Páginas

quarta-feira, 17 de novembro de 2010

Configurar SAP J2EE Engine no S.N. Developer Studio

Estou começando a desenvolver alguns WebDynpro Java e de cara tive um problema, dentro do Developer Studio estava configurado um host e uma porta default que não funcionou, óbvio.

Ai vai como verificar a porta e o host certo.

Você pode entrar direto neste endereço http://host:porta/monitoring/SystemInfo ou entrar neste link http://host:porta/index.html e seguir os passos abaixo.

Entrar no link http://host:porta/index.html e depois em "System Information".

Host e Port

Configuração no Developer Studio.

Você pode verificar a configuração na aba J2EE Engine.

sexta-feira, 1 de outubro de 2010

Ativando Log de Mensagens

Muitas vezes ativando o log de mensagens da Monitor, pode ajudar a resolver diversos problemas, por exemplo de Mapping.

Ativado o log, dentro da transação SXI_MONITOR em uma mensagem, você consegue visualizar a mensagem de origem, a transformação pela Message Mapping, e depois a nova mensagem de destino.

No caso de cenários síncronos você pode visualizar dentro de uma mensagem, a mensagem de ida e a mensagem de volta (request e response).

Obs: desative o log depois, isso gera muitas mensagens e a tabela acaba crescendo muito.

Para ativar os logs, você deve entrar na transação:
- SXMB_ADMIN
- Configuração
- "Configurar Integration Engine".













Clicar no Botão "Configuração específica".

Inserir as duas linhas marcadas abaixo com o valor igual a 1, valor 2 você desativa.


Cenário com mensagem Síncrona:

Entrando em uma mensagem Síncrona disparada por um BPM.

Dentro da mensagem CENTRAL ("envio"), você pode verificar dois MainDocument:

- o primeiro é a mensagem com a estrutura da Message Interface Abstract Síncrona do BPM;

- o segunda MainDocument já é depois que passou pela Interface Mapping, formando a mensagem de entrada da Message Interface Sincrona Inbound;













Na mensagem Response ("Retorno"), você pode observar que vai existir também dois MainDocument:

- o primeiro MainDocument é a mensagem de retorno da Message Interface Síncrona Inbound;

- o segundo MainDocument é a mensagem depois que passou pela Interface Mapping e gerou a mensagem de entrada da Message Interface Abstract Síncrona.

quarta-feira, 1 de setembro de 2010

Mapping JDBC campo data no Oracle

Pode existes diversos formatos de campos do tipo date em um banco, para resolver esse problema podemos utilizar a função TO_DATE() e definir o formato da data.

Exemplo:
UPDATE minha_tabela SET DATE = TO_DATE ('1987-05-08 ',' AAAA-MM-DD')

Para resolver esse caso, você deve criar um atributo ao campo data com o nome "hasQuot".

Quando for criar seu message mapping, você deve passar o valor "No" para o campo "hasQuot".





Para o campo date, será necessário criar o seguinte mapping:
Constant: TO_DATE('
Constant: ','DDMMYYYY')
Resultado: TO_DATE('01092010','DDMMYYYY')


Obs: se você testar o mapping, vai ter esse resultado:
TO_DATE('01092010','DDMMYYYY')





segunda-feira, 2 de agosto de 2010

Mensagem "Select Original Language"

Quando criamos um objeto, muitas vezes recebemos a mensagem abaixo:


Simples de resolver, entre no menu "Tools-->Personal Settings..."

Selecione um idioma de criação para o objeto e depois "Apply".

Lock de Objetos

Muitas vezes estamos desenvolvendo alguma interface no PI e nossa conexão cai, depois quando entramos novamente no objeto não conseguimos modificar.


Segue os passos para desbloquear o objeto.

1 - Entrar no link http://servidor:porta/rep e clicar em "Administration".

2 - Clicar em "Repository" ou "Directory" e depois em "Lock overview", isso depende de onde o seu objeto esta bloqueado.

3 - Selecionar o seu objeto e clique em "Remove selected locks", preste atenção para não desbloquear outros objetos, pois sempre que estamos criando ou modificando objetos eles vão estar em lock.

4 - Pronto, objeto desbloqueado.

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.