terça-feira, 26 de abril de 2011

Função - GUI_DOWNLOAD

  "  Cria um arquivo externo conforme 'Filename com as informações da 'Data_tab
 
  p_log = 'C:\Documents and Settings\user\Desktop\arquivo.TXT'" Exemploooo
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename = p_log      " Endereço do arquivo a ser criado
    TABLES
      data_tab = it_message " Tabela com as informações que irão popular o arquivo
    EXCEPTIONS
      OTHERS   17.

Função - GUI_UPLOAD

"  Pega o arquivo externo relacionado e coloca os dados em uma tabela
" sem trata as informações.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = p_dest " Endereço completo do arquivo com os dados
    TABLES
      data_tab = t_line " Tabela interna que receberá os dados.
    EXCEPTIONS
      OTHERS   17.

Função - WS_FILENAME_GET

  "  A Idéia desta 'Function é muito simples, serve pra conseguir selecionar
" um arquivo externo com a extensão desejada. É usado muito na seleção do
" arquivo para o Batch Input

  CALL FUNCTION 'WS_FILENAME_GET'
       EXPORTING
            def_filename = ' '                       " Nome default
            def_path     = 'C:\'                     " Pasta default
            mask         ',Texto,*.txt,Todos,*.*.' " Formato .txt
 "           mask         = ',Imagem,*.jpeg,Todos,*.*.'" Formato .jpeg
            mode         'O'                       " S = Save, O = Open
            title        'Arquivo de Entrada'(004) " Titulo da caixa de msg
       IMPORTING
            filename     = p_dest               " Endereço completo do arquivo.
       EXCEPTIONS
            OTHERS
            .

Batch Input - Básico

  "  Vamos agora tentar explicar um Batch Input, sabe quando tem aquele
" funcionário que tem um monte de dados dentro de um arquivo externo como
" um arquivo .xls ou .txt ou qualquer outro formato fora do SAP e este
" funcinário fala que os dados estão dentro de um arquivo e que pra
" cadastrar todos dentro da SAP demoraria dias, nessa hora o funcional
" escuta em sua mente sombria a palavra BATCH INPUT, a primeira coisa
" que o funcional fala é organize todos os dados em um único arquivo
" pulando uma linha por registro e separando os dados por ';' ou 'Space'
" recomendo ';' pois as vezes contem dados com espaço dentro e isso pode
" atrapalhar o processo de Input no Sistema.
"  Crie um arquivo que servirá como entrada de dados com as informações:

" 8000000001;nome teste1;rua teste1;São Paulo1;12345671
" 8000000002;nome teste2;rua teste2;São Paulo2;12345672

"  Lembrando que a ordem é muito importante pois eh gravado na ordem.

"  Tem um outro arquivo muito importante tb, o famoso SHDB contendo o
" mapeamento do processo por este arquivo vc consegue ver quais são os
" dados necessários para realizar com sucesso o processo qualque dúvida
" http://abapjuniores.blogspot.com/2011/04/shdb-basico.html.
"  Segue abaixo um programa comentado básico para um batch imput funciona.

*&---------------------------------------------------------------------*
REPORT zmj_batch.


" Tipos ....
TYPES:
" Dados que serão informados pelo arquivo.
  BEGIN OF ty_arqui,
    cliente TYPE rf02d-kunnr,        " Código do Cliente
    nome    TYPE kna1-name1,         " Nome do cliente
    rua     TYPE kna1-stras,         " Rua do cliente
    end     TYPE kna1-ort01,         " Endereço do cliente
    tel     TYPE kna1-telf1,         " telefone do cliente
  END OF ty_arqui,

" Batch input nova estrutura do campo de tabela
  BEGIN OF ty_bdcdata,
    program   TYPE bdcdata-program,  " Pool de módulos BDC
    dynpro    TYPE bdcdata-dynpro,   " NÚmero de tela BDC
    dynbegin  TYPE bdcdata-dynbegin, " Início BDC de uma tela
    fnam      TYPE bdcdata-fnam,     " Nome do campo
    fval      TYPE bdcdata-fval,     " Valor do campo BDC
  END OF ty_bdcdata,

" Relação informativa do log
  BEGIN OF ty_message,
    cliente TYPE rf02d-kunnr,        " Código do cliente
    msgty   TYPE message-msgty,      " Tipo da mensagem
    msgno   TYPE message-msgno,      " Numero da mensagem
    msgtx   TYPE message-msgtx,      " Descrição da mensagem
  END OF   ty_message
    .

" Tabelas Internas ....
DATA: it_arqui    TYPE TABLE OF ty_arqui,
      it_bdcdata  TYPE TABLE OF ty_bdcdata,
      it_msg      TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
      it_message  TYPE TABLE OF ty_message
        .
" Tabela que recebe as informações crua do arquivo que será tratado
DATA: BEGIN OF t_line OCCURS 0,
        linha(108) TYPE c,
      END OF t_line
        .

" Estruturas ...
DATA: st_arqui   TYPE ty_arqui,
      st_bdcdata TYPE ty_bdcdata,
      st_message TYPE ty_message
        .

" Variaveis ....
DATA: vg_mode(1) TYPE VALUE 'N'" informa o Modo do Call Transaction
      vg_texto(100) TYPE c,        " Texto para o Indicator
      vg_s TYPE VALUE 'S',       " Informa o Update do call Transaction
      mensg LIKE message VALUE IS INITIAL, " variavel que recebe retorno
      msgno LIKE sy-msgno
        .


" Tela de Seleção ....
" texto (
SELECTION-SCREEN BEGIN OF BLOCK WITH FRAME TITLE text-001.
PARAMETERS:    p_dest TYPE string, " Texto ( Arquivo txt: )
               p_log  TYPE string  " Texto ( Arquivo log: )
                 .
SELECTION-SCREEN END OF BLOCK a.

" Quando for requisitado um valor no 'Parameter faça ...
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dest.
  PERFORM z_busca_arquivo.

" Quando for requisitado um valor no 'Parameter faça ...
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_log.
  PERFORM z_mostra_local.

"  Começa aki ...
START-OF-SELECTION.
  PERFORM: z_baixa_arquivo,
           z_trata_arquivo,
           z_monta_shdb,
           z_manda_arquivo
           .

*&---------------------------------------------------------------------*
*&      Form  z_busca_arquivo
*&---------------------------------------------------------------------*
  "  Pega o valor contido no parameters e add o texto '.txt' no final assim o
  " o nome do arquivo fica com a extensão desejada.
  FORM z_busca_arquivo.
  CONCATENATE p_dest '.txt' INTO p_dest.
  CALL FUNCTION 'WS_FILENAME_GET'
       EXPORTING
            def_filename = ' '
            def_path     = 'C:\'
            mask         ',Texto,*.txt,Todos,*.*.'
            mode         'O'
            title        'Arquivo de Entrada'(004)
       IMPORTING
            filename     = p_dest
       EXCEPTIONS
            OTHERS.

ENDFORM.                    " z_busca_local

*&---------------------------------------------------------------------*
*&      Form  z_mostra_local
*&---------------------------------------------------------------------*
  " Mostra o local onde será gravado o arquivo de Log.
FORM z_mostra_local .
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = 'Informar o caminho para gerar o arquivo'
      initial_folder       = 'C:\'
    CHANGING
      selected_folder      = p_log
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               4.
  " Nome do Arquivo do Log contendo o endereço+NOME1+HORA+.TXT.
  CONCATENATE  p_log '\' sy-uname '_' sy-uzeit '.TXT' INTO p_log
          .

ENDFORM.                    " Z_MOSTRA_LOCAL

*&---------------------------------------------------------------------*
*&      Form  Z_MONTA_ARQUIVO
*&---------------------------------------------------------------------*
"  Pega o arquivo externo relacionado e coloca os dados na 'T_LINE
FORM z_baixa_arquivo.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename = p_dest
    TABLES
      data_tab = t_line
    EXCEPTIONS
      OTHERS   17.

ENDFORM.                    " Z_MONTA_ARQUIVO

*&---------------------------------------------------------------------*
*&      Form  Z_TRATA_ARQUIVO
*&---------------------------------------------------------------------*
"  Será os dados conforme sequencia de campos e add na tabela principal
FORM z_trata_arquivo.
  LOOP AT t_line.
    " o Split quebra a linha e separa por delimitador ';' colocando cada dado
    " em cada campo sequencialmente.
    SPLIT t_line AT ';' INTO: st_arqui-cliente
                              st_arqui-nome
                              st_arqui-rua
                              st_arqui-end
                              st_arqui-tel
                              .
    " Add registro na tabela.
    APPEND st_arqui TO it_arqui.

  ENDLOOP.
ENDFORM.                    " Z_TRATA_ARQUIVO
*&---------------------------------------------------------------------*
*&      Form  z_monta_shdb
*&---------------------------------------------------------------------*
FORM z_monta_shdb.

  LOOP AT it_arqui INTO st_arqui.
    " cria uma variavel pra informar qual cliente está porcessando no
    " perform z_sapgui_progress_indicator.
    CONCATENATE 'Processando o Cliente -' st_arqui-cliente
    INTO vg_texto SEPARATED BY space.
    "  informa o processo atual
    PERFORM z_sapgui_progress_indicator USING vg_texto.
    " É aki que o bixo pega, lembra dakele arquivo SHDB que enviaram pra vc
    " é aki que ele começa a faze sentido, oq nós estamos fazendo aki e criando
    " uma tabela com as informações conforme o SHDB só mundando a informação
    " que vc quer que mude conforme o registro.
    "  Depois de terminar os performs z_preenche_bdc vc vai dar uma olhada
    " na tabela it_bdcdata pq ela vai estar igualzinha com o SHDB que
    " enviaram pra vc.
    " Crie um 'Perform pra cada tela que tiver no SHDB.
    PERFORM z_preenche_bdc USING:

      'X'    'SAPMF02D'       '0101',
      ' '    'BDC_CURSOR'     'RF02D-D0110',
      ' '    'BDC_OKCODE'     '/00',
      ' '    'RF02D-KUNNR'    st_arqui-cliente,
      ' '    'RF02D-D0110'    'X'.

    PERFORM z_preenche_bdc USING:

      'X'    'SAPMF02D'        '0110',
      ' '    'BDC_CURSOR'      'KNA1-TELF1',
      ' '    'BDC_OKCODE'      '/00',
      ' '    'KNA1-NAME1'     st_arqui-nome,
      ' '    'KNA1-STRAS'     st_arqui-rua,
      ' '    'KNA1-ORT01'     st_arqui-end,
      ' '    'KNA1-TELF1'      st_arqui-tel.

    PERFORM z_carrega_transacao.
    PERFORM z_imprime_mensagem.

    CLEAR it_bdcdata.

  ENDLOOP.
ENDFORM.                    " z_monta_shdb
*&---------------------------------------------------------------------*
*&      Form  Z_PREENCHE_BDC
*&---------------------------------------------------------------------*
"  Se Dynbegin = 'X' ele preenche as informações da tela, senão ele preenche
" o campo e o dado dela. prontio.
FORM z_preenche_bdc  USING dynbegin
                           name
                           value.
  IF dynbegin = 'X'.
    MOVE: name      TO st_bdcdata-program,
          value     TO st_bdcdata-dynpro,
          dynbegin  TO st_bdcdata-dynbegin.
    APPEND st_bdcdata TO it_bdcdata.
  ELSE.

    MOVE: name  TO st_bdcdata-fnam,
          value TO st_bdcdata-fval.
    APPEND st_bdcdata TO it_bdcdata.

  ENDIF.
"  prepara a estrutura para o Loop.
  CLEAR st_bdcdata.
ENDFORM.                    " Z_PREENCHE_BDC
*&---------------------------------------------------------------------*
*&      Form  Z_CARREGA_TRANSACAO
*&---------------------------------------------------------------------*
FORM z_carrega_transacao .
"  Chama a trasação informada usando a tabela 'IT_BDCDATA que na verdade
" é um shdb que vai automátiza o processo até o ultimo registro, existe
" dois metodos de ver o processo, no 'MODE se colocar 'N' vc não visualiza
" o processo, agora se vc coloca 'A' no 'MODE vc terá que apertar 'Enter
" por processo e depois de efetuar o processo por registro ele popula a
" tabela 'IT_MSG com os dados de retorno,se foi realizado com exito, ou se
" deu algum problema.
  CALL TRANSACTION 'XD02' USING it_bdcdata
                          MODE  vg_mode
                          UPDATE vg_s
                          MESSAGES INTO it_msg
                            .

ENDFORM.                    " Z_CARREGA_TRANSACAO

*&---------------------------------------------------------------------*
*&      Form  Z_IMPRIME_MENSAGEM
*&---------------------------------------------------------------------*
FORM z_imprime_mensagem.
"  Dá 'Loop na tabela de retorno da chamada da transação e alimenta outra
" tabela com a retorno referenciado com o Cliente
  LOOP AT it_msg.
    msgno = it_msg-msgnr.
    "  Function que faz mostrar a mensagem
    CALL FUNCTION 'WRITE_MESSAGE'
      EXPORTING
        msgid         = it_msg-msgid
        msgno         = msgno
        msgty         = it_msg-msgtyp
        msgv1         = it_msg-msgv1
        msgv2         = it_msg-msgv2
        msgv3         = it_msg-msgv3
        msgv4         = it_msg-msgv4
        msgv5         = ' '
     IMPORTING
*       ERROR         =
        messg         = mensg
*       MSGLN         =
              .
  ENDLOOP.

  st_message-cliente = st_arqui-cliente.
  st_message-msgty   = mensg-msgty.
  st_message-msgno   = mensg-msgno.
  st_message-msgtx   = mensg-msgtx.
" popula a tabela principal de mensagem que será o Log de erro.
  APPEND st_message TO it_message.

*   WRITE: / , st_arqui-cliente ,
*              mensg-msgtx,
*              mensg-msgty
*           .

ENDFORM.                    " Z_IMPRIME_MENSAGEM

*&---------------------------------------------------------------------*
*&      Form  Z_MANDA_ARQUIVO
*&---------------------------------------------------------------------*
FORM z_manda_arquivo .
"  Cria um arquivo externo conforme 'Filename com as informações da 'Data_tab
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename = p_log
    TABLES
      data_tab = it_message
    EXCEPTIONS
      OTHERS   17.
ENDFORM.                    " Z_MANDA_ARQUIVO

*&---------------------------------------------------------------------*
*&      Form  Z_SAPGUI_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
FORM z_sapgui_progress_indicator  USING texto.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 10
      text       = texto.

ENDFORM.                    " Z_SAPGUI_PROGRESS_INDICATOR

"  Debugem isso, estudem, façam de outra forma pois não eh tão facil assim,
" apertem F1, muda o 'MODE no 'CALL TRANSACTION pra ver processo por processo
" abusem deste programa, olhem abaixo o SHDB possivel para este Batch input,
" provavelmente deve ter mais campo mostrando valores mas nós não precisavamos
" cadatrar outros campos, e qualquer dúvida e soh fala, t+.


"                                               T XD02  BS AA X   F
"SAPMF02D 0101  X
"                                                 BDC_CURSOR  RF02D-D0110
"                                                 BDC_OKCODE  /00
"                                                 RF02D-KUNNR 8000000001
"                                                 RF02D-D0110 X
"SAPMF02D 0110  X
"                                                 BDC_CURSOR  KNA1-TELF1
"                                                 BDC_OKCODE  /00
"                                                 KNA1-NAME1  teste
"                                                 KNA1-STRAS  rua teste
"                                                 KNA1-ORT01  São Paulo
"                                                 KNA1-TELF1  12345678

segunda-feira, 25 de abril de 2011

SHDB - Básico

"  Um SHDB e nada mais nada menos que um mapeamento do processo feito dentro
" de uma transação, serve para informar as coordenadas para um Batch Input.
"  Na verdade esta informação tem que vir do funcional mas caso de algum
" erro no batch input durante a gravação vc mesmo pode ir na transação e criar
" um SHDB para verificar a e comparar se o funcional se equivocou.
"  Criar um SHDB é muito facil, primeiro entre na transação SHDB, clique no
" botão 'Nova Gravação e aparecerá uma na tela.


" Nela preencha o 'Registro com o nome que quiser ( seja Organizado )
" e colocar a transação no 'Código da transação, clique em 'Executar registro,
" agora eh soh realizar o processo normal dentro da transação q quando
" terminar ele irá mostrar um arquivo contendo todos os campos, telas e
" informações usadas durante o seu processo, ai é soh copiar ( Crtl+Y )
" e colar num arquivo .txt ( caso precise ).

quarta-feira, 20 de abril de 2011

Função - CONVERSION_EXIT_PDATE_OUTPUT

  "  Função usada para converter a data padrão americano pra versão brasileira,
" usa bastante isso pra mostra pro usuário na forma que ele entenda.
report zmj_func_003.

"  Caso o 'Vg_input seja do tipo 'dats ou 'sy-datum vc não vai precisar
" nem chamar a função pois a SAP já muda conforme a lingua do sistema
" na hora de dar um 'Write

data : vg_input(8)  type ,
       vg_output    like vg_input
        .

vg_input = '20111230'.

  CALL FUNCTION 'CONVERSION_EXIT_PDATE_OUTPUT'
    EXPORTING
      input        = vg_input     " Valor a ser alterada
   importing
     output        = vg_output    " Valor alterado
            .


  write :
     vg_input ,
  /, vg_output
  .

Função - RZL_SLEEP

  "  Função muito utilizada junto com o 'SAPGUI_PROGRESS_INDICATOR',
" onde chamando estah função ele faz esperar durante um tempo de 
" 0 a 5 segundos, não sei pra que serviria em outra coisa mas tah ai.

CALL FUNCTION 'RZL_SLEEP'
 EXPORTING
   SECONDS              = " Qtde de segundos à esperar
 EXCEPTIONS
   ARGUMENT_ERROR       = " O erro que dara 
   OTHERS               " Retorno caso não seja nenhum das opções
          .

Função - SAPGUI_PROGRESS_INDICATOR

  "  Agora que nós sabemos fazer uma 'function vamos agora aprender a trabalhar
" com elas, (caso não saiba http://abapjuniores.blogspot.com/2011/04/funcao-basico.html)
" vou usar de exemplo uma função chamada SAPGUI_PROGRESS_INDICATOR,
" que uma função standard que serve para interação com o usuário informando
" em qualquer parte do processo um texto na barra inferior esquerdo,
" primeiro como sempre colocar essa 'function dentro de um Perform, no caso
" dessa 'Function usaremos o 'Using no Perform pq dependendo do processo o
" texto vai mudar. Dentro do 'Form clicar no botão 'MODELO' que fica ao lado
" do 'Pretty Printer' e nele abrirá um campo com a descrição de 'Call Function
" coloque o nome da função standart ou criado e aperte 'Enter.



"  Assim é mais fácil porque ele mostra todas as variáveis onde as
" opcionais estão comentadas e ai e só descomentar e relacionar ela com
" alguma variável ou qualquer outra coisa que tenha o valor requerido ou
" até mesmo o proprio valor.

report zmj_func_001.
" Tabelas .....
tables : bsak
          .
" Tipos .....
types :
   begin of ty_bsak,
     bukrs type bsak-bukrs,    " Empresa
     lifnr type bsak-lifnr,    " Nº conta do fornecedor
     augdt type bsak-augdt,    " tabela de contabilidade
   end of ty_bsak
         .
" Estruturas ....
data : st_bsak type ty_bsak
        .
" Tabelas internas .....
data : it_bsak type table of ty_bsak
        .
" Constantes .....
constants : c_re(2) type value 'RE'.

" Tela de seleção ....
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_bukrs FOR bsak-bukrs no intervals " Empresa
                  .

SELECTION-SCREEN END OF BLOCK b01.


" Initialization ....

perform seleciona_dados.


*&---------------------------------------------------------------------*
*&      Form  SELECIONA_DADOS
*&---------------------------------------------------------------------*
form SELECIONA_DADOS .

perform SAPGUI_PROGRESS_INDICATOR using  'Processo 1'.

*  Seleciona os dados da tabela 'BSAK e coloca na tabela interna 'IT_BSAK
* conforme criterios de seleção pela tela.
SELECT     bukrs     " Empresa
           lifnr     " Nº conta do fornecedor
           augdt     " Data de compensação
  FROM     bsak      " tabela de contabilidade
  INTO TABLE it_bsak      " Tabla Interna
  WHERE      bukrs IN so_bukrs      " Empresa
  AND        blart =  c_re.         " Tipo de documento

endform.                    " SELECIONA_DADOS

*&---------------------------------------------------------------------*
*&      Form  SAPGUI_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
form SAPGUI_PROGRESS_INDICATOR  using p_process.

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
 EXPORTING
   PERCENTAGE       = 10               " Velo do reloginho em %
   TEXT             = p_process        " Texto que aparecerá
          .

endform.                    " SAPGUI_PROGRESS_INDICATOR

"  Agora é soh executar e ver a mensagem que a aparece na barra inferior,
" eu uso ele principalmente quando o código tem varios processos e quero
" ver oq o programa tah fazendo...
"  Espero que tenham entendido até o proximo Post.

Função - Básico

 
"  A Partir de hoje estaremos postando sobre 'Functions, bem para quem não
" sabe, 'Function é uma ferramenta usada para otimizar programas como rotinas
" podendo ser usado em varios programas ao mesmo tempo.
"  Na teoria eh meio complicado, mas vcs vão ver que eh mou de boua, primeira
" coisa vou mostrar um Passo a Passo de como fazer uma 'Function e depois eu
" eu dou varios exemplos de 'functions que já vem da SAP, principalmente as
" mais usadas.

"  Primeiro para ter uma 'function temos que ter um 'Grupo de funções onde é
" ir no se80, colocar Grupo de funções, colocar o nome e dar Enter, nessa
" hora ele ira informar que não existe ai e só preencher os campos e pronto,
" agora pra criar uma 'Function e soh clicar com o botão direito do mouse
" sobre o grupo de funções criada agora e criar uma função, mas aki nós
" vamos trabalhar com o se37 pois é quase uma obrigação saber usar bem esta
" transação.
"  Na SE37 coloque o nome da 'Function e clique em Criar, o sistema irá
" informar que não existe então aparecerá uma tela onde vc deve colocar
" o grupo de função ( que eu espero que já tenha sido criado ) e clicar em
" Gravar.


"  Dentro da função existe algumas abas uma delas é a 'Importing onde vc
" deve colocar aki todas as variáveis que o seu programa irá enviar para
" a função e na aba 'Exporting colocar todas as variaveis que a função irá
" exportar depois da execução.



"  Repare bem nas propriedades preenchidas de cada campo dentro das abas
" 'Importing e 'Exporting onde está "Op..." seria 'Opcional que significa
" que para o funcionamento da 'Functions ela não precisa necessariamente
" que está variavel contenha valor e onde está " Tra..." seria 'Tranferivel.
"  Caso tenha alguma variável que será modificado durante a execução, colocar
" na aba 'Modify.
"  Caso vc tenha alguma tabela interna no programa que vá usar na sua 'function
" declarar ela na aba 'tables, lembrando que está tabela pode ser tipo uma
" estrutura "Z como tb qualquer coisa standart.



"  Em Exceções serão colocadas às mensagens que a função irá retornar.



"  Em 'Texto fonte' deverá ser codificado em ABAP normalmente, onde é
" só colocar o código abaixo é ver oq acontece.

FUNCTION Z_CRIAR_FUNCAO.
*"----------------------------------------------------------------------
*"*"Interface local:
*"  IMPORTING
*"     REFERENCE(V_MATNR) LIKE  MARA-MATNR
*"  EXPORTING
*"     REFERENCE(V_MAKTX) LIKE  MAKT-MAKTX
*"  TABLES
*"      T_TELA STRUCTURE  ZCRIAR_ESTRUT OPTIONAL
*"  EXCEPTIONS
*"      MATERIAL_INEXISTENTE
*"----------------------------------------------------------------------
  REFRESH: t_tela.
  CLEAR t_tela.

  SELECT matnr werks
  INTO TABLE t_tela
  FROM marc
  WHERE matnr = v_matnr.

  IF sy-subrc NE 0.
    RAISE Material_Inexistente.
  ENDIF.

  SELECT SINGLE maktx
  INTO v_maktx
  FROM makt
  WHERE spras = sy-langu and
        matnr = v_matnr.

LOOP AT t_tela.
 t_tela-maktx = v_maktx.

    MODIFY t_tela.

ENDLOOP.

ENDFUNCTION.


" Salve, Ative e aperte F8 para testar onde aparecerá essa tela.




"  E digite um Nº de material valido, caso contrario aparece mensagem
" de retorno.

"  Portanto daki por diante se precisar uma descrição de material
" pelo numero do material informado é soh usar essa função, rsrs,

" t+ e qualquer coisa comentem.

segunda-feira, 18 de abril de 2011

Amém

" Num curto prazo de tempo, apertáis Ctrl+s, Ctrl+F2 e Ctrl+F3 e serás salvo. "

Module Pool - Básico

 
"  Vou tentar comentar como faze um 'Module Pool simples o sulficiente pra
" fala que um dia fez um, vou tentar ser um pouco mais didádico.
"  'Module Pool ou programa online É uma ferramenta da SAP para interação
" de com o usuário.
"  Existem duas maneiras de Cria um 'OnLine seria pelo se38 ( editor ABAP
" normal ) se41 (MenuPainter) se51(Screen Painter) mas isso eh soh pra sabe
" pq na verdade vc vai usa o se80 ( Object Navigator ) pq vc fika vendo a
" arvore do esquema todo que vc tah criando, 'Includes, 'Campos, ' Modulos,
" 'Telas e mais um monte de coisa que faz o se80 fika bem mais vantajoso.

" Vamo lah então step by step,

"  Na se80 clique com o botão direito do mouse no na pastinha de programa e crie
" um novo programa e muito importante vc seguir a nomenclatura padrão SAP
" que seria conforme exemplo SAPMZSD0001 onde o 'SAP' é nome padrão, 'M' indica
" que é 'Module Pool, 'SD' indica pra que Modulo está sendo feita este 'Module,
" a partir daki seguir a metodologia utilizada pelo cliente ou ambiente.
"  Escolha a opção com 'Include Top pq assim os includes vão ser declarados
" automaticamente, a SAP irá sugerir um nome, o mais indicado é aceitar, nos
" atributos do programa preencha o tipo de programa com 'Pool de modulos' .


 

"  Num 'Online existem 4 principais 'Includes que serão utilizados durante
" todo o processo que ficam no programa principal já veêm escrito no código
" mas esta comentando portando soh descomente e clique duas vezes para criar,
" siga o padrão de nomenclatura que a SAP coloca no comentario:
" Nomenclatura : Include TOP - TOP / Include PBO - O01 / Include PAI - I01
" / Include Performs - f01.

"  Include TOP - serve pra vc coloca todas as declarações que será usado no
" programa como variáveis, tipos, estrutura, tabelas internas, constantes etc.
"  Include PBO - Serão armazenados todos os Modules PBO que são todas as
" rotinas para a preparação das informações e/ou elementos da tela antes
" da sua exibição.
"  Include PAI - Serão armazenados todos os Modules PAI que são todas as
" rotinas de tratamento das ações ( comando do usuário ) que foram
" executados na tela.
" Include Performs - Onde vai fika todos os performs que vc cria.




"  Agora nós estamos quase terminando, rsrs, vixi tem muita coisa ainda,
" vamos criar as telas agora, é a parte que o usuário visualiza os campos
" que tem que ser preenchido.
"  Clique com o botão direito no nome do programa criar/ tela de um numero
" pra essa tela que servirá como referencia para chamar apos numero da tela
" confirme e coloque a descrição da tela e salve.
"  ( a SAP recomenda usar o numero da tela de 9000 a 9999 indicando que
" a tela criada é uma tela 'Z' ( criada por nois mortais ))
"  Após gravar a tela irá aparecer na arvore de objetos do programa,




"  Toda ação feita na tela do programa faz retornar um valor , o
" código de função, Para saber que valor é esse, deve-se definir um
" campo OK_CODE como um campo da tela, o qual receberá o valor desse código
" e assim tomando as ações relacionadas a ela, Portanto defina uma variavel
" do tipo sy-ucomm e atribua ao campo Ok_code da tela.

"  Caso queira fazer uma validação nos valores que foram informados na tela
" e informar ao usuário de que algo não está correto, deve se usar o comando
" 'Field, com a adição de uma chamada para o 'Module, isso significa que o
" referido modulo é somente executado para o campo especificado no codigo.

"  Se quiser fazer uma validação em muitos campos é só reunir todos os
" campos dentro de um bloco de comandos ('Chain / EndChain'), um mesmo
" campo pode ser chamados em blocos de comandos diferentes.

"  Podemos querer que chame o 'Module somente se o conteudo do campo for
" alterado usando o parâmetro 'On input na chamada do 'Module, ou então
" chamar o 'Module se o conteudo de algum dos campos dentro do bloco
" usando o parâmetro 'On chain-imput.

"  O parâmetro adicional 'At exit-command, faz com que o 'Module sejá
" processado antes das verificações automaticas de entrada (PAI).

"  Existe o famoso 'Status_gui que serve para customiza as barrinhas
" com os botões, menus como o botão de ativar, salvar, voltar, modelo
" e todos os outros botões que ficam encima quando vc tah programando,
" primeiro vc tem que criar o Status-gui clicando com o botão direito
" do mouse no nome do programa e ir em criar / status gui informe o
" nome do status, coloque um texto breve e no tipo de sttatus deixe como
" Status dialog mesmo e avance.



"  Recomendo sempre definir primeiro as funções standard da barra 'ToolBar
" que seriam os botões Voltar / Sair / Cancelar na teclas de função onde
" vc ativa estes botões só colocando o nome neles.

"  Agora com o 'Status-gui pronto nós devemos associar para uma tela onde
" é só descomentar o 'Module status_(nº tela), dar um duplo clique para
" criar o 'Module adicionando-o no PBO, dentro do 'Module coloque
" 'Set Pf-Status '(nome do status-gui criado) descomentando a linha rsrs,
" vcs viram que o SAP ajuda muito a gente pq tudo no 'Module pool e meio
" pré-definido bom pra gente rsrs.

"  Um Online pode utilizar varias telas é para chamá-las e só usarmos
" set screen  : para atualizar a proxima tela temporariamente, e
" call screen : para inserir um processamento de uma ou mais telas antes
" da tela atual.
" Leave to screen : Sai da tela atual ou indicada caso sejá descrita
" no código.

"  Existem tb as subtelas que são areas reservadas dentro da tela principal
" para outra tela, a diferença eh que ela não tem OK_CODE, nas caracteristicas
" ela eh definida como SUBTELA.

"  Existe um recurso muito utilizado que se chama 'Table control que serve
" pra mostra e edita dados de uma tabela dentro de uma tela, o 'Table control
" e tipo um quadro adicionado no 'Screen Painter ( akele botão chamado
" layout que fica do lado do 'pretty Printer na tela que vc tá mexendo ),
" para trabalhar com ela eh muito simples,
" Existe com wizard mas aih nós não vamos aprender nada, portanto manualmente
" defina o nome da 'Table Control no 'Top Include (Onde fika todas as
" declarações); na tela criar um 'Table control com as dimensões que achar
" necessário; Inserir os campos da tabela interna dentro do 'Table control.

"  Bem espero ter ajuda mais duq atrapalhado, com isso que eu passei vc já
" consegue fazer um On-line feio mas que funciona e que você pode deixar
" bem maior conforme sua necessidade ou curiosidade.

" Qualquer dúvida, opnião e sugestão por favor comentar aee  pq 'Module Pool
" tem muito dúvida as vezes até pra gente velha do ABAP.
"
report z_comm_modpool.