Você está na página 1de 14

ABAP/4 Training SAP-SC

ABAP Factory

ABAP/4 - SQL

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

1. INTRODUÇÃO

1.1 Overview

Uma das principais funções 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 nível de programação ABAP/4 foi isolado pela SAP do nível de


bases de dados. Este é um dos principais requisitos que tornam
esta uma linguagem de quarta geração. Isto significa que as
instruções de extração de dados encarregam-se de detalhes de
acesso e consistências de dados, tornando-os transparentes ao
programador.

Qualquer linguagem de banco de dados executa leitura e


manipulação de dados através de uma linguagem de domínio
público padronizada mundialmente e conhecida como Structured
Query Language (SQL). O ABAP/4, além de possuir instruções
próprias de acesso, inclui em seu escopo os principais comandos
SQL. Pode-se classificar as instruções de acesso a tabelas em
duas categorias: os comandos portáveis do SAP, também
chamados de SAP-SQL e o subconjunto SQL da linguagem, que
são os comandos precedidos de OPEN SQL.

Uma das principais preocupações que envolvem os acessos via


SQL são 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 serão comparadas as principais formas de acesso


com o propósito de se refinar um programa até que se obtenha
uma performande desejável.

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

2. LABORATÓRIO

2.1 Principais Comandos

1- Criar um programa de report online ABAP/4 chamado


ztstsql# (# = número do grupo).
2- Digitar “SELECT” e clicar F1 com o cursor posicionado na
palavra.
3- “Navegar” pelo help observando as principais variações
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 Análise de Performance

1- Acessar a transação 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 variações do SQL interface.
4- Na tela inicial da transação SE30 entrar com o programa
ZREPORT4EXECUTE
5- Na tela de seleção do programa entrar com : 100000005 e
1997  EXECUTAR
6- Voltar   e clicar em Analyze
7- Discutir o gráfico obtido
8- Clicar em TABLES e discutir os valores mostrados.

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

ABAP/4 - SQL
EXERCÍCIOS

ABAP/4 - SQL 4
ABAP/4 Training SAP-SC
ABAP Factory
EXERCÍCIO 1

1 - Considerações:

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

- O Exercício consiste de um único programa em que faz a seleção


de dados em tabelas SAP.

- Ao término do exercício os programas devem apresentar os


resultados esperados para a faixa de dados de entrada fornecida.

- Quando os grupos obtiverem os resultados esperados, os


programas serão submetidos a análise de performance.

- O programa mais eficiente será analisado e os grupos discutirão


as questões de performance.

Descrição Funcional.

Desenvolver um programa ABAP/4 baseado em aplicações


de General Ledger que, dado quatro parâmetros de entrada,
selecione os documentos especiais dos tipos indicados pelos
parâmetros. Em seguida obtenha as descrições destas contas
especiais baseado numa atribuição condicional e acesso à
tabela de descrições. Após isso selecione todas as contas que
possuem estes documentos, armazene-os em uma tabela de
resultados e gere uma listagem.

Descrição Técnica

Tabelas : BSEG, BKPF , SKAT.

Parâmetros 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 parâmetro entrado, fazer:

- Buscar a primeira linha de BSEG onde UMSKZ = parâmetro


-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.
Senão
mover BSEG-SAKNR para a tabela interna.
Endse

OBS2: A descrição desta linha deve ser buscada na tabela SKAT


(campo TXT50) usando como chave de busca o campo SAKNR
obtido.

2- Para os próximos três parâmetros, repete-se o item acima


apenas trocando o último valor de Concatenação:

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 através 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

EXERCÍCIO 2

Incluir um parameter no programa anterior que sirva de “flag”


para indicar se o relatório deve ser gravado ou não. Em caso
positivo, durante a impressão 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

Descrição : 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

Descrição : 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

Descrição : 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

Descrição : 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 impressão de Special G/L Account

REPORT ZTSTSQL
MESSAGE-ID ZZ.

TABLES: BSEG,
BKPF,
SKAT.

* Parametros de entrada para seleção 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.

START-OF-SELECTION.

ABAP/4 - SQL 11
ABAP/4 Training SAP-SC
ABAP Factory
* 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.
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.

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

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
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

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

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, /,
'Descrição : ', 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.

*&---------------------------------------------------------------------*
*& Form F_CHECK
*&---------------------------------------------------------------------*
* Checa sucesso da pesquisa *
*----------------------------------------------------------------------*
* --> p1 número 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 14