cancel
Showing results for 
Search instead for 
Did you mean: 

Múltiplas NFes de entrada em um email

Former Member
0 Kudos

Boa tarde senhores,

Há algumas semanas percebi que a implementação "padrão" que fizeram da NFe de entrada considera apenas uma nota por email (unbelievable!). Além disso, pega o primeiro anexo e toca ficha... se esse primeiro anexo for o pdf com a danfe, crash, óbvio.

Dei uma vasculhada no fórum e ninguém parece ter discutido sobre isso (ou cada um fez o seu e ficou por isso mesmo). Se alguém já teve de consertar isso e quiser partilhar a experiência, fique à vontade.

Se ninguém tiver feito isso ainda, vou começar a fazer amanhã um adpater module pra tratar vários xml's de entrada. Quem quiser ajudar fique à vontade, vou postando aqui o progresso.

T+

Waldemar

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Henrique,

Você tem razão, mas neste caso estamos lidando com dois cenários:

- Email to File (Custom);

- File to AbapProxy (Standard NFEB2B);

Já no primeiro cenário o Adapter Module faz a leitura dos anexos, o mapping faz o split para multiple messages e um canal file escreve os XMLs no diretório de destino. Funciona sem problemas.

[]´s

Marlo Simon.

Former Member
0 Kudos

Bom dia senhores,

Marlo, não fazemos movimentação de file... o cenário (até onde eu sei) é standard Email to abap Proxy.

O simples "quebrar" da mensagem em várias vai fazer com que seja chamado o abap proxy N vezes?

T+

Waldemar

henrique_pinto
Active Contributor
0 Kudos

Desculpa, mas eu nao tinha visto que vc tinha sugerido splitar em 2 cenarios. Assim sendo, com ctz funciona sem problemas.

Mas nao sei se isso vai ser necessariamente mais eficiente do que vc executar um BPM simples (que vc pode paralelizar), principalmente considerando o tempo de pooling do file sender adapter.

Vc chegou a testar o 1:n direto pro XI adapter pra ver o q dá?

Outra opcao (totalmente gambiarra++; crianças não tentem em casa) seria utilizar o SOAP Receiver Adapter pra enviar mensagem pro ABAP Proxy (colocar o Integration Engine como URL de recebimento do CC). Teria que dar uma olhada na XI Message (que nada mais é que uma mensagem SOAP) para avaliar os conteudos de SOAP Action, etc.

Abs,

Henrique.

henrique_pinto
Active Contributor
0 Kudos

> Bom dia senhores,

>

> Marlo, não fazemos movimentação de file... o cenário (até onde eu sei) é standard Email to abap Proxy.

> O simples "quebrar" da mensagem em várias vai fazer com que seja chamado o abap proxy N vezes?

>

> T+

>

> Waldemar

A sugestao dele (que eu tb acho que ele nao tinha feito antes, mas o médico falou que é melhor nao contrariar) foi justamente de quebrar o cenario Email-ABAP Proxy em 2 cenarios: Email-File (salvando em uma pasta) e File-ABAP Proxy (lendo dessa pasta e jogando pra interface *FB2B do GRC). O benefício seria que assim vc poderia fazer o 1:n na 1a perna sem necessidade de BPM; a 2a perna seria executada 1:1 pra cada NFe que tiver na pasta.

Se tiver tempo, faz os 2 cenários (split com File / BPM) e compara performance num stress test. O SCN agradece.

Abs,

Henrique.

Former Member
0 Kudos

Ok senhores, vou continuar com o BPM.

Fiz a configuração do BPM, e estou há uma hora com um maldito NO_RECEIVER_CASE_ASYNC. Já revisei os receivers uma dúzia de vezes, mudei os nomes da mensagens, eliminei e criei tudo denovo, o receiver está no cache, as informações de party, service, interface e namespace estão corretas... a mensagem vem com as informações corretas... bah, tudo correto, e não vai. O workflow tá executando ok, o problema ocorre no send step do cenário que já descrevemos.

henrique_pinto
Active Contributor
0 Kudos

No Integration Directory, vc fez a configuracao da interface BPM -> GRC?

Note que o sender interface vai ser sua interface abstrata e a receiver vai ser a interface inbound standard do GRC.

Abs,

Henrique.

PS: downside do BPM, vc vai ter q fazer 1 pra NFe e outro pra Cancelamento, ou criar interfaces abstratas genéricas (além de um multimapping que splite seja NFe seja cancelamento). Daí nessa interface BPM -> GRC, vc faz um IF no Interface Determination similar ao proposto no artigo de B2B Inbound (if CFB2B).

Former Member
0 Kudos

Henrique,

Sim, no ID tem a configuração do Email pro BPM e do BPM pro GRC.

O erro de no_receiver ocorre justo entre o BPM e o GRC.

Configurei este receiver assim:

sender

party: NFE_B2B_Party

service: NFB2B_INBOUND (o meu bpm)

interface: ABS_OUT_NFB2B_procNFe_OB (abstrata, do send step do bpm)

namespace: http://mynamespace/70/nfe/b2b/receiver

receiver

party: my_party

service: sap_sll_nfe

configured receivers

service: XD0_635 (client do PI do GRC)

receiver determination: NFB2B_enhProcNFe_IB

Pro mapping entre a interface abstrata e a concreta, tive que alterar o mapping standard NFB2B_procNFe_TO_enhProcNFe_IB, só mudando na verdade a messa interface de entrada do mapping...

O caso do cancelamento ok, eu tinha pensando em fazer o split no receiver determination mesmo.

henrique_pinto
Active Contributor
0 Kudos

Nao sei exatamente como está a sua configuracao, mas geralmente os BPMs sao criados sem Party no ID: vc tem ctz que o seu está dentro de uma party?

Ainda, no receiver determination mail to BPM, o BPM lá está com party tb?

Abs,

Henrique.

Former Member
0 Kudos

Argh! Que vergonha, com certeza deve ser isso.

Vou testar e te falo.

Thanks!

henrique_pinto
Active Contributor
0 Kudos

O Wizard é seu amigo...

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

Na verdade eu estava editando o cenário que já existe, por isso foi na mão... Mas era o maldito party mesmo. Importei o integration process debaixo do party por que já estava com o mail sender aberto lá, aí foi no automático...

Enfim, custom adapter ok, bpm ok. Na hora do teste, vi que o mapping não tá fazendo o split... Eu já imaginava que ia dar nisso. Vou explicar.

Quando criei as interface messages abstratas, apenas copiei a NFB2B_procNFe_OB e tornei-a abstrata. O schema na verdade não estava sendo respeitado (estava manipulando uma lista ao invés de uma única mensagem, como é o schema de fato). Fiz o mapping com xsl quebrando a mensagem, setei a cardinalidade 1:N no mapping, mas não consegui imaginar como o XSL ia fazer gerar mais de uma mensagem na saída. Dito e feito, não faz

Vou ter que criar um tipo novo com uma lista de nfeProc e fazer o mapping via mapping tool pra conseguir fazer o split... ou tem jeito de fazer via xsl mesmo?

T+

Waldemar

former_member182114
Active Contributor
0 Kudos

Bom dia Waldemar,

Tô adorando a discussão de vocês, mas num tenho tantos recursos pra ajudar... só lembrei de algo neste seu último post que talvez invalide o uso de XSLT para fazer o mapping e separação...

Como o email chegará com qualquer possibilidade de anexo, talvez uma "separação" hard-code filtrando o que é XML do que não é faz-se necessária para só disparar novas mensagens/split de XML entendido como válido e no caso de ser zip abrir e processar internamente... isto para evitar erros no processamento das interfaces do PI quando PDF, BMP, JPG (qq coisa exceto os 4 tipos de XML esperados)...

Ignora se falei besteira sobre este XSLT que você comentou...

Atenciosamente, Fernando Da Ró

Former Member
0 Kudos

Bom dia senhores,

Fernando, na verdade o processo está (até agora) assim:

1 - email chega com qualquer coisa em anexo

2 - criamos um adapter module customizado pra abrir o email, ler os anexos, juntar todos os anexos de nfe válidos e colocá-los na mensagem principal (que vai virar uma lista de nfeProc)

3 - encaminhamos essa mensagem para um ccBPM

4 - este ccBPM deve receber a mensagem, fazer um split pra pra cada nfeProc da lista e enviá-la pro grc.

O problema continua no split. Pensei em fazer esse split com xls, mas mesmo colocando 1:N no message mapping e no interface mapping, não está funcionando. Estou tentando fazer o mesmo mapping 1:N com xsl sem o bpm pra ver qual o erro.

former_member182114
Active Contributor
0 Kudos

Bom dia Waldemar,

Show de bola, agora entendi onde tá.

Seguinte, se der um erro no processamento do ccBPM ele para e não processa os próximos ou independe?

Apesar de ser muito fã da idéia de passar pelo disco, achei interessante a proposta de duas interfaces... uma abrindo e gravando em disco 1:N e outra para ler o disco e processar 1:1

Atenciosamente, Fernando Da Ró

henrique_pinto
Active Contributor
0 Kudos

Oi Waldemar,

dá pra fazer multimapping com Java/XSLT mapping sim, sem problemas.

A única coisa que vc tem que fazer é adicionar, manualmente em caso de Java/XSLT, as tags que o Message Mapping cria automaticamente qdo vc tem somatoria(cardinalidade) > 1 (ou seja, mais de uma mensagem ou uma unica mensagem multiline).

As tags são a (onde X E IN+, i.e., 1, 2, 3...).

Ainda, elas precisam estar no namespace "http://sap.com/xi/XI/SplitAndMerge" (pra nao confundir com os namespaces de seu XML interno, é boa prática vc forçar um namespace prefix específico nessas tags). Vc pode ver essas tags criadas no XML destino se vc criar um multimapping via message mapping de teste.

Enfim, a mensagem XML final teria que ser algo assim:

origem:

<nfeList>
   <nfeProc>...</nfeProc>
   <nfeProc>...</nfeProc>
   <nfeProc>...</nfeProc>
</nfeList>

destino:

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
   <ns0:Message1>
      <nfeProc>...</nfeProc>
      <nfeProc>...</nfeProc>
      <nfeProc>...</nfeProc>
   </ns0:Message1>
</ns0:Messages>

Mais informacoes, no forum de PI, p.ex. essas mensagens abaixo, que são antiiiigas, da época que eu gostava/tinha tempo de brincar por lá.

Abs,

Henrique.

Former Member
0 Kudos

Henrique, eu estava tentando bem por aí com o XSL.

O problema talvez tenham sido os namespaces, vou tentar com isso então.

Só uma diferença... no que eu estava tentando eu estava gerando a saída assim (só que sem os namespaces):


<ns0:Messages ns0:http://sap.com/xi/XI/SplitAndMerge>
   <ns0:Message1>
      <nfeProc>...</nfeProc>
   </ns0:Message1>
   <ns0:Message2>
      <nfeProc>...</nfeProc>
   </ns0:Message2>
   <ns0:Message3>
      <nfeProc>...</nfeProc>
   </ns0:Message3>
</ns0:Messages>

Note, eu estava criando um novo MessageN pra cada nfeProc...

henrique_pinto
Active Contributor
0 Kudos

Nao nao, vc precisa de 1 .

E o namespace é necessário, pois o parser busca exatamente aquela tag.

Qualquer coisa diferente, é considerado como parte do payload e nao informacao interna.

Abs,

Henrique.

Former Member
0 Kudos

Fernando, na verdade o erro que tenho no BMP é aquele maldito "Permanent error in BPE inbound processing", que pelo que pesquisei pode ser um milhão de coisas diferentes. Isso começou quando coloquei o mapping xsl que tá fazendo split no BMP, quando o mapping estava 1:1 não acontecia esse erro e o bpm ia até o fim, creio que o problema esteja aí.

O cenário com file ficaria mais simples de implementar mas mais complicado de manter. Usamos fileserver fora dos servidores sap, e essa conexão não é 100% (é 99,9%). Aí tem uns problemas (basis, não é minha praia também) que quando a conexão com o fileserver é perdida por milésimos de segundo que sejam, o mapeamento pra conexão se perde e ninguém fica sabendo... aí já viu, file not found exception e para tudo...

Vamos continuando com o bpm. Posto aqui os resultados assim que implementar a sugestão do henrique.

T+

Waldemar

Former Member
0 Kudos

Perfeito Henrique, entendi, um Message1 por type não por instância.

Provavelmente o problema estava por aí então.

Vamos ver se agora vai.

T+

Waldemar

henrique_pinto
Active Contributor
0 Kudos

> O cenário com file ficaria mais simples de implementar mas mais complicado de manter. Usamos fileserver fora dos servidores sap, e essa conexão não é 100% (é 99,9%). Aí tem uns problemas (basis, não é minha praia também) que quando a conexão com o fileserver é perdida por milésimos de segundo que sejam, o mapeamento pra conexão se perde e ninguém fica sabendo... aí já viu, file not found exception e para tudo...

Concordo, de maneira geral. Mas um ponto a mais na discussão é que o File Adapter é assíncrono, e mensagens assíncronas que falham são retried automaticamente pelo PI 5 minutos depois (até 3 retries, se nao me engano). Entao erros estocásticos desse tipo tendem a não ser permanentes.

Abs,

Henrique.

former_member182114
Active Contributor
0 Kudos

Show, então vamos em frente com o BPM e em paralelo conversa com o time de Basis se seria possível utilizar um espaço /tmp no próprio servidor apenas para a "passagem" dos XML's já que ele será lido e pode ser deletado na segunda perna da solução.

Atenciosamente, Fernando Da Ró

Former Member
0 Kudos

Pois então.

O problema continua no mapping 1:N.

A saída do XSL está ok... testei tanto com ferramenta externa quanto com a ferramenta de teste do interface mapping usando como source um xml que chegou no bpm, peguei via sxmb_moni. A saída tem

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
  <ns0:Message1>
    <nfeProc xmlns...>
    <nfeProc xmlns...>
    <nfeProc xmlns...>
  </ns0:Message1>
</ns0:Messages 

O erro que dá no BPM é o tal do Permanent error in BPE inbound processing... ou seja, não dá pra saber qual é o erro que ele tá achando no mapping (ou dá?). Tirando o mapping não dá o erro... e o processo só não termina porque não tem mensagem de saída do BPM...

Former Member
0 Kudos

Com relação ao file... o problema é que, quando a conexão com o file server "se perde", algumas vezes é necessário baixar o application do PI pra conseguir reestabelecer a conexão... Tem até oss aberta há algum tempo, mas essa situação aparentemente só acontece nos ambientes de desenvolvimento.

Usar o /tmp seria uma opção e podemos até vir a usar dessa forma, mas rasgo meu diploma se não conseguir fazer esse bpm ridículo funcionar, rsrs.

Outro problema que tenho percebido é que às vezes o deploy (do adapter module) pelo nwds aparentemente não atualiza o ejb no servidor. Mudo o fonte, faço o deploy, deploy ok e o adapter continua com o mesmo comportamento (como se não tivesse feito o deploy)... isso é uma "feature" comum? rsrs.

T+

Waldemar

henrique_pinto
Active Contributor
0 Kudos

vou tentar replicar aqui internamente pra testar.

Manda uns prints do BPM, mostrando as configs de todos os steps.

Abs,

Henrique.

henrique_pinto
Active Contributor
0 Kudos

Waldemar,

acho que te falei errado o resultado que tem que sair do mapping.

De fato, vc só pode ter , pois vc só tem um unico target message type, mas estou achando que vc só pode ter uma instancia do XML por cada tag Message1. Então teria que ser algo assim:

<ns0:Messages ns0:http://sap.com/xi/XI/SplitAndMerge>
   <ns0:Message1>
      <nfeProc>...</nfeProc>
   </ns0:Message1>
   <ns0:Message1>
      <nfeProc>...</nfeProc>
   </ns0:Message1>
   <ns0:Message1>
      <nfeProc>...</nfeProc>
   </ns0:Message1>
</ns0:Messages>

Testa aí se funciona (deve funcionar), daí eu corrijo lá na msg original.

Abs,

Henrique.

Former Member
0 Kudos

Ok Henrique,

Alterei o xsl. Na ferramenta de teste do mapping está saindo uma pra cada nfeProc. No BPM continuo recebendo o "Permanent error in BPE inbound processing"... se tiro o mapping funciona. Tem algum jeito de ver o erro do mapping no BPM? Porque ele não abre a tela do workflow quando dá esse erro, abre uma tela chamada LUW Data... não dá pra saber se algum step funcionou e como ficou a mensagem em cada step...

henrique_pinto
Active Contributor
0 Kudos

Entao, ele fala que o erro é no inbound processing, entao dá a entender que a msg nem entrou, talvez por isso vc nao vê o BPM.

De qq maneira, tente selecionar o "create transaction" flag em cada step, pq daí ele cria uma LUW pra cada step, em vez de fazer tudo numa transacao só.

Abs,

Henrique.

Former Member
0 Kudos

Perfeito, agora executou o BPM e parou no mapping.

Vou avaliar os logs pra ver qual é o problema.

Nesse meio tempo eu estava avaliando como o mapping tool faz o 1:N, e me parece fazer mais sentido mesmo da forma como vc sugeriu primeiro, uma pra todas as nfeProc... vou testando as duas formas.

T+

Waldemar

henrique_pinto
Active Contributor
0 Kudos

Eu nao sei como está o seu XSLT, mas talvez vc tenha q considerar que seu XML source vai ter as tags <ns0:Message>/<ns0:Message1> também.

Abs,

Henrique.

Former Member
0 Kudos

Sim, já está considerando. O Source para o XML está indo com .

henrique_pinto
Active Contributor
0 Kudos

Entao tenta o contrário, talez vc nao tenha q considerar o Messages/MessageX no source. Rs...

Abs,

Henrique.

Former Member
0 Kudos

Vou tentar remover os anexos do email e ver o que acontece... As unicas mensagens que começam com são os anexos...

henrique_pinto
Active Contributor
0 Kudos

O Mapping só é executado pro main payload.

Talvez o seu module nao tenha jogado o como mainpayload? Vê o PayloadSwapbean.

Abs,

Henrique.

Former Member
0 Kudos

Bom dia Senhores,

Voltando pra essa luta, rsrs.

Henrique, ontem à tarde virei o xsl do avesso e nada... tentei com um por instância, com um pra toda a lista, na entrada, na saída, nos dois lados, em nenhum... bah, tentei 18 combinações possíveis. O split simplesmente não acontece...

Executei em diversas situações o split no test do message mapping e coloquei o resultado fixo no xsl (pra não fazer o mapeamento, apenas gerar a mensagem como ela está saindo no teste do message mapping) e bingo! Funciona! Tem alguma coisa que acontece em runtime no mapping xsl que não acontece no teste do message mapping...

Pra por em produção, alterei o scenário pro adapter module customizado gravar os anexos direto no filesystem, e coloquei um file sender pra enviar cada arquivo pro GRC. Estou liberando agora pro pessoal testar em qualidade.

A propósito, Fernando, Marlo, se ainda estão acompanhando esta thread... O split pro file de qualquer forma seria feito no BPM, certo? Ou o file receiver com content conversion tem alguma configuração que possa ser usada pra fazer split?

Vou continuar avaliando o que tem nesse processo do xsl nas horas vagas... já pedi pra um desenvolvedor java avaliar o xsl, as mensagens, etc e tal, tudo "parece" correto. Se não tiver outra sugestão vou tentar debugar o mapping (já tenho uma idéia de como fazer pra parar o processamento no meio do bpm, mas não tenho idéia como o xsl é processado lá no abap, vamos descobrir).

Abraço!

T+

Waldemar

Former Member
0 Kudos

Henrique, com relação ao PayloadSwapBean, arranquei ele fora, já que agora quem está responsável pela mensagem é o custom adapter module.

henrique_pinto
Active Contributor
0 Kudos

Cara,

só posso concluir que sua mensagem output do XSLT não está exatamente igual ao que deveria ser. Algum namespace errado, prefixo indevido, declaracao do namespace faltando nas tags etc.

Abs,

Henrique.

Former Member
0 Kudos

Com certeza!

O problema é que isso só acontece quando a transformação xsl é executada no integration engine... no teste do mapping e em ferramentas externas a mensagem é gerada ok. E se eu pegar a mensagem gerada via teste do mapping ou ferramentas externas e colocá-la como saída do mapping, o split funciona no bpm. Então há uma diferença no resultado do mapping no integartion engine e o resultado do mapping fora dele.

henrique_pinto
Active Contributor
0 Kudos

> Com certeza!

>

> O problema é que isso só acontece quando a transformação xsl é executada no integration engine... no teste do mapping e em ferramentas externas a mensagem é gerada ok. E se eu pegar a mensagem gerada via teste do mapping ou ferramentas externas e colocá-la como saída do mapping, o split funciona no bpm. Então há uma diferença no resultado do mapping no integartion engine e o resultado do mapping fora dele.

O que vc está dizendo é que é feito em Runtime está diferente do que é feito na aba Test do Interface Mapping? Para o mesmo XSLT?

Daí é complicado, hein.

Você tem como jogar o payload gerado no runtime aqui? E o código do XSLT?

Quanto ao cenario file, vc nao vai fugir de fazer o multimapping...

Abs,

Henrique.

former_member182114
Active Contributor
0 Kudos

Bom dia Waldemar,

Continua acompanhando, mas por falta de experiência fico na torcida apenas.

Atenciosamente, Fernando Da Ró

former_member182503
Active Contributor
0 Kudos

Waldemar,

Olhando o defaultTrace você consegue pegar o exception que ocorre no seu XSLT Mapping, já tentou?

Fora isso, eu ia sugerir que você fizesse um "Caveman Debug".

Primeiro, eu criaria um java Mapping dummy que apenas geraria um arquivo .XML no filesystem com o input do mapping, gerando um output igual ao input. Na sequência, alteraria o Interface Mapping, colocando esse Java Mapping antes e depois do seu XSLT mapping, para poder ver o que está entrando no XSLT e o que está saindo.

Aí acho que talvez vc tenha algumas pistas do que possa estar acontecendo.

[]'s

JN

henrique_pinto
Active Contributor
0 Kudos

Outra opcao seria, se vc usa XMLSpy, usar o engine do XSLT processor do PI para execucao de XSLT (dá pra alterar isso nas preferencias). Basta apontar pro sapxmltoolkit.jar que vc pega do server (acho que era isso).

Mas isso deveria dar no mesmo que testar via aba Test do interface mapping...

Abs,

Henrique.

Former Member
0 Kudos

Bom dia Senhores,

Solução com o cenário email->file->grc em produção e bombando.

Agora que está rodando vou montar outro cenário com aquele xsl maldito e vou testando nas horas vagas pra ver onde é que eu fiz besteira, ou pra descobrir se há mesmo alguma outra diferença. Posto aqui as descobertas...

Henrique, acha interessante publicar alguma coisa disso? Vou ter que documentar o cenário atual de qualquer forma pra passar pra equipe de operação. A parte do custom adapter module lendo os anexos do email talvez seja interessante.

Desde já agradeço as discussões e o tempo dos senhores. Se aparecerem aqui no norte de santa catarina pago uma rodada de chopp

Waldemar

henrique_pinto
Active Contributor
0 Kudos

Com certeza!

Se você puder e quiser, por favor publique no wiki em Português, se for mais fácil pra você:

http://wiki.sdn.sap.com/wiki/display/Port/Home

Crie dentro de "SAP NFE".

Abs,

Henrique.

Former Member
0 Kudos

Ok, vamos publicando lá.

Não descobri ainda como colocar imagens... vou ler o how to do wiki.

A propósito, eu vi que algumas pessoas tinham citado que não conseguiam postar conteúdo lá... realmente, no editor rich text não rola (e a mensagem de erro que dá é de falta de permissão). Mas se abrir o editor wiki markup dá pra publicar sem problemas. Tentem lá.

T+

Waldemar

henrique_pinto
Active Contributor
0 Kudos

Oi Waldemar,

muito estranho vc ter erro de permissão no rich text mas não no markup.

Poderia por favor me mandar por email prints da mensagem de ero?

Deveria funcionar pros 2.

E com relação a fazer upload de imagens, dentro do seu wiki, tem uma aba attachments, basta vc ir nela, fazer upload das imagens. E no markup do wiki, vc coloca a imagem assim:

!exemplo.jpg!

(com as exclamações).

Abs,

Henrique.

Answers (14)

Answers (14)

Former Member
0 Kudos

Waldemar Roberti , bom dia !

Primeiramente gostaria de agradecer pelo material postado, realmente está sendo de grande ajuda! Parabéns.

Estou passando pelo mesmo problema aqui, segui os seus passos :

- Criei o desenvolvimento JAVA ( .EAR)

- O basis realizou o Deploy

- Alterei o CC NFB2B_MAIL_SND adcionando o novo custom module adapter

- Criei o novo CC Sender (CHN_SND_NFB2B) que lê os arquivos .xml

Mas a duvida surge exatamente nesse ponto :

Quem será o receiver do CHN_SND_NFB2B ?

Você realizou algum novo mapping ?

Abraços,

Luiz Carlos Souza

Former Member
0 Kudos

Waldemar,

Obrigado pela ajuda ! O restante do processo continua o standard.

Abraços!

Former Member
0 Kudos

Senhores, obrigado a todos pela discussão e pela ajuda. Publiquei lá no wiki um resumo da solução que desenvolvi com as discussões que tivemos aqui.

http://wiki.sdn.sap.com/wiki/pages/viewpage.action?pageId=233474286

Não está uma brastemp, minha primeira colaboração no wiki, mas já pode ajudar quem tiver problemas com custom adapter module.

Abraço! Qualquer coisa entrem em contato.

Waldemar Roberti

Former Member
0 Kudos

Waldemar,

Ficou show de bola, parabéns!

Até onde vai a minha compreensão do NFe 10.0 a maneira de como o PI vai ler emails não será contemplada de forma standard, ou seja, muita gente ainda vai precisar disso.

Vou aproveitar e complementar com outras dicas práticas que já enfrentei por ai.

[]´s

Marlo Simon

PS: Neste ano estamos estudando a viabilidade de um SAP Inside Track em São Leopoldo, você estaria interessando em ajudar?

PS2: Sobre o SIT

Former Member
0 Kudos

Blz Marlon, fique à vontade mesmo pra complementar.

Então, amanhã à tarde vai vir alguém da SAP (provavelmente funcional) com o Luciano pra conversar com os nossos funcionais sobre a NFe 10. Até por isso revisitei esse assunto e terminei o post lá no wiki pra lembrar. Confirmando-se a necessidade desse adapter módule customizado pra controlar a leitura dos anexos vamos alocar um tempo no projeto pra deixar isso mais redondo.

Com relação a um inside track em são leopoldo, realmente seria interessante. Estivemos lá conhecendo o labs há algumas semanas. Pode me envolver, com certeza.

T+

Waldemar

Former Member
0 Kudos

Waldemar,

Fiz o desenvolvimento de acordo com o apresentado, porém aparentemente esta "perdendo" um anexo,

você sabe o que pode estar acontecendo?

Obrigado,

Carlos Eduardo

Former Member
0 Kudos

Bom dia Carlos,

Essa thread está encerrada há tempo. Abra uma outra pra discutirmos o seu cenário, senão vamos causar bagunça.

Um abraço!

Waldemar

Former Member
0 Kudos

Olá SDNERS!

Muito interessante esta discussão, passei pelos mesmos problema para implementar um module processor para o Mail Adapter. Mas achei essa parte de jogar em um diretório e depois para o PI excelente!

A solução que tenho pronta monta um XML com todos os XMLs do anexo dentro dele, e no BPM é feito o split tanto para entrada normal quanto cancelamento.

O cenário é um pouco complexo pois uso alguns XSL e Java Mapping e um cenário adicional no Directory que processa as mensagens e envia para o cenário standard.

Tive muitos problemas com a manipulação do XML sem alterar o conteúdo, mas creio que agora já esteja 99% pronto. já tenho isso rodando em ambiente produtivo há mais ou menos 1 ano em alguns clientes.

Depois coloco o EAR para download pois ele já funciona pegando o 1 XML da NFe sem a necessidade de parâmetros no CC. E com um parâmetro a mais, ele pega todos os XMLs do e-mail.

Former Member
0 Kudos

Blz Waldemar,

Recapitulando a solução.

No cenário em que o adapter checa todos os payloads por XML válidos e cria um novo mainpayload com várias NFe's você já usa um Inteface Mapping. Neste IM adicione um Message Mapping com a mensagem de entrada com 1:N no formato de uma nova mensagem de saída.

Se o formato da nova mensagem é:

<Message><nfeProc> ... </nfeProc></Message>

Esta mensagem de saída contém todo o XML dentro da tag <nfeProc/>; e esta tag você usa no para escrever o File.

[]´s

Marlo Simon.

Interessante: Para o tratamento de erros que vão aparecer no dia a dia este modelo de dois cenários é muito mais simples de depurar.

Former Member
0 Kudos

Caros,

É claro que se pesquisarmos no Forum veremos que o crédito da concepção desta solução é do nosso companheiro José Nunes, que já deu inúmeros conselhos sobre o tema seja para mim ou para outros SDNners.

Além dos Kudos, poderíamos começar a colocar tudo isso no Wiki, se o nosso ilustre moderador liberar nossos acessos.

[]'s

Marlo Simon

henrique_pinto
Active Contributor
0 Kudos

> Além dos Kudos, poderíamos começar a colocar tudo isso no Wiki, se o nosso ilustre moderador liberar nossos acessos.

Cara,

nao sei pq vc nao conseguiu, diversas pessoas jah criaram paginas de teste, sem problemas.

Jah passei pro pessoal do SCN, de qq maneira.

Abs,

Henrique.

Former Member
0 Kudos

Waldemar,

Nossa, estamos dando a volta ao mundo para resolver isto, heheheh

Lembrando da idéia simplificada:

Cenário Email-to-File

1 - Adapter Module para gerar MT_MultiplasNFes


<MT_MultiplasNFes>
  <Anexos>
    <Anexo>
       <Nome_XML>
       <XML>
    </Anexo>
  ...
  </Anexos>
</MT_MultiplasNFes>

2 - Message mapping 1:N para split de Nfe's MT_NFe


<MT_NFe>
  <File>
       <Nome_XML>
       <XML>
  </File>
<MT_NFe>

3 - Gravar XML em diretório temporário no servidor - File Receiver (Content Conversion)

(Veja se vc tem acesso à AL11 e encontre um diretório com permissão de escrita)

File-to-Proxy standard

1 - Enviar o XML para o GRC apagando o XML

@DaRós

Ajuda ai convencer os caras

[]´s

Marlo Simon.

former_member182503
Active Contributor
0 Kudos

Marlo,

bela técnica, companheiro

[]'s

henrique_pinto
Active Contributor
0 Kudos

> Waldemar,

>

> Nossa, estamos dando a volta ao mundo para resolver isto, heheheh

Não entendi o piti.

O multimapping ele tem que fazer de qq maneira, seja pra BPM, seja pra cenario quebrado em 2.

Abs,

Henrique.

Former Member
0 Kudos

Waldemar,

Segundo o comentário do Henrique no último post, tem que testar para fazer sem BPM ou crie seu BPM e seja feliz.

No final das contas fica a critério do desenvolvedor. Para mim separar o problema em dois cenários torna a resolução de problemas mais simples.

Problemas é o que não vão faltar neste cenário, como costumo dizer "E-mail foi feito para humanos, não para sistemas".

Na prática apenas 90-95% dos emails são legíveis o resto sobra como um backlog a ser tratado.

[]´s

Marlo Simon.

henrique_pinto
Active Contributor
0 Kudos

> Problemas é o que não vão faltar neste cenário, como costumo dizer "E-mail foi feito para humanos, não para sistemas".

>

> Na prática apenas 90-95% dos emails são legíveis o resto sobra como um backlog a ser tratado.

Concordo que essa é a realidade, mas discordo que precisa ser.

O problema do email nao é que ele é feito pra humano, o problema é que ele é feito também pra humanos.

SMTP, a priori, é um protocolo de transferencia de mensagens (em geral, MIME) que vale tanto pra A2A qto pra A2X.

Emails que sao gerados por sistemas (enviado por XI, por exemplo), coetera paribus, depois de redondo, nao falha mais. Pode mandar 1 milhao, 1 milhao vai ser processado. Claro, se nao valer o coetera paribus, ou seja, se o admin mudar configs do mail server, mudar firewall, mudar o adsense, mudar o anti-virus etc., vai ferrar. Nesse ponto concordo que sao muitas variáveis, mais do que deveriam existir para uma comunicação A2A, justamente pq o admin tem que tratar o pior caso, que sao os emails gerados por humanos, para humanos.

No fim, por causa desses deltas, fica bem mais eficiente se vc tiver um web service ou algo do tipo.

Abs,

Henrique.

Former Member
0 Kudos

Henrique, concordo com relação ao email. E sim, nossos problemas são com emails gerados por humanos... af, essees humanos, rsrs. Nossos parceiros que enviam emails via sistema se encaixam perfeitamente no cenário standard.

Former Member
0 Kudos

Waldemar,

Não precisa ir tão longe. Para dividir o seu xml em várias mensagens você precisa apenas de um message mapping split de 1:n.

Edite o seu MM e na aba Messages mude a Ocurrence da Target Message para 0..Unbounded. Agora volte para a aba design, faça o mapping usando como mudança de contexto o Message Type original.

Link de Referencia:

#Cancelamento

Além da tag "".

Vou postar alguma coisa sobre a solução no Wiki em Português, podemos ir melhorando com a experiência de mais membros da comunidade.

[]'s

Marlo Simon

henrique_pinto
Active Contributor
0 Kudos

Do ponto de vista do mapping, perfeito, mas para suportar 1:n message split sem BPM, só pra adapters no Adapter Engine (Java based), e nesse caso, o receiver adapter é o ABAP Proxy. Nao sei se o XI Adapter conta como um adapter do AE, confesso que nunca testei.

http://help.sap.com/saphelp_nw70/helpdata/en/42/f3b31d48fb1bc8e10000000a11466f/frameset.htm

Abs,

Henrique.

Former Member
0 Kudos

Bom dia senhores,

Não existe a previsão de disponilização de Nota SAP para esse problema ?

Grato,

Regis Ferrato

Former Member
0 Kudos

Boa tarde senhores,

Então, depois das semanas de atropelo por causa do SAPForum, vamos voltar à programação normal.

O adapter module está pronto. Ele cria uma nova mensagem adicionando a esta mensagem todos os anexos que possuem uma NFE (procurei pela tag .

Já está testado e funcionando. Temos então chegando no integration engine o seguinte:

<nfeList>
   <nfeProc>...</nfeProc>
   <nfeProc>...</nfeProc>
   <nfeProc>...</nfeProc>
</nfeList>

Agora, pra executar várias requisições pro grc (uma pra cada em uma mensagem separada

3 - Block com o atributo mode setado pra ForEach

4 - Um sender dentro desse block pra enviar cada mensagem pra frente

Pro atributo message do receiver (1) é necessário uma mensagem abstrata. Fiz uma cópia da mensagem NFB2B_procNFe_OB e alterei-a pra abstrata, criei uma interface variable pra ela e associei ao receiver.

Para o transformation, source message é a mesma do receiver e para o target message criei uma nova interface variable de NFB2B_procNFe_OB, só que multiline. Aí vem a dúvida cruel. Embora a mensagem que eu esteja utilizando seja a NFB2B_procNFe_OB, o que vem do adapter engine não respeita esse schema, então fiz um mapping XSL pra quebrar a mensagem que entra em várias compatíveis com a NFB2B_procNFe_OB.

Para o block, o multiline element é a target message do transformation. Criei uma nova interface variable pro atributo current line tendo como container o block.

Para o sender configurei o atributo message com o current line do block.

Amanhã pela manhã vou fazer a configuração no directory, vamos ver se vai.

Tentei ser breve, intenção apenas de compartilhar o que estou fazendo. Se alguém encontrar alguma inconsistência no cenário, não deixe de dar um toque.

T+

Waldemar

Former Member
0 Kudos

Bom dia,

Temos o mesmo problema com multiplos arquivos em um e-mail.

Em nosso projeto teremos que fazer um "GAP" para tratar isso.

Alguém sabe se a SAP ja liberou ou está para liberar este tratamento em alguma nota ou versão do GRC?

Grato

Former Member
0 Kudos

Waldemar,

Verdade, com WD4Java é um processo semelhante. Acho que o teu NWDS está de mal humor

Normalmente na configuração do debug, Project > Browse, seria suficiente para encontrar o teu projeto EJB do adapter. Não esqueça de verificar na aba "Source" se o seu projeto está listado, senão inclua.

[]´s

Marlo Simon.

Former Member
0 Kudos

Henrique,

É preciso fazer um "live test" via PI:

- Deploy do AM (Adapter Module) feito no Web AS;

- AM configurado no Communication Channel;

- No NWDS: Breakpoints, Debug conectado;

- Envie um email para caixa de destino das Nfe's, espere o tempo do pooling (ou stop/start no CC Monitor);

- Game On!

[]´s

Marlo Simon

PS: Vou juntar meu material de AM e postar no Wiki. Que tal até a semana que vem?

henrique_pinto
Active Contributor
0 Kudos

Marlo,

seria muito legal!!!

Aliás, se vc quiser fazer (ou se já tiver) em portugues, podemos dar um jeito de liberar acesso pra vc já no wiki em PT.

Abs,

Henrique.

Former Member
0 Kudos

Fala pessoal, nessa eu posso ajudar!

Tem como DEBUGAR SIM! Mas você vai precisar de algumas coisas...

Um Custom Adapter Module nada mais é que um EJB Stateless portanto é possível através de uma conexão remota com a JVM do Stack Java.

Você vai precisar que:

- O stack Java esteja em modo Debug;

- Configurações de J2EE Server no NWDS;

- Configurações de Debug - Remote Java Application

Seguem links que mostram todo o caminho das pedras.

- Remote Debugging in the SAP NetWeaver Developer Studio

- Debugging Java EE Applications (SAP Library - Developing Java EE 5 Applications)

Boa sorte,

Marlo Simon

henrique_pinto
Active Contributor
0 Kudos

Opa, muito bom, Marlo.

Mas assim, até dá pra executar um EJB "qualquer".

Mas como vc faz pra chamar o custom module com os parametros necessários?

P.ex., uma XI Message com todo o header configurado + outros objetos instanciados (input module data etc.).

Abs,

Henrique.

Former Member
0 Kudos

Bom dia senhores,

Então, no meio dos incêndios, vamos continuar a brincadeira.

Marlo, eu já tinha imaginado que existia uma forma, e mesmo sem ter encontrado a documentação (li agora) estava seguindo o mesmo princípio do debug remoto pra webdynpro (conheço umas fumaças de webdynpro, não sou expert). Pedi ao basis de PI pra setar o debug mode on e depois de alguns percalços, o server está "debugable".

O detalhe é que quando eu vou criar uma configuração de debug j2ee, ao tentar selecionar o ear, simplesmente não aparece ear nenhum na lista (no manual está lá bonitinho, rsrs). Tenho abertos os dois projetos, o do ejb module e o do enterprise aplication. Já fechei e abri os dois várias vezes (nwds inclusive), mas nada de o enterprise aplication project aparecer na aba web object da configuração do debug. Tens alguma sugestão do que pode estar faltando?

Abraço!

Waldemar

former_member182114
Active Contributor
0 Kudos

Bom dia Waldemar,

Totalmente apoiado, as discussões neste sentido aqui realmente ficaram até o ponto do entendimento. Um outro caso também relacionado é o recebimento de vários XML's num arquivo compactado.

De antemão a sua contribuição já terá um lugar reservado no "Leia Antes de Postar".

Além do Wiki geral de NF-e.

Agradecidamente, Fernando Da Ró

henrique_pinto
Active Contributor
0 Kudos

Waldemar,

já discuti o tema com diversos parceiros, a maioria offline (i.e. nao pelo fórum), e alguns até se comprometeram a jogar aqui o código que utilizaram em seus modules de tratamento de múltiplos anexos. Mas até agora ninguém o fez de fato (sei como é, prazo e tal).

Se tiveres alguma dúvida no desenvolvimento, podemos trocar figurinhas, claro, e se pudesse jogar o resultado aqui no SCN (em um wiki por exemplo) seria ótimp.

Abs,

Henrique.

Former Member
0 Kudos

Claro, vamos fazer então e publicar.

Como nunca fiz um custom adapter module, e meu java só dá pro gasto, vamos descobrindo o caminho.

Baixei os pacotes com.sap.aii.af*;

Instalei o developer studio;

Criei um "primeiro" EJB (com base no documento "how to create modules for j2ee adapter engine") só pra ver como a coisa funciona (o código java só está emitindo audit logs pra eu entender como os objetos funcionam - por acaso tem javadocs em algum lugar dos com.sap.aii.af.*.jar ?);

Criada classe, registrada como ejb, criado pacote EAR;

Falta de permissão pro deploy em dev. Auxílio de basis pra tarefa.

Problema: na hora de fazer o EAR, o documento fala pra remover os jar de dependência "Make sure that the libraries are not inside the generated EAR file, or delete them with WinZip". Desse jeito não rolou o deploy. Gerei o EAR denovo, deixei os com.sap.aii.*.jar e então o deploy funcionou. Tem algum problema em deixar assim?

Deploy feito, configurar o mail sender adapter.

Novo module configurado como primeiro passo no module chain.

Dúvida: Não entendi a neecssidade de colocar parâmetros... o ModuleContext e o ModuleData já são carregados pela classe Module (pai que estou extendendo) ? Deixei sem parâmetros.

Testar. Executei a leitura de um email.

Nada na sxmb_moni, mau sinal.

Encontrei log de erro no comunication channel

exception caught during processing mail message com.sap.aii.af.mp.processor.ModuleProcessorException: Error during processing local bean: localejbsreadMultipleAttachment caused by: java.lang.ClassCastException: class com.sap.aii.af.mp.module.ModuleLocalHomeImpl0_0 can not be casted to ModuleLocalHome or SModuleLocalHome

Essa não entendi. Aparentemente o meu readMultipleAttachment não foi instanciado por erro no tipo da interface (mas as interfaces vieram de sap.com.aii.af*... standard...) Tem como debugar isso?

Se puderem me ajudar, agradeço.

T+

Waldemar

Former Member
0 Kudos

Como o esperado, o erro de deploy era culpa da inexperiência. Adicionadas as referências corretas no arquivo de configuração application-j2ee-engine.xml e removidos os jar de dependência do ear, deploy feito com sucesso.

Pro teste denovo: Executei a leitura de um email.

Mensagem na sxmb_moni, bom sinal.

Log do comunication channel com todos os AuditLogs que eu coloquei. Muito bom.

Agora é escrever a lógica da brincadeira.

Continuo achando que seria interessante ter uma forma de debugar isso... tem?

T+

Waldemar

Edited by: Waldemar Roberti on Mar 11, 2011 5:07 PM

henrique_pinto
Active Contributor
0 Kudos

Waldemar,

verifique se vc nao está fazendo o build localmente (eclipse) numa JDK de versão diferente da versão da JDK do AS JAva onde está sendo feito o deploy (se for PI 7.0, é J2EE, ou seja, JDK = 1.4.x).

Ainda, com relacao à geracao do EAR, vc está usando desenvolvimento em Development Components?

Se sim, vc pode criar um DC do tipo Library pra adicionar os .jars pre-reqs, e coloca esse DC Library como dependencia do seu DC do EJB, que por sua vez é dependencia do DC de Enterprise Application (que gera o EAR). Quando gerar o EAR, os .jars do DC Library nao sao incluidos no EAR por default.

Abs,

Henrique.

Former Member
0 Kudos

Bah, postamos na mesma hora Henrique,

PI 7.0, java 1.4, tudo certo agora.

Não fiz DC dessa vez, fiz um projeto local e pedi pro basis fazer o deploy do ear via visual admin. Mas me parece ser bem melhor prática fazer com DC então. Vou fazer funcionar, depois refaço com DC. Até aqui está parecendo simples.

Maior dificuldade: ainda não descobri como debugar isso...

T+

Waldemar

henrique_pinto
Active Contributor
0 Kudos

Debug nao tem muito o que fazer. É inserir log/trace mesmo, e setar o level pra "debug" ou "info" no log configurator pra sua location/category.

http://help.sap.com/saphelp_nw70/helpdata/en/f4/d1e6418b7eca17e10000000a155106/frameset.htm

Ou, se quiser facilitar, só joga pro audit log (veja o exemplo no sample module).

Aliás, tem javadoc das classes de module lá no SDA do sample module também.

http://help.sap.com/saphelp_nw70/helpdata/en/87/3ef4403ae3db12e10000000a155106/frameset.htm

Abs,

Henrique.