Páginas

segunda-feira, 19 de julho de 2010

Criando Filas

Você pode criar as filas na transação "SXMB_ADMIN" entrando no menu "Administration --> Manage Queues".

Marcar tudo e clicar em "Register Queues".

Clicar em "Activate Queues"

Pronto, agora você pode entrar na transação "SMQR" e verificar as filas.

Dica: criar as filas no client 000 também.

terça-feira, 13 de julho de 2010

Abap Proxy - criar um Technical System do R3 no SLD (Dica para Basis)

O Technical System corresponde ao software para o host físico no qual ele está instalado. As definições exatas para cada sistema dependerá do tipo de sistema.

1 - Criar as seguintes Destination na SM59 do R3.
a) Integration_Server_001 -- Tipo H -- Apontando para o Integration Server.




























b) Criar a Destination "LCRSAPRFC" -- Tipo "T".

c) Criar a Destination "SAPSLDAPI" -- Tipo T.

2 - Entrar na transação "SLDAPICUST", marcar Primár, inserir o host e a porta do Integration Server, colocar o usuário SLDDSUSER e sua senha.

3 - Entrar na transação "SXMB_ADMIN".
a) Configuração --> Configurar Integration Engine

b) Entrar no menu "Processar" --> "Modificar dados de configuração globais", isso vai deixar você selecionar "Sistema de aplicação"e depois digitar "dest://(destination tipo H criado na sm59) e salvar.

4 - Entrar na transação RZ70.
  1. Marcar "Destino RFC standard;
  2. Colocar o host e o service do Integration Server;
  3. Marcar todas os programas de coleta de dados;
  4. Verificar se a maquina do R3 esta conseguindo resolver o host name da maquina do PI;
  5. Clicar em executar;

Deve ser exibido essa mensagem de sucesso.

5 - Apos ter feito isso você pode executar a transação "SLDCHECK", ela vai exibir uma tela parecida com a figura abaixo e deve carregar seu navegado.
A transação "SLDCHECK" vai verificar diversas comunicações.

6 - No SLD você vai conseguir verificar a criação do seu Technical System Abap.

quinta-feira, 8 de julho de 2010

JavaMapping com NodeList

Existe algumas maneiras de fazer um mapa entre mensagens, uma delas é você utilizar um javaMapping.

1 - Criar dois DT, um para entrada e outra para saída.




2 - Criar dois Message Type.

3 - Criar duas Message Interface.


4 - Criar um Imported Archive e importar o .class compactado no formato ZIP.

Código do JavaMapping.

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.sap.aii.mapping.api.StreamTransformation;
import com.sap.aii.mapping.api.StreamTransformationException;


public class JavaMappingBlog1 implements StreamTransformation{

private static final String EXCEPTION = "An exception occured: ";
private static final String CAB       = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
private static final String OrigBeg   = "<MT_Origem";
private static final String OrigEnd   = "</MT_Origem>";
private static final String MenBeg    = "<ns0:MT_Destino xmlns:ns0=\"http://javamapping.com\">";
private static final String MenEnd    = "</ns0:MT_Destino>";
private static final String RowBeg    = "<row>";
private static final String RowEnd    = "</row>";

// Método para buscar um valor em uma TAG dentro de um NodeList
public static String recuperaNode(Node node, String campo) {
String result="";
Element elmnt = (Element) node;
NodeList elmntLst = elmnt.getElementsByTagName(campo);
Element elmnt2 = (Element) elmntLst.item(0);
NodeList key = elmnt2.getChildNodes();
if (key.getLength()==0) result="";
else result = ((Node) key.item(0)).getNodeValue();
return result;
}
public void setParameter(Map arg0) {}
public void execute(InputStream in, OutputStream out) throws StreamTransformationException {
final String UTF8 = "UTF-8";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String inStr=""r1="";
String nome="", sobrenome="", idade="";
int c = -1, s = 0, e = 0;
try {
while ((c = in.read()) != -1)
baos.write(c);
inStr = baos.toString(UTF8);

// Remover alguns caracteres e substituir alguns.
// Coloquei uma imagem porque o HTML estava convertendo tudo

// procurando na string o inicio o e fim da mensagem
s = inStr.indexOf(OrigBeg);
e = inStr.indexOf(OrigEnd);

// pegando o inicio e o fim e convertendo para um InputStream
r1 = inStr.substring(s, e+OrigEnd.length());
InputStream row1 = new ByteArrayInputStream(r1.getBytes("UTF-8"));

// Gerar o NodeList
DocumentBuilderFactory dbf1 = DocumentBuilderFactory.newInstance();
DocumentBuilder db1 = dbf1.newDocumentBuilder();
Document doc1 = db1.parse(row1);
  doc1.getDocumentElement().normalize();
// Especificar o elemento para realizar o loop
  NodeList nodeLst1 = doc1.getElementsByTagName("row");
inStr = "";
if (nodeLst1!=null){
for (int cont = 0; cont < nodeLst1.getLength(); cont++) {
Node fstNode = nodeLst1.item(cont);

      if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

// busca o valor da TAG
nome = recuperaNode(fstNode, "nome");
sobrenome = recuperaNode(fstNode, "sobrenome");
idade = recuperaNode(fstNode, "idade");

// Monta o a TAG row de saída
inStr = inStr + RowBeg"<nomeComleto>" + nome + " " + sobrenome +   "</nomeComleto>" + "<idade>" + idade  + "</idade>"RowEnd;

      }
  }
}

// Monta a mensagem de saída
inStr = CAB + MenBeg + inStr + MenEnd;
 
out.write(inStr.getBytes(UTF8));

}
catch (Exception exception){
throw new StreamTransformationException(EXCEPTION + exception.getMessage());
}
}
public static void main(String[] args) {
final String INPUT  = "/Users/kaleokuntgen/Compartilhada/blog1.xml";
final String OUTPUT = "/Users/kaleokuntgen/Compartilhada/blog1_resp.xml";
try {
JavaMappingBlog1 JavaMappingBlog1 = new JavaMappingBlog1();

InputStream input = new FileInputStream(INPUT);
OutputStream output = new FileOutputStream(OUTPUT);
JavaMappingBlog1.execute(input, output);
input.close();
output.flush();
output.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}

5 - Criar a Interface Mapping com as mensagens e o imported archive.

6 - Entre na aba "Test" para verificar o mapeamento.

terça-feira, 6 de julho de 2010

Criando um Integration Scenario

Integration Scenario é um objeto criado dentro do Design, onde você vai desenhar o fluxo das mensagens e informar quais os seus mapas.

1 - Criar um Data Type


2 - Criar um Message Type

3 - Criar uma Message Inteface Outbound Asynchronous.

4 - Criar uma Message Inteface Inbound Asynchronous para gravação do arquivo.

5 - Criar um mapa entre os Message Type
7 - Criar uma Interface Mapping com as duas Message Interface e adicionar o mapa criado.

8 - Criando o Integration Scenario.
a) Clicar com o botão direito e inserir um Application Component para o Client Abap.


b) Selecionar "Template" e informar o nome e descrição do Application Component.


c) Clicar com o botão direito e inserir outro Application Component para o Party.

d) Selecionar "Template" e "External Party with B2B Communication", informar o nome e descrição.

e) Botão direito, clicar em "Create Action".


f) Selecionar External.

g) Dar um nome ao Action.


h) Adicionar a MI de Outbound.

i) Botão direito, clicar em "Create Action".

j) External.

k) Da um nome ao Action.

l) Adicionar a MI de Inbound


m) Selecionar os dois actions e clicar com o botão direto, selecionar "Create Connection Between Selected Actions".

n) Clicar na aba "Assign Mapping"

o) Selecionar a Interface Mapping.


p) IM.


q) Apply.


r) Clicar com o botão direito nos actions e definir Star e End e depois salvar.

Agora você deve abrir o Configuration (Directory)
1 - Criar um Party "PA_Blog"

2 - Criar um Business Service "BE_Rede".

3 - Criar um Communication Channel "CC_FILE_Rcv_ArquivoBlog1"do tipo File

4 - Informar o diretório da rede onde o arquivo vai ser salvo e o nome do arquivo.

5 - No menu clicar em "Transfer Integration Scenario from Integration Repository...".

6 - Selecione o Integration Scenario criado no Design.


7 - Dar um nome ao cenário que será criado.


8 - Clicar em "Assign Services".


9 - Selecionar u Business System do client Abap e clicar na aba Business Services for B2B.


10 - Você deve selecionar um Party com seu Service e marcar novamente o Business System selecionado anteriormente. Esse Party com esse service é apenas um Party criado sem nenhum Communication Channel, apenas para representar o seu Business System. Clicar em Next Role.

11 - Selecionar o Party "PA_Blog".


12 - Clicar em "Starting of configuration connections".


13 - Selecionar o Communicaiton Channel criado. Note que não é necessário ter um communication channel para o Business System porque estamos utilizando chamada de proxy. Clicar em Apply.


14 - Clicar em "Generate".


15 - Marcar "Generation" e clicar em "Start".


16 - Vai ser exibido uma tela como log dos objetos criados e se gerou algum erro, pode fechar.


17 - Clicar em fechar.


18 - Apply.

19 - Objetos gerados.

20 - Código do programa Abap.


REPORT zblog1.

DATA: me TYPE REF TO zclco_mi_asyn_out_arquivo,
output TYPE zclmt_arquivo.

TRY.
CREATE OBJECT me.
ENDTRY.

output-mt_arquivo-nome = 'Kaleo'.
output-mt_arquivo-idade = '23'.

TRY.
CALL METHOD me->mi_asyn_out_arquivo
EXPORTING
output = output.
CATCH cx_ai_system_fault .
ENDTRY.

Commit work and wait.


21 - Mensagens geradas na transação SXI_MONITOR.


22 - Arquivo gerado.