cancel
Showing results for 
Search instead for 
Did you mean: 

Estrutura CHOICE - Consulta Cadastro

former_member643919
Participant
0 Kudos

Boa tarde,

Estou desenvolvendo a interface de consulta do cadastro do contribuinte.

Fiz todas as configurações no PI e estou implementando a classe proxy.

Para esta interface, tenho 3 opções de consulta: IE, CNPJ ou CPF.

Ao testar via SoapUi, só consegui fazer funcionar, quando retirei as tags CPF e IE.

Pois bem, na estrutura criada pelo proxy, tenho a estrutura CHOICE, com os campos SELECTION, IE, CNPJ e CPF.

Estou passando como parâmetro o campo SELECTION com a string 'CNPJ', o IE em branco, CNPJ com valor e CPF em branco.

Ao chamar a classe proxy, estou recebendo a exceção CX_ST_DESERIALIZATION_ERROR.

E ao analisar a estrutura inbound preenchida, reparei que a classe mudou o preenchimento da estrutura SELECTION para 'IE' e lançou o campo IE com '000'.

Com isso dá erro no schema XML.

Pesquisei sobre o assunto e não encontrei nada.

Alguém pode me ajudar?

Abs,

Flavio

Accepted Solutions (0)

Answers (1)

Answers (1)

former_member643919
Participant
0 Kudos

Olá,

Identifiquei que o problema, na realidade, é o deserialization da tag dhCons.

Me parece ser um erro standard, assim como aconteceu com a interface NFESC, descrito na thread http://scn.sap.com/thread/2002000 para o campo dhRecbto.

Alguém já enfrentou este problema ou será que devo abrir um chamado em SLL-NFE?

Abs,

Flavio.

henrique_pinto
Active Contributor
0 Kudos

Nao se aplica abrir chamado, esse nao é um proxy standard!!

Vc pode ir direto na estrutura que o proxy cria e trocar o tipo do campo DHCONS de XSDDATETIME_Z para STRING.

former_member643919
Participant
0 Kudos

Oi Henrique,

Verdade. Depois que me toquei.

Já havia feito o que indicou e iria postar o resultado aqui. Olhei a nota para corrigir a NFESC e fiz o mesmo para a CONSCAD.

Funcionou.

Agora o problema voltou a ser a estrutura CHOICE, que parece que não está surtindo efeito. Eu olho o XML Outbound, e fica preenchido corretamente. porém, no Inbound, ele retorna com o choice em outro campo.

Obrigado.

Abs,

Flavio.

henrique_pinto
Active Contributor
0 Kudos

Como assim com o choice em outro campo?

Cole uns prints e/ou código please.

Me parece que vc tem choices na ida e volta e que no XML da volta tá entrando no ABAP com selection no campo errado, é isso?

Se vc tem um choice, vc só pode ter uma das tags existentes no XML e preechida com valor.

Veja se seu XML de retorno está assim, e nao com mais de um campo e/ou com campo em branco.

former_member643919
Participant
0 Kudos

Henrique,

Bom dia. Obrigado pelo retorno.

Testando pelo SoapUi funciona perfeitamente a consulta.

Porém, quando testo diretamente no SAP, não.

Vou tentar detalhar um pouco mais:

Segue o código que incluí na função:

DATA: lo_clproxy  TYPE REF TO zco_conscad_nfe_consulta_cadas,
         lo_sys_exc  TYPE REF TO cx_ai_system_fault,
         ls_outbound TYPE zconsulta_cadastro21,
         ls_inbound  TYPE zconsulta_cadastro_response21,
         lv_error    TYPE string.

   ls_outbound-consulta_cadastro2-c_uf = cuf = '29'.
   ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-x_serv = 'CONS_CAD'.
   ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-uf = dados-inf_cons-uf = 'BA'.

   dados-inf_cons-cnpj = '96731534000167'.
*  dados-inf_cons-ie = '37120700'.

   IF NOT dados-inf_cons-ie IS INITIAL.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-ie = dados-inf_cons-ie.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-selection = 'IE'.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-cnpj = ''.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-cpf = ''.
   ELSEIF NOT dados-inf_cons-cnpj IS INITIAL.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-cnpj = dados-inf_cons-cnpj.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-selection = 'CNPJ'.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-ie = ''.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-cpf = ''.
   ELSEIF NOT dados-inf_cons-cpf IS INITIAL.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-cpf = dados-inf_cons-cpf.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-selection = 'CPF'.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-ie = ''.
     ls_outbound-consulta_cadastro2-nfe_dados_msg-cons_cad-inf_cons-choice-cnpj = ''.
   ENDIF.

   TRY.
*       Create proxy client
       CREATE OBJECT lo_clproxy.

*       Do synchronous client proxy call
       TRY.
           CALL METHOD lo_clproxy->conscad_nfe_consulta_cadastro
             EXPORTING
               output = ls_outbound
             IMPORTING
               input  = ls_inbound.

         CATCH cx_ai_system_fault INTO lo_sys_exc.
*           Error handling
           RAISE erro_consulta.
       ENDTRY.
     CATCH cx_ai_system_fault INTO lo_sys_exc.
*       Error handling
       RAISE erro_consulta.
   ENDTRY.

Estou fazendo o choice pelo CNPJ. Quando executo, parece que o XML Outbound está sendo montado corretamente:

Porém, estou tomando o erro Falha no Schema XML, e no XML, aparece o choice em outro campo (IE). Estou estranhando esse 000 no valor.

Estou imaginando que o erro deva estar no Response do Interface Mapping... Cheguei a utilizar uma cópia modificada do mapeamento genérico, utilizado nas maiorias dos cenário NFe (GENERIC_SOAP12OutConverter). Porém, imagino que não possa utilizá-lo, por causa do choice (pois preciso mapear apenas a tag com valor). Por isso, estou utilizando um XSD para atribuir os valores a um MT e adicionei um message mapping para incluir a lógica nas tags do CHOICE.

Código do XSD:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsl:template match="/">

        <xsl:element name="ns0:mt_ConsCad_v200_response" namespace="HTTP://   /xi/NFE/006">

            <xsl:element name="retConsCad">

                <xsl:element name="versao">2.00</xsl:element>

                <xsl:apply-templates select="//*[local-name()='Body']/*[local-name()='consultaCadastro2Result']/*[local-name()='retConsCad']/*"/>

            </xsl:element>

        </xsl:element>

    </xsl:template>

    <xsl:template match="@*|node()">

        <xsl:choose><!-- This is to restrict the length of the content of the xMotivo tag to 255 characters. -->

            <xsl:when test="local-name()='xMotivo'">

                <xsl:copy>

                    <xsl:value-of select="substring(.,1,254)"/>

                </xsl:copy>

            </xsl:when>

            <xsl:otherwise xml:space="">

                <xsl:copy xml:space="">

                    <xsl:apply-templates select="*"/>

                </xsl:copy>

            </xsl:otherwise>

        </xsl:choose>

    </xsl:template>

    <xsl:template match="*">

        <xsl:element name="{local-name()}">

            <xsl:apply-templates select="@* | node()"/>

        </xsl:element>

    </xsl:template>

</xsl:stylesheet>

E abaixo um exmplo do mapeamento que estou fazendo para as 3 tags do CHOICE (IE, CNPJ e CPF):

Por essa explicação, consegue ter uma idéia do que pode ser?

Muito obrigado pela atenção.

Abs,

Flavio.

henrique_pinto
Active Contributor
0 Kudos

Flavio,

vc chegou a debugar o programa ABAP antes de responder a msg?

Provavelmente, o campo IE está como NUMC no ERP ou mesmo na interface RFC, e daí vem o valor "000". Nesse caso, o check "not xxx is initial" nao se aplica. Provavelmente a IE vem preenchida nos seus testes simplesmente pq ela está antes, no seu código...

Dê uma olhada na funcao /XNFE/006_SIGN_NFE_OUT para ver o tipo de tratamento que o standard faz com campos similares.

Abs,

Henrique.

former_member643919
Participant
0 Kudos

Oi Henrique,

O campo não está como NUMC na RFC, nem nas estruturas proxy criadas. Em todos está como string. Tanto no outbound quanto no inbound.

Estou testando direto pela RFC, no GRC. E sim, já debuguei... Os campos da estrutura choice no outbound não estão preenchidos com 0, estão em branco.

Vou seguir quebrando a cabeça aqui...

Obrigado,

Flavio.

former_member643919
Participant
0 Kudos

Henrique,

Apenas pra que eu possa focar minha análise ...

Vc tem idéia se o problema está no mapeamento da interface outbound ou inbound?

Venho destinando minha atenção ao inbound pq vejo no monitor que o xml está sendo montado corretamente para envio à Sefaz.

Porém, pela sua resposta passei a considerar que o erro pode estar no outbound.

Obrigado

Flávio.

henrique_pinto
Active Contributor
0 Kudos

Oi Flavio,

cole aqui o XML do outbound que sai pra SEFAZ.

former_member643919
Participant
0 Kudos

Oi Henrique,

Conferi no exemplo da SEFAZ RS e parece que está certo o XML Outbound.

Segue a tela do debug pra mostrar que estou passando apenas o CNPJ...

Porém, o que me causou estranheza foi o seguinte...

Testando pelo SoapUi, eu recebo o mesmo erro, caso eu passe as tags do choice em branco...

Seguem as telas com o procedimento que dá erro e depois, retirando as tags, a consulta com sucesso.

Obrigado novamente.

Abs,

Flavio.

former_member643919
Participant
0 Kudos

Boa tarde,

Descobri o que estava faltando... Como podia supor, era algo bem simples.

Faltava informar a versão do XML na mensagem Outbound.

Agora a consulta está funcionando.

Obrigado,

Flavio.