quarta-feira, 8 de agosto de 2018

Webservice sem montar estrutura WSDL

  A experiência faz toda diferença..   Eu coloquei alguns posts referente ao envio de arquivo para o SEFAZ do estado do ES e PE, onde montei um WSDL para ser importado no SAP e assim criar as estruturas automaticamente, basicamente no programa era só colocar os valores nos campos da estrutura criada.  EIS QUE.

  Tem um problema nesse esquema, que no começo funcionou, mas tive problema com alguns clientes. Como a estrutura era standard na montagem do XML para envio o SAP automaticamente coloca o namespace nas tags  e isso em alguns casos começaram a dar erro.  Quebrei a cabeça por um bom tempo e percebi que eu poderia manter o WSDL original do SEFAZ e montar manualmente o XML antes de enviar o proxy. No caso do ES eu tive que fazer uma modificação no WSDL para poder funcionar, mas sem criar campos. 

Falando na prática.

no WSDL no exemplo abaixo. o duaEmissao é a tag principal e abaixo vai as outras tags de valores, quando eu fiz a primeira vez criei todos os campos manualmente no WSDL, no caso abaixo ficou com um elemento <S:ANY>. Quando importado esse WSDL esse elemento é criado no SAP com typo RAWSTRING.

      <s:element name="duaEmissao">
        <s:complexType mixed="true">
            <s:sequence>
                <s:any />
            </s:sequence>
        </s:complexType>
      </s:element>

No programa. criei um campo tipo string e concatenei todo o meu XML.

DATA: l_xml TYPE string.

      CONCATENATE
           '<duaDadosMsg xmlns="http://www.sefaz.es.gov.br/duae">'
           '<emisDua versao="1.01">'
           '<tpAmb>1</tpAmb>'
           '<cnpjEmi>07592315000114</cnpjEmi>'
           '<cnpjOrg>27080571000130</cnpjOrg>'
           '<cArea>4</cArea>'
           '<cServ>1384</cServ>'
           '<cnpjPes>28614242000194</cnpjPes>'
           '<dRef>2018-08</dRef>'
           '<dVen>2018-09-30</dVen>'
           '<dPag>2018-09-30</dPag>'
           '<cMun>57053</cMun>'
           '<xInf>teste</xInf>'
           '<vRec>119.06</vRec>'
           '<qtde>1</qtde>'
           '</emisDua>'
           '</duaDadosMsg>'
           INTO l_xml.


 converto para uma variável tipo XTRING.

   DATAl_xstr TYPE xstring.

      CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
        EXPORTING
          text   l_xml
        IMPORTING
          buffer l_xstr
        EXCEPTIONS
          failed 1
          OTHERS 2.

Atribuo esse valor convertido ao meu campo ANY.

lw_emi_in-any l_xstr.

E chamo proxy.

      CALL METHOD lo_proxy->dua_emissao
        EXPORTING
          input  lw_emi_in
        IMPORTING
          output lw_emi_out.


================================

Para ver como ficou montado o XML, pode usar a função abaixo, q convert o xtring em uma tabela XML. Eu utilizo para verificar o retorno que para mim também vem com um campo tipo RAWSTRING.

      CALL FUNCTION 'SMUM_XML_PARSE'
        EXPORTING
          xml_input l_xstr
        TABLES
          xml_table lt_xml
          return    t_ret.