La actualización de los datos en Protheus también se lleva a cabo a través de WebServices como se ve en la validación utilizando el evento del proceso afterProcessFinish que se ejecuta en la finalización de la solicitud.
function afterProcessFinish(processId){
var wsService = ServiceManager.getService("WSCLIENTE");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("localhost.WSCLIENTELocator");
var service = serviceLocator.getWSCLIENTESOAP();
var SA1 = new XML("<SA1/>");
SA1.A1_COD = hAPI.getCardValue("A1_COD");
SA1.A1_TIENDA = hAPI.getCardValue("A1_TIENDA");
SA1.A1_TIPO = hAPI.getCardValue("A1_TIPO");
SA1.A1_PERSONA = hAPI.getCardValue("A1_PERSONA");
SA1.A1_NOMBRE = hAPI.getCardValue("A1_NOMBRE");
SA1.A1_NREDUC = hAPI.getCardValue("A1_NREDUC");
SA1.A1_DIR = hAPI.getCardValue("A1_DIR");
SA1.A1_MUN = hAPI.getCardValue("A1_MUN");
SA1.A1_EST = hAPI.getCardValue("A1_EST");
try {
ret = service.INCLUIR(new java.lang.String(SA1.toXMLString()).getBytes());
}
catch(erro){
throw erro.message
}
}
MVC
La validación del proceso de una rutina MVC también se lleva a cabo utilizando WebService FWWSMODEL (http://hostexemplo:8080/ws/fwwsmodel.apw?wsdl) con la invocación del método GETXMLDATADETAIL que devuelve el XML del modelo para llenar los datos y el método PUTXMLDATA que graba XML.
function afterProcessFinish(processId){
var wsService = ServiceManager.getService("TOTVS_FWMVC");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("br.com.totvs.webservices.fwwsmodel_apw.FWWSMODELLocator");
var service = serviceLocator.getFWWSMODELSOAP();
var err = {message:"", empty:true};
var ret, xml;
try {
ret = service.GETXMLDATADETAIL([],"MATA030_MVC");
xml = new XML(new String(new java.lang.String(ret)).replace(/<\?.*\?>/g,""));
}
catch(erro){
throw erro.message;
return;
}
updateXMLFields(xml,err);
eval("xml.@Operation = 3");
try{
service.PUTXMLDATA([],"MATA030_MVC",new java.lang.String(xml.toXMLString()).getBytes());
} catch(e){
throw e.message;
}
}
function updateXMLFields(node,err){
var list = node.children();
var name,value;
for (var i=0;i<list.length();i++){
switch (Trim(eval("list[i][email protected]()"))){
case "FIELDS":
updateXMLFields(list[i],err);
break;
default:
name = list[i].name().localName;
value = hAPI.getCardValue(name);
if (value != null)
list[i].value = convertValue(name,list[i],value,err);
break;
}
if (err.message.length > 0)
break;
}
}
function convertValue(name,struct,value,err){
var y,m,d,n,len,str,reg
var setYear = new Date().getFullYear().toString().substring(0,2);
var setDate = "dd/mm/yyyy";
var yCount = setDate.match(/yyyy/) ? 4 : 2;
var hasErr = false;
value = value.trim();
switch (eval("[email protected]()")){
case "D":
if (value.replace("/","").trim() != ""){
len = value.length();
d = setDate.indexOf("d");
m = setDate.indexOf("m");
y = setDate.indexOf("y");
if (d + 2 > len || m + 2 > len || y + yCount > len){
hasErr = true;
}
else{
str = value.substr(m,2) + value.substr(d,2);
if (yCount == 4)
str = value.substr(y,4) + str;
else
str = setYear + value.substr(y,2) + str;
if (str.match(/((((19|20)(([02468][048])|([13579][26]))0229))|((19|20)[0-9][0-9])((((0[1-9])|(1[0-2]))((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))31)|(((0[1,3-9])|(1[0-2]))(29|30)))))/g))
value = new java.lang.String(str);
else
hasErr = true;
}
if (hasErr)
err.message = "El campo "+eval("struct.@info")+" ("+name+") contiene una fecha no válida";
else
err.empty = false;
}
break;
case "N":
len = eval("[email protected]().split(',')");
if (len[1] == "0"){
reg = new RegExp("^[0-9]{1,"+len[0]+"}$");
str = value.replace(",","");
if(!reg.test(str)){
str = value.replace(".","");
if(!reg.test(str)){
err.message = "El campo "+eval("struct.@info")+" ("+name+") contiene un número (valor o tamaño) no válido"
hasErr = true;
break;
}
}
if (!hasErr){
n = parseInt(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
else{
reg = new RegExp("^0$|^0\.[0-9]{1,"+len[1]+"}$|^[0-9]{0,"+len[0]+"}(\.[0-9]{1,"+len[1]+"})?$");
str = value.replace(".","").replace(",",".");
if(!reg.test(str)){
str = value.replace(",","");
if(!reg.test(str)){
err.message = "El campo "+eval("struct.@info")+" ("+name+") contiene un número (valor o tamaño) no válido"
hasErr = true;
break;
}
}
if (!hasErr){
n = parseFloat(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
break;
default:
if (value != "")
err.empty = false;
break;
}
return value;
}
function Trim(str){return str.replace(/^\s+|\s+$/g,"");}
Rutina Automática (Modelo 1)
Como las rutinas automáticas después de la validación ejecutan la actualización en vez de utilizar el evento afterProcessFinish utilice el evento beforeTaskSave cuando el proceso esté en la actividad final. Además de WebService de MVC utilice también FWWSMODEL (http://hostexemplo:8080/ws/fwwsecm.apw?wsdl) con la invocación del método PUTDATA.
#include "totvs.ch"
User Function WSMVC()
Local cName := "TOTVS_FWWSECM"
Local cURL := "http://hostname:8080/ws/fwwsecm.apw?wsdl"
Local cDescription := "Servicio de TOTVS Microsiga Protheus para integración de rutinas automáticas con ECM"
Local aService := FWWFGetService(cName)
If Empty(aService) .and. FWWFPutService(cName,cUrl,cDescription)
MsgInfo("Servicio registrado con éxito")
EndIf
Return
Evento beforeTaskSave:
function beforeTaskSave(colleagueId,nextSequenceId,userList){
var wsService = ServiceManager.getService("TOTVS_FWMVC");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("br.com.totvs.webservices.fwwsmodel_apw.FWWSMODELLocator");
var service = serviceLocator.getFWWSMODELSOAP();
var err = {message:"", empty:true};
var ret, xml;
try {
ret = service.GETXMLDATADETAIL([],"MATA030_MVC");
xml = new XML(new String(new java.lang.String(ret)).replace(/<\?.*\?>/g,""));
}
catch(erro){
throw erro.message;
return;
}
updateXMLFields(xml,err);
if (err.message.length > 0){
throw err.message;
}
else if (err.empty){
throw "Complete el formulario";
}
else{
wsService = ServiceManager.getService("TOTVS_FWWSECM");
serviceHelper = wsService.getBean();
serviceLocator = serviceHelper.instantiate("br.com.totvs.webservices.fwwsecm_apw.FWWSECMLocator");
service = serviceLocator.getFWWSMODELSOAP();
eval("xml.@Operation = 3");
try{
service.PUTDATA([],"SA1","MATA030",new java.lang.String(xml.toXMLString()).getBytes());;
} catch(e){
throw e.message;
}
}
}
function updateXMLFields(node,err){
var list = node.children();
var name,value;
for (var i=0;i<list.length();i++){
switch (Trim(eval("list[i][email protected]()"))){
case "FIELDS":
updateXMLFields(list[i],err);
break;
default:
name = list[i].name().localName;
value = hAPI.getCardValue(name);
if (value != null)
list[i].value = convertValue(name,list[i],value,err);
break;
}
if (err.message.length > 0)
break;
}
}
function convertValue(name,struct,value,err){
var y,m,d,n,len,str,reg
var setYear = new Date().getFullYear().toString().substring(0,2);
var setDate = "dd/mm/yyyy";
var yCount = setDate.match(/yyyy/) ? 4 : 2;
var hasErr = false;
value = value.trim();
switch (eval("[email protected]()")){
case "D":
if (value.replace("/","").trim() != ""){
len = value.length();
d = setDate.indexOf("d");
m = setDate.indexOf("m");
y = setDate.indexOf("y");
if (d + 2 > len || m + 2 > len || y + yCount > len){
hasErr = true;
}
else{
str = value.substr(m,2) + value.substr(d,2);
if (yCount == 4)
str = value.substr(y,4) + str;
else
str = setYear + value.substr(y,2) + str;
if (str.match(/((((19|20)(([02468][048])|([13579][26]))0229))|((19|20)[0-9][0-9])((((0[1-9])|(1[0-2]))((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))31)|(((0[1,3-9])|(1[0-2]))(29|30)))))/g))
value = new java.lang.String(str);
else
hasErr = true;
}
if (hasErr)
err.message = "El campo "+eval("struct.@info")+" ("+name+") contiene una fecha no válida";
else
err.empty = false;
}
break;
case "N":
len = eval("[email protected]().split(',')");
if (len[1] == "0"){
reg = new RegExp("^[0-9]{1,"+len[0]+"}$");
str = value.replace(",","");
if(!reg.test(str)){
str = value.replace(".","");
if(!reg.test(str)){
err.message = "El campo "+eval("struct.@info")+" ("+name+") contiene un número (valor o tamaño) no válido"
hasErr = true;
break;
}
}
if (!hasErr){
n = parseInt(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
else{
reg = new RegExp("^0$|^0\.[0-9]{1,"+len[1]+"}$|^[0-9]{0,"+len[0]+"}(\.[0-9]{1,"+len[1]+"})?$");
str = value.replace(".","").replace(",",".");
if(!reg.test(str)){
str = value.replace(",","");
if(!reg.test(str)){
err.message = "El campo "+eval("struct.@info")+" ("+name+") contiene un número (valor o tamaño) no válido"
hasErr = true;
break;
}
}
if (!hasErr){
n = parseFloat(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
break;
default:
if (value != "")
err.empty = false;
break;
}
return value;
}
function Trim(str){return str.replace(/^\s+|\s+$/g,"");}