cancel
Showing results for 
Search instead for 
Did you mean: 

B2B de saída - Email, webservice e arquivo

Former Member
0 Kudos

Boa noite pessoal,

Queria saber como posso configurar mais de um tipo de envio de XML para os clientes.

Por exemplo, um cliente A quer receber via e-mail, o cliente B via webservice e o cliente C via FTP.

Na parte do Integration Directory crio 1 adapter para cada situação, faço o RFC lookup para o caso do e-mail. A dúvida é como determinar para onde será enviado.

Tenho que criar alguma tabela Z (ECC ou GRC) dizendo qual forma o cliente deseja receber o e-mail e, de acordo com esse parâmetro, determinar o communication channel no UDF que é criado para o B2B?

Obrigado.

Abs.

Accepted Solutions (1)

Accepted Solutions (1)

henrique_pinto
Active Contributor
0 Kudos

Olá Ricardo,

algumas considerações:

1. Nao existe no PI um IF por adapter (i.e. se cliente tal, manda pra adapter tal). Na verdade, por definicao, se vc está falando de clientes diferentes, vc deveria considerar ter receivers diferentes. Pra manter a "genericidade" dos receivers, vc pode criar um pra cada tipo de comunicacao,e.g. GENERIC_MAIL_RECEIVER, GENERIC_FTP_RECEIVER, GENERIC_WS_RECEIVER etc.

2. Sim, vc vai ter q ter essa informacao de qual metodo de comunicacao por cliente em alguma tabela. Uma possibilidade seria vc extender a tabela /XNFE/TB2B com um campo Z, i.e. método de comunicacao, e daí vc lá colocar um valor que defina o tipo de comunicacao, e.g. 'MAIL, 'FTP', 'WS' etc. Daí o que vc poderia fazer seria criar uma RFC Lookup genérica que vc usa pra qq tipo de comunicacao, e.g. pra cada CNPJ, ele devolve um campo com o tipo de comunicacao e o valor (e.g. se Mail, o endereço, se FTP, a URL do ftp server, se web service, a URL do WS etc. Talvez vc precise de mais dados, e.g. user/senha ou soap action no caso de WS (vc pode usar um unico campo string com algum pipeline pra separar os dados, ou criar mai de um campo mesmo). Daí na UDF que chama a RFC Lookup, dependendo do tipo de comunicacao, vc preenche os dados de comunicacao pro technical name/namespace do File adapter, Mail adapter ou SOAP adapter.

3. Por default, alem de ter essa definicao do tipo de comunicacao na tabela Z, em teoria vc deveria saber isso tb no receiver determination, pra poder criar as conditions (i.e. se cnpj a, b, c, vai pro mail receiver; se x, y, z, vai pro ftp receiver; se m, n, p, vai pro ws receiver). Se tiver muitas opcoes pro condition, uma alternativa que talvez seja mais viável é criar um mapping pra fazer um enhanced receiver determination. Nesse mapping, vc chama a RFC lookup definida acima e retorna pra mensagem Receivers, preenchendo com o nome do generic receiver que mencionamos acima baseado no tipo de comunicacao. Mais detalhes:

http://help.sap.com/saphelp_nw70ehp2/helpdata/en/43/a5f2066340332de10000000a11466f/frameset.htm

Abs,

Henrique.

PS: talvez dê até pra evitar o enhanced receiver determination se vc chamar o método .put() no mapping normal (UDF) passando o nome do receiver de acordo com o tipo de comunicacao. O codigo seria similar ao do metodo .get() exemplificado no link abaixo (na parte final), porém chamando o .put() em vez do .get().

http://help.sap.com/saphelp_nw70ehp2/helpdata/EN/e2/e13fcd80fe47768df001a558ed10b6/frameset.htm

http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html#put(java.lang.Object, java.lang.Object)

Former Member
0 Kudos

Henrique,

Obrigado pelo detalhamento da explicação. A ideia inicial era fazer uma tabela Z mesmo, com os parâmetros que vamos precisar (talvez até extendendo a standard /XNFE/TB2B). Mas isso ainda é uma definição que precisaremos ter, pois precisaremos que os controles fiquem todos no ECC.

Os adapters terão que ser genéricos mesmo, isso não tem como, para assim deixar livre a utilização deles para n clientes.

A parte que vou ter que estudar mais e trabalhar direitinho será da RFC Lookup (já mexi apenas para casos de envio de e-mail) e no enhanced receiver determination...

Vou desenvolvendo por aqui e quando chegar a uma solução, posto aqui novamente o resultado.

Obrigado!

Abs.

Former Member
0 Kudos

Bom dia Henrique, (desculpe, não consegui colocar a msg como código)

Implementei o UDF aqui e a parte que faz todo o tratamento de decisão entre qual forma ele vai usar para envio está funcionando. O código que utilizei foi:

 java.util.Map map;
AbstractTrace trace = container.getTrace();

Channel channel = null;
RfcAccessor accessor = null;
map = container.getTransformationParameters();

//envia a NFe para um administrador no caso de falha
String email = "nfe(arroba)nfe.com.br";
int forma = 0;
String pastaDestino = "";
String webserviceUrl = "";
String webserviceUsuario = "";
String webserviceAction = "";

try {
	// Retorna o Communication Channel
	channel = LookupService.getChannel(busSystem, commChannel);
	trace.addWarning("Channel: " + channel);

	// Get a RFC accessor for the channel
	accessor = LookupService.getRfcAccessor(channel);
	trace.addWarning("Accessor: " + accessor);
	
	// Define a Mensagem de requisicao para a RFC
	String req = "<ns0:ZPIF_NFE_CLIENTE xmlns:ns0='urn:sap-com:document:sap:rfc:functions'><ZCNPJ>" + cnpj + "</ZCNPJ></ns0:ZPIF_NFE_CLIENTE>";
	trace.addWarning("Req: " + req);
	
	// Create the xml inputstream
	InputStream inputStream = new ByteArrayInputStream(req.getBytes("UTF-8"));
	
	// Create xml payload
	XmlPayload payload = LookupService.getXmlPayload(inputStream);
		
	// Execute lookup
	XmlPayload result = accessor.call(payload);
	
	// Get the response
	InputStream resp = result.getContent();
	
	// Parse the response
	//Campo ZFORMA
	DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
	Document doc = builder.parse(resp);
	Node nodeForma = (Node) doc.getElementsByTagName("ZFORMA").item(0);
	// trace.addWarning("ZFORMA: " + doc);
		if (nodeForma.hasChildNodes() && !nodeForma.getFirstChild().getNodeValue().equals("")) {
		forma = Integer.parseInt(nodeForma.getFirstChild().getNodeValue());
		trace.addWarning("ZFORMA: " + forma);
	}	

	//Campo ZEMAIL
	Node nodeEmail = (Node) doc.getElementsByTagName("ZEMAIL").item(0);
	// trace.addWarning("ZEMAIL: " + doc);
	if (nodeEmail.hasChildNodes() && !nodeEmail.getFirstChild().getNodeValue().equals("")) {
		email = nodeEmail.getFirstChild().getNodeValue();
		trace.addWarning("ZEMAIL: " + email);
	}

	//Campo ZPASTA_DESTINO
	Node nodePasta = (Node) doc.getElementsByTagName("ZPASTA_DESTINO").item(0);
	// trace.addWarning("ZPASTA_DESTINO: " + doc);
	if (nodePasta.hasChildNodes() && !nodePasta.getFirstChild().getNodeValue().equals("")) {
		pastaDestino = nodePasta.getFirstChild().getNodeValue();
		trace.addWarning("ZPASTA_DESTINO: " + pastaDestino);
	}

	//Campo ZWEBSERVICE_URL
	Node nodeUrl = (Node) doc.getElementsByTagName("ZWEBSERVICE_URL").item(0);
	// trace.addWarning("ZWEBSERVICE_URL: " + doc);
	if (nodeUrl.hasChildNodes() && !nodeUrl.getFirstChild().getNodeValue().equals("")) {
		webserviceUrl = nodeUrl.getFirstChild().getNodeValue();
		trace.addWarning("ZWEBSERVICE_URL: " + webserviceUrl);
	}

	//Campo ZWEBSERVICE_USUARIO
	Node nodeUsuario = (Node) doc.getElementsByTagName("ZWEBSERVICE_USU").item(0);
	// trace.addWarning("ZWEBSERVICE_USU: " + doc);
	if (nodeUsuario.hasChildNodes() && !nodeUsuario.getFirstChild().getNodeValue().equals("")) {
		webserviceUsuario = nodeUsuario.getFirstChild().getNodeValue();
		trace.addWarning("ZWEBSERVICE_USUARIO: " + webserviceUsuario);
	}	
	
	//Campo ZWEBSERVICE_ACTION
	Node nodeAction = (Node) doc.getElementsByTagName("ZWEBSERVICE_ACT").item(0);
	// trace.addWarning("ZWEBSERVICE_ACT: " + doc);
	if (nodeAction.hasChildNodes() && !nodeAction.getFirstChild().getNodeValue().equals("")) {
		webserviceAction = nodeAction.getFirstChild().getNodeValue();
		trace.addWarning("ZWEBSERVICE_ACTTION: " + webserviceAction);
	}

} catch (Exception e) {
	trace.addWarning("Falha na RFC: " + e);
} finally {

	// Close the accessor in order to free resources.
	if (accessor!=null) {
	try {
		accessor.close();
	} catch (Exception e) {
		trace.addWarning("Error while closing accessor: " + e);
	}
}
}

// Definir qual rota o XML sera enviado
	switch(forma) {
		  case 1:  // Envio via E-MAIL
				trace.addWarning("Entrou na forma de envio de EMAIL");
		  		int posicaoId = xml.indexOf("Id=");
				trace.addWarning("Definiu variavel posicaoId: " + posicaoId);
				String chaveAcesso = xml.substring(posicaoId + 7, posicaoId + 51);
				trace.addWarning("Definiu chave de acesso: " + chaveAcesso);
				String filename = chaveAcesso + ".xml";
				trace.addWarning("Definiu nome do arquivo: " + filename);

				// String service1 = (String) map.get(StreamTransformationConstants.RECEIVER_SERVICE);
				String service1 = "EMAIL";
				map.put(StreamTransformationConstants.RECEIVER_SERVICE, "EMAIL");
				trace.addWarning("Definiu servico recebedor: " + service1);

				// Preenche o dynamic configuration para o campo "para" no mail adapter
				DynamicConfiguration conf11 = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
				trace.addWarning("Chama o Dynamic Configuration: " + conf11);
				DynamicConfigurationKey toKey11 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/Mail", "THeaderTO");
				trace.addWarning("Seta o namespace e o campo desejado: " + toKey11);
				conf11.put(toKey11, email);
				trace.addWarning("preencheu o campo para no e-mail");
				
				DynamicConfiguration conf12 = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
				DynamicConfigurationKey toKey12 = DynamicConfigurationKey.create("http:/" + "/sap.com/xi/XI/System/File", "FileName");
				conf12.put(toKey12, filename);
				trace.addWarning("preencheu o nome do arquivo no anexo");

		  case 2:  // Envio via WebService
				trace.addWarning("Entrou na forma de envio de WebService");
				// String service2 = (String) map.get(StreamTransformationConstants.RECEIVER_SERVICE);
				String service2 = "WEBSERVICE";
				trace.addWarning("Definiu servico recebedor: " + service2);
				map.put(StreamTransformationConstants.RECEIVER_SERVICE, "WEBSERVICE");
				trace.addWarning("Setou o servico recebedor");
				
				// Preenche o dynamic configuration para os parametros do SOAP adapter
				DynamicConfiguration conf21 = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
				trace.addWarning("Chama o Dynamic Configuration: " + conf21);
				DynamicConfigurationKey toKey21 = DynamicConfigurationKey.create("http:/" + "/sap.com/xi/XI/System/SOAP", "TServerLocation");
				trace.addWarning("Seta o namespace e o campo desejado: " + toKey21);
				conf21.put(toKey21, webserviceUrl);
				trace.addWarning("devolve os parametros para o Dynamic Configuration");
				
				DynamicConfiguration conf22 = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
				DynamicConfigurationKey toKey22 = DynamicConfigurationKey.create("http:/" + "/sap.com/xi/XI/System/SOAP", "TAuthKey");
				conf22.put(toKey22, webserviceUsuario);
				
				DynamicConfiguration conf23 = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
				DynamicConfigurationKey toKey23 = DynamicConfigurationKey.create("http:/" + "/sap.com/xi/XI/System/SOAP", "THeaderSOAPACTION");
				conf23.put(toKey23, webserviceAction);
	
		  case 3:  // Envio via Arquivo
				trace.addWarning("Entrou na forma de envio via arquivo");
		  		DynamicConfiguration conf31 = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
				
				String service3 = (String) map.get(StreamTransformationConstants.RECEIVER_SERVICE);
				map.put(StreamTransformationConstants.RECEIVER_SERVICE, "FILE");
				
				// Preenche o dynamic configuration para os parametros do File adapter	
				DynamicConfigurationKey toKey31 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/File", "Directory");
				conf31.put(toKey31, webserviceUrl);

		  default: //TODO
	}

//Since this is a dummy mapping, return the same value from input
return cnpj; 

Note que coloquei vários warnings para acompanhar cada etapa do processo.

O erro que está dando no teste no Interface Mapping é o seguinte:


Call method execute of the application Java mapping com.sap.xi.tf._MM_RetornaDados_
*** START APPLICATION TRACE ***
Channel: CC_xi_Was_receiver (Party: , Service: NFDCLNT150, Object ID: 5147baaf07f23d5589d6230370dc64ea)
Falha na RFC: com.sap.aii.mapping.lookup.LookupException: Plain exception:Problem when calling an adapter by using communication channel CC_xi_Was_receiver (Party: , Service: NFDCLNT150, Object ID: 5147baaf07f23d5589d6230370dc64ea) Check whether the communication channel exists in the Integration Directory; also check the cache notifications for the instance Integration Server (central Adapter-Engine) Channel object with Id Channel:5147baaf07f23d5589d6230370dc64ea not available in CPA Cache. com.sap.aii.mapping.lookup.LookupException: Problem when calling an adapter by using communication channel CC_xi_Was_receiver (Party: , Service: NFDCLNT150, Object ID: 5147baaf07f23d5589d6230370dc64ea) Check whether the communication channel exists in the Integration Directory; also check the cache notifications for the instance Integration Server (central Adapter-Engine) Channel object with Id Channel:5147baaf07f23d5589d6230370dc64ea not available in CPA Cache. at com.sap.aii.ibrun.server.lookup.AdapterProxyLocal.<init>(AdapterProxyLocal.java:61) at com.sap.aii.ibrun.server.lookup.SystemAccessorInternal.getProxy(SystemAccessorInternal.java:98) at com.sap.aii.ibrun.server.lookup.SystemAccessorInternal.<init>(SystemAccessorInternal.java:38) at com.sap.aii.ibrun.server.lookup.SystemAccessorHmiServer.getConnection(SystemAccessorHmiServer.java:270) at com.sap.aii.ibrun.server.lookup.SystemAccessorHmiServer.process(SystemAccessorHmiServer.java:70) at com.sap.aii.utilxi.hmis.server.HmisServiceImpl.invokeMethod(HmisServiceImpl.java:169) at com.sap.aii.utilxi.hmis.server.HmisServer.process(HmisServer.java:178) at com.sap.aii.utilxi.hmis.web.HmisServletImpl.processRequestByHmiServer(HmisServletImpl.java:296) at com.sap.aii.utilxi.hmis.web.HmisServletImpl.processRequestByHmiServer(HmisServletImpl.java:211) at com.sap.aii.utilxi.hmis.web.workers.HmisInternalClient.doWork(HmisInternalClient.java:70) at com.sap.aii.utilxi.hmis.web.HmisServletImpl.doWork(HmisServletImpl.java:496) at com.sap.aii.utilxi.hmis.web.HmisServletImpl.doPost(HmisServletImpl.java:634) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.runServlet(HttpHandlerImpl.java:401) at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.handleRequest(HttpHandlerImpl.java:266) at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:386) at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:364) at com.sap.engine.services.httpserver.server.RequestAnalizer.invokeWebContainer(RequestAnalizer.java:1039) at com.sap.engine.services.httpserver.server.RequestAnalizer.handle(RequestAnalizer.java:265) at com.sap.engine.services.httpserver.server.Client.handle(Client.java:95) at com.sap.engine.services.httpserver.server.Processor.request(Processor.java:175) at com.sap.engine.core.service630.context.cluster.session.ApplicationSessionMessageListener.process(ApplicationSessionMessageListener.java:33) at com.sap.engine.core.cluster.impl6.session.MessageRunner.run(MessageRunner.java:41) at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37) at java.security.AccessController.doPrivileged(Native Method) at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:104) at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:176) 
*** END APPLICATION TRACE ***
Java mapping com/sap/xi/tf/_MM_RetornaDados_ completed. (execute() of com.sap.xi.tf._MM_RetornaDados_
Call method execute of the application Java mapping sap.com.xi.nfe.map.NTB2B_NFeToB2BReceiverConverter
Java mapping sap/com/xi/nfe/map/NTB2B_NFeToB2BReceiverConverter completed. (execute() of sap.com.xi.nfe.map.NTB2B_NFeToB2BReceiverConverter
Executed successfully

Ele está falando que o adaptador para comunicação com o Application Server não está no cache... mas esse adaptador está configurado e OK no RWB...

Já fiz um CPA full cache refresh e nada...

Sabe o que ainda pode estar causando o erro?

Obrigado.

henrique_pinto
Active Contributor
0 Kudos

Oi Ricardo,

verifique se o communication channel foi criado no Serviço com o mesmo nome que está no código ("NFDCLNT150").

Ainda, no campo Party, verifique se ele está com o campo vazio, como esperado no código, ou com asterisco.

Diferentemente da lógica, pro PI, * não inclui vazio. 😛

Se tiver como *, copie o comm channel existente apenas trocando a Party de * para vazio.

Abs,

Henrique.

Former Member
0 Kudos

Boa tarde Henrique...

Obrigado pela resposta. Não tive tempo de atualizar aqui no fórum... o erro era meu mesmo... na constante onde você informa o communication channel que vai ser passado para o UDF, eu tinha escrito o nome do channel errado. Esse ponto consegui avançar...

O erro que estou tendo agora é o seguinte:

Consigo fazer com que o PI entenda qual a forma que vai ter que ser enviada a mensagem (e-mail, WS ou arquivo) usando o Dynamic Configuration.

Quando é via e-mail, excelente, manda o e-mail certinho.

Quando é via WS ou arquivo, ele não consegue colocar os valores dinâmicos no adaptador. Por exemplo, a URL do webservice ou a pasta para gravar o arquivo, no caso do File adapter.

Na SXI_MONITOR, na parte de trace, encontrei: Dynamic Configuration Is Empty

Ou seja, ele não conseguiu passar os valores dinâmicos para o adaptador saber o que ele tem que fazer com a mensagem...

Abs

henrique_pinto
Active Contributor
0 Kudos

Ricardo,

analisando seu código, tanto para o case file quanto para o caso soap, vc definiu o namespace da DynamicConfigurationKey da seguinte forma:

"http:/" + "/sap.com/xi/XI/System/File"
...
"http:/" + "/sap.com/xi/XI/System/SOAP"

Pq vc separou o http do resto do namespace?

No caso do Mail, vc nao separou, deixando junto normal.

"http://sap.com/xi/XI/System/Mail"

Provavelmente é causa de ele nao estar conseguindo preencher o Dynamic Configuration.

Faça pro File & SOAP como fez pro Mail, deve ir ok.

Abs,

Henrique.

Former Member
0 Kudos

Olá Henrique,

Ai que está a parte estranha... troquei como você falou e continuou a mesma coisa... para E-mail ele envia, encontra o Dynamic Configuration, mas para os outros dois não.

Fiz outros testes também, trocando no código "case" por "if's" para ver se mudava alguma coisa, mas não adiantou também.

Parece que quando ele chama o Dynamic para e-mail, ele entende que tem que passar os valores dinamicamente e para os outros não...

Obrigado.

henrique_pinto
Active Contributor
0 Kudos

Nos communication channels, vc setou os flags de "use Adapter Specific message attributes" e "variable transport binding"?

Abs,

Henrique.

Former Member
0 Kudos

Boa tarde Henrique,

A opção "use Adapter Specific message attributes" está marcada e a opção "variable transport binding" existe apenas para o SOAP adapter (e está marcada também).

No caso do SOAP adapter, fiz testes também preenchendo os campos Variable Header com TServerLocation, TAuthKey e THeaderSOAPACTION, além de colocar em Authentication Keys o nome do usuário/senha.

Mas não funcionou.

Obrigado.

Abs.

henrique_pinto
Active Contributor
0 Kudos

Ricardo,

qual a msg de erro que dá no audit log, nos casos soap e file?

Nao dá pra concluir muita coisa, a nao ser que talvez haja problema ainda no setup/nomes dos serviços e comm channels.

Faça um double check disso tudo.

Verifique tb no receiver agreement pros serviços em questão (WS e FILE), ele está apontando pro comm channel correto.

Abs,

Henrique.

Former Member
0 Kudos

Henrique...

Obrigado pelas ajudas. Impressionante como quando estamos fazendo testes viciados fica mais difícil de achar o problema. Acho que o ponto crucial foi: "Faça um double check disso tudo".

Comecei a rever toda a configuração. Nos Interface Determinations, quando trocamos o Interface Mapping do standard para o Interface Mapping customizado, eu tinha feito apenas para o caso de E-mail... ficou faltando alterar para os casos de arquivo e webservice.

Agora o Dynamic Configuration está sendo chamado e, no caso de arquivos que eu acabei de testar, gerou o arquivo na pasta que eu quis, com o nome que eu quis, dinamicamente.

Tenho uma observação a fazer: como no receiver determination eu coloquei os 3 receivers sem nenhum "if", ele cria mensagem para os 3 tipos, porém só conclui o envio para o que de fato eu configurei para enviar. Isso só seria resolvido caso eu utilizasse também o enhanced receiver determination?

Obrigado.

Abs.

henrique_pinto
Active Contributor
0 Kudos

Oi Ricardo,

vc pode usar os parametros do message header no condition do receiver determination.

Vc preencheu o receiver_service com "WS", "FILE" e "MAIL" ou algo assim, certo?

Vai lá no condition editor, e na hora de selecionar o parametro, em vez de ir no XPath, vai nos context attributes.

Lá, vc deve ver os parametros do message header, incluindo o receiver_service.

Daí vc faz um IF em cima do valor dele.

Abs,

Henrique.

Former Member
0 Kudos

Eu tentei fazer isso em outro teste que fiz...

O problema é que para o namespace http://sap.com/xi/XI/System aparece apenas a opção ProcessStep, e não tenho como selecionar as outras opções, no caso, RECEIVER_SERVICE...

Por isso acabei deixando os 3 receiver services tentarem receber a mensagem...

Abs.

henrique_pinto
Active Contributor
0 Kudos

Oi Ricardo,

note que esses parametros sao como variaveis que existem e podem ser preenchidas com qq valor.

No seu código, vc pode preencher um dynamic configuration (.put() ) para o parametro ProcessStep, no namespace q vc mencionou, e depois vc pode usar o valor pro IF no receiver determination.

Vc pode criar um parametro custom tb.

Veja aqui, eu fiz isso faz uns anos: .

Mas pro seu caso, eu usaria um que nao está sendo usado (o proprio ProcessStep, p.ex.).

Abs,

Henrique.

Former Member
0 Kudos

Obrigado novamente Henrique.

Fiz uns testes aqui utilizando essa configuração.

O problema é que quando uso o .put() para colocar os valores no parâmetro ProcessStep e coloco as conditions no ReceiverDetermination ele nem chega a chamar o Dynamic Configuration, ele antes dá erro de "No receiver could be determined". Pelo que pude entender, ele primeiro tentou fazer a validação da condition e encontrar o receiver para depois fazer o Dynamic Configuration.

Abs.

henrique_pinto
Active Contributor
0 Kudos

Ricardo,

vc tem toda razão, falei besteira.

Esqueci q vc tava fazendo seu dynamic config no mapping.

De fato, o mapping só é feito depois do interface determination, que vem depois ainda do receiver determination, entao forçar no codigo o receiver_service nao vai adiantar...

Isso só funcionaria se vc colocasse o dynamic configuration num adapter module que fosse chamado pelo sender adapter (que nao existe no seu caso, pois o sender é um abap proxy) ou via enhanced receiver determination mesmo.

Abs,

Henrique.

henrique_pinto
Active Contributor
0 Kudos

Uma outra possibilidade que me ocorreu depois seria forçar o receiver ainda no código ABAP do Proxy (mas daí vc teria que modificar código standard, que creio que vc nao queira fazer).

Verifique o protocolo "ROUTING" descrito nesse link:

http://help.sap.com/saphelp_nw04/helpdata/en/51/d5cd16235e4643ae8ec92395c4ad97/frameset.htm

Abs,

Henrique.

Former Member
0 Kudos

Boa tarde Henrique,

Com certeza, modificar código standard está fora dos planos.

Consegui fazer praticamente tudo... ele está mandando pelas 3 formas, implementei um custom module para setar o nome do anexo com a chave de acesso, no caso de e-mails, etc.

O que acontece agora é que como existem as 3 formas e ele tenta mandar para as 3 e mas 2 delas falham, no monitor web as notas ficam com status de erro de B2B, como se não tivessem sido enviadas.

Vou ter que pensar em alguma forma de contornar isso, pois mesmo os XMLs chegando ao destino com sucesso, ele permanece com este erro.

Obrigado.

Abs.

henrique_pinto
Active Contributor
0 Kudos

É relativamente simples, se vc fizer o enhanced receiver determination (vc tem q criar outro mapping program da sua msg origem p/ a msg Receivers, e lá preencher com qual o receiver relevante).

Abs,

Henrique.

Former Member
0 Kudos

Obrigado Henrique.

Fui fazer uns testes do enhanced receiver determination. Para fazer isso, vou ter que trocar o Java Mapping, pois a target message do Interface Mapping agora tem a estrutura Receivers e como o Java é a última etapa da execução do mapping, ele dá erro com o standard...

A parte ruim disso é que não desenvolvo Java... só pequenas alterações... vou tentar mais alguns testes para ver o que pode ser feito...

Obrigado.

Abs.

Former Member
0 Kudos

Bom dia Henrique...

Desculpe a resposta de ontem. Tentar fazer as coisas quando a cabeça já está cheia não dá certo. Ontem tinha feito todo o procedimento para o Enhanced Receiver Determination, mas quando tentava selecionar o Interface Mapping no Receiver Determination, nada aparecia...

Hoje cedo comecei a configuração do Enhanced Receiver Determination do início, e agora sim funcionou perfeitamente. Agora ele manda a mensagem apenas para o serviço que tem que mandar.

Achei um Wiki que foi bom para me orientar quanto ao Enhanced Receiver Determination

Resumindo toda nossa conversa, para quem quiser implementar a solução:

1- Extender a tabela /XNFE/TB2B para incluir os campos de definição para forma de envio, cadastro de e-mail, pasta de destino, etc, de acordo com a necessidade

2- Criar a RFC com o CNPJ como parâmetro de entrada e os outros campos como parâmetros de saída

3- Criar o cenário de B2B de saída normal

4- No UDF para fazer a RFC Lookup, utilizar do recurso Adapter Specific Message Attributes (ASMA) para passar os parâmetros para os adaptadores dinamicamente (se quiserem, posso disponibilizar o código também)

5- Implementar o Enhanced Receiver Determination (conforme link acima). No UDF, fazer uma RFC Lookup para que, dependendo da forma de envio decidida, ele passa o parâmetro para o campo "Receivers"

6- No Receiver Determination, associar o Interface Mapping criado para o Enhanced Receiver Determination

7- No meu caso, criei um Adapter Module para trocar o nome anexo do e-mail para a chave de acesso da NFe

Acho que é isso..

Muito obrigado pelas ajudas e orientações Henrique.

Abs.

henrique_pinto
Active Contributor
0 Kudos

Oi Ricardo,

muito legal mesmo.

Acho que seria de grande ajuda se você criasse um wiki.

Topas?

Abs,

Henrique.

Former Member
0 Kudos

Oi Henrique...

Seria um prazer criar um Wiki sobre este assunto. Acredito que em muitas oportunidades, esse tipo de desenvolvimento é necessário.

Como funciona a criação do Wiki? Nunca fiz um por aqui.

Se me passar o caminho das pedras de como, onde criar, e quais padrões seguir, crio ele sim!

Abs.

henrique_pinto
Active Contributor
0 Kudos

Oi Ricardo,

a página inicial do wiki em português é a seguinte:

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

Para criar uma nova página relacionada a NFE, clique no link que diz "Clique aqui para enviar seu conteúdo".

Na página que abrir, vc pode editar o conteúdo da página, e lá embaixo, clique no campo "Location" e na parent page, coloque "SAP NFE" (sem as aspas).

Como exemplo, vc pode seguir a mesma linha desses outros wikis já criados.

Não há um template oficial, mas esses exemplos podem te dar uma idéia.

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

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

Abs,

Henrique.

Former Member
0 Kudos

Fala Henrique, tudo certo?

Criei o Wiki! Tentei fazer com o maior número de detalhes possíveis... espero que tenha ficado bom.

Qualquer parte que achar que deve ser melhorada, fique a vontade..

Obrigado!

Abs.

henrique_pinto
Active Contributor
0 Kudos

Oi Ricardo,

você poderia ter postado o link aqui pra facilitar, rs...

Mas já peguei aqui, o link direto é http://wiki.sdn.sap.com/wiki/pages/viewpage.action?pageId=260178548.

Cara, deu uma passada rápida e a primeira vista ficou MUITO SHOW!

Quando puder, dou uma lida com cuidado, mas com certeza vai ajudar muita gente que tem a mesma necessidade ou necessidades parecidas. Como você fez tão detalhado, o pessoal vai poder usar na verdade pra qq cenário, não apenas NFe.

Abração e obrigado por compartilhar o conhecimento com o pessoal.

Henrique.

Former Member
0 Kudos

Faltou o principal, o link direto né, rs...

Quis colocar o máximo de detalhes possível, pois a solução apesar de ser fácil, é bem cheia de detalhes também.

Obrigado você por sempre ajudar a solucionarmos nossos problemas.

Que venha o próximo!

Abraço.

Answers (0)