cancel
Showing results for 
Search instead for 
Did you mean: 

Alteração Nome Arquivo XML B2B + Corpo do E-mail

Former Member
0 Kudos

Bom dia.

Estamos com uma demanda para alteração do nome (dinamico) do arquivo XML enviado para os clientes e

outra alteração para colocar um texto no corpo do e-mail (tambem dinamico) enviado.

Vi que tenho que utilizar o Adapter Framework do Partner Connectivity Kit (PCK).

Temos os seguintes componentes no nosso PI:

SAP_ABA - 700 - 0019

SAP_BASIS - 700 - 0019

PI_BASIS - 2006_1_700 - 0009

ST-PI - 2008_1_700 - 0000

SAP_BW - 700 - 0021

SLL-NFE - 100 - 0011

ST-A/PI - 01L_BCO700 - 0000

Minha dúvida (por enquanto) é. Quais componentes e/ou ferramentas adicionais vou precisar instalar para

começar a desenvolver um Adapter Module?

Accepted Solutions (1)

Accepted Solutions (1)

henrique_pinto
Active Contributor
0 Kudos

Bernardo,

vc nao precisa instalar nada no seu servidor!

Vc vai desenvolver em plataforma Java, pois o Module é deployado no Adapter Engine do PI.

Vc só precisa instalar o Netweaver Developer Studio, mas ele é instalado localmente na sua maquina.

Veja esse artigo com detalhes do desenvolvimento de um module: http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/f013e82c-e56e-2910-c3ae-c602a67b918e

Para um sample code, va no wiki: https://wiki.sdn.sap.com/wiki/display/BPX/SamplecodetocreateemailbodyandXMLattachmentinanoutgoingNFEB2Be-mail+communication

Abs,

Henrique.

Former Member
0 Kudos

Valeu, vou dar uma lida.

Obrigado.

At.,

Bernardo Tavares Braga

Answers (1)

Answers (1)

Former Member
0 Kudos

OK. Baixei e instalei o SAP NetWeaver Developer Studio.

Baixei o SP24 for XI ADAPTER FRAMEWORK CORE 3.0

E extrai os arquivos necessários...qualquer problema eu falo.

Obrigado.

At.,

Bernardo Tavares Braga

Edited by: Bernardo Tavares Braga on Nov 27, 2009 8:38 PM

henrique_pinto
Active Contributor
0 Kudos

Bernardo,

baixe o NWDS 7.0.

http://service.sap.com/swdc, busque por support packages e patches e procure por "developer studio".

Abs,

Henrique.

Former Member
0 Kudos

Bom dia.

Criamos o adapter module e solicitamos o deploy em DEV. Esta retornando o erro abaixo. Tem idéia do que pode ser?

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

Deployment started Wed Dec 02 09:52:16 WGT 2009

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

Starting Deployment of AdapterModuleEAR

Aborted: development component 'AdapterModuleEAR'/'sap.com'/'localhost'/'2009.12.01.18.36.40'/'0':Caught exception during application deployment from SAP J2EE Engine's deploy service:java.rmi.RemoteException: Cannot deploy application sap.com/AdapterModuleEAR.. Reason: Exception during generation of components of application sap.com/AdapterModuleEAR in container EJBContainer.; nested exception is: com.sap.engine.services.deploy.exceptions.ServerDeploymentException: Exception during generation of components of application sap.com/AdapterModuleEAR in container EJBContainer. (message ID: com.sap.sdm.serverext.servertype.inqmy.extern.EngineApplOnlineDeployerImpl.performAction(DeploymentActionTypes).REMEXC)

Deployment of AdapterModuleEAR finished with Error (Duration 14413 ms)

Obrigado.

At.,

Bernardo Tavares Braga

henrique_pinto
Active Contributor
0 Kudos

O .jar está dentro e referenciado no .ear?

Tem que verificar alguns pontos, revisar todo o projeto.

Em paralelo vc pode abrir um chamado tb (BC-XI-JAS).

Abs,

Henrique.

Former Member
0 Kudos

Boa tarde.

Antes de abrir o chamado estou tentando esgotar todas as possibilidades.

Fiz o How to, o projeto todo está OK, compilando sem problemas, porém estou com problema que a versão SAP NetWeaver 7.1 Composition Environment não possui a mesma interface da versão utilizada no How-to. Tentei adaptar os arquivos de configuração, porém cada vez que altero alguma coisa, o problema anterior se resolve e surge um novo no momento do Deploy, o último que tive foi esse: Cannot find the alternative deployment descriptor for EJB JAR file.

Tem um how-to baseado em uma versão mais nova do Developer Studio?

Qual versão do SAP EJB J2EE eu tenho que usar, a 1.4 ou a 5?

Obrigado.

At.,

Bernardo Tavares Braga

henrique_pinto
Active Contributor
0 Kudos

Bernardo, se vc está no PI 7.0, vc tem que desenvolver usando o NWDS 7.0, que usa o J2EE.

O CE 7.1 vai compilar tudo no JEE 5, que só funciona no PI 7.1.

Abs,

Henrique.

Former Member
0 Kudos

Hum....

Então é isso. Vou refazer aqui e posto o resultado.

At.,

Bernardo Tavares Braga

Edited by: Bernardo Tavares Braga on Dec 2, 2009 9:50 PM

Former Member
0 Kudos

Henrique, estou trabalhando junto com o Bernardo nessa solução.

Baixamos o developer studio 7 e o deploy foi feito com sucesso.

Verifiquei a classe gerada por você no wiki (SetAttachmentName.java) e não entendi o que está sendo feito no trecho de código abaixo:

....

String message = moduleContext.getContextData("Message");

....

O que é retornado nessa chamada, é algo preenchido no conteúdo da mensagem?

Pergunto isso, porque eu criei um attachment porém ele não printou no corpo do email, o que tenho que fazer para que ele seja printado no corpo do email?

No me código eu setei conforme abaixo:

text.setName("NFEAtachment");

text.setContentType("text/plain");

text.setText(body);

O anexo foi criado com sucesso e enviado no email, porém o que eu desejo é que ele seja escrito no corpo do email.

Obs, o conteúdo da variável body é montado no mapping.

henrique_pinto
Active Contributor
0 Kudos

Marcio,

o metodo ModuleContext.getContextData(String) retorna o conteudo de um parametro que vc definiu na sequencia do module processor, no communication channel.

Na aba Module, vc teria os 2 modulos, o standard adapter module e o seu novo custom module.

No caso, vc teria que criar um parametro para o seu custom module (nesse exemplo, o nome do parametro é "Message"), e nesse parametro vc poderia fixar o texto que vai no corpo do email.

Alternativamente, vc pode montar esse texto dinamicamente no proprio codigo java do custom module, por exemplo baseado no conteudo XML.

Com relacao ao que vc descreveu, aparentemente o comportamento do Adapter Framework mudou nos ultimos SPs. Exatamente com esse codigo, ele criava o 2o anexo como inline e o conteudo ia no corpo do email.

Eu criei isso no projeto piloto de SAP NFE no Brasil.

Talvez uma pequena modificacao seja necessária para fazer funcionar.

Apesar do nome, o método Message.setContentType(String) seta o Content Disposition do payload.

Talvez funcione se vc usar algo do tipo:

text.setContentType("text/plain;inline;filename="Instrucoes.txt"");

Abs,

Henrique.

henrique_pinto
Active Contributor
0 Kudos

Uma outra alternativa é, depois do addAttachment(text), usar o metodo setMainPayload() pra setar o text como payload principal.

http://help.sap.com/javadocs/pi/SP3/xpi/com/sap/engine/interfaces/messaging/api/Message.html#setMain...

Ainda, no communication channel, em vez do Message Protocol XIPAYLOAD, tente o XIALL.

Abs,

Henrique.

Former Member
0 Kudos

Vou tentar incluir o inline no setContentType.

Obs: Não estou achando o método setMainPayload da classe Message. Dá erro dizendo que o método não existe.

Att,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Aquele Javadoc é do PI 7.1.

Achei que tivessem colocado nos ultimos SPs do 7.0, mas aparentemente nao...

Abs,

Henrique.

former_member182503
Active Contributor
0 Kudos

O método setMainPayload é exclusivo do PI 7.1, se não me engano.

Former Member
0 Kudos

Tem algo estranho. Efetuei o deploy exatamente como está na classe Java disponibilizada no wiki e quando uso os métodos via classe Payload alguma exceção é lançada, abaixo o erro:

Delivery of the message to the application using connection Mail_http://sap.com/xi/XI/System failed, due to: com.sap.aii.af.ra.ms.api.RecoverableException: Exception thrown in method process. The transaction is marked for rollback.: com.sap.engine.services.ejb.exceptions.BaseTransactionRolledbackLocalException: Exception thrown in method process. The transaction is marked for rollback..

Quando altero o código para usar TextPayload tudo funciona, ou melhor, não ocorre a exceção e o email é enviado com dois anexos, alguma idéia do que pode estar ocorrendo?

Abaixo o código que dá a exceção:

Payload text = msg.createPayload();

text.setContent(body.getBytes("UTF-8"));

text.setContentType("text/plain;filename="Instrucoes.txt"");

--nesse momento ocorre a exceção

msg.addAttachment(text);

Quando altero para o código abaixo não ocorre a exceção:

TextPayload text = msg.createTextPayload();

text.setName("NFeAttachment");

text.setContentType("text/plain");

text.setText(body);

Obs: Com isso não consegui setar o inline.

henrique_pinto
Active Contributor
0 Kudos

Mas vc tem o metodo .setContentType() da mesma maneira.

Vc tentou algo do tipo text.setContentType("text/plain;inline") ?

Abs,

Henrique.

Former Member
0 Kudos

Acho que tentei, deu erro, mas vou tentar novamente e retorno amanhã, pois o basis que faz o deploy já foi embora. Lembro-me que tentei exatamente como você instruiu e não funcionou, daí tentei várias mudanças na parte do setContentType, mas não lembro se tentei com a classe TextPayload. Amanhã retorno o que ocorreu.

Obrigado por toda ajuda,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Ainda, tente trocar o message protocol para XIALL independente do teste do setContentType.

Uma ultima opcao seria usar Mail Package e colocar o texto no campo "Content".

Att,

Henrique.

Former Member
0 Kudos

Henrique,

Tentei o XIALL, ele além dos dois anexos, mandou também todo o Soap Document da mensagem do PI como anexo.

Fiz a seguinte alteração para testes amanhã:

text.setName("NFeAttachment");

text.setContentType("text/plain;inline");

text.setText(body);

Caso não funcione, vou tentar partir para o Mail Package.

Att,

Márcio

Former Member
0 Kudos

Henrique,

Achei um help interessante no SDN que talvez me ajude. http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/6d967fbc-0a01-0010-4fb4-91c6d38c5816&override... . Nesse artigo o Prashanth Azharuddin comenta sobre um EJB MessageTransformBean que me permite informar o Content Disposition do email para inline. A idéia minha será, efetuar a chamada do meu EJB, em seguida chamar o MessageTransformBean que coloca o meu anexo do tipo texto para inline e por último o EJB Default de email. O que acha da idéia?

Att,

Márcio

Former Member
0 Kudos

O Help que comentei no último post me fez refletir que se existe um EJB que consegue setar o Content Disposition provavelmente eu consigo fazer isso do meu código, daí comecei a analisar e cheguei a duas conclusões:

Existe um método na classe TextPayalod que é o setAttribute. Pesquisei um pouco sobre esse método e ele pode ser usado para seta propriedades do objeto, daí me veio a idéia de tentar isso:

text.setAttribute("Content-Disposition", "inline");

Isso me fez também pensar que o que pode estar errado é que talvez a chamada correta do setContentType deva ser:

text.setContentType("text/plain;Content-Disposition=inline");

Irei tentar seguir essa idéia para ver se resolve e assim que testar posto o resultado.

Novamente muito obrigado a todos pela ajuda,

Att,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Marcio,

sim, muito provavelmente, o que o MessageTransformBean faz é chamar algum metodo que vc tb pode chamar, da interface Payload ou de alguma das subinterfaces.

Eu acho que tenho o codigo fonte desse module standard em algum lugar do meu note. Amanha dou uma buscada.

Com relacao a sua duvida, na verdade, o "text/plain" é o Content-Type, enqto que o "inline" eh o Content-Disposition (e o filename eh um parametro possivel do content disposition). Isso vc vê na RFC 2183 (http://www.ietf.org/rfc/rfc2183.txt). Soh que na library do AF, o objeto Payload nao tem um metodo setContentDisposition, entao o metodo setContentType faz as vezes de um.

Com relacao ao metodo .setAttribute(), ele está disponivel para vc na API do PI 7.0??

Se tiver, ele funciona sim!! Mas achei que ele soh estivesse disponivel no 7.1.

Olha soh o texto dessa nota:

Documentation: NetWeaver PI 7.1 SP6

AF API: NetWeaver PI 7.1 SP5

The com.sap.engine.interfaces.messaging.api.Payload interface was extended by the method to set, get and clear attributes. A Payload is mapped to a MIME attachment of the XI protocol, which uses SOAP with attachments internally. As such, MIME attachments have attributes like Content-Disposition or Content-Type, which now can be managed with the new getAttributeNames(), clearAttributes(), getAttribute(String attributeName), setAttribute(String name, String value), removeAttribute(String attributeName).

Se vc conseguir usar esse metodo, matou a charada.

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

Descobri porque o corpo do email não está sendo escrito. Para que isso ocorra, o primeiro anexo tem que ser o texto e não o xml como está ocorrendo. Fiz com o MessageTransformBean mudar o xml do payload para texto e aí printou no corpo do email. Agora vem a pergunta, como faço para que o meu primeiro anexo seja o txt, ou seja, como passo o payload que já vem na mensagem para o segundo anexo? Pelo que andei lendo, uma vez atachado uma mensagem ela não pode ser removida da lista, então será que terei que criar o objeto de novo e atachar as duas mensagens?

Att,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Marcio,

na pior das hipoteses, vc pode usar o module PayloadSwapBean pra fazer a troca, logo depois do seu custom module.

Em paralelo, vou tentando encontrar uma alternativa (infelizmente, nao tenho o source code do MessageTransformBean).

Abs,

Henrique.

henrique_pinto
Active Contributor
0 Kudos

Marcio,

uma boa noticia!

No PI 7.0, com as APIs (.jars) do ultimo SP disponivel (SP20), existem os metodos .setAttribute() e .getAttribute() sim!

Ao menos apareceram aqui pra mim, na classe Payload.

No caso, seria apenas descobrir como alterar a ordem dos attachments na msg.

Na pior das hipoteses, dá pra remover o attachment NFe (msg.removeAttachment()) e adiciona-lo de novo apos o text.

Abs,

Henrique.

henrique_pinto
Active Contributor
0 Kudos

Se o .setAttribute() nao resolver, ultima tentativa: inclua as seguintes linhas de codigo.

1. substitua a linha

Message msg = (Message) inputModuleData.getPrincipalData();

pelo codigo abaixo:

		Object obj = inputModuleData.getPrincipalData();
		Message msg = (Message) obj;
		com.sap.aii.messaging.mo.Message mo = null;
		if (obj instanceof XIMessage) {
			mo =
				(com.sap.aii.messaging.mo.Message) ((XIMessage) obj)
					.getXMBMessage();
		} else if (obj instanceof MessageContext) {
			mo = ((MessageContext) obj).getMessage();
		} else {
			Audit.addAuditLogEntry(
				AuditLogStatus.WARNING,
				"NFe: no payload found");
		}

2. ao final do codigo, apos a linha

msg.addAttachment(text);

inclua o codigo abaixo:

			XMBPayload apld = XMBMessageOperator.getApplicationPayload(mo);
			for (int i = 0;
				i < XMBMessageOperator.numberOfPayloadReferences(mo);
				i++) {
					XMBPayload pld = XMBMessageOperator.getPayload(mo, i);
					if (pld.getPayloadName().equals(apld.getPayloadName()) {
						continue;
					} else {
						pld.setPayloadType(PayloadType.APPLICATION);
						apld.setPayloadType(PayloadType.APPLICATION_ATTACHMENT);
					}
			}

Para poder usar as classes abaixo:

com.sap.aii.adapter.xi.ms.XIMessage;
com.sap.aii.messaging.mo.Message
com.sap.aii.messaging.mo.MessageContext;
com.sap.aii.messaging.mo.xmb.XMBMessageOperator;
com.sap.aii.messaging.mo.xmb.XMBPayload;

vc precisa de 3 libs adicionais: aii_adapter_svc.jar, aii_msg_runtime.jar e guidgenerator.jar.

Vc consegue elas no proprio ambiente do PI.

Teoricamente a SAP nao autoriza o uso das classes dessas libs em modules custom.

Mas eu vi o codigo fonte do PayloadSwapBean e ele utiliza esse parametro.

Entao ou vc usa o PayloadSwapBean (o que nao seria tanto problema assim) ou usa essas classes.

Testa aí e vê se funciona.

Abs,

Henrique.

Former Member
0 Kudos

Henrique,

Conforme informei no último post, consegui entender que para que o corpo do email seja descrito, eu preciso que o primeiro attachment, ou o payload, não estou certo ainda, seja o primeiro anexo. Fiz uma alteração onde usei o removeAttachment, tudo no meu Modulo funcionou, porém no módulo default do correio recebi a seguinte mensagem:

Message processing failed. Cause: com.sap.aii.af.ra.ms.api.RecoverableException: com.sap.aii.messaging.srt.BubbleException: XI payload not found [null "null"]

Alguma idéia do que houve?

Abaixo um trecho do código:

try {

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "Removing NFe Attachment...");

msg.removeAttachment(nfe.getName());

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe Attachment removed...");

}

catch (Exception e)

{

Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro removing NFe Attachment: " + e.getMessage());

}

try {

text.setAttribute("Content-Disposition", "inline");

text.setAttribute("charset", "UTF-8");

msg.addAttachment(text);

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "setAttribute was sucessfull...");

}

catch (Exception e1) {

Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro setting setContentType: " + e1.getMessage());

try {

text.setContentType("text/plain;Content-Disposition=inline;charset = "UTF-8"");

msg.addAttachment(text);

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "addAttachment was sucessfull...");

}

catch (Exception eAtt) {

Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro setting setAttribute: " + eAtt.getMessage());

try {

text.setContentType("text/plain");

msg.addAttachment(text);

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "setContentType with text-plain was sucessfull...");

}

catch (Exception err) {

Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro setting setContentType with text-plain: " + err.getMessage());

}

}

}

try

{

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe: Setting Attachment Content Disposition...");

if (FileName == null)

nfe.setContentType("application/xml;charset = "UTF-8";filename="procNfe.xml"");

else

nfe.setContentType("application/xml;charset = "UTF-8";filename="" + FileName + """);

try {

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "Adding NFe Attachment...");

msg.addAttachment(nfe);

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe Attachment added...");

}

catch (Exception e)

{

Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro removing NFe Attachment: " + e.getMessage());

}

Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe: " + FileName);

}

catch(InvalidParamException e)

{

Audit.addAuditLogEntry(amk, AuditLogStatus.ERROR, "NFe: Error setting E-mail details...");

throw new ModuleException("NFe: Error setting E-mail details...", e);

}

Att,

Márcio

Former Member
0 Kudos

Ficou horrível a formatação do último comentário, desculpe-me.

msg.removeAttachment(nfe.getName());

text.setAttribute("Content-Disposition", "inline");

text.setAttribute("charset", "UTF-8");

msg.addAttachment(text);

msg.addAttachment(text);

msg.addAttachment(nfe);

Daí ocorre o erro:

Message processing failed. Cause: com.sap.aii.af.ra.ms.api.RecoverableException: com.sap.aii.messaging.srt.BubbleException: XI payload not found [null "null"]

Att,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Acho que ocorreu que as 2 msgs foram adicionadas como attachment e nenhuma foi considerada como o main payload...

Vc chegou a tentar o codigo que passei acima?

Abs,

Henrique.

Former Member
0 Kudos

Vou tentar segunda-feira, não tive tempo, tive alguns contratempos, você pode me dizer em resumo, qual a idéia que você teve? ou melhor, qual o resultado esperado no código que você informou? Não consegui captar a idéia.

Grato,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Para o objeto Message, existe a interface disponivel na API do AF (que é a que vc usou no seu codigo para criar os attachmetns, por exemplo) mas existe tb uma classe interna, de uso restrito, que possui alguns outros metodos.

Dentro dessa classe, vc pode obter os payloads, que sao instancias do objeto XMBPayload e que possuem um atributo, payloadType, que define se sao o payload principal (PayloadType.APPLICATION) ou um attachment (PayloadType.APPLICATION_ATTACHMENT).

Eu extrai esse codigo do source do modulo PayloadSwapBean. Alternativamente, vc pode usar esse modulo standard sem ter que adicionar esse codigo ao seu.

Abs,

Henrique.

Former Member
0 Kudos

Alterei o código para ficar conforme sua orientação, porém alguma exceção ocorreu, estou com esse erro na mensagem:

Delivery of the message to the application using connection Mail_http://sap.com/xi/XI/System failed, due to: com.sap.aii.af.ra.ms.api.RecoverableException: Exception thrown in method process. The transaction is marked for rollback.: com.sap.engine.services.ejb.exceptions.BaseTransactionRolledbackLocalException: Exception thrown in method process. The transaction is marked for rollback..

Você saberia dizer como faço isso via Swap ou Transform como você comentou anteriormente?

Att,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Vc precisa adicionar o module PayloadSwapBean no seu Module Processor do Communication Channel em questao.

Busque aqui no forum por "PayloadSwapBean" que tem algumas dicas.

Att,

Henrique.

Former Member
0 Kudos

Henrique e Jose, muito obrigado por toda ajuda de vocês. Consegui resolver o meu problema utilizando javamapping. Tentei esgotar todas as possibilidades de efetuar a solução pelo módulo, porém eu não consegui fazer com que o anexo criado no módulo fosse printado no corpo do email. Usei o MessageTransformBean junto com o PayloadSwapBean, porém não obtive sucesso, sempre os o correio era enviado com dois anexos. Alterei via transform o tipo do payload da mensagem para text/plain daí ele escrevia o xml no corpo, só que o segundo não escrevia de jeito nenhum. Segui a orientação no blog do Stefan Grube (http://www.sdn.sap.com/irj/scn/weblogs;jsessionid=(J2EE3414800)ID0358120850DB11974506480389940426End?blog=/pub/wlg/6321) e deu certo.

Agradeço novamente toda ajuda,

Márcio

henrique_pinto
Active Contributor
0 Kudos

Marcio,

pena nao ter dado via module.

De fato a API do PI 7.0 nao eh a ideal para isso; o PI 7.1 trata bem melhor essas questoes. Alem do fato de que no PI 7.1 dah pra tratar attachment no mapping (a Java Mapping API do PI 7.1 trata nao soh o payload como todos os atributos e attachments da msg XI). Fica bem mais facil.

Abs,

Henrique.

Former Member
0 Kudos

Henrique, de qualquer maneira valeu para efeito de aprendizado sobre os módulos e sobre o que é possível fazer com eles.

Grato,

Márcio