Você está na página 1de 15

ABAP/4 Training SAP-SC

ABAP Factory

ABAP/4 - SQL

ABAP/4 - SQL 1
ABAP/4 Training SAP-SC
ABAP Factory

1. INTRODUO

1.1 Overview

Uma das principais funes da linguagem ABAP/4 extrair dados do


sistema R/3. Esta tarefa muitas vezes torna-se complexa devido
quantidade de tabelas (que podem ser da ordem de dezenas de milhares)
armazenadas no SAP.

O nvel de programao ABAP/4 foi isolado pela SAP do nvel de bases de


dados. Este um dos principais requisitos que tornam esta uma linguagem
de quarta gerao. Isto significa que as instrues de extrao de dados
encarregam-se de detalhes de acesso e consistncias de dados, tornando-os
transparentes ao programador.

Qualquer linguagem de banco de dados executa leitura e manipulao de


dados atravs de uma linguagem de domnio pblico padronizada
mundialmente e conhecida como Structured Query Language (SQL). O
ABAP/4, alm de possuir instrues prprias de acesso, inclui em seu
escopo os principais comandos SQL. Pode-se classificar as instrues de
acesso a tabelas em duas categorias: os comandos portveis do SAP,
tambm chamados de SAP-SQL e o subconjunto SQL da linguagem, que
so os comandos precedidos de OPEN SQL.

Uma das principais preocupaes que envolvem os acessos via SQL so os


problemas de performance. Existem diversas maneiras de se extrair dados
de tabelas, no entanto nem sempre visualizar a forma que dispenda menos
custo de tempo uma tarefa simples.

Neste curso sero comparadas as principais formas de acesso com o


propsito de se refinar um programa at que se obtenha uma performande
desejvel.

ABAP/4 - SQL 2
ABAP/4 Training SAP-SC
ABAP Factory

2. LABORATRIO

2.1 Principais Comandos

1- Criar um programa de report online ABAP/4 chamado ztstsql# (# =


nmero do grupo).
2- Digitar SELECT e clicar F1 com o cursor posicionado na palavra.
3- Navegar pelo help observando as principais variaes deste comando
4- Repetir a pesquisa para LOOP Loop on an internal table
5- Repetir a pesquisa para READ Read an internal table
6- Repetir a pessquisa para APPEND , UPDATE, INSERT ,
DELETE , COMMIT

2.2 Anlise de Performance

1- Acessar a transao SE30 , clicar em Tips & Tricks, clicar no primeiro


item do SQL interface
2- Clicar em Measure Runtine visualizando o comando mais eficiente e
discutindo com o grupo.
3- Repetir o item 2 para todas as variaes do SQL interface.
4- Na tela inicial da transao SE30 entrar com o programa
ZREPORT4EXECUTE
5- Na tela de seleo do programa entrar com : 100000005 e 1997
EXECUTAR
6- Voltar e clicar em Analyze
7- Discutir o grfico obtido
8- Clicar em TABLES e discutir os valores mostrados.

ABAP/4 - SQL 3
ABAP/4 Training SAP-SC
ABAP Factory

ABAP/4 - SQL
EXERCCIOS

ABAP/4 - SQL 4
ABAP/4 Training SAP-SC
ABAP Factory

EXERCCIO 1

1 - Consideraes:

- Para esta atividade,a classe deve dividir-se em grupos.

- O Exerccio consiste de um nico programa em que faz a seleo de dados


em tabelas SAP.

- Ao trmino do exerccio os programas devem apresentar os resultados


esperados para a faixa de dados de entrada fornecida.

- Quando os grupos obtiverem os resultados esperados, os programas


sero submetidos a anlise de performance.

- O programa mais eficiente ser analisado e os grupos discutiro as


questes de performance.

Descrio Funcional.

Desenvolver um programa ABAP/4 baseado em aplicaes de


General Ledger que, dado quatro parmetros de entrada, selecione os
documentos especiais dos tipos indicados pelos parmetros. Em seguida
obtenha as descries destas contas especiais baseado numa atribuio
condicional e acesso tabela de descries. Aps isso selecione todas as
contas que possuem estes documentos, armazene-os em uma tabela de
resultados e gere uma listagem.

Descrio Tcnica

Tabelas : BSEG, BKPF , SKAT.

Parmetros de Entrada: p_ind1 do tipo BSEG-UMSKZ


p_ind2
p_ind3
p_ind4.

ABAP/4 - SQL 5
ABAP/4 Training SAP-SC
ABAP Factory

START-OF-SELECTION

1- Para o primeiro parmetro entrado, fazer:

- Buscar a primeira linha de BSEG onde UMSKZ = parmetro


-Armazenar os campos BUKRS / BELNR / UMSKZ / SAKNR encontrados
numa tabela interna de Special Indicator (UMSKZ).

OBS1: Montar o campo SAKNR da seguinte forma :


Se BSEG-UMSKZ = 'A'
Concatenar 0000 , BUKRS , 10 e mover para a tabela interna.
Seno
mover BSEG-SAKNR para a tabela interna.
Endse

OBS2: A descrio desta linha deve ser buscada na tabela SKAT (campo
TXT50) usando como chave de busca o campo SAKNR obtido.

2- Para os prximos trs parmetros, repete-se o item acima apenas


trocando o ltimo valor de Concatenao:

p_ind2 : 11 p_ind3: 12 p_ind4: 15.

3 - Buscar na tabela de documentos (BKPF) os documentos que casem


com cada linha que foi armazenada na tabela interna do tem anterior e
armazen-los em uma tabela piv de documentos (OBS: Trazer apenas os
campos BUKRS BELNR BUDAT BKTXT.

4 - Buscar na tabela de G/L accounts (BSEG) as contas que possuam os


documentos (BELNR) encontrados.

Utilize a tabela piv de documentos como chave de busca. Mover cada


linha encontrada para a tabela de resultados descrita abaixo:

ABAP/4 - SQL 6
ABAP/4 Training SAP-SC
ABAP Factory

Tabela interna de resultados : t_result

Campo Tabela Origem


HKONT BSEG
BELNR BSEG key:
GJAHR BSEG
SGTXT BSEG
PSWBT BSEG
DMBTR BSEG
BUDAT BKPF
BKTXT BKPF

Obs : Os campos de BKPF devem ser buscados dentro do SELECT de BSEG


atravs do comando READ TABLE.

5 - Imprimir os resultados separando as contas por indicador de Special


G/L (ver resultado esperado)

ABAP/4 - SQL 7
ABAP/4 Training SAP-SC
ABAP Factory

EXERCCIO 2

Incluir um parameter no programa anterior que sirva de flag para indicar


se o relatrio deve ser gravado ou no. Em caso positivo, durante a
impresso os dados devem ser inseridos na tabela ZTST#

ABAP/4 - SQL 8
ABAP/4 Training SAP-SC ABAP Factory

RESULTADO ESPERADO

15.10.1997 Programa teste curso ABAP/4 - SQL 1

Indicador de Special G/L : A

Descrio : Banco Bradesco

G/L account Document # Fiscal Year I_Amount A_Amount PostDate

210001 100000004 1997 136,36 136,36 18.03.1997


112815 100000004 1997 1.000,00 1.000,00 18.03.1997
210001 100000004 1997 1.136,36 1.136,36 18.03.1997

Indicador de Special G/L : C

Descrio : Bradesco Recebimentos Cheques

G/L account Document # Fiscal Year I_Amount A_Amount PostDate

112020 100000033 1997 112.000,00 100.000,00 30.03.1997


217450 100000033 1997 113.000,00 100.000,00 30.03.1997
217451 100000033 1997 2.000,00 0,00 30.03.1997
560215 100000033 1997 3.000,00 0,00 30.03.1997

Indicador de Special G/L : F

Descrio : Bradesco Recebimentos Depositos

G/L account Document # Fiscal Year I_Amount A_Amount PostDate

112815 1700000000 1997 1.000,00 1.000,00 17.03.1997

ABAP/4 - SQL 9
ABAP/4 Training SAP-SC ABAP Factory

Indicador de Special G/L : T

Descrio : Bradesco Pagto via Cheques

G/L account Document # Fiscal Year I_Amount A_Amount PostDate

210640 1700000005 1997 10.000,00 10.000,00 09.06.1997


132601 1700000005 1997 10.000,00 10.000,00 09.06.1997

ABAP/4 - SQL 10
ABAP/4 Training SAP-SC
ABAP Factory

RESULTADO

* Programa de busca e impresso de Special G/L Account

REPORT ZTSTSQL
MESSAGE-ID ZZ.

TABLES: BSEG,
BKPF,
SKAT.

* Parametros de entrada para seleo de Special G/L indicator.


PARAMETERS: P_IND1 LIKE BSEG-UMSKZ, "Special G/L ind.
P_IND2 LIKE BSEG-UMSKZ,
P_IND3 LIKE BSEG-UMSKZ,
P_IND4 LIKE BSEG-UMSKZ.

* Tabela piv de pesquisa de documentos por 'Posting date'


DATA: BEGIN OF T_BKPF OCCURS 0,
BUKRS LIKE BKPF-BUKRS,
BELNR LIKE BKPF-BELNR,
BUDAT LIKE BKPF-BUDAT,
BKTXT LIKE BKPF-BKTXT.
DATA: END OF T_BKPF.

* Tabela de armazenamento de valores preliminares


DATA: BEGIN OF T_DOCTOS OCCURS 0,
BUKRS LIKE BSEG-BUKRS,
BELNR LIKE BSEG-BELNR,
SAKNR LIKE BSEG-SAKNR,
UMSKZ LIKE BSEG-UMSKZ,
DESCR LIKE SKAT-TXT50.
DATA: END OF T_DOCTOS.

* Tabela de armazenamento de resultados


DATA: BEGIN OF T_RESULT OCCURS 0,
HKONT LIKE BSEG-HKONT,
BELNR LIKE BSEG-BELNR,
GJAHR LIKE BSEG-GJAHR,
SGTXT LIKE BSEG-SGTXT,
PSWBT LIKE BSEG-PSWBT,
DMBTR LIKE BSEG-DMBTR,
BUDAT LIKE BKPF-BUDAT,
BKTXT LIKE BKPF-BKTXT.
DATA: END OF T_RESULT.

ABAP/4 - SQL 11
ABAP/4 Training SAP-SC
ABAP Factory

START-OF-SELECTION.

* Busca dado para o primeiro G/L Special Indicator


SELECT SINGLE * FROM BSEG WHERE UMSKZ = P_IND1.
PERFORM F_CHECK USING P_IND1. " checa sucesso

MOVE BSEG-BUKRS TO T_DOCTOS-BUKRS.


MOVE BSEG-BELNR TO T_DOCTOS-BELNR.
MOVE BSEG-UMSKZ TO T_DOCTOS-UMSKZ.
IF BSEG-UMSKZ = 'A'.
CONCATENATE '0000' T_DOCTOS-BUKRS '10' INTO T_DOCTOS-SAKNR.
ELSE.
MOVE BSEG-SAKNR TO T_DOCTOS-SAKNR.
ENDIF.

SELECT SINGLE * FROM SKAT WHERE SAKNR = T_DOCTOS-SAKNR.


PERFORM F_CHECK USING P_IND1. " checa sucesso

MOVE SKAT-TXT50 TO T_DOCTOS-DESCR.


APPEND T_DOCTOS.

* Busca dado para o segundo G/L Special Indicator


SELECT SINGLE * FROM BSEG WHERE UMSKZ = P_IND2.
PERFORM F_CHECK USING P_IND2. " checa sucesso

MOVE BSEG-BUKRS TO T_DOCTOS-BUKRS.


MOVE BSEG-BELNR TO T_DOCTOS-BELNR.
MOVE BSEG-UMSKZ TO T_DOCTOS-UMSKZ.
IF BSEG-UMSKZ = 'C'.
CONCATENATE '0000' T_DOCTOS-BUKRS '11' INTO T_DOCTOS-SAKNR.
ELSE.
MOVE BSEG-SAKNR TO T_DOCTOS-SAKNR.
ENDIF.

SELECT SINGLE * FROM SKAT WHERE SAKNR = T_DOCTOS-SAKNR.


PERFORM F_CHECK USING P_IND2. " checa sucesso
MOVE SKAT-TXT50 TO T_DOCTOS-DESCR.
APPEND T_DOCTOS.

* Busca dado para o terceiro G/L Special Indicator


SELECT SINGLE * FROM BSEG WHERE UMSKZ = P_IND3.
PERFORM F_CHECK USING P_IND3. " checa sucesso
MOVE BSEG-BUKRS TO T_DOCTOS-BUKRS.
MOVE BSEG-BELNR TO T_DOCTOS-BELNR.

ABAP/4 - SQL 12
ABAP/4 Training SAP-SC
ABAP Factory

MOVE BSEG-UMSKZ TO T_DOCTOS-UMSKZ.


IF BSEG-UMSKZ = 'F'.
CONCATENATE '0000' T_DOCTOS-BUKRS '12' INTO T_DOCTOS-SAKNR.
ELSE.
MOVE BSEG-SAKNR TO T_DOCTOS-SAKNR.
ENDIF.

SELECT SINGLE * FROM SKAT WHERE SAKNR = T_DOCTOS-SAKNR.


PERFORM F_CHECK USING P_IND3. " checa sucesso

MOVE SKAT-TXT50 TO T_DOCTOS-DESCR.


APPEND T_DOCTOS.

* Busca dado para o quarto G/L Special Indicator


SELECT SINGLE * FROM BSEG WHERE UMSKZ = P_IND4.
PERFORM F_CHECK USING P_IND4. " checa sucesso
MOVE BSEG-BUKRS TO T_DOCTOS-BUKRS.
MOVE BSEG-BELNR TO T_DOCTOS-BELNR.
MOVE BSEG-UMSKZ TO T_DOCTOS-UMSKZ.
CONCATENATE '0000' T_DOCTOS-BUKRS '15' INTO T_DOCTOS-SAKNR.
IF BSEG-UMSKZ = 'T'.
CONCATENATE '0000' T_DOCTOS-BUKRS '15' INTO T_DOCTOS-SAKNR.
ELSE.
MOVE BSEG-SAKNR TO T_DOCTOS-SAKNR.
ENDIF.

SELECT SINGLE * FROM SKAT WHERE SAKNR = T_DOCTOS-SAKNR.


PERFORM F_CHECK USING P_IND4. " checa sucesso

MOVE SKAT-TXT50 TO T_DOCTOS-DESCR.


APPEND T_DOCTOS.

* Retira a data dos documentos encontrados e move para t_bkpf


SELECT BUKRS BELNR BUDAT BKTXT FROM BKPF INTO T_BKPF
FOR ALL ENTRIES IN T_DOCTOS
WHERE BUKRS = T_DOCTOS-BUKRS AND
BELNR = T_DOCTOS-BELNR.
APPEND T_BKPF.
ENDSELECT.

* Seleciona as contas relativas aos documentos encontrados


SELECT * FROM BSEG
FOR ALL ENTRIES IN T_BKPF
WHERE BUKRS = T_BKPF-BUKRS AND

ABAP/4 - SQL 13
ABAP/4 Training SAP-SC
ABAP Factory

BELNR = T_BKPF-BELNR.

MOVE BSEG-HKONT TO T_RESULT-HKONT.


MOVE BSEG-BELNR TO T_RESULT-BELNR.
MOVE BSEG-GJAHR TO T_RESULT-GJAHR.
MOVE BSEG-SGTXT TO T_RESULT-SGTXT.
MOVE BSEG-PSWBT TO T_RESULT-PSWBT.
MOVE BSEG-DMBTR TO T_RESULT-DMBTR.
* busca data do documento

READ TABLE T_BKPF WITH KEY BELNR = BSEG-BELNR.


MOVE T_BKPF-BUDAT TO T_RESULT-BUDAT.
MOVE T_BKPF-BKTXT TO T_RESULT-BKTXT.

APPEND T_RESULT.

ENDSELECT.

LOOP AT T_DOCTOS.

ULINE.
WRITE: 'Indicador de Special G/L : ', T_DOCTOS-UMSKZ, /,
'Descrio : ', T_DOCTOS-DESCR.
ULINE.
WRITE: 'G/L account Document # Fiscal Year I_Amount '.
WRITE: ' A_Amount PostDate'.
ULINE.
LOOP AT T_RESULT WHERE BELNR = T_DOCTOS-BELNR.
WRITE:
T_RESULT-HKONT, ' ',
T_RESULT-BELNR, ' ',
T_RESULT-GJAHR, ' ',
T_RESULT-DMBTR, ' ',
T_RESULT-PSWBT, ' ',
T_RESULT-BUDAT, ' ',
T_RESULT-BKTXT.
NEW-LINE.
ENDLOOP.
WRITE: / , / , /.
ENDLOOP.

ABAP/4 - SQL 14
ABAP/4 Training SAP-SC
ABAP Factory

*&---------------------------------------------------------------------*
*& Form F_CHECK
*&---------------------------------------------------------------------*
* Checa sucesso da pesquisa *
*----------------------------------------------------------------------*
* --> p1 nmero do G/L Special pesquisado
*----------------------------------------------------------------------*
FORM F_CHECK USING MESS.
IF SY-SUBRC <> 0.
MESSAGE E001 WITH MESS.
ENDIF.
ENDFORM. " F_CHECK

ABAP/4 - SQL 15

Você também pode gostar