Escolar Documentos
Profissional Documentos
Cultura Documentos
APRENDENDO ABAP No MINISAP PDF
APRENDENDO ABAP No MINISAP PDF
Tela Inicial
ZMARA e a ZMAKT
Clique
em
Create.
Descrição da tabela
Display/Maintenanc
Classe de aplicação e Allowed para
permitir a
manutenção da
tabela sem restrição
Na “ABA” Fields repita a Descrição da tabela, e preencha os nomes dos campos como abaixo
O mandante deve
existir como
primeiro campo de
qualquer tabela e
sempre será chave
Confirme a
criação do
Elemento de Desconsiderar essa telinha,
Dados apenas confirme.
preencha o nome do
domínio a ser criado
Clique em Yes
Descrição
O Domínio carrega as características do breve
campo, como tamanho e tipo; e neste caso o
tipo como
CHAR e o tamanho 18.
3 passos obrigatórios:
Salvar
Verificar
Inconsistências
Ativar
Somente após esses passos o objeto funciona. Clique em BACK para voltar.
Para salvar o domínio após o clique, marque o popup como objeto local, verifique e ative.
Voltando, salve, verifique e ative também o Elemento de Dados.
Clique em Yes
Preencha o nome da
tabela no campo
Table/View
(VIEWNAME) e clique
em Maintain (Update).
Criando uma transação para manutenção de tabela - Transação: SE93 – Criação de transação.
Como a SM30 não é uma transação disponível para o usuário, criar uma transação para a manutenção
da tabela na transação SE93.
Coloque o nome
da transação, no
ex. ZMARA e
clique em
“Create”
Marque as 3 opções
de interface
Preencha com a
transação SM30
Marque “Pular a
Tela Inicial”
Preencha os campos e os conteúdos da
primeira tela da transação SM30.
Preencha o nome do
programa clique em
Create, todo objeto
customizado, ou que
não seja Standard
começa com Z.
Preencha o campo
Title com o nome do
relatório, o Type
como “Executable
program” e o Status
como “SAP Standard
Prodution Program”.
Salve como Objeto
Local.
O sistema abrirá o
editor de programa
ABAP; complete o
código como no
modelo abaixo:
*---------------------------------------------------------------------*
* Report ZRELMARA
*
*---------------------------------------------------------------------*
* Autor: Responsável:
* Data: Módulo:
*---------------------------------------------------------------------*
REPORT zrelmara.
*---------------------------------------------------------------------*
* Declaração
*---------------------------------------------------------------------*
* Tabelas transparentes do dicionário de dados que serão usadas no código.
TABLES: zmara,
zmakt.
*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
* Busca Dados---------------------------
* para organizar o processamento neste bloco utiliza-se forms, com a chamada
* pelo comando perform.
* para criar o form referente basta clicar duas vezes no nome do perform.
* Busca ZMARA - Busca dados da tabela zmara.
PERFORM busca_zmara.
* Processa dados-----------------------
PERFORM processa_dados.
*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form busca_zbseg
*---------------------------------------------------------------------*
FORM busca_zmara .
* Seleciona os dados matnr ersda mtart
SELECT matnr ersda mtart
* para dentro da tabela interna ti_zmara
INTO TABLE ti_zmara
* vindo da tatela transparente zmara
FROM zmara
* com a condição de acordo com a tela de seleção
WHERE matnr IN s_matnr. " ranger é com 'IN'
* sempre que for fazer um select relacionado com uma tabela transparente
* tem que garantir que isso não será feito com uma tabela vazia.
ENDLOOP.
*---------------------------------------------------------------------*
* Form imprime_saida
*---------------------------------------------------------------------*
FORM imprime_saida .
WRITE:/ wa_saida-matnr,
wa_saida-ersda,
wa_saida-mtart,
wa_saida-spras,
wa_saida-maktx.
ENDLOOP.
Salvar
Verificar
Inconsistências
Ativar
Clicar em Direct Processing (F8)
para rodar o programa.
Preencher com a
Clicando em Goto descrição dos campos,
Text Elements
Selections Texts. Salvar , Ativar e
Voltar .
Clique em Yes
Fazendo uma Função – calculadora simples - Transação: SE37 – Construtor de função ABAP.
Coloque o nome da
função e clique em
Create
Em Source code, a
tela trará os
parâmetros declarados
anteriormente.
Salvar
Verificar
Preencha os parâmetros
Ativar
de entrada e dê F8.
Segue o resultado.
Para testar a função dê F8
Usando uma função no código - Crie o programa ZCALCSP na SE38, com o código abaixo.
*---------------------------------------------------------------------*
* Report ZCALSP
*---------------------------------------------------------------------*
REPORT zcalcsp.
*---------------------------------------------------------------------*
* Declaração
*---------------------------------------------------------------------*
* Variáveis
DATA: v_result(10) TYPE n.
* Saída--------------------------------
* Imprime os dados da tabela ti_saida na tela.
PERFORM imprime_saida.
*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form chama_funcao
*---------------------------------------------------------------------*
FORM chama_funcao .
Preencha o nome da
função no campo ende
o CALL FUNCTION
estiver flegado e
confirme.
Preencher com
o texto que os
usuários irão
ver: Execute
novamente
Salvar,
Ativar e
Voltar.
* Processa dados-----------------------
PERFORM processa_dados.
* Saida--------------------------------
* Imprime os dados da tabela ti_saida na tela.
PERFORM imprime_saida.
*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form exporta_saida
*---------------------------------------------------------------------*
FORM exporta_saida .
A organização do programa deve ficar separada em blocos como em um report, porém tudo acontece
dentro dos respectivos includes.
Onde:
*---------------------------------------------------------------------*
* Module Pool SAPMZ1ONL no include TOP ficam todas as declarações.
no include O01 ficam os processamentos
*---------------------------------------------------------------------*
* Declarações da tela. PBO – Process Before
INCLUDE MZ1ONLTOP. " global Data Output
no include I01 ficam os processamentos após
* Processamento
INCLUDE MZ1ONLO01. " PBO-Modules um comando de tela.
INCLUDE MZ1ONLI01. " PAI-Modules PAI - Process After Input
no include F01 ficam todos os forms dos
* Subrotinas. processamentos.
INCLUDE MZ1ONLF01. " FORM-Routines
Os includes foram sugeridos, mas devem ser criados, faça assim para cada um, (menos o TOP, que
já foi criado junto com o online). Clique 2 X no nome do include a ser criado.
Neste ponto a estrutura do Online está pronta para receber qualquer processamento, tela, botões,
códigos, lógica, declarações, etc. Os includes são “programinhas” externos e lincados ao código
principal, tudo acontece neles. Não é necessário usar mais do que os 4 includes inicialmente
sugeridos, mesmo que outros venham a ser sugeridos pelo SAP.
Para esse online, vamos fazer a importação, na primeira tela, do TXT exportado pelo último report
e apresentar o resultado em um TABLE CONTROL em uma segunda tela.
* Tabelas Transparentes
TABLES: zmara, zmakt.
* Tabelas Internas
DATA: ti_txt TYPE STANDARD TABLE OF ty_txt,
ti_saida TYPE STANDARD TABLE OF ty_saida.
* Work Áreas
DATA: wa_txt LIKE LINE OF ti_txt,
wa_saida LIKE LINE OF ti_saida.
* Variáveis
DATA: v_path(128) TYPE c,
okcode TYPE sy-ucomm,
v_okcode TYPE sy-ucomm.
-----------------------------------------------------------------------------------
Coloque um
número ( 0100,
5000 ou 9000 )
Clique em Yes para identificar a
tela e confirme.
Clique em Yes
Preencha o
Function text
Com Enter e
Confirme Confirme.
Confirme e repita a
Seqüência para o
BACK e demais
botões que sejam
necessário criar.
*---------------------------------------------------------------------*
* Include MZ1ONLI01
*---------------------------------------------------------------------*
* Module USER_COMMAND_0100 INPUT
*---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
* o sy-ucomm recebe o nome do botão clicado,
* o okcode é um elemento de tela que vai receber o sy-ucomm
* para asegurar que o valor do botão não vai se perder
* o v_okcode recebe o valor é usado para o teste no CASE.
okcode = sy-ucomm.
v_okcode = okcode.
CLEAR okcode.
Neste ponto o código já importou o arquivo txt para dentro da tabela interna it_txt.
Agora vamos mostrar este conteúdo em uma segunda tela, porém a tabela ti_txt tem apenas um
único campo que é uma linha de 1000 caracteres; pouco funcional no processamento.
Temos que quebrar essa linha campo a campo e depois chamar a próxima tela para exibi-los;
então temos que criar outro form onde vamos quebrar as linhas da ti_txt em uma tabela interna
mais apropriada, a ti_saida e incluir a chamada da próxima tela de exibição.
Altere o módulo USER_COMMAND_0100 do include I01 para que fique como abaixo.
ENDCASE.
Para criar o desenho da tela, clique em LAYOUT. A ferramenta Screen Painter se abrirá.
Para colocar o campo que receberá o endereço ( V_PATH, declarado no TOP), clique no quadrinho
vermelho no topo da tela. No popup que se abrirá, clique em Get from Program e todas as declarações
do TOP aparecerão no grid; escolha a variável V_PATH e confirme.
Localize o campo
V_PATH e
confirme o
próximo popup.
Salve e volte.
Confirme
Clique 2 X no nome
STATUS_0110. Para esta tela,
que só vai mostrar os dados,
vamos colocar somente o botão
Voltar. Confirme o primeiro
popup, escolha o include de PBO
com o final O01 e confirme.
Confirme
Descomente o módulo
USER_COMMAND Confirme a criação do objeto em YES,
_0110 e clique 2 X escolha o include I01 e confirme.
para criá-lo.
*---------------------------------------------------------------------*
* Module USER_COMMAND_0110 INPUT
*---------------------------------------------------------------------*
MODULE user_command_0110 INPUT.
okcode = sy-ucomm.
v_okcode = okcode.
CLEAR okcode.
Clique em
Table Control
(With Wizard)
Salve e volte. O código vai estar cheio de coisas novas que com tempo merecem estudos, pois o
ideal de um table control é que ele seja feito “à mão”. Ative o Código de maneira GERAL.
Preencha o nome do
programa e o número
da tela.
Marque as 3 opções de
GUI suport e salve
como objeto local.
Segue o resultado:
Os botões criados
nas telas, são os
únicos ativos.
*Variáveis do AVL
DATA: v_repid LIKE sy-repid,
v_save TYPE c.
*---------------------------------------------------------------------*
*Tela com os parâmetros de entrada que servirão de filtro para a
* busca dos dados do relatório.
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
*Busca Dados---------------------------
*para organizar o processamento neste bloco utiliza-se forms, com a chamada
*pelo comando perform.
*para criar o form referente basta clicar duas vezes no nome do perform.
START-OF-SELECTION.
*Busca ZMARA - Busca dados da tabela zmara.
PERFORM busca_zmara.
*Processa dados-----------------------
PERFORM processa_dados.
*Saída--------------------------------
*Imprime os dados da tabela ti_saida na tela.
IF p_sim = 'X'.
*Imprime o relatório com o comando WRITE
PERFORM imprime_simples.
ELSE.
*Imprime o relatório com o processo de AVL
PERFORM imprime_alv.
ENDIF.
END-OF-SELECTION.
*Limpa todas as estruturas
PERFORM limpa_tudo.
*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form busca_zmara
*&---------------------------------------------------------------------*
FORM busca_zmara .
*Seleciona os dados matnr ersda mtart
*sempre que for fazer um select relacionado com uma tabela transparente
*tem que garantir que isso não será feito com uma tabela vazia
IF NOT ti_zmara[] IS INITIAL.
*Carrega uma linha com um fonte maior para título, tipo 'H'.
CLEAR wa_header.
wa_header-typ = 'H'.
wa_header-info = 'Listagem de Impressão ALV'(001).
APPEND wa_header TO it_header.
*Carrega uma linha com um fonte média para sub-títulos, tipo 'S'.
CLEAR wa_header.
wa_header-typ = 'S'.
wa_header-key = 'Materiais'(002). "imprime uma parte em negrito
wa_header-info = 'Dados Mestres Materiais'. "imprime outra parte normal
APPEND wa_header TO it_header.
*Carrega uma linha com um fonte menor para detalhes, tipo 'A'.
WRITE sy-datum TO l_data.
CONCATENATE 'Data:' l_data INTO l_linha.
CLEAR wa_header.
wa_header-typ = 'A'.
wa_header-info = l_linha.
APPEND wa_header TO it_header.
i = i + 1.
CLEAR wa_sort.
wa_sort-spos = i. "Sequência da ordem
wa_sort-fieldname = 'MATNR'. "Campo da tabela interna - Cx alta.
wa_sort-subtot = 'X'. "Quebra e subtotaliza valores por este campo
wa_sort-up = 'X'. "Sort descendente
APPEND wa_sort TO it_sort.
i = i + 1.
CLEAR wa_sort.
wa_sort-spos = i.
wa_sort-fieldname = 'ERSDA'.
APPEND wa_sort TO it_sort.
i = i + 1.
CLEAR wa_sort.
wa_sort-spos = i.
wa_sort-fieldname = 'MTART'.
wa_sort-subtot = 'X'. "Outro quebra de subtotal por este campo.
wa_sort-up = 'X'.
APPEND wa_sort TO it_sort.
i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i. "Ordem do fieldcat
wa_afield-fieldname = 'MATNR'. "Nome do campo da tb. de saída
wa_afield-ref_fieldname = 'MATNR'. "Campo de refrência para herdar características
wa_afield-ref_tabname = 'ZMARA'. "Tabela transparente que tem o campo acima
wa_afield-key = 'X'. "Marca como chave
APPEND wa_afield TO it_fieldcat.
i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'ERSDA'.
i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'MTART'.
wa_afield-ref_fieldname = 'MTART'.
wa_afield-ref_tabname = 'ZMARA'.
wa_afield-key = 'X'.
APPEND wa_afield TO it_fieldcat.
i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'SPRAS'.
wa_afield-ref_fieldname = 'SPRAS'.
wa_afield-ref_tabname = 'ZMARA'.
APPEND wa_afield TO it_fieldcat.
i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'MAKTX'.
wa_afield-ref_fieldname = 'MAKTX'.
wa_afield-ref_tabname = 'ZMARA'.
APPEND wa_afield TO it_fieldcat.
*Transfere dados-----------------------------------
wa_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_TRANSFER_DATA_BACK'
EXPORTING
it_fieldcat = it_fieldcat
is_layout = wa_layout
IMPORTING
et_fieldcat = it_fcat
es_layout = wa_lay.
*Imprime dados--------------------------------
MOVE sy-repid TO v_repid.
MOVE v_repid TO wa_variant-report.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
STOP.
ENDIF.
__________________________________________________________________________________
O Processo de Batch Input tem o objetivo de dar carga nas tabelas transparentes do SAP, porém
obedecendo todas as consistências e integridades geradas pelas regras de negócio de cada transação.
Nenhuma carga no SAP é efetuada diretamente no Banco de Dados (‘direct input’ tem que ser bem
estudado). O processo se divide em Mapeamento e Programa de Carga.
Clique em
Nova Gravação
*---------------------------------------------------------------------*
* Declarações
*---------------------------------------------------------------------*
* Tabelas transparentes
TABLES : zmara.
* Tipos
* Receber os dados importados para o SAP pela função GUI_UPLOAD.
TYPES: BEGIN OF ty_arq,
matnr(18) TYPE c,
ersda(8) TYPE c,
mtart(4) TYPE c,
spras(2) TYPE c,
maktx(40) TYPE c,
END OF ty_arq.
* Tabelas internas
DATA: ti_arq TYPE STANDARD TABLE OF ty_arq.
* Work areas
DATA: wa_arq LIKE LINE OF ti_arq.
* Work Areas
DATA: wa_bdcdata LIKE LINE OF ti_bdcdata ,
wa_bdcmsgcoll LIKE LINE OF ti_bdcmsgcoll,
wa_log LIKE LINE OF ti_log.
*Variáveis
DATA: v_msg LIKE t100-text,
v_msgv1 LIKE balm-msgv1,
v_msgv2 LIKE balm-msgv2,
v_msgv3 LIKE balm-msgv3,
v_msgv4 LIKE balm-msgv4.
*---------------------------------------------------------------------*
* Tela
*---------------------------------------------------------------------*
* Endereço do Txt.
* Batch Input
*Define Saída
SELECTION-SCREEN BEGIN OF BLOCK b002 WITH FRAME TITLE text-002.
*Grupo de botões que vão definir a maneira que o log será impresso.
PARAMETERS: p_spl RADIOBUTTON GROUP impr, " Impressão simples
p_alv RADIOBUTTON GROUP impr. " Impressão em ALV
SELECTION-SCREEN END OF BLOCK b002.
*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
START-OF-SELECTION.
* Busca dados
PERFORM busca_dados.
* Processa Dados
PERFORM executa_shdb.
* Saída
PERFORM imprime_log.
END-OF-SELECTION.
*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form busca_dados
*---------------------------------------------------------------------*
FORM busca_dados .
*---------------------------------------------------------------------*
* Form executa_shdb
*---------------------------------------------------------------------*
FORM executa_shdb .
CLEAR ti_log[].
* Para cada registro retornado pela importação do TXT.
LOOP AT ti_arq INTO wa_arq.
* Monta o SHDB da transação
PERFORM f_monta_bdc_data.
* Executa a transação
PERFORM f_call_trasaction.
* Tratamento de log de mensagens
PERFORM f_trata_log.
ENDLOOP.
*---------------------------------------------------------------------*
* Form f_monta_bdc_data
*---------------------------------------------------------------------*
FORM f_monta_bdc_data .
CLEAR ti_bdcdata[].
* O Mapeamento feito no SHDB é passado para o Código no formato abaixo.
* O parâmetro USING transporta cada conteúdo pra dentro do form f_bdc_data.
PERFORM f_bdc_data USING:
'SAPLZMARA' '0001' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=NEWL',
'SAPLZMARA' '0001' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=SAVE',
'' '' '' 'ZMARA-MATNR(01)' wa_arq-matnr,
'' '' '' 'ZMARA-ERSDA(01)' wa_arq-ersda,
'' '' '' 'ZMARA-MTART(01)' wa_arq-mtart.
CLEAR ti_bdcmsgcoll[].
*---------------------------------------------------------------------*
* Form f_trata_log
*---------------------------------------------------------------------*
FORM f_trata_log .
wa_log-matnr = wa_arq-matnr.
wa_log-ersda = wa_arq-ersda.
* Monta mensagem standard
LOOP AT ti_bdcmsgcoll INTO wa_bdcmsgcoll.
v_msgv1 = wa_bdcmsgcoll-msgv1.
v_msgv2 = wa_bdcmsgcoll-msgv2.
v_msgv3 = wa_bdcmsgcoll-msgv3.
v_msgv4 = wa_bdcmsgcoll-msgv4.
IF sy-subrc <> 0 .
CLEAR wa_log-tipo.
v_msg = 'Não houve mensagem'.
ENDIF.
wa_log-tipo = wa_bdcmsgcoll-msgtyp.
wa_log-msg_erro = v_msg.
APPEND wa_log TO ti_log.
ENDLOOP.
*---------------------------------------------------------------------*
* Form F_BDC_DATA
*---------------------------------------------------------------------*
* -->P_program programa
* -->P_dynpro tela
* -->P_start define a tela
* -->P_fnam nome do campo ou comando
* -->P_fval conteúdo do campo ou comando
*----------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form imprime_log
*---------------------------------------------------------------------*
FORM imprime_log .
*********EXERCÏCIO*************
* COMPLETAR O PROGRAMA COM UM PROCESSO DE IMPRESSÃO
* EM ALV UTILIZANDO A ti_log COMO SAÍDA.
ENDIF.
*---------------------------------------------------------------------*
* Form limpa_tudo
*---------------------------------------------------------------------*
FORM limpa_tudo .