Histórico da Página
...
Para acessar o valor de um campo do formulário utilizar a API do workflow hAPI.getCardValue(<nomeCampo>) e para o tratamento de exeções utilizar o comando throw <mensagem> que apresentará a mensagem para o usuário impendindo que prossiga enquanto não corrigir as informações digitadas.
Script do evento no ECM
Validações simples podem ser realizadas no script do evento para evitar a comunicação desnecessário ao Protheus retornando imediatamente uma mensagem ao usuário.
function beforeTaskSave(colleagueId,nextSequenceId,userList){
var A1_COD = hAPI.getCardValue("A1_COD");
if (A1_COD == ""){
throw "O campo Código é obrigatório"
}
}
Protheus
A validação nos scripts dos eventos utilizando aplicações externas é realizada atraves de WebServices que devem ser cadastradas como serviço no ECM na opção Painel de Controle > Serviços > Adicionar. Quando qualquer definição do WebService for alterada ou incluída será necessário atualizar o ECM na opção Painel de Controle > Serviços > Editar > Atualizar.
O WebService pode ser cadastrado através do Painel de Controle do ECM ou pelo Protheus utilizando a função FWWFPutService como no exemplo abaixo.
#include "totvs.ch"
User Function WSCliente()
Local cName := "WSCLIENTE"
Local cURL := "http://hostname:8080/ws/exemplo.apw?wsdl"
Local cDescription := "Serviço para validação e atualização do cadastro de cliente"
If FWWFPutService(cName,cUrl,cDescription)
MsgInfo("Serviço cadastrado com sucesso")
EndIf
Return
WebService
Exemplo de WebService do Protheus:
#include "totvs.ch"
#include "apwebsrv.ch"
WSSERVICE WSCLIENTE DESCRIPTION "Exemplo cadastro de cliente"
WSDATA A1_COD AS STRING
WSDATA A1_LOJA AS STRING
WSDATA XML AS Base64Binary
WSDATA RETEXISTCOD AS BOOLEAN
WSDATA RETINCLUIR AS BOOLEAN
WSMETHOD ExistCod DESCRIPTION "Verifica se codigo do cliente ja existe"
WSMETHOD Incluir DESCRIPTION "Inclui cliente"
ENDWSSERVICE
WSMETHOD ExistCod WSRECEIVE A1_COD,A1_LOJA WSSEND RETEXISTCOD WSSERVICE WSCLIENTE
Private INCLUI := .T.
::RETEXISTCOD := existchav("SA1",::A1_COD+::A1_LOJA)
Return .T.
WSMETHOD Incluir WSRECEIVE XML WSSEND RETINCLUIR WSSERVICE WSCLIENTE
Local oXML := tXMLManager():New()
Local lRet := .T.
Local aDadosCli := {}
If oXML:Parse(::XML)
aAdd( aDadosCli, { "A1_COD" , oXML:XPathGetNodeValue("/SA1/A1_COD") , NIL } )
aAdd( aDadosCli, { "A1_LOJA" , oXML:XPathGetNodeValue("/SA1/A1_LOJA") , NIL } )
aAdd( aDadosCli, { "A1_TIPO" , oXML:XPathGetNodeValue("/SA1/A1_TIPO") , NIL } )
aAdd( aDadosCli, { "A1_PESSOA" , oXML:XPathGetNodeValue("/SA1/A1_PESSOA"), NIL } )
aAdd( aDadosCli, { "A1_NOME" , oXML:XPathGetNodeValue("/SA1/A1_NOME") , NIL } )
aAdd( aDadosCli, { "A1_NREDUZ" , oXML:XPathGetNodeValue("/SA1/A1_NREDUZ"), NIL } )
aAdd( aDadosCli, { "A1_END" , oXML:XPathGetNodeValue("/SA1/A1_END") , NIL } )
aAdd( aDadosCli, { "A1_MUN" , oXML:XPathGetNodeValue("/SA1/A1_MUN") , NIL } )
aAdd( aDadosCli, { "A1_EST" , oXML:XPathGetNodeValue("/SA1/A1_EST") , NIL } )
lMsErroAuto := .F.
MSExecAuto( { | x, y | MATA030( x, y ) } , aDadosCli, 3 )
If lMsErroAuto
If __lSX8
RollBackSX8()
EndIf
::RETINCLUIR := .F.
Else
If __lSX8
ConFirmSX8()
EndIf
::RETINCLUIR := .T.
EndIf
Else
SetSoapFault("WSCLIENTE:INCLUIR",oXML:LastError())
lRet := .F.
EndIf
Return lRet
Validação no script do evento beforeTaskSave:
- Invocar a carga do serviço com o método ServiceManager.getService
- Utilizar o método getBean para retornar o utilitário para acesso as classes do serviço através do método instantiate enviando como parâmetro a classe Locator que esta descrita no ECM em Painel de Controle > Serviços, selecionar o serviço e clicar em Visualizar
- Invocar o método para instanciar o serviço (no exemplo getWSCLIENTESOAP) que também esta descrito na opção Painel de Controle > Serviços > Visualizar
- Invocar o método do serviço (no exemplo ExistCod)
function beforeTaskSave(colleagueId,nextSequenceId,userList){
var A1_COD = hAPI.getCardValue("A1_COD");
if (A1_COD == ""){
throw "O campo Código é obrigatório"
}
var wsService = ServiceManager.getService("WSCLIENTE");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("localhost.WSCLIENTELocator");
var service = serviceLocator.getWSCLIENTESOAP();
var ret = false;
try {
ret = service.EXISTCOD(A1_COD);
}
catch(erro){
throw erro.message
}
if (!ret) {
throw "Cliente já existe";
}
}