Intensive ABAP workshop exploring fundamentals and practices in the SAP ERP environment.
- /o(transação): Cria outra janela
- /n(transação): Cancela a transação atual e executa a próxima. Perde-se os dados não salvos
- SE38: Pesquisar/criar/editar programas.
- SE91: Criar Classe de Mensagens.
- Menu "Ir Para > Tradução": Traduzir textos.
- SE11: Visualizar estrutura de tabelas.
- SE16/SE16N: Consultar conteúdo de tabelas.
- SE37: módulos de função
- SE80: object navigator
- J1B3N: Consulta nota fiscal
- SN30: Quando criar tabela, criar dados para inserção em tabelas existentes
- F5 entra na rotina. F6 executa.
- CTRL+’/’ exibe a lista de atributos de um objeto no editor do ABAP GUI
- Domínio e Elemento de Dados: O SAP usa rotinas de conversão para armazenar e exibir dados em formatos diferentes.
- Uso de Foreign Keys: Controle de referência feito pelo SAP, sem chaves estrangeiras físicas nos bancos.
- CTRL+F1: O acesso ao ABAP glossary, para consultar a documentação
- F4: acionar a ajuda de pesquisa (match-code, search help)
- Tabela dicionário ≠ Tabela SGBD Tabela dicionário é utilizada para atribuir à variáveis tipos já existentes, para não reinventar a roda. Já a tabela de SGBDs é utilizada para
- O acesso ao ABAP glossary, para consultar a documentação, é feito pelo atalho CTRL+F1
- Tipo N → Campo de DÍGITOS (Caracteres no intervalo [0-9]).
- Abapgit para versionamento.
- SM30 é o mesmo que ZUSURED_08
- SE80 para criar um programa online
- CTRL+F1: Alterna entre o modo de visualização e modificação do código.
- CTRL+F2: Verificar sintaxe.
- CTRL+F3: Ativar o programa (1 - verifica sintaxe; 2 - compila; 3 - grava)
- F5: Editar símbolos de texto e texto de seleção, abre o editor de Elemento de Textos:
- Símbolos de texto: Muda as variáveis de texto. Ex: TEXT-002 = “Datas”.
- Textos de seleção: Edita os nomes dos parâmetros que Da tela de seleção do usuário (input).
- Títulos de Lista: Mínima ideia ainda.
- F8: Executa o programa.
- CTRL+S: Salva o código.
- REPORT: Nomeia o programa.
- DATA: Declaração de variáveis.
- PARAMETERS: Input pelo usuário.
- INITIALIZE: Inicializa variáveis com um valor.
- START-OF-SELECTION: Executado após a tela de seleção padrão (após apertar F8).
- AT SELECTION-SCREEN: Evento usado para validações.
- END-OF-SELECTION: Finaliza o processamento do programa.
- SY-UNAME: Código do usuário (usuário de logon do SAP).
- SY-DATUM: Data atual.
- SY-UZEIT: Hora atual.
- SY-REPID: Nome do programa.
- SY-TCODE: Transação em execução.
| Prefixo | Tipo/Propósito | Exemplo |
|---|---|---|
v_ |
Variável comum (geral) | v_data |
t_ |
Tabela interna | t_table |
tp_ |
Tipos (Types) | tp_tipo |
lv_ |
Variável local (Local Variable) | lv_counter |
gv_ |
Variável global (Global Variable) | gv_total |
lt_ |
Tabela interna (Local Table) | lt_sales |
gt_ |
Tabela interna global | gt_customers |
ls_ |
Estrutura (Local Structure) | ls_employee |
gs_ |
Estrutura global | gs_order |
lf_ |
Field-Symbols (Símbolo de Campo) | lf_field |
cf_ |
Field-Symbols globais | cf_value |
lr_ |
Referência (Local Reference) | lr_object |
gr_ |
Referência global | gr_service |
wa_ |
Work Area | wa_customer |
it_ |
Tabela interna | it_data |
iv_ |
Parâmetro de entrada (Input Variable) | iv_name |
ev_ |
Parâmetro de saída (Export Variable) | ev_result |
cv_ |
Parâmetro de alteração (Changing Var.) | cv_flag |
p_ |
Parâmetro em geral (Parameter) | p_date |
c_ |
Constante | c_pi |
z_ |
Customização (obj/var do cliente) | z_program |
| Operator | Meaning |
|---|---|
| =, EQ | Equal: True if the value of operand1 matches the value of operand2. |
| <>, NE | Not Equal: True if the value of operand1 does not match the value of operand2. |
| <, LT | Less Than: True if the value of operand1 is less than the value of operand2. |
| >, GT | Greater Than: True if the value of operand1 is greater than the value of operand2. |
| <=, LE | Less Equal: True if the value of operand1 is less than or equal to the value of operand2. |
| >=, GE | Greater Equal: True if the value of operand1 is greater than or equal to the value of operand2. |
Inicializa e nomeia o programa.
REPORT znome_do_programa.Comentários em bloco e em linha.
- CTRL+Vírgula (’ , ‘): Comenta o bloco de código selecionado.
- CTRL+Ponto (’ . ‘): Descomenta o bloco de código selecionado.
****************************************************************
* REPORT znome_do_programa.
****************************************************************
* 23/01/2025 - Programa teste
****************************************************************REPORT znome_do_programa. "Isso é um comentárioDeclaração de variáveis não inicializadas.
DATA v_variavel TYPE i.DATA: v_numero TYPE i VALUE 10,
v_nome(20) TYPE c,
v_sobrenome TYPE c LENGTH 20,
v_data TYPE sy_datum.
Declaração de variáveis inicializadas pelo usuário (input). Não podem ter mais de 8 dígitos.
PARAMETERS v_myname(20) TYPE c.PARAMETERS: v_idade TYPE i,
v_dtnasc TYPE sy_datum,
v_is_ok AS CHECKBOX.Inicializar e atribuir valores constantes.
CONSTANTS: c_produto_acabado TYPE mara_mtart VALUE 'FERT'.Escrever algum texto ou variável na tela.
WRITE v_data_nasc.
**"""""""OUTPUT"""""""
"** 16.12.2005
**""""""""""""""""""""**WRITE: / 'Olá mundo'.
WRITE: / 'Meu nome é', v_seu_nome, / 'eu tenho', v_idade, 'anos.'.
WRITE: / '.'.
WRITE: / | Meu nome é {v_seu_nome} |, / | eu tenho {v_idade} anos.|.
**"""""""OUTPUT"""""""
"** Olá mundo
**"** Meu nome é Pedro
**"** eu tenho 20 anos.
**"** .
**"** Meu nome é Pedro
**"** eu tenho 20 anos.
**""""""""""""""""""""**Condicional (Inicia e termina com IF e ENDIF)
DATA v_idade TYPE i VALUE 20.
IF v_idade >= 19. "True
WRITE 'Maior de idade'.
ELSEIF v_idade = 18.
WRITE 'Na risca'.
ELSE.
WRITE 'Menor de idade'.
ENDIF.
**"""""""OUTPUT"""""""
"** Maior de idade
**""""""""""""""""""""**Laço de Repetição (Inicia e termina com DO e ENDDO), sy-index = Index iniciando de 1 (1, 2, 3…)
DO 4 TIMES.
WRITE: / 'Índice', sy-index.
ENDDO.
**"""""""OUTPUT"""""""
"** Índice 1
**"** Índice 2
**"** Índice 3
**"** Índice 4
**""""""""""""""""""""**Laço de Repetição (Inicia e termina com LOOP e ENDLOOP). Lopando dentro das linhas da tabela.
LOOP AT it_scustom INTO wa_scustom.
WRITE: / 'ID:', wa_scustom-vtp_scustom_id, ' | ',
'Nome:', wa_scustom-vtp_scustom_name, ' | ',
'Cidade:', wa_scustom-vtp_scustom_city.
ENDLOOP.LOOP AT lt_item_nf INTO l_item_nf. "Loop pelas linhas de uma tabela.
WRITE: / 'Nota fiscal', l_item_nf-docnum,
/ 'Item:', l_item_nf-itmnum,
/ 'Data NF:', l_item_nf-docdat,
/ 'Material', l_item_nf-matnr,
/ 'Quantidade', l_item_nf-menge, l_item_nf-meins.
SKIP.
ENDLOOP.Utilizado para perguntar se uma varável está no seu estado INICIAL.
IF v_variavel IS INITIAL.
WRITE: / 'Está no seu estado inicial'.
ENDDO.Tipos customizáveis.
TYPES: quantidade_estoque TYPE mchb-clabs,
preco_liquido TYPE ekpo-netwr.TYPES: BEGIN OF y_pedido,
numero(8) TYPE n,
cliente(40) TYPE c,
preco_total TYPE ekpo-netwr,
data_entrega TYPE sy-datum,
END OF y_pedido.TYPES: BEGIN OF tp_custom,
vtp_scustom_ID TYPE scustom-id,
vtp_scustom_name TYPE scustom-name,
vtp_scustom_city TYPE scustom-city,
END OF tp_custom.TYPES: BEGIN OF s_user,
nome TYPE c LENGTH 20,
cidade TYPE c LENGTH 20,
idioma TYPE c LENGTH 1,
END OF s_user.
DATA: usuario_1 TYPE s_user.
CLEAR usuario_1 "Limpar a variavelFazendo uma query na tabela de SGBD mara e jogando os dados na estrutura material2:
SELECT SINGLE *
FROM mara
INTO material2
WHERE matnr = '000020000392'.
WRITE: / 'Tipo de Material', material2-mtart.SELECT SINGLE carrid
FROM scarr
INTO v_scarr_carrid
WHERE carrid = v_cid.
v_query_id = sy-subrc. "=0: found / <>0: not foundSELECT id, name, city
FROM scustom
INTO TABLE @it_scustom
WHERE id IN @v_cid.
PERFORM f_command_status USING sy-subrc.TYPES: BEGIN OF s_user,
nome TYPE c LENGTH 20,
cidade TYPE c LENGTH 20,
idioma TYPE c LENGTH 1,
END OF s_user.
DATA: v_utmp TYPE s_user.
SELECT SINGLE name, city, langu
FROM scustom "Tabela interna
INTO @v_utmp
WHERE id = @v_idclnt.
IF sy-subrc = 0. " Se sy-subrc=0: QuerySem erros
* SY-SUBRC: status de comando (testar imediatamente após o comando)
WRITE: / |Nome: { v_utmp-nome } |,
/ |Cidade: { v_utmp-cidade }|,
/ |Idioma: { v_utmp-idioma } |.
ELSE.
WRITE: |Cliente { v_idclnt } não encontrado.|.
ENDIF. FIELD-SYMBOLS <item> TYPE y_item_nf. " Cabeçalho
SELECT j_1bnflin~docnum
j_1bnflin~itmnum
j_1bnfdoc~docdat
j_1bnflin~matnr
j_1bnflin~menge
j_1bnflin~meins
FROM j_1bnfdoc
INNER JOIN j_1bnflin
ON j_1bnfdoc~docnum = j_1bnflin~docnum
INTO TABLE lt_item_nf
WHERE j_1bnfdoc~docnum IN s_nf.SELECT SINGLE carrid
FROM scarr
INTO v_scarr_carrid
WHERE carrid = v_cid. "WHERE (coluna da tabela) = (variavel local).
" A ordem é essa: SELECT + FROM + INTO + WHERE.FORM f_command_status USING f_operation_id TYPE i.
IF f_operation_id = 0.
WRITE: / |Operação executada com sucesso!|.
ELSE.
WRITE: / |Não foi possível executar a operação.|.
ENDIF.
ENDFORM.
*** QUERY QUALQUER
PERFORM f_command_status USING sy-subrc. "Utilizar essa rotina logo após a querry.Exibe mensagens personalizadas.
IF v_idade < 18.
MESSAGE 'Idade insuficiente!' TYPE 'E'.
ENDIF.AT SELECTION-SCREEN.
IF v_dt_fim < v_dt_ini.
MESSAGE e002(z08) WITH v_dt_fim v_dt_ini. "ERRO: Data final deve ser >= à inicial.
STOP.
ENDIF.
* z08 é a classe de mensagens, e002 é a 3º mensagem dentro de z08.
* "ERRO: Data final &1 deve ser >= à inicial &2." (Msg 002 dentro de z08)
* No caso acima, v_dt_fim v_dt_ini subsitituirão respectivamente &1 e &2.Modularização: Funções/Subrotinas que recebem argumentos e retornam valores.
*** CRIAR A FUNÇÃO
FORM retornar_data
USING lv_data_input TYPE sy-datum
lv_type_out TYPE i
CHANGING lv_dia_output TYPE c
lv_mes_output TYPE c
lv_ano_output TYPE c.
lv_ano_output = lv_data_input+0(4).
lv_dia_output = lv_data_input+6(2).
lv_mes_output = lv_data_input+4(2)
IF lv_type_out = 1.
lv_mes_output = to_upper( lv_mes_output+0(3) ).
ENDIF.
IF lv_type_out = 3.
lv_mes_output = lv_mes_output+0(3).
ENDIF.
ENDFORM.
*** EXECUTAR A FUNÇÃO
PERFORM retornar_data USING v_dt_ini 1 CHANGING v_dia_temp v_mes_temp v_ano_temp.
WRITE: / 'Início:', v_dia_temp, '/', v_mes_temp, '/', v_ano_temp.
**"""""""OUTPUT"""""""
"** Início: 24 / 01 / 2025
**""""""""""""""""""""**Concatenar strings em uma nova variável.
CONCATENATE v_nome+0(1) v_sbnome INTO v_new_cod_user.Remove os espaços em brancos (no inicio, final, e espaços redundantes) de uma string.
CONCATENATE v_nome+0(1) v_sbnome INTO v_new_cod_user.Retorna o tamanho de uma string.
DATA: v_nome(8) TYPE c,
v_nome_length TYPE i.
v_nome = 'abcdefgh'.
v_nome_length = STRLEN( v_nome ). "v_nome_length = 8Obtém uma substring de uma string+n(m) → Pula n dígitos, logo após seleciona m dígitos.
WRITE: v_nome+2(5).
**"""""""OUTPUT"""""""
"** cdefg
**""""""""""""""""""""**
v_nome_length_minus2 = v_nome_length-2. "x=8-2, x=6
WRITE: v_nome+v_nome_length_minus2(2). "v_nome+6(2) , 2 últimos caracteres.
**"""""""OUTPUT"""""""
"** gh
**""""""""""""""""""""**Adiciona um espaço (SKIP.) e uma linha (ULINE.) logo após.
SKIP.
ULINE.
**"""""""OUTPUT"""""""
"
"** __________________
**""""""""""""""""""""**Switch case, evita vários IF e ELSE (Inicia com CASE, possui vários WHEN, termina com ENDCASE).
CASE v_data_hoje+4(2). "v_data_hoje=2024.11.17, v_data_hoje+4(2)=11
WHEN '01'.
v_data_month = 'JANEIRO'.
WHEN '02'.
v_data_month = 'FEVEREIRO'.
* ...
WHEN '11'. "True
v_data_month = 'NOVEMBRO'.
WHEN '12'.
v_data_month = 'DEZEMBRO'.
ENDCASE.
WRITE: / v_data_month.
**"""""""OUTPUT"""""""
"** NOVEMBRO
**""""""""""""""""""""**Função módulo, retorna o resto da divisão (%).
IF v_ano_ini MOD 4 = 0 AND v_ano_ini MOD 100 <> 0.
WRITE: / v_ano_ini, 'é ano bissexto'.
ENDIF.
**"""""""INPUT""""""""**
**"** v_ano_ini = 2004
**"""""""OUTPUT"""""""
"** 2004 é ano bissexto.
**""""""""""""""""""""**
**"""""""INPUT""""""""**
**"** v_ano_ini = 1900
**"""""""OUTPUT"""""""
"**
**""""""""""""""""""""**Cria um bloco com o cabeçario de um texto definido.
SELECTION-SCREEN BEGIN OF BLOCK b_input WITH FRAME TITLE text-001.
PARAMETERS: v_cid TYPE scarr-carrid OBLIGATORY,
v_cname TYPE scarr-carrname,
v_url TYPE scarr-url.
SELECTION-SCREEN END OF BLOCK b_input.Cria um bloco com o cabeçario de um texto definido.
DATA: tp_scustom_id TYPE scustom-id.
SELECTION-SCREEN BEGIN OF BLOCK b_input WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS v_cid FOR tp_scustom_id OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b_input.Radiobutton: Opção única, Checkbox: Múltiplas opções.
SELECTION-SCREEN BEGIN OF BLOCK radios WITH FRAME TITLE TEXT-002.
PARAMETERS:
v_radio1 RADIOBUTTON GROUP rdgp DEFAULT 'X',
v_radio2 RADIOBUTTON GROUP rdgp,
v_radio3 RADIOBUTTON GROUP rdgp,
v_check1 AS CHECKBOX,
v_check2 AS CHECKBOX,
v_check3 AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK radios.Exibir tela de confirmação (SIM ou NÃO) SE37: módulos de função SE80: object navigator
DATA: v_resposta TYPE char1.
CALL FUNCTION 'POPUP_CONTINUE_YES_NO'
EXPORTING
textline1 = 'DESEJA EXCLUIR O REGISTRO?'
Texline2 = 'OBS: OPERAÇÃO SEM RETORNO'
title1 = 'CONFIRME'
IMPORTING
ANSWER = v_resposta
if V_RESPOSTA = 'J' "OBS: Sim = "J" e Não = "N"
"DELETE...
ENDIF.Função RFC: Remote Function Call
Inserir dados em uma tabela interna.
FORM f_create USING f_carr TYPE tp_carr.
INSERT INTO scarr
VALUES @( VALUE #(
carrid = f_carr-vtp_cid
carrname = f_carr-vtp_cname
url = f_carr-vtp_url ) ).
PERFORM f_command_status USING sy-subrc.
ENDFORM.INSERT demo_expressions FROM TABLE @( VALUE #(
( id = 'X' num1 = 1 num2 = 10 )
( id = 'Y' num1 = 2 num2 = 20 )
( id = 'Z' num1 = 3 num2 = 30 ) ) ). INSERT v_l_bdcdata_tmp INTO it_bdcdata INDEX 1.
APPEND v_l_bdcdata_tmp TO it_bdcdata.Alterar dados de uma tabela (UPDATE: Se não existir, cria. MODIFY: Se não existir, não faz nada.)
FORM f_modify USING f_carr TYPE tp_carr.
UPDATE scarr
SET carrname = @f_carr-vtp_cname,
url = @f_carr-vtp_url
WHERE carrid = @f_carr-vtp_cid.
PERFORM f_command_status USING sy-subrc.
ENDFORM. PARAMETERS: v_csid TYPE scustom-id OBLIGATORY, "Código do Passageiro
v_csmail TYPE scustom-email OBLIGATORY. "Novo Email
UPDATE scustom
SET email = @v_csmail
WHERE id = @v_csid.
IF sy-subrc = 0.
WRITE: / |ID { v_csid } teve seu email alterado para { v_csmail }.|.
ELSE.
MESSAGE e012(z08). "Erro ao atualizar o email
ENDIF.Deletar dados de uma tabela.
FORM f_delete USING f_carr TYPE tp_carr.
DELETE FROM scarr
WHERE carrid = f_carr-vtp_cid.
PERFORM f_command_status USING sy-subrc.
ENDFORM.Alterando (várias) linhas de uma tabela interna.
LOOP AT t_passageiro ASSIGNING FIELD-SYMBOL(<pass>). " FIELD-SYMBOL é um PONTEIRO
IF <pass>-langu = 'P'.
<pass>-country = 'BR'.
ENDIF.
ENDLOOP.DATA: it_copy_sflight TYPE TABLE OF sflight,
it_valid_sflight TYPE TABLE OF sflight.
SELECT *
FROM sflight
INTO TABLE @it_copy_sflight
WHERE carrid IN @v_cid
AND fldate IN @v_fldt.
LOOP AT it_copy_sflight ASSIGNING FIELD-SYMBOL(<it_line>).
IF ( <it_line>-seatsmax * '0.6' ) > <it_line>-seatsocc.
<it_line>-price = <it_line>-price * '1.15'.
APPEND <it_line> TO it_valid_sflight.
ENDIF.
ENDLOOP.
MODIFY sflight FROM TABLE it_valid_sflight.Excluindo linhas da tabela interna.
LOOP AT t_passageiro ASSIGNING FIELD-SYMBOL(<pass>).
IF <pass>-langu = 'D'.
DELETE t_passageiro.
ENDIF.
ENDLOOP.
" O loop acima poderia ser escrito como:
DELETE t_passageiro WHERE langu = 'D'.Imprimindo itens de uma tabela interna usando Work-Area
TYPES: BEGIN OF tp_custom,
vtp_scustom_ID TYPE scustom-id,
vtp_scustom_name TYPE scustom-name,
vtp_scustom_city TYPE scustom-city,
END OF tp_custom.
FORM f_search_data_1. " Usando Work-Area (EVITAR, INEFICIENTE)
DATA: it_scustom TYPE TABLE OF tp_custom,
wa_scustom TYPE tp_custom.
SELECT id, name, city
FROM scustom
INTO TABLE @it_scustom
WHERE id IN @v_cid.
PERFORM f_command_status USING sy-subrc.
LOOP AT it_scustom INTO wa_scustom.
WRITE: / 'ID:', wa_scustom-vtp_scustom_id, ' | ',
'Nome:', wa_scustom-vtp_scustom_name, ' | ',
'Cidade:', wa_scustom-vtp_scustom_city.
ENDLOOP.
ENDFORM.Imprimindo itens de uma tabela interna usando Linha de Cabeçalho
FORM f_search_data_2. " Usando Linha de Cabeçalho (NUNCA USAR, GERA AMBIGUIDADE)
DATA: it_scustom TYPE TABLE OF tp_custom WITH HEADER LINE.
SELECT id, name, city
FROM scustom
INTO TABLE @it_scustom
WHERE id IN @v_cid.
PERFORM f_command_status USING sy-subrc.
LOOP AT it_scustom.
WRITE: / 'ID:', it_scustom-vtp_scustom_ID, ' | ',
'Nome:', it_scustom-vtp_scustom_name, ' | ',
'Cidade:', it_scustom-vtp_scustom_city.
ENDLOOP.
ENDFORM.Imprimindo itens de uma tabela interna usando Field-Symbol
FORM f_search_data_3. " Usando Field-Symbol (RECOMENDADO USAR, MAIS EFICIENTE)
DATA: it_scustom TYPE TABLE OF tp_custom.
FIELD-SYMBOLS: <fs_line> LIKE LINE OF it_scustom.
SELECT id, name, city
FROM scustom
INTO TABLE @it_scustom
WHERE id IN @v_cid.
PERFORM f_command_status USING sy-subrc.
LOOP AT it_scustom ASSIGNING <fs_line>.
WRITE: / 'ID:', <fs_line>-vtp_scustom_id, ' | ',
'Nome:', <fs_line>-vtp_scustom_name, ' | ',
'Cidade:', <fs_line>-vtp_scustom_city.
ENDLOOP.
ENDFORM. TYPES: t_tp_sflight TYPE TABLE OF sflight.
FORM f_print_table USING f_table TYPE t_tp_sflight.
FIELD-SYMBOLS: <f_line> LIKE LINE OF f_table.
LOOP AT f_table ASSIGNING <f_line>.
WRITE: / <f_line>-carrid,
<f_line>-connid,
<f_line>-fldate,
<f_line>-price,
<f_line>-seatsmax,
<f_line>-seatsocc.
ENDLOOP.
ENDFORM.REPORT z_selects_type.
* Declarações
DATA :
it_spfli TYPE TABLE OF spfli,
it_sflight TYPE TABLE OF sflight,
st_spfli TYPE spfli,
st_sflight TYPE sflight
.
* Select simples.
PERFORM f_simples.
* select com condição.
PERFORM f_condicao.
* Seleciona somente uma linha
PERFORM f_single.
* Seleciona somente as informações de um ou mais campos alimenta
* uma ou mais variáveis conforme condições.
PERFORM f_variavel.
* Selecionando campos especificos e alimentando os respectivo
* campos da tabela/ estrutura.
PERFORM f_corresponding_fields.
* Seleciona conforme informações específicas ( MAX, MIN, AVG, SUM, COUNT )
PERFORM f_agregados.
*&---------------------------------------------------------------------*
*& Form f_simples
*&---------------------------------------------------------------------*
FORM f_simples .
* Selecionou tudo da tabela SPFLI e colocou tudo numa tabela interna.
SELECT *
FROM spfli
INTO TABLE it_spfli.
BREAK-POINT.
FREE it_spfli.
ENDFORM. " f_simples
*&---------------------------------------------------------------------*
*& Form f_condicao
*&---------------------------------------------------------------------*
FORM f_condicao .
* Selecionou somente os registros que se adequam a condição ( Carrid = AA e
* connid = '0064') da tabela transaparente SPFLI e colocou os registros
* dentro da tabela interna IT_SPFLI.
SELECT *
FROM spfli
INTO TABLE it_spfli
WHERE carrid = 'AA'
AND connid = '0064'.
BREAK-POINT.
FREE it_spfli.
ENDFORM. " f_condicao
*&---------------------------------------------------------------------*
*& Form f_single
*&---------------------------------------------------------------------*
FORM f_single .
* Selecionou somente um registro (conforme condição)e jogou para uma
* estrutura.
SELECT SINGLE *
FROM spfli
INTO st_spfli
WHERE carrid = 'AA'
.
" Obs. Caso todas as condições sejam chave da tabela, não será necessário
" o uso do comando 'SINGLE' pois sempre retornará um registro.
BREAK-POINT.
CLEAR st_spfli.
ENDFORM. " f_single
*&---------------------------------------------------------------------*
*& Form f_variavel
*&---------------------------------------------------------------------*
FORM f_variavel .
DATA :
vl_cityfrom TYPE spfli-cityfrom,
vl_cityto TYPE spfli-cityto.
* Com uma variável
SELECT SINGLE cityfrom
FROM spfli
INTO vl_cityfrom
WHERE carrid = 'AA'.
BREAK-POINT.
CLEAR vl_cityfrom.
* Com mais variáveis
SELECT SINGLE cityfrom cityto
FROM spfli
INTO (vl_cityfrom, vl_cityto)
WHERE carrid = 'AA'.
BREAK-POINT.
CLEAR : vl_cityfrom , vl_cityto.
ENDFORM. " f_variavel
*&---------------------------------------------------------------------*
*& Form f_corresponding_fields
*&---------------------------------------------------------------------*
FORM f_corresponding_fields .
* Alimentando tabela
SELECT carrid connid cityfrom cityto
FROM spfli
INTO CORRESPONDING FIELDS OF TABLE it_spfli
.
BREAK-POINT.
FREE it_spfli.
* Alimentando estrutura
SELECT SINGLE carrid connid cityfrom cityto
FROM spfli
INTO CORRESPONDING FIELDS OF st_spfli
.
BREAK-POINT.
CLEAR st_spfli.
ENDFORM. " f_corresponding_fields
*&---------------------------------------------------------------------*
*& Form f_agregados
*&---------------------------------------------------------------------*
FORM f_agregados .
DATA :
vl_value TYPE i.
* Valor máximo para o campos determinado
SELECT MAX( fltime )
FROM spfli
INTO vl_value.
BREAK-POINT.
CLEAR st_spfli.
* Valor Minimo para o campos determinado
SELECT MIN( fltime )
FROM spfli
INTO vl_value.
BREAK-POINT.
CLEAR st_spfli.
* Valor medio entre todos os registro ( com condição ) para
* campo determinado
SELECT AVG( fltime )
FROM spfli
INTO vl_value
WHERE carrid = 'AA'.
BREAK-POINT.
CLEAR st_spfli.
* Soma entre todos os registro ( com condição ) para o campo
* determinado
SELECT SUM( fltime )
FROM spfli
INTO vl_value
WHERE carrid = 'JL'.
BREAK-POINT.
CLEAR st_spfli.
* Informa a quantidade de registro existentes
SELECT COUNT( * )
FROM spfli
INTO vl_value.
BREAK-POINT.
CLEAR st_spfli.
ENDFORM. " f_agregados