Você está na página 1de 47

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

Lus Fernando Berti Santos Consultor BC Luis.santos@procwork.com.br

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 1 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


1) Passos para a criao no SAP de tabelas de acesso externo: Criar e ativar a tabela no SAP, normalmente.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 2 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


As opes tcnicas no devem ser alteradas:

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 3 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


Aps ativada, a tabela deve ser excluda do banco de dados, existindo somente, no dicionrio SAP:

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 4 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

2) Converso entre tipos: TIPO SAP P (DEC) N, CHAR DATS, TIME I TIPO BASE EXTERNA Numeric Varchar Integer

Com esse modelo, no teremos problema algum com a converso de data-types entre os ambientes. Convm ressaltar que NO devemos usar os tipos especficos do SAP, para no termos que nos preocupar com converso de tipo de dados em todos os programas que faro acesso essas tabelas.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 5 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


Outro ponto que dificilmente conseguiremos criar tabelas com chaves externas, devido justamente criao das tabelas com ELEMENTO DE DADOS diferentes dos utilizados pelo SAP Standard, portanto, no podemos esquecer que essas tabelas, no so consistidas pelo SAP. Muito importante ressaltar que, apesar de o SAP no consistir essas tabelas, no significa que poderemos ter com isso, programas que gerem dados inconsistentes, pois o que pode e deve-se fazer, criar consistncias no prprio DB (utilizando-se de recursos de Integridade Referencial). Isto muito utilizado no mundo externo ao SAP, pois em sistemas baseados em ORACLE, SYSBASE, SQL Server, OpenINGRES, etc., quem consiste os dados no so os programas e sim o prprio SGBD, como alis acontece no SAP, s que de forma transparente para ns consultores ABAP. Outra ferramenta muito poderosa que dispomos quando utilizamos base de dados externas, so as triggers (ou store procedure, etc.) pois atravs delas podemos fazer com que ao inserirmos dados na tabela, automaticamente, seja disparado um processo que atualize uma ou mais tabelas, fazendo com isso a integridade referencial (cabe ressaltar que para o desenvolvimento destas rotinas, necessrio um profissional especfico do DB que estamos trabalhando, pois esta escrita diretamente no DB).

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 6 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

3) Criando Sinnimo (SYNONYM) na base da dados externa: Primeiramente, apesar de normalmente ns (equipe de ABAP) criarmos as tabelas no SAP, quando se trata de sinnimos, devido natureza e complexidade da criao, no nos incumbe tal tarefa. Ns somente devemos nos preocupar com a criao da tabela no SAP, conforme demonstrado no item 1 acima, porm veremos abaixo procedimentos para que possamos entender e, se necessrio for, at criarmos os sinnimos: 3.1) Definio: Os sinnimos fazem parte do esquema de uso de tabelas remotas, destinadas a troca de informaes entre o sistema R/3 e outros sistemas de Banco de Dados. O sinnimo ( synonym ) um recurso do SGBD que permite acesso a objetos em bancos de dados remotos, de maneira transparente, que consiste basicamente na criao de um redirecionamento de chamadas ( requests ) dos clientes para um banco remoto.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 7 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

3.2) Porque utilizarmos Sinnimos ? Como j vimos, o sinnimo (synonym) uma ferramenta dos SGBDs atuais que permitem fazermos ligao lgica entre uma requisio de informaes e a informao fsica. Esquecendo um pouco o SAP (se que possvel isso), imaginemos um sistema qualquer, escrito em uma linguagem qualquer (que no seja ABAP!) onde temos inmeros programas acessando determinada tabela em deterninado servidor e em determinado Banco de Dados. Por alguma razo (utilizaremos a hiptese de espao em disco), precisamos alterar o servidor (mquina fsica) e banco de dados e, de quebra tambm o nome desta tabela. Pronto, temos um enorme problema em nossas mos: precisaremos localizar e alterar TODOS os cdigos fonte que fazem acesso essa tabela. Porm, neste momento em que entra um Sinnimo, pois atravs dele, enganaremos o servidor de Banco de Dados. Como? Criaremos um sinnimo, no banco de dados j existente, apontando para aquele servidor/banco de dados/tabela, fazendo assim com que no precisemos alterar NENHUMA linha de codificao.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 8 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


3.3) Suas Aplicaes e Vantagens: As tabelas fsicas so todas criadas em um banco de dados especfico para este fim (com os devidos procedimentos de segurana e contingncia), e so acessadas atravs de um Database Link (recurso do SGBD) criado manualmente com o banco de dados do R/3. Mantendo as tabelas no SAP em um banco de dados separado desonera o servidor de banco de dados para o R/3 (desde que os DBs estejam em mquinas diferentes), pois as operaes de acesso ( select, insert, delete, update ) so processadas pelo servidor onde as tabelas foram criadas fisicamente. O uso do Database Link entre bancos de dados, permite o acesso tambm a tabelas de Bancos de dados Terceiros, atravs do produto Transparent Gateway (somente para Oracle), pois o SAP pode fazer uma request para o Oracle que, poder ser atendida pelo SYBASE ou SQLServer. Este caso serve para podermos acessar dados de sistemas que no esto nem sequer com o mesmo tipo de Banco de Dados onde encontra-se instalado o SAP, aumentando assim a integrao do SAP com qualquer ambiente externo.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 9 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


3.4) Desvantagens: Por no ser standard (obviamente), no possui quase nenhum recurso de consistncia automtica de dados (tab. Verificao por exemplo), alm de no podermos visualizar de forma rpida e fcil os dados nelas contidos (temos que utilizar aplicativos especficos dos banco de dados). Por no conterem dados nem sequer tabela fsica vinculada no SAP, no podemos utilizar estas tabelas em queries, sendo assim somente possvel acessarmos atravs de programa ABAP. 3.5) IMPORTANTSSIMO: Outra questo muito importante que quando um sinnimo criado para uma tabela do mesmo Banco de Dados, podemos utilizar OpenSQL, isso mesmo, podemos, porm no 100% garantido o funcionamento. O ideal utilizarmos diretamente acesso Nativo, pois desta forma, evitaremos problemas futuros (no caso Legado, funcionava normalmente, sendo que quando atualizaram a verso do Oracle, parou de funcionar). Quando trata-se de um link para outro banco de dados, no possvel, na maioria dos casos, o acesso por OpenSQL, pois apesar de que deveria ser transparente para o SAP, no funciona, conforme mencionado anteriormente.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 10 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


3.6) Procedimentos para Criao do Database Link

(ORACLE/UNIX): Deve-se incluir os novos schemas a serem acessados no listener do DB Server para o SAP R/3.
vi /oracle/SID/network/admin/tnsnames.ora O05DS.WORLD = (DESCRIPTION = (ADDRESS = (PROTOCOL= TCP)(Host= risc05)(Port= 1521)) (CONNECT_DATA = (SID = O05DS)) ) S08PR = (DESCRIPTION = (ADDRESS = (PROTOCOL= TCP)(Host= risc05)(Port= 1521)) (CONNECT_DATA = (SID = s08pr)(SERVER=DEDICATED)) )

Sintaxe do comando para criao do sinnimo:


create public database link <NOME> connect to <USER> identified by using <SERVICENAME>

onde: <NOME>: identificao do database link <USER>: usurio remoto utilizado para acesso (uso do sapr3 para este fim definitivamente no permitido) <SERVICENAME>: identificao do sistema remoto (conforme configurado no listener do Oracle) Utilizar usurio padro do R/3 SYSTEM Exemplos: create public database link O05DS

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 11 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


connect to DSVR3 identified by SENHA using 'O05DS'; Acessando Sybase: create public database link S08PR connect to USERORA identified by SENHA using 'S08PR'; Onde S08PR USERORA usurio criado no Sybase, e S08PR a configurao para o Transparent Gateway no servidor dbhx05cd. 3.7) Passos no dicionrio de dados ( SAP R/3 e Oracle ): a) Criar a tabela de interface no dicionrio de dados do R/3 como mencionado no item 1 acima.

3.8) Criao do Sinnimo para a tabela do SAP R/3: Remover, manualmente a tabela da base de dados ( manter a definio do dicionrio de dados do R/3 ), como mencionado no item 1, ou conforme abaixo: Utilizar usurio padro do R/3 SAPR3 Exemplo: drop table ZTABELA4; Criar o sinnimo, com o nome da tabela ( transparent table ) removida, para a tabela remota. Sintaxe do comando:
create public synonym <NOME> for <USER>.<TABLE>@<SERVICENAME>.WORLD;

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 12 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


onde: <NOME>: identificao do sinnimo <USER>: usurio remoto utilizado para acesso ( uso do sapr3 para este fim definitivamente no permitido) <TABLE>: nome da tabela criada no banco de dados remoto <SERVICENAME>: identificao do sistema remoto (conforme configurado no listener do Oracle) Utilizar usurio padro do R/3 SYSTEM Exemplo:
create public synonym "ZTABELA4" for DBAR3.T_TABELA4@O05DS.WORLD;

Exemplo para Sybase:


create public synonym "ZTR30019" for "dbcdapd..T_R3_ESTOQUE"@S08PR;

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 13 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

4) Formas de Acesso Base de Dados externa: Um problema no acesso aos dados que esto na base de dados externa, que eles no so visveis no ambiente SAP, como as tabelas no SAP. Exemplo: no podemos visualizar o contedo da tabela de forma alguma pelas transaes do DDIC, sendo que ao tentarmos, receberemos a infeliz mensagem de que a tabela no existe no banco de dados.

Logo ao entrar vemos que a tabela no existe no SAP

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 14 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


Logo quando entramos na SE11, podemos visualizar que esta tabela no existe no Banco de Dados (pelo menos para o SAP no), e se tentarmos mesmo assim visualizar os dados nela contidos atravs do menu Utilitrios -> Contedo da Tabela, teremos mais uma vez a infeliz notcia de que no existe tabela no banco de dados para a tabela em questo:

No adianta insistir...

Bem, como vimos, impossvel visualizar-mos os dados destas tabelas pelo SAP, o que de certa forma dificulta um pouco nosso trabalho. A nica forma de vermos as informaes armazenadas nestas tabelas, acessando diretamente o servidor de banco de dados

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 15 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


utilizando-se para tanto algum tipo de utilitrio de acesso base de dados (SQL plus Oracle, RapidSQL - SYSBASE, ISQL, SQL Server, etc.) para atravs destes, podermos visualizar os dados (na maioria dos casos utilizamos comando SQL puro para visualizar os dados ou atravs de botes da prpria interface do aplicativo, o que facilita nosso trabalho). Alm da forma descrita acima, a nica outra forma de visualizarmos os dados dentro de um programa ABAP, onde atravs do SELECT, carregamos os dados das tabelas em tabelas internas (Application Server). 4.1) Acessando uma tabela externa dentro de um Programa ABAP: Apesar de todos os detalhes na criao e visualizao destas tabelas, o acesso ela pode ser to simples quanto o acesso a qualquer tabela SAP. Para acessarmos essas tabelas, na maioria dos casos, no precisamos de nenhuma codificao diferenciada para extrarmos os dados dela. isso mesmo, na maioria dos casos, porque, em determinadas circunstncias, o OpenSQL no funciona, chegando at a travar o servidor de Banco de Dados (muito comum principalmente no SYSBASE). Acontece que quando fazemos acesso essas tabelas externas com OpenSQL o SAP (por algum motivo que nem a

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 16 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


prpria SAP soube responder), aberto um cursor no Banco de Dados e de alguma forma, perde-se a ligao com o programa ABAP, ficando desta forma ambos os processos presos (tanto o programa ABAP quanto o Cursor de Banco de Dados).
*** Estes problemas foram constatados principalmente no SYSBASE.

Portanto, para sanarmos esse e qualquer outro eventual problema, podemos utilizar o que a SAP chama de NativeSQL, pois atravs deste mtodo de acesso, no h interferncia no comando SQL pelo interpretador ABAP, sendo que este comando vai diretamente para a Base de Dados externa, conforme esquema abaixo:

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 17 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

5) Utilizando comandos NativeSQL:

Lembremos que o OpenSQL permite-nos acessar as tabelas do banco de dados declaradas no dicionrio ABAP, independente da plataforma em que estamos trabalhando com o R/3, porm, algumas vezes, necessitamos utilizar comandos especficos do banco de dados e, no somente para acessar sinnimos, como vimos at agora. Para decidirmos pela utilizao de NativeSQL, devemos ter em mente que quando escrevemos um programa com comandos especficos do banco de dados, este programa s funcionar no DB para o qual foi previamente escrito, portanto, se no quisermo incorrer em problemas futuros com possveis mudanas de banco de dados, no devemos utilizar NativeSQL. Um comando NativeSQL, deve ser sempre precedido pela declarao EXEC SQL e, finalizado sempre com a declarao ENDEXEC, conforme exemplo abaixo:
EXEC SQL [PERFORMING <form>]. ENDEXEC. Parmetro opcional

<Comandos Native SQL> [;]

Vejamos agora uma lista de comandos que, independente do Banco de Dados, esto includos no NativeSQL. (esta lista pode ser maior, dependendo do Banco de Dados).

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 18 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

Transaction management o COMMIT o ROLLBACK

Data definition o CREATE TABLE o DROP TABLE o ALTER TABLE o CREATE VIEW o DROP VIEW o CREATE INDEX o DROP INDEX o GRANT o REVOKE

Data manipulation o SELECT o INSERT o UPDATE o DELETE o DECLARE CURSOR

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 19 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


o OPEN o FETCH o CLOSE Devemos lembrar que o uso do ; no final de um comando NativeSQL opcional (depende do banco de dados que estamos trabalhando), ao passo que ao contrrio de um comando ABAP, um comando NativeSQL nunca pode terminar com .. Quando utilizamos NativeSQL, as tabelas no necessitam estar declaradas no Dicionrio ABAP (depende do banco de dados, obrigatrio) e, desta maneira, no necessitam ser declaradas pelo comando TABLE. Porm devemos atentar para o fato de o banco de dados ser case-sensitive ou no, pois seno teremos uma conversinha com nosso velho amigo DUMP . No NativeSQL no h especificao automtica de client, deste modo, se necessrio for, devemos observar mais este detalhe. Os dados so transportados entre a tabela do banco de dados e o programa ABAP, atravs de variveis host, que devem ser declaradas normalmente no programa ABAP (sempre atentando para a tabela de converso citada no item 2 acima) e, devem ser precedidas de :, dentro da clusula EXEC SQL, conforme veremos exemplos de comandos logo abaixo. Podemos utilizar campos ou estruturas dentro do NativeSQL.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 20 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


No necessrio utilizarmos o comando CONNECT para acessarmos dados das tabelas com NativeSQL, pois isto j feito automaticamente quando o R/3 estartado. Ao contrrio da sintaxe do ABAP, aspas duplas no comenta a linha em NativeSQL, sendo que para informarmos Strings (textos) na clusula WHERE, sem este estar contido em uma varivel tipo CHAR, devemos utilizar aspas duplas e no aspas simples como em ABAP (dependendo do Banco de Dados). NUNCA um comando EXEC SQL, retornar dados

diretamente dentro de uma tabela interna, pois seu processamento executado linha-a-linha, fazendo com isso que, se o resultado desejado for uma tabela, deveremos utilizar a sintaxe PERFORMING <form>, onde transportaremos os dados da WA para uma Tabela Interna. Quanto utilizamos o comando PERFORMING <form>, o formulrio <form> executado para cada registro retornado pela clusula SELECT, ou seja, podemos process-los um a um, ou executar APPEND em uma tabela interna para processamento(s) futuro(s), sendo que o comando EXIT FROM SQL. Outro ponto importante, que o AUTHORIT-CHECK no executado quando usamos NativeSQL.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 21 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


Exemplos: a) Neste exemplo, o resultado ser uma lista impressa linha-alinha com cada registro lido. DATA: BEGIN OF WA, CLIENT(3), ARG1(3), ARG2(3), END OF WA. DATA F3 VALUE ' 1 '. EXEC SQL PERFORMING LOOP_OUTPUT. SELECT CLIENT, ARG1 INTO :WA FROM TABLE_001 WHERE ARG2 = :F3 ENDEXEC. FORM LOOP_OUTPUT. WRITE: / WA-CLIENT, WA-ARG2. ENDFORM. b) Este exemplo, serve para criarmos uma tabela no banco de dados, tabela esta que obviamente no estar no Dicionrio ABAP. EXEC SQL. CREATE TABLE AVERI_CLNT ( CLIENT CHAR(3) NOT NULL, ARG1 CHAR(3) NOT NULL, ARG2 CHAR(3) NOT NULL, FUNCTION CHAR(10) NOT NULL, PRIMARY KEY (CLIENT, ARG1, ARG2) ) ENDEXEC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 22 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


c) Neste exemplo podemos ver que a especificao de variveis na clusula INTO possvel, de maneira semelhante utilizada pelo OpenSQL. DATA: F1(3), F2(3), F3(3). F3 = ' 1 ' EXEC SQL. SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT WHERE ARG2 = :F3 ENDEXEC. WRITE: / F1, F2.

d) para simplificar a clusula INTO, podemos tambm informar uma estrutura, como j mencionado, a exemplo de como fazemos com OpenSQL. DATA: BEGIN OF WA, CLIENT(3), ARG1(3), ARG2(3), END OF WA. DATA F3(3). F3 = ' 1 ' EXEC SQL. SELECT CLIENT, ARG1 INTO :WA FROM AVERI_CLNT WHERE ARG2 = :F3 ENDEXEC. WRITE: / WA-CLIENT, WA-ARG1.

e) podemos utilizar OpenSQL para tabelas externas, desde que tenham sido criados sinnimos anteriormente para elas: NativeSQL: EXEC SQL PERFORMING ZF_APPEND_TAB.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 23 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


SELECT CLIENT, NUMBER FROM TAB001 INTO :T_TAB WHERE NUMBER > 100 AND CLIENT = :SY-MANDT ENDEXEC. OpenSQL: SELECT NUMBER FROM TAB001 INTO TABLE T_TAB WHERE NUMBER > 100. Devemos lembrar que quando utilizamos o NativeSQL, necessrio especificarmos mandantes. o mandante que desejamos selecionar, caso contrrio, o resultado ser a juno de dados de TODOS os

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 24 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

6) Comandos OpenSQL/NativeSQL avanados: Veremos agora algumas clusulas SQL que esto presentes na maioria dos banco de dados atuais e, que desta forma podemos utilizar no ambiente SAP. 6.1) Funes Agregadas ou de Agrupamento: funo 1) 2) 3) 4) 5) avg(n) count(expr) max(expr) min(expr) sum(n) retorno
mdia do valor n, ignorando nulos vezes que o nmero da expr avalia para algo no nulo maior valor da expr menor valor da expr soma dos valores de n, ignorando nulos

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 25 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


Exemplos: AVG: OpenSQL: SELECT MATNR AVG( BSTMI ) AVG( BSTMA ) FROM MARC INTO TABLE T_MARC GROUP BY MATNR. NativeSQL: EXEC SQL PERFORMING ZF_APPEND_1. SELECT MATNR, AVG( BSTMI ), AVG( BSTMA ) FROM MARC INTO :T_MARC WHERE MANDT = :SY-MANDT GROUP BY MATNR ENDEXEC. FORM ZF_APPEND_1. APPEND T_MARC. CLEAR ENDFORM. T_MARC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 26 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

COUNT: OpenSQL: SELECT COUNT( DISTINCT MATNR ) FROM MARC INTO V_CONTA_1. NativeSQL: EXEC SQL. SELECT COUNT( MATNR ) FROM MARC INTO :V_CONTA_2 WHERE MANDT = :SY-MANDT ENDEXEC. MAX: OpenSQL: SELECT MATNR MAX( BSTMI ) MAX( BSTMA ) FROM MARC INTO TABLE T_MARC GROUP BY MATNR.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 27 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


NativeSQL: EXEC SQL PERFORMING ZF_APPEND_3. SELECT MATNR, MAX( BSTMI ), MAX( BSTMA ) FROM MARC INTO :T_MARC WHERE MANDT = :SY-MANDT GROUP BY MATNR ENDEXEC. MIN: OpenSQL: SELECT MATNR MIN( BSTMI ) MAX( BSTMA ) FROM MARC INTO TABLE T_MARC GROUP BY MATNR. NativeSQL: EXEC SQL PERFORMING ZF_APPEND_3. SELECT MATNR, MIN( BSTMI ), MAX( BSTMA ) FROM MARC INTO :T_MARC WHERE MANDT = :SY-MANDT GROUP BY MATNR ENDEXEC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 28 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


SUM: OpenSQL: SELECT MATNR SUM( BSTMI ) SUM( BSTMA ) FROM MARC INTO TABLE T_MARC GROUP BY MATNR. NativeSQL: EXEC SQL PERFORMING ZF_APPEND_4. SELECT MATNR, SUM( BSTMI ), SUM( BSTMA ) FROM MARC INTO :T_MARC WHERE MANDT = :SY-MANDT GROUP BY MATNR ENDEXEC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 29 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


6.2) HAVING: utilizado para restringir a matriz resultado dos selects anteriores, por exemplo. Exemplo: OpenSQL: SELECT MATNR SUM( BSTMI ) SUM( BSTMA ) FROM MARC INTO TABLE T_MARC GROUP BY MATNR HAVING SUM( BSTMI ) > 10 AND SUM( BSTMA ) > 20. NativeSQL: EXEC SQL PERFORMING ZF_APPEND_6. SELECT MATNR, SUM( BSTMI ), SUM( BSTMA ) FROM MARC INTO :T_MARC WHERE MANDT = :SY-MANDT GROUP BY MATNR HAVING SUM( BSTMI ) > 10 AND SUM( BSTMA ) > 20 ENDEXEC. Vale lembrar que o HAVING pode ser usado tambm com as outras funes de agragamento (MAX, MIN, AVG, COUNT).

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 30 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


6.3) Join de Tabelas: OpenSQL: SELECT MARA~MATNR MAKT~MAKTX MARC~WERKS FROM MARA INNER JOIN MAKT ON MARA~MATNR EQ MAKT~MATNR INNER JOIN MARC ON MARA~MATNR EQ MARC~MATNR INTO TABLE T_JOIN WHERE MARC~WERKS = 'CE01' AND MAKT~SPRAS = SY-LANGU. NativeSQL: EXEC SQL PERFORMING ZF_APPEND_7. SELECT A.MATNR, B.MAKTX, C.WERKS FROM MARA A, MAKT B, MARC C INTO :T_JOIN WHERE A.MATNR = B.MATNR AND A.MATNR = C.MATNR AND A.MANDT = :SY-MANDT AND B.MANDT = :SY-MANDT AND C.MANDT = :SY-MANDT AND B.SPRAS = :SY-LANGU ENDEXEC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 31 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


6.4) Subconsultas: Primeiramente, devemos ressaltar que as subconsultas

dentro do SAP, deve ser utilizada atravs da clusula FOR ALL ENTRIES, sendo que em SQL, no existe tal clusula, como veremos a seguir: OpenSQL: ***Apenas para utilizao no FOR ALL ENTRIES SELECT MATNR MTART FROM MARA INTO TABLE T_MARA WHERE MTART = 'HAWA'. SELECT MARA~MATNR MAKT~MAKTX MARC~WERKS FROM MARA INNER JOIN MAKT ON MARA~MATNR EQ MAKT~MATNR INNER JOIN MARC ON MARA~MATNR EQ MARC~MATNR INTO TABLE T_JOIN FOR ALL ENTRIES IN T_MARA WHERE MARC~WERKS = 'CE01' AND MAKT~SPRAS = SY-LANGU AND MARA~MATNR = T_MARA-MATNR.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 32 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


NativeSQL: EXEC SQL PERFORMING ZF_APPEND_8. SELECT A.MATNR, B.MAKTX, C.WERKS FROM MARA A, MAKT B, MARC C INTO :T_JOIN WHERE A.MATNR = B.MATNR AND A.MATNR = C.MATNR AND A.MANDT = :SY-MANDT AND B.MANDT = :SY-MANDT AND C.MANDT = :SY-MANDT AND B.SPRAS = :SY-LANGU AND A.MATNR IN ( SELECT MATNR FROM MARA WHERE MTART = 'HAWA' ) ENDEXEC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 33 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


6.5) Insert: Observao: Lembre-se de que quando utilizamos NativeSQL, necessrios especificarmos o mandante ! DATA: T_Z3DADOST LIKE Z3DADOST. T_Z3DADOST-ZCODIGO = 00040. T_Z3DADOST-DESCRICAO = 'TESTE DO CURSO DE SQL'. INSERT INTO Z3DADOST VALUES T_Z3DADOST. COMMIT WORK. ADD 1 TO T_Z3DADOST-ZCODIGO. EXEC SQL. INSERT INTO Z3DADOST ( MANDT, ZCODIGO, DESCRICAO ) VALUES( :SY-MANDT, :T_Z3DADOST-ZCODIGO, :T_Z3DADOST-DESCRICAO ); COMMIT; ENDEXEC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 34 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

6.6) Trabalhando com Cursores de Banco de Dados: Para abrirmos um cursor de banco de dados, obrigatrio declararmos uma varivel tipo CURSOR, e um cursor de banco de dados pode ser utilizado somente para comandos SELECT e, este comando SELECT, deve, obrigatoriamente retornar mais do que uma linha como resultado. Sintaxe: OPEN CURSOR C1 FOR SELECT * FROM SFLIGHT WHERE CARRID = 'LH '. FETCH CURSOR C1. CLOSE CURSOR C1. Sim, este comando muito semelhante ao OpenSQL, at porque pertence classe de comandos do OpenSQL, sendo desta forma, impossvel a sua utilizao atravs de NativeSQL.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 35 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


Exemplo: DATA: C1 TYPE CURSOR. OPEN CURSOR C1 FOR SELECT MATNR MTART FROM MARA WHERE MTART = 'HAWA'. DO. FETCH NEXT CURSOR C1 INTO T_MARA. IF SY-SUBRC EQ 0. APPEND T_MARA. ELSE. EXIT. ENDIF. ENDDO. CLOSE CURSOR C1.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 36 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

7) Utilizando o SQLTrace: Esta uma ferramenta muito importante no nosso dia-a-dia, pois com ela podemos transaes descobrir e com exatamente quais quais tabelas podemos determinadas bem simples: chaves,

perfeitamente utiliz-la. Veremos a seguir como sua utilizao

Transao ST05

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 37 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

Ento, ativamos o trace. Neste momento, deveremos executar o

programa/transao/funco que queremos fazer o trace.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 38 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

O resultado ser este Report, com todos os acessos de tabela executados pelo usurio enquanto o Trace estava ativo. Para obtermos maiores detalhes, devemos clicar duas vezes na linha desejada.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 39 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

Veremos ento, o comando SQL que foi enviado para o DB Server, podendo at copiarmos e utilizarmos em instrues Native ou OpenSQL.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 40 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


UNION: Muito pouco utilizado, mas com enorme utilidade, esta clusula faz com que o resultado de dois ou mais SELECTs sejam obtidos como resultado. A quantidade e o tipo dos campos em TODOS os SELECTs devem sempre ser o mesmo, sendo que podermos preench-lo com literais quando em alguma das tabelas no tivermos todos os campos das demais. Exemplo: EXEC SQL PERFORMING ZF_APPEND_11. SELECT MATNR, MTART FROM MARA UNION SELECT MATNR,'XXXX' FROM MARC UNION SELECT DISTINCT MATNR, 'AAAA' FROM MARD WHERE MATNR IN ( SELECT MATNR FROM MARA ) INTO :T_MARA ENDEXEC.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 41 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


8) MODELO DE DADOS

Interface com o SAP R/3 Verso: 23/03/99


t_r3_inte rface
no_tab_interface: VARCHAR2(30) NOT NULL dc_interface: VARCHAR2(250) NOT NULL sg_sist_gerador: VARCHAR2(2) NOT NULL cd_pgm_gerador: VARCHAR2(8) NOT NULL no_resp_geracao: VARCHAR2(30) NOT NULL sg_sist_receptor: VARCHAR2(2) NOT NULL cd_pgm_receptor: VARCHAR2(8) NULL id_depend_seq: NUM BER(10) NOT NULL id_periodicidade: NUMBER(10) NULL qt_dia_retencao: NUM BER(10) NOT NULL cd_usuario: VARCHAR2(12) NOT NULL dt_atualizacao: VARCHAR2(8) NOT NULL

t_r3_xxxx xxxx
nm_seq_registro: NUMBER(15,0) NOT NULL dt_geracao: VARCHAR2(8) NULL hr_geracao: VARCHAR2(6) NULL dt_processamento: VARCHAR2(8) NULL hr_processamento: VARCHAR2(6) NULL id_sit_registro: NUMBER(3) NOT NULL cd_erro_registro: VARCHAR2(8) NULL coluna_1: VARCHAR2(8) NULL coluna_2: VARCHAR2(10) NULL coluna_n: NUM BER(5) NULL

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 42 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


9) DESCRIO DO MODELO DE DADOS
As interfaces dos Sistemas Legado com o SAP R/3 (e vice-versa) utilizaro as tabelas:  t_r3_interface (Cadastro das Interfaces com o SAP R/3)  t_r3_xxxxxxxx (este um exemplo para mostrar os controles que todas as tabelas de dados devero conter. ) 9.1 - Tabela: t_r3_interface Cadastro das Interfaces entre o sistema SAP R/3 e os demais sistemas(vice-versa). Colunas: no_tab_interface - Nome da tabela que contm os registros de interface.(Ser utilizado pelo programa de limpeza e pelo programa de monitorao) dc_interface - Descrio da finalidade da interface. sg_sist_gerador - Sigla do sistema que gera a interface. cd_pgm_gerador - Cdigo do programa que gera a interface. no_resp_geracao - Nome do Analista responsvel pelo Sistema que far a gerao da interface. sg_sist_receptor - Sigla do sistema que recebe a interface. cd_pgm_receptor - Cdigo do programa que trata os registro no sistema destino. id_depend_seq - Indica se o processamento dos registros da tabela de interface deve obedecer a sequncia de gerao Domnio: 0 - No 1 - Sim Regra: Se uma interface possui id_depend_seq = 1 e ocorre um erro no processamento de um registro, os demais registros no podero ser processados enquanto o problema no for resolvido. id_periodicidade - Indica a periodicidade de gerao da interface. Domnio: 1 - Diria 7 - Semanal 15 - Quinzenal 30 - Mensal 180 - Semestral 360 Anual qt_dia_retencao - Quantidade de dias para reteno do registro aps o processamento. dt_atualizacao - Data da ltima atualizao no Cadastro de interfaces. cd_usuario - Cdigo do usurio (login) responsvel pela ltima atualizao.

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 43 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


9.2 - Tabela: t_r3_xxxxxxxx Exemplo de definio de uma tabela de interface com o SAP R/3. A tabela t_r3_xxxxxxxx conter os dados que devem ser trocados entre os Sistemas Legado e o SAP R/3, e tambm os campos de controles para a verificao do processamento de cada registro. Existir uma tabela para cada Interface necessria. Os nomes das tabelas devero iniciar sempre com t_r3_, e em seguida um nome identificando a interface. Exemplo: t_r3_mov_estoque, t_r3_faturamento_diario, t_r3_preos.... Quando for solicitado a criao dessas tabelas, devemos solicitar tambm a criao de um sequence para a tabela, com o respectivo TRIGGER para o nmero sequencial do registro. Colunas: nm_seq_registro Nmero sequencial para controle de gerao do registro. (Ser gerado automaticamente por uma Trigger de Banco). dt_geracao Data em que foi a gerada a interface (a mesma data para os registros de um mesmo processamento). hr_geracao Hora em que foi gerada a interface(a mesma hora para os registros de um mesmo processamento). dt_processamento Data em que foi processada a interface(a mesma data para os registros de um mesmo processamento). hr_processamento Hora em que foi processada a interface(a mesma hora para os registros de um mesmo processamento). id_sit_registro Indica a situao do processamento de um registro de interface. Domnio: 1 - No processado 2 - Em processamento 3 - Processado OK 4 - Processado com ERRO 5 - Cancelado Transio de estados: 12 2 3 ou 4 ou 5 4 1 ou 5 cd_erro_registro Cdigo de erro ocorrido no processamento do registro. Coluna_1 Conforme definio das Solicitaes de Servio (feitas para gerar arquivos texto). Coluna_2 Conforme definio das Solicitaes de Servio (feitas para gerar arquivos texto). Coluna_3 Conforme definio das Solicitaes de Servio (feitas para gerar arquivos texto). Coluna_n Conforme definio das Solicitaes de Servio (feitas para gerar arquivos texto).

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 44 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

10) FORMAS DE INTERFACEAMENTO COM O SAP R/3     Tabelas de Interface Tabelas Corporativas IDOCs CALL FUNCTION (RFC)

10.1) FLUXO: Troca de informaes entre o SAP R/3 e os Sistemas Legado

SAP

Progra ABAP

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 45 de 47 -

Progra

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL

10.2)

TABELAS DE INTERFACE

So as tabelas definidas no Modelo de Dados, que sero utilizadas para a troca de informaes entre o SAP R/3 e os Sistemas Natura(e vice-versa). Sempre que possvel utilizaremos esta soluo. Esta soluo dever ser utilizada para a maioria das interfaces com o SAP R/3, exceto nos casos onde ser necessrio utilizar-se de IDOCs.

10.2.1) FLUXO: Gerao de Interface no SAP R/3 utilizando as Tabelas de Interface(ORACLE)

SAP

Gerao de Interface no SAP

Programa ABAP

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 46 de 47 -

ACESSO BASE DE DADOS EXTERNA COM NATIVE E OpenSQL


10.2.2) FLUXO: Processamento da Interface no SAP utilizando as Tabelas de Interface(ORACLE).
SAP Processamento da Interface no SAP Tabelas Espelho Tabelas Interface

R/3

Gerao da Interface no Sistema Legado

Sistema Legado

t_r3_interface Programa ABAP Transao SAP t_r3_xxxx

t_r3_interface

t_r3_xxxx

Programa Cobol ou VB5

DB SAP

DBLINK

DB

Legado

t_r3_interface Transao SAP Programa ABAP t_r3_yyy

t_r3_interface

Programa Cobol ou VB5

t_r3_yyy

Lus Fernando Berti Santos Aspen Procwork 2001 - Pgina 47 de 47 -