Gerar XML, webservice

Discussão em 'Progress 4GL' iniciado por juliano, Fevereiro 11, 2014.

  1. juliano

    juliano Sem Pontuação

    Ola, estou desenvolvendo um programa em Progress para conectar a um webservice, em uma rotina eu devo enviar um XML para o webservice e este me retorna outro XML, eu criei esta rotina para gerar meu XML, ele gera o XML eu passo para o webservice via lonchar porem o mesmo sempre retorna que não conseguiu ler o EAN, como se o valor na tag EAN estivesse em branco, o formato que eu gero o XML esta correto(Usando o SAX-WRITER ) ou tenho que gerar de outra forma?, pois eu ja joguei este XML gerado no SoapUI e não da problema executa normal.

    Código:
    DEFINE INPUT PARAMETER ean        AS CHARACTER NO-UNDO.
    DEFINE INPUT PARAMETER quantidade LIKE saldo-estoq.qtidade-atu NO-UNDO.
    
    /*DEFINE VARIABLE c-msg-xml AS MEMPTR NO-UNDO.*/
    DEFINE VARIABLE c-msg-xml AS LONGCHAR NO-UNDO.
    DEFINE VARIABLE hSAXWriter AS HANDLE NO-UNDO.
    DEFINE VARIABLE lok AS LOGICAL NO-UNDO.
    def var i-cont as int.
    
    FIND FIRST ITEM WHERE item.it-codigo = ean NO-LOCK NO-ERROR.
    IF AVAIL item THEN DO:
      
    END.
    RUN pi-ws-login.
    
    IF LoginResult THEN DO:
    
        CREATE SAX-WRITER hSAXWriter.
        hSAXWriter:STRICT = FALSE.
        hSAXWriter:FORMATTED = TRUE.
        hSAXWriter:ENCODING = 'UTF-8'.
    
        /*lok = hSAXWriter:SET-OUTPUT-DESTINATION("MEMPTR",c-msg-xml).*/
        lok = hSAXWriter:SET-OUTPUT-DESTINATION("longchar",c-msg-xml).
        lok = hSAXWriter:START-DOCUMENT().
        lok = hSAXWriter:START-ELEMENT("soapenv:Envelope").
      
        lok = hSAXWriter:INSERT-ATTRIBUTE("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/").
        lok = hSAXWriter:INSERT-ATTRIBUTE("xmlns:tem","http://tempuri.org/").
        lok = hSAXWriter:INSERT-ATTRIBUTE("xmlns:fac","http://schemas.datacontract.org/2004/07/Fac.ERP.Modelo.Materiais").
        lok = hSAXWriter:INSERT-ATTRIBUTE("xmlns:fac1","http://schemas.datacontract.org/2004/07/Fac.ERP.Modelo.Status").
      
        lok = hSAXWriter:START-ELEMENT("soapenv:Header").
        lok = hSAXWriter:END-ELEMENT("soapenv:Header").
      
        lok = hSAXWriter:START-ELEMENT("soapenv:Body").
      
        lok = hSAXWriter:START-ELEMENT("tem:manterMaterial").
      
        lok = hSAXWriter:START-ELEMENT("tem:material").
      
        /*dados do item solicidado*/
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:EAN" , item.it-codigo).
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Quantidade" , string(quantidade)).
        /*lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Quantidade" , REPLACE(string(quantidade, '->>>,>>>,>>9.9999'), ',', '.')).*/
      
      
        lok = hSAXWriter:START-ELEMENT("fac:Status").
      
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac1:Codigo" , "1").
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac1:Efetivado" , "true").
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac1:Mensagem" , "?").
      
        lok = hSAXWriter:END-ELEMENT("fac:Status").
        CASE item.classif-abc:
            WHEN 1 THEN
                lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Curva" , "A").
            WHEN 2 THEN
                lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Curva" , "B").
            WHEN 3 THEN
                lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Curva" , "C").
        END CASE.
    
      
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Descricao" , item.desc-item).
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Excluir" , "false").
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Imagem" , "").
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Peso" , REPLACE(string(item.peso-bruto, '>>>,>>9.99999'), ',', '.')).
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:Tolerancia" , "10").
        lok = hSAXWriter:WRITE-DATA-ELEMENT("fac:UnidadeMedida" , item.un).
      
      
        lok = hSAXWriter:END-ELEMENT("tem:material").
      
        lok = hSAXWriter:END-ELEMENT("tem:manterMaterial").
      
        lok = hSAXWriter:END-ELEMENT("soapenv:Body").
      
        lok = hSAXWriter:END-ELEMENT("soapenv:Envelope").
      
        lok = hSAXWriter:END-DOCUMENT().
    
        DELETE OBJECT hSAXWriter.
    
        /*
        OUTPUT TO "c:\tmp\Gera.xml".
          EXPORT c-msg-xml.
        OUTPUT CLOSE.
        */
    
      /* Procedure invocation of manterMaterial operation. */
      RUN manterMaterial IN hISGAServico(INPUT c-msg-xml, OUTPUT manterMaterialResult).
    
      RUN pi-gerarXMLRetorno(INPUT manterMaterialResult).
      RUN pi-gerarXMLRetorno(INPUT c-msg-xml).
    
      RUN pi-ws-logout.
    
    
    END.
    
      
    
    Última edição: Fevereiro 11, 2014
  2. Rogerio

    Rogerio Moderator Moderador Equipe de Suporte

    Poderia postar tambem um XML gerado por esse seu programa?
  3. Rogerio

    Rogerio Moderator Moderador Equipe de Suporte

    Dei uma olhada no programa e fiquei com uma duvida... nas TAGs deve conter o valor 'fac:' ou somente o EAN??? tente remover os FAC, FAC1, etc... todos esses valores que estão antes dos ':' inclusive os ':', e tente rodar novamente.
  4. juliano

    juliano Sem Pontuação

    Se eu remover não roda segue um exemplo do XML gerado:
    Código:
    <?xml version="1.0" encoding="UTF-8" ?>
    <soapenv:Envelope xmlns:fac="http://schemas.datacontract.org/2004/07/Fac.ERP.Modelo.Materiais" xmlns:fac1="http://schemas.datacontract.org/2004/07/Facc.ERP.Modelo.Status" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
      <soapenv:Header>
      </soapenv:Header>
      <soapenv:Body>
        <tem:manterMaterial>
          <tem:material>
            <fac:EAN>0303240527</fac:EAN>
            <fac:Quantidade>13</fac:Quantidade>
            <fac:Status>
              <fac1:Codigo>1</fac1:Codigo>
              <fac1:Efetivado>true</fac1:Efetivado>
              <fac1:Mensagem>?</fac1:Mensagem>
            </fac:Status>
            <fac:Curva>A</fac:Curva>
            <fac:Descricao>BROCA WIDEA 6MM</fac:Descricao>
            <fac:Excluir>false</fac:Excluir>
            <fac:Imagem/>
            <fac:Peso>      0.00000</fac:Peso>
            <fac:Tolerancia>10</fac:Tolerancia>
            <fac:UnidadeMedida>UN</fac:UnidadeMedida>
          </tem:material>
        </tem:manterMaterial>
      </soapenv:Body>
    </soapenv:Envelope>
  5. Agnaldo

    Agnaldo Membro Ativo

    Juliano, será que precisa mesmo montar um XML.
    Rode o script do Progress (bprowsdldoc) que gera a documentação do WebService que esta acessando, algo como
    /dlc/bin/bprowsdldoc http://...........
    veja a documentação gerada.
    É provável que, ao invés de gerar um XML, possa apenas da RUN passando a temp com os dados.
  6. juliano

    juliano Sem Pontuação

    Eu ja havia rodado:
    Procedure prototype
    Código:
    
    PROCEDURE manterMaterial:
      DEFINE INPUT PARAMETER material AS LONGCHAR NO-UNDO.
      DEFINE OUTPUT PARAMETER manterMaterialResult AS LONGCHAR NO-UNDO.
    END PROCEDURE.
    
    Parameters
    Código:
    <!-- The following element is optional. The following element may have the 'xsi:nil="true"` attribute (it is nillable). --> <ns0:material xmlns:ns0="http://tempuri.org/" xmlns:ns1="http://schemas.datacontract.org/2004/07/Fac.ERP.Modelo.Materiais"> <!-- The following element is optional. The following element may have the 'xsi:nil="true"` attribute (it is nillable). --> <ns1:EAN>string-value</ns1:EAN> <!-- The following element is optional. --> <ns1:Quantidade>int-value</ns1:Quantidade> <!-- The following element is optional. --> <ns1:Status> <!-- The following element is optional. --> <ns2:Codigo xmlns:ns2="http://schemas.datacontract.org/2004/07/Fac.ERP.Modelo.Status">short-value</ns2:Codigo> <!-- The following element is optional. --> <ns2:Efetivado>boolean-value</ns2:Efetivado> <!-- The following element is optional. The following element may have the 'xsi:nil="true"` attribute (it is nillable). --> <ns2:Mensagem>string-value</ns2:Mensagem> </ns1:Status> <!-- The following element is optional. --> <ns1:Curva>int-value</ns1:Curva> <!-- The following element is optional. The following element may have the 'xsi:nil="true"` attribute (it is nillable). --> <ns1:Descricao>string-value</ns1:Descricao> <!-- The following element is optional. --> <ns1:Excluir>boolean-value</ns1:Excluir> <!-- The following element is optional. The following element may have the 'xsi:nil="true"` attribute (it is nillable). --> <ns1:Imagem>string-value</ns1:Imagem> <!-- The following element is optional. --> <ns1:Peso>decimal-value</ns1:Peso> <!-- The following element is optional. --> <ns1:Tolerancia>decimal-value</ns1:Tolerancia> <!-- The following element is optional. The following element may have the 'xsi:nil="true"` attribute (it is nillable). --> <ns1:UnidadeMedida>string-value</ns1:UnidadeMedida> </ns0:material>

Compartilhe esta Página