Histórico da Página
A atualização dos dados no Protheus também é realizada atraves de WebServices como visto na validação utilizando o evento do processo afterProcessFinish que é executado na finalização da solicitação.
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_LOJA = hAPI.getCardValue("A1_LOJA");
SA1.A1_TIPO = hAPI.getCardValue("A1_TIPO");
SA1.A1_PESSOA = hAPI.getCardValue("A1_PESSOA");
SA1.A1_NOME = hAPI.getCardValue("A1_NOME");
SA1.A1_NREDUZ = hAPI.getCardValue("A1_NREDUZ");
SA1.A1_END = hAPI.getCardValue("A1_END");
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
A validação do processo de uma rotina MVC é também é realizada utilizando o WebService FWWSMODEL (http://hostexemplo:8080/ws/fwwsmodel.apw?wsdl) com a invocação do método GETXMLDATADETAIL que retorna o XML do model para popular os dados e do método PUTXMLDATA que gravar o 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 = "O campo "+eval("struct.@info")+" ("+name+") contém uma data invá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 = "O campo "+eval("struct.@info")+" ("+name+") contém um número (valor ou tamanho) invá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 = "O campo "+eval("struct.@info")+" ("+name+") contém um número (valor ou tamanho) invá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,"");}
Rotina Automática (Modelo 1)
Como as rotinas automáticas após validarem executam a atualização ao invés de utilizar o evento afterProcessFinish utilizar o evento beforeTaskSave quando o processo estiver na atividade fim. Além do WebService do MVC utilizar também o FWWSMODEL (http://hostexemplo:8080/ws/fwwsecm.apw?wsdl) com a invocação do método PUTDATA.
#include "totvs.ch"
User Function WSMVC()
Local cName := "TOTVS_FWWSECM"
Local cURL := "http://hostname:8080/ws/fwwsecm.apw?wsdl"
Local cDescription := "Serviço do TOTVS Microsiga Protheus para integração de rotinas automáticas com ECM"
Local aService := FWWFGetService(cName)
If Empty(aService) .and. FWWFPutService(cName,cUrl,cDescription)
MsgInfo("Serviço cadastrado com sucesso")
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 "Preencha o formulário";
}
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 = "O campo "+eval("struct.@info")+" ("+name+") contém uma data invá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 = "O campo "+eval("struct.@info")+" ("+name+") contém um número (valor ou tamanho) invá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 = "O campo "+eval("struct.@info")+" ("+name+") contém um número (valor ou tamanho) invá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,"");}