on 03-29-2012 8:28 PM
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
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
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.
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.
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.
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.
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.
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.
User | Count |
---|---|
15 | |
4 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.