cancel
Showing results for 
Search instead for 
Did you mean: 

Gravar XML Diretório de rede ou local

Former Member
0 Kudos

Pessoal, Bom Dia!

Estou desenvolvendo no PI um funcionalidade que depois do Envio do E-mail automático, será gravado em um determinado diretório o XML.

Só que me peguei na seguinte situação, no Mapping eu precisaria colocar cada vez um nome de arquivo no XML, senão sempre irá sobregravar. Pensei em colocar nfe_numero.xml, porem no Mapping do E-mail não tenho referencias da NFE.

Teria como eu colocar alem da Definição Externa NTB2B_NFeToB2BReceiver + alguma outra Definição que tem o NFE juntos no mesmo Mapping, ou algo assim?

Alguem poderia me ajudar?

Obrigado

Abraço,

Bruno

Accepted Solutions (1)

Accepted Solutions (1)

henrique_pinto
Active Contributor
0 Kudos

Bruno,

utilize os parametros standard do Receiver File Adapter p/ geracao do nome do arquivo.

Se vc quiser a solucao + simples, utilize a opcao "Add timestamp".

Se quiser por algum dado da NFe no nome do arquivo, utilize a funcionalidade de Variable Substitution. Para a chave de acesso, vc pode ler do campo (nao dah pra ler o Id da NFe mesmo, pois o variable substitution nao suporta ler o valor de attributes, só dos nodes XML mesmo).

Mais detalhes em: http://help.sap.com/saphelp_nw2004s/helpdata/en/bc/bb79d6061007419a081e58cbeaaf28/frameset.htm

Abs,

Henrique.

Answers (1)

Answers (1)

former_member182114
Active Contributor
0 Kudos

Bom dia Bruno,

Não sei se é isto que você está precisando. O Henrique fez um artigo e nele demonstra como preencher via UDF a chave de acesso no subject do email.

Além disto, pode-se utilizar algo parecido para alterar o nome do anexo para um personalizado (acho que usando as mesmas técnicas). Veja em: Adapter Module PI 7.0 Set Attachment Name

Abraços,

Fernando Da Ró

henrique_pinto
Active Contributor
0 Kudos

Fernando,

utilizar dynamic configuration + enhancement do mapping para isso é como utilizar uma bazuca para matar formiga. Nao precisa, o variable substitution ou mesmo o timestamp atende.

E o Set attachment name nao se aplica a esse caso, apenas quando se tem email (pois ele seta o Content Disposition, que só faz sentido em msgs MIME).

Abs,

Henrique.

former_member182114
Active Contributor
0 Kudos

Quem sabe faz ao vivo. Thanks Henrique

Former Member
0 Kudos

Henrique,

Criei uma função no Mapping:

...

InputStream in = new ByteArrayInputStream(xml.getBytes("utf-8"));

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

Document doc = builder.parse(in);

Node node = (Node) doc.getElementsByTagName("infNFe").item(0);

if (node.hasAttributes() && !node.getAttributes().getNamedItem("Id").equals(""))

{

String strFileName = node.getAttributes().getNamedItem("Id").getNodeValue();

String strNf = doc.getElementsByTagName("nNF").item(1).getFirstChild().getNodeValue();

strFileName += "NF" + "-" + strNf;

DynamicConfiguration conf = (DynamicConfiguration) container

.getTransformationParameters()

.get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);

DynamicConfigurationKey key = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/File","FileName");

conf.put(key, strFileName);

}

...

porem na SXMB_MONI, está com a seguinte mensagem

The Adapter Message Property 'FileName' was configured as mandatory element, but was not supplied in the XI Message header: com.sap.aii.adapter.file.configuration.DynamicConfigurationException: The Adapter Message Property 'FileName' was configured as mandatory element, but was not supplied in the XI Message header

No message monitoring: Error Category XI_J2EE_ADAPTER_FILE

Error Code PROCESSING_ERROR

Em resumo está com erro..rs rs porem ainda estou correndo atras de como resolver, será que você conseguiria me ajudar? Ou alguma dica para clarear...

Obrigado!

Abraço,

Bruno

henrique_pinto
Active Contributor
0 Kudos

Eu falei outras solucoes mais simples mas vc preferiu usar a mais complicada. 😛

De qq maneira, verifique se seu codigo está sendo executado mesmo.

Vc criou esse message mapping mas adicionou ele a um Interface Mapping?

Colocou esse Interface Mapping no Interface Determination (no Directory)?

Veja na SXMB_MONI se ele está alimentando o dynamic configuration (ele deveria mostrar outro XML embaixo do payload). Para ver isso, vc precisa estar com o parametro LOGGING = 1 na SXMB_ADM.

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

É realmente criei da forma mais complicada, mas o cliente quer assim...

Criei o Message Mapping e associei na Interface Mapping NTB2B_procNFe_TO_procNFe

No Mapping Program está na seguinte ordem:

1 - MM de Enviar E-mail

2 - MM de Gerar no Diretório

3 - Java Class

Coloquei sim, só que coloquei associando a um outro Party e Receiver com Channel do tipo File.

Configurei tudo no Integration Scenario..

Na SXMB_MONI, não tem nada do Dynamic Configuration para esse erro... única coisa que achei que pode ajudar é

- <SAP:Ack xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:mustUnderstand="1">

<SAP:Status>Error</SAP:Status>

<SAP:Category>transient</SAP:Category>

</SAP:Ack>

Não está passando na código executado, agora está me faltando experiencia para encontrar um pq disso.

Agradeço muito pela ajuda!

Abraço,

Bruno

henrique_pinto
Active Contributor
0 Kudos

Bruno,

ele está reclamando que o atributo "FileName" é requerido no adapter (vc deve ter marcado o flag, correto?) mas nao está preenchido.

Aparentemente seu codigo nao está sendo executado.

Como vc associou ao Interface Mapping?

Vc fez o que está explicado no artigo do B2B ou vc modificou o standard?

Se sim, confirme se o Interface Determination está executando o standard (SWCV = SAP SLL-NFE 1.0) ou se está referenciando o SWCV Z que vc criou.

Outra coisa, vc testou seu codigo?

Ele está funcionando?

Eu colocaria uma string fixa primeiro e depois faria a leitura do XML.

Att.

Henrique.

Former Member
0 Kudos

Henrique,

Correto está com Flag no Adapter.

O FileName estou tentando configurar pelo Dynamic Configuration no MM.

No Interface Determination está referenciando o B2B que eu criei para envio de e-mail, você me falando isso estou pensando que o erro pode estar por ai... Teria que criar mais um SWCV Z para fazer essa funcionalidade de gravação do XML na rede, ou estou errado?

Mais uma vez obrigado!

Bruno

henrique_pinto
Active Contributor
0 Kudos

Bruno,

para vc ter incluido seu MM no Interface Mapping, ou vc modificou o Interface Mapping standard ou vc criou um novo dentro de um SWCV Z criado por vc.

O que perguntei foi qual metodo vc usou?

E se vc usou a criacao de um novo, pedi pra vc checar qual interface mapping que está referenciado no Interface Determination, nao qual party vc está usando.

Verifique isso novamente:

- vc modificou o IM standard ou criou um novo?

- qual interface mapping está referenciado no interface determination?

Henrique.

Former Member
0 Kudos

Henrique,

Dentro do SWCV Z para B2B, foi criado um namespace onde criei o Message Mapping e dentro desse mesmo SWCV Z nos Objetos Basicos namespace http://sap.com/xi/NFE/005a, modifiquei a IM NTB2B_procNFe_TO_procNFe, apenas adicionando mais um Message Mapping no Mapping Program, ficando da seguinte forma:

1 - MM de Enviar E-mail namespace criado Z

2 - MM de Gerar no Diretório namespace idem ao 1

3 - Java Class http://sap.com/xi/NFE/005a

(tirei com base seu artigo do e-mail, que já tinha feito e deu certinho)

IM referenciado no Interface Determination

Name.: NTB2B_procNFe_TO_procNFe

Namespace: http://sap.com/xi/NFE/005a

SWCV.: B2B of Cliente

Obrigado,

Bruno

henrique_pinto
Active Contributor
0 Kudos

Vc testou seu codigo?

Funciona corretamente?

Vc pode adicionar traces para ver se ele está executando como esperado.

Está tudo ativado, no IR e no ID?

Se estiver tudo ok, há sempre a possibilidade de ser cache...

Tente um full cache refresh na SXI_CACHE e, se nao resolver, um CPA full Cache refresh.

Abs,

Henrique.

former_member182114
Active Contributor
0 Kudos

Não sei se vc fez este teste que o Henrique comentou.

Isole seu problema, teste apenas se está setando o filename com um código bem simples, depois vc personaliza o nome.

Fora do IF relacionado a leitura da tag NFe.

conf.put(key, "arquivo.xml");

Ou seja bem radical, provoque um null pointer acess para "provar" que seu código foi executado.

Former Member
0 Kudos

Henrique e Fernando,

Nada como a simplicidade... 😛

No Mapping fiz a funçao Java ligando procNfeStr -> Função -> procNfeStr

AbstractTrace trace = container.getTrace();

try

{

DynamicConfiguration conf = (DynamicConfiguration) container

.getTransformationParameters()

.get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);

DynamicConfigurationKey key = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/File","FileName");

conf.put(key, "NFE_.xml");

DynamicConfigurationKey key1 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/File","Directory");

conf.put(key1, "C:/temp");

}

catch (Exception e)

{

trace.addWarning("Failed Message Mapping SAVE_IN_DIRECTORY" + e);

}

return xml;

No Canal de Comunicação:

File Construction Mode = Add Time Stamp (vlw Henrique)

Adapter-Specific Message Attributes

X - use adapter-specific Message Attributes

X - Fail if specific Message Attributes Missing

X - File Name

X - Directory

O resto sem Flag.

Agradeço muito pela ajuda, as vezes melhor simplificar!

E mais um desenvolvimento para NFE, feito.

Abraço,

Bruno

henrique_pinto
Active Contributor
0 Kudos

Bruno,

mas pra fazer nome fixo vc nao precisava de dynamic config, apenas do comm channel.

Falta agora entender pq estava falhando o retrieve dos dados do XML.

Tente arredondar o codigo localmente no dev studio/eclipse e soh depois colocar lah na UDF.

Abs,

Henrique.