1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

[RESOLVIDO] Datasul EAI - Adapter

Discussão em 'EMS , HCM e Totvs 11' iniciado por rsilva, Maio 29, 2009.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. rsilva

    rsilva Sem Pontuação

    Estou com um problema na construção de um adapter de recebimento, que receberá um XML via HTTP. Depois de executado é gerado um log com mensagem de erro dizendo que a transação não foi assinada, mas tenho certeza que esta assinada. A assinatura é feita pela própria Datasul. Se alguem puder ajudar ficarei muito grato.

    Segue o código:

    Código:
    /*=============================================================
    |                                                             |
    |                       Definitions                           |
    |                                                             |
    ===============================================================*/
    
    
    &GLOBAL-DEFINE XmlMod            Distribuicao 
    &GLOBAL-DEFINE XmlProdName       EMS2
    &GLOBAL-DEFINE XmlProdVersion    204
    &GLOBAL-DEFINE XmlApp            esp 
    &GLOBAL-DEFINE XmlTranName       CadCli 
    &GLOBAL-DEFINE XmlMinTranVersion 204.000
    &GLOBAL-DEFINE XmlMaxTranVersion 204.100
    &GLOBAL-DEFINE XmlListOfEvents
    &GLOBAL-DEFINE XmlListOfAction   add,upd,del
    
    /* DEFINE AS VARAIVEIS PARA USO DO xmlLoadMessageHandlerRec */
    {xmlinc/xmlLoadMessageHandlerRecDef.i}
    
    /* DEFINE AS VARAIVEIS PARA USO DO xmlLoadGenXmlRec */
    {xmlinc/xmlLoadGenXmlRecDef.i}
    
    /* TEMP-TABLE PARA ARMAZENAR O XML DO NEGOCIO (BUSINESSCONTENT) */
    DEF TEMP-TABLE ttemitente LIKE emitente.
    
    /* TEMP-TABLE QUE ARMAZENA OS ERROS OCORRIDOS NA EFETIVACAO DA MENSAGEM */
    DEF TEMP-TABLE ttListOfError             NO-UNDO
        FIELD ErrorControl#                  AS INT
        FIELD ErrorId                        AS INT 
        FIELD ErrorType                      AS CHAR
        FIELD ErrorDesc                      AS CHAR
        INDEX CounterId IS PRIMARY UNIQUE ErrorControl#.
    
    /*=============================================================
    |                                                             |
    |                       Main Block                            |
    |                                                             |
    ===============================================================*/
    
    /* DEFINE A PROCEDURE getTransSubsInfo */
    {xmlinc/xmlgettranssubsinfo.i}
    
    
    /*=============================================================
    |                                                             |
    |               Procedure ReceiveMessage                      |
    |                                                             |
    ===============================================================*/
    PROCEDURE receiveMessage:
            
        DEF INPUT  PARAM hInputXML  AS HANDLE NO-UNDO.
        DEF OUTPUT PARAM hOutputXML AS HANDLE NO-UNDO.
        
        DEF VAR hBusinessContent AS HANDLE NO-UNDO.
        DEF VAR lSuccessProcess  AS LOG    NO-UNDO.
        DEF VAR cValue           AS CHAR   NO-UNDO.
        DEF VAR cNodeName        AS CHAR   NO-UNDO.
        DEF VAR iId              AS INT    NO-UNDO.
        DEF VAR cTranEvent       AS CHAR   NO-UNDO.
        DEF VAR cTranVersion     AS CHAR   NO-UNDO.
        DEF VAR cErrorText       AS CHAR   NO-UNDO.
        DEF VAR iCount           AS INT    NO-UNDO.
        DEF VAR cListRootSon     AS CHAR   NO-UNDO.
        DEF VAR iContRootSon     AS INT    NO-UNDO.
        DEF VAR lError           AS LOG    NO-UNDO.
        DEF VAR hGenXml          AS HANDLE NO-UNDO. 
        DEF VAR hMessageHandler  AS HANDLE NO-UNDO.
        DEF VAR cReturnValue     AS CHAR   NO-UNDO.
        DEF VAR cTranAction      AS CHAR   NO-UNDO.
        
        
        /* COLOCA O Message Handler NA MEMORIA, SE ELE Jµ NÇO ESTIVER. */
        {xmlinc/xmlLoadMessageHandlerRec.i &MessageHandler="hMessageHandler" &MHReturnValue="cReturnValue" &MHReturnError="hOutputXML"}
        
        /* VERIFICA SE O MessageHandler FOI EXECUTADO CORRETAMENTE */
        IF cReturnValue <> "OK" 
        THEN 
            /* AQUI O DESENVOLVEDOR FAZ O QUE DESEJAR ANTES DE RETORNAR */
            RETURN cReturnValue.
        
        
        /* FAZ A INTERPRETAۂO, ARMAZENA E VALIDA A MENSAGEM QUE RECEBE */
        RUN parseMessage IN hMessageHandler (INPUT  hInputXml,
                                             INPUT "{&XmlTranName}",
                                             INPUT "{&XmlMaxTranVersion}",
                                             INPUT "{&XmlMinTranVersion}",
                                             INPUT 
                                               &IF DEFINED(XmlListOfEvents) <> 0
                                               &THEN "{&XmlListOfEvents}",
                                               &ELSE "",
                                               &ENDIF
                                             OUTPUT lSuccessProcess,
                                             OUTPUT cTranAction,
                                             OUTPUT cTranEvent,
                                             OUTPUT cTranVersion,
                                             OUTPUT hOutputXML ).
                                                 
        /* SE NÇO PROCESSOU CORRETAMENTE RETORNA ERRO */
        IF NOT lSuccessProcess
        THEN 
            /* AQUI O DESENVOLVEDOR FAZ O QUE DESEJAR ANTES DE RETORNAR */
            RETURN "NOK".
        
      /*  /* AQUI O DESENVOLVEDOR PODE VERIFICAR A VERSAO, CASO O ADAPTER DE RECEBIMENTO ACEITE MAIS QUE UMA VERSAO */
        IF cTranVersion = "200.000"
        THEN 
            /* A CRITERIO DO DESENVOLVEDOR */
            MESSAGE cTranVersion
                    VIEW-AS ALERT-BOX INFO BUTTONS OK.
        
        /* AQUI O DESENVOLVEDOR PODE VERIFICAR O EVENTO, CASO O ADAPTER DE RECEBIMENTO ACEITE MAIS QUE UM EVENTO */
        IF cTranEvent = "evento2"
        THEN 
            /* A CRITERIO DO DESENVOLVEDOR */
            MESSAGE cTranEvent
                    VIEW-AS ALERT-BOX INFO BUTTONS OK.
        
        */
        /* OBTEM A PARTE DA MENSAGEM QUE CONTEM O BusinessContent */
        RUN getBusinessContent IN hMessageHandler (OUTPUT hBusinessContent).
        
        
        /* VERIFICA SE APIXML ESTA NA MEMORIA */
        {xmlinc/xmlLoadGenXmlRec.i &GenXml="hGenXml" &GXReturnValue="cReturnValue" &GXReturnError="hOutputXML"}
        
                
        /* VERIFICA SE O ut-genxml FOI INICIADO CORRETAMENTE */
        IF cReturnValue <> "OK" 
            THEN DO:
                /* ELIMINA A MENSAGEM OBTIDA NO MTODO getBusinessContent */
                DELETE OBJECT hBusinessContent NO-ERROR.
        
                /* === AQUI O DESENVOLVEDOR FAZ O QUE DESEJAR COM O ERRO ANTES DE RETORNA-LO AO CONTROL BROKER === */
                RETURN cReturnValue.
            END.
                
        /* OBTEM OS VALORES DOS ELEMENTOS ABAIXO DO BusinessContent */
        /* LIMPA AS TEMP-TABLES INTERNAS DA API XML */
        RUN reset IN hGenXml.
        
        /* CARREGA A ESTRUTURA FILHA DE BusinessContent */
        RUN loadXml IN hGenXml (hBusinessContent).
        
        /* ELIMINA A MENSAGEM OBTIDA NO MTODO getBusinessContent */
        DELETE OBJECT hBusinessContent NO-ERROR.
        
        /* Cria um registro para receber os valores dos filhos do elemento raiz (Upsert ou Delete) */
        CREATE ttemitente.
        
    
        /*
            /* OBTM O VALOR DO NODE RELATIVO A Cnpj */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Cnpj", OUTPUT ttemitente.cgc).
        
            /* OBTM O VALOR DO NODE RELATIVO A Inscricao-est */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Inscricao-est", OUTPUT ttemitente.ins-estadual).
        
            /* OBTM O VALOR DO NODE RELATIVO A Inscricao-mun */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Inscricao-mun", OUTPUT ttemitente.ins-municipal).
        
            /* OBTM O VALOR DO NODE RELATIVO A Nome */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Nome", OUTPUT ttemitente.nome-emit).
        
            /* OBTM O VALOR DO NODE RELATIVO A Endereco */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Endereco", OUTPUT ttemitente.endereco).
        
            /* OBTM O VALOR DO NODE RELATIVO A Numero */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Numero", OUTPUT ttemitente.ramal-fac).
        
            /* OBTM O VALOR DO NODE RELATIVO A Bairro */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Bairro", OUTPUT ttemitente.bairro).
        
            /* OBTM O VALOR DO NODE RELATIVO A Cep */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Cep", OUTPUT ttemitente.cep).
        
            /* OBTM O VALOR DO NODE RELATIVO A Cidade */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Cidade", OUTPUT ttemitente.cidade).
        
            /* OBTM O VALOR DO NODE RELATIVO A UF */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "UF", OUTPUT ttemitente.estado).
        
            /* OBTM O VALOR DO NODE RELATIVO A Pais */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Pais", OUTPUT ttemitente.pais).
        
            /* OBTM O VALOR DO NODE RELATIVO A Email */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Email", OUTPUT ttemitente.e-mail).
        
            /* OBTM O VALOR DO NODE RELATIVO A DDD */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "DDD", OUTPUT ttemitente.telex).
        
            /* OBTM O VALOR DO NODE RELATIVO A Telefone */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Telefone", OUTPUT ttemitente.telef-modem).
         
            /* OBTM O VALOR DO NODE RELATIVO A Contato */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Contato", OUTPUT ttemitente.atividade).
        
            /* OBTM O VALOR DO NODE RELATIVO A Celular */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Celular", OUTPUT ttemitente.caixa-postal).
        
            /* OBTM O VALOR DO NODE RELATIVO A Fax */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Fax", OUTPUT ttemitente.telefax).
        
            /* OBTM O VALOR DO NODE RELATIVO A Banco */
            RUN getSonDec IN hGenXml (INPUT 1, INPUT "Banco", OUTPUT ttemitente.cod-banco).
        
            /* OBTM O VALOR DO NODE RELATIVO A Agencia */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Agencia", OUTPUT ttemitente.agencia).
        
            /* OBTM O VALOR DO NODE RELATIVO A Conta */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Conta", OUTPUT ttemitente.conta-corren).
        
            /* OBTM O VALOR DO NODE RELATIVO A Data_Cadastro */
            RUN getSonDate IN hGenXml (INPUT 1, INPUT "Data_Cadastro", OUTPUT ttemitente.data-implant).
        
            /* OBTM O VALOR DO NODE RELATIVO A Complemento */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Complemento", OUTPUT ttemitente.inf-complementar).
        
            /* OBTM O VALOR DO NODE RELATIVO A Cod-Suframa */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Cod-Suframa", OUTPUT ttemitente.cod-suframa).
        
            /* OBTM O VALOR DO NODE RELATIVO A End-cob */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "End-cob", OUTPUT ttemitente.endereco-cob).
        
            /* OBTM O VALOR DO NODE RELATIVO A Num-cob */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Num-cob", OUTPUT ttemitente.ramal-fax).
        
            /* OBTM O VALOR DO NODE RELATIVO A Compl-cob */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Compl-cob", OUTPUT ttemitente.home-page).
        
            /* OBTM O VALOR DO NODE RELATIVO A Bairro-cob */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Bairro-cob", OUTPUT ttemitente.bairro-cob).
        
            /* OBTM O VALOR DO NODE RELATIVO A Cep-cob */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Cep-cob", OUTPUT ttemitente.cep-cob).
        
            /* OBTM O VALOR DO NODE RELATIVO A Cidade-cob */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Cidade-cob", OUTPUT ttemitente.cidade-cob).
        
            /* OBTM O VALOR DO NODE RELATIVO A Uf-cob */
            RUN getSonVal IN hGenXml (INPUT 1, INPUT "Uf-cob", OUTPUT ttemitente.estado-cob).
        
            /* OBTM O VALOR DO NODE RELATIVO A Codigo-rep */
            RUN getSonDec IN hGenXml (INPUT 1, INPUT "Codigo-rep", OUTPUT ttemitente.cod-rep).
        */
        
        /*=============================================================
        |                                                             |
        |               Programa de Efetiva‡Æo                      |
        |                                                             |
        ===============================================================*/
        
        
        /* SE A MENSAGEM FOR DE INCLUSAO "ADD" OU SE A MENSAGEM FOR DE MODIFICA "UPD" */
        IF cTranAction = "add" OR cTranAction = "upd" THEN DO:
            /* VERIFICA SE O PROGRAMA EXISTE */
            IF SEARCH("esp/eai/nks/eai000.r") <> ? OR SEARCH("esp/eai/nks/eai000.p") <> ? THEN DO:
                /* PASSA OS DADOS OBTIDOS AO PROGRAMA QUE EFETIVARµ A INCLUSAO/ALTERA€ÇO DO REGISTRO */
                RUN esp/eai/nks/eai000.p ( INPUT TABLE ttemitente,
                                           OUTPUT TABLE ttListOfError) NO-ERROR.
                /* VERIFICA SE OCORRERAM ERROS NA EXECUۂO DO PROGRAMA */
                IF ERROR-STATUS:ERROR THEN DO:
                    /* CONCATENA AS MENSAGENS DE ERRO */
                    DO iCount = 1 TO ERROR-STATUS:NUM-MESSAGES:
                        cErrorText = cErrorText + ERROR-STATUS:GET-MESSAGE(iCount).
                    END.
        
                    /* INFORMA AO MESSAGE HANDLER O ERRO QUE DEVE ESTAR PRESENTE NA MENSAGEM DE RETORNO */
                    RUN setError IN hMessageHandler (INPUT 0,
                                                     INPUT "enviroment_error",
                                                     INPUT "Erro de integra‡Æo. Erro ao executar o programa 'fin/upsertCustomer.p' pelo programa adapters/xml/fin/AdapterRecebimento.p. Durante sua execu‡Æo ocorreu o(s) seguinte(s) erro(s) de Progress: " + cErrorText).
                END.
                ELSE DO:
                    /* PARA CADA ERRO ENCONTRADO NO PROCESSO DE EFETIVAR O REGISTRO */
                    FOR EACH ttListOfError:
                        /* INFORMA AO MESSAGE HANDLER UM ERRO QUE DEVE ESTAR PRESENTE NA MENSAGEM DE RETORNO */
                        RUN setError IN hMessageHandler (INPUT ttListOfError.ErrorId,
                                                         INPUT ttListOfError.ErrorType,
                                                         INPUT ttListOfError.ErrorDesc).
                    END.
                END.
            END.
            ELSE DO:
                /* INFORMA AO MESSAGE HANDLER O ERRO QUE DEVE ESTAR PRESENTE NA MENSAGEM DE RETORNO */
                RUN setError IN hMessageHandler (INPUT 0,
                                                 INPUT "enviroment_error",
                                                 INPUT "Erro de integra‡Æo. NÆo foi poss¡vel localizar o programa 'fin/upsertCustomer.p' a ser executado pelo programa adapters/xml/fin/AdapterRecebimento.p.").
            END.
        END.
        /* SE A MENSAGEM FOR DE ELIMINA "DEL" */
        ELSE IF cTranAction = "del" THEN DO:
            /* VERIFICA SE O PROGRAMA EXISTE */
            IF SEARCH("fin/deleteCustomer.r") <> ? OR SEARCH("fin/deleteCustomer.p") <> ? THEN DO:
                /* PASSA OS DADOS OBTIDOS AO PROGRAMA QUE EFETIVARµ A ELIMINA€ÇO DO REGISTRO */
                RUN fin/deleteCustomer.p ( INPUT TABLE ttemitente,
                                           OUTPUT TABLE ttListOfError) NO-ERROR.
                /* VERIFICA SE OCORRERAM ERROS NA EXECUۂO DO PROGRAMA */
                IF ERROR-STATUS:ERROR THEN DO:
                    /* CONCATENA AS MENSAGENS DE ERRO */
                    DO iCount = 1 TO ERROR-STATUS:NUM-MESSAGES:
                        cErrorText = cErrorText + ERROR-STATUS:GET-MESSAGE(iCount).
                    END.
                    /* INFORMA AO MESSAGE HANDLER O ERRO QUE DEVE ESTAR PRESENTE NA MENSAGEM DE RETORNO */
                    RUN setError IN hMessageHandler (INPUT 0,
                                                     INPUT "enviroment_error",
                                                     INPUT "Erro de integra‡Æo. Erro ao executar o programa 'fin/deleteCustomer.p' pelo programa adapters/xml/fin/AdapterRecebimento.p. Durante sua execu‡Æo ocorreu o(s) seguinte(s) erro(s) de Progress: " + cErrorText).
                END.
                ELSE DO:
                    /* PARA CADA ERRO ENCONTRADO NO PROCESSO DE EFETIVAR O REGISTRO */
                    FOR EACH ttListOfError:
                        /* INFORMA AO MESSAGE HANDLER UM ERRO QUE DEVE ESTAR PRESENTE NA MENSAGEM DE RETORNO */
                        RUN setError IN hMessageHandler (INPUT ttListOfError.ErrorId,
                                                         INPUT ttListOfError.ErrorType,
                                                         INPUT ttListOfError.ErrorDesc).
                    END.
                END.
            END.
            ELSE DO:
                /* INFORMA AO MESSAGE HANDLER O ERRO QUE DEVE ESTAR PRESENTE NA MENSAGEM DE RETORNO */
                RUN setError IN hMessageHandler (INPUT 0,
                                                 INPUT "enviroment_error",
                                                 INPUT "Erro de integra‡Æo. NÆo foi poss¡vel localizar o programa 'fin/deleteCustomer.r' a ser executado pelo programa adapters/xml/fin/AdapterRecebimento.p.").
            END.
        END.
    
        RETURN "OK".
        
    END.
    

    Roberto Silva
  2. woliveira

    woliveira Sem Pontuação

    Bom Dia ,

    Quero pedir desculpa pela demora na resposta. Vamos lá, um consultor da DataSul disponibilizou um programa em Java que faz o processo de envio do arquivo XML por HTTP Post neste arquivo existem 03 parâmetros 1º na URL do WebSpeed é passado um adapter que ele informou que é padrão para o envio (adapters/xml/utp/axrut003.p) o 2º é o arquivo XML com os arquivos do meu negócio e o 3º é um arquivo de resposta, que estarei encaminhando junto com o log do servidor do WebSpeed onde existem varias informações relacionadas ao problema que vem ocorrendo. Também venho informar que ao enviar o adapter para o consultor ele me informou que só está dando erro porque o meu adapter está incompleto(faltando muitas informações) e que só após o acerto do mesmo que o problema iria se resolver.

    OBS:Dentro do Arquivo compactado existem o arquivo de resposta do programa Java, o log do Servidor WebSpeed, o meu xml de teste e o xsd para o meu xml.

    Desde já obrigado pela atenção.

    Att,


    Wesley

    Arquivos Anexados:

Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página