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.

sexta-feira, 15 de abril de 2011

Execute Online

Diquinha de Hoje

" Para executar um Module Pool criás-tes uma transação, rs"

Figura no Module Pool

  "  Radical esse código heim, hahaii !!
"  Foi como disse o meu amigo que passou este esqueminha pra mim,
" o Nicholas procurou muito na internet e naum achou porisso estou postando
" espero que ajude algum junior, vamos por passos : 

"  Passo 1 - Criar uma 'Custom Control no Layout da tela
"  Passo 2 - Dentro do 'Before OutPut (PBO) tem o Modulo de Status da tela,
"  Passo 3 - Dentro deste modulo (por Bouas praticas) crie um 'Perform para 
" chamar a imagem
"  Passo 4 - Agora coloque o codigo abaixo não esquecendo de relacionar o 
" o 'Custom Control com o container e colocar o nome do figurinha no 'Method

"  É Voala (é Assim que escreve?) agora seu 'Module Pool vai ter uma imagem a 
" maioria da vezes serve pra coloca o logo do cliente (por favor não erre a 
" imagem )

*&---------------------------------------------------------------------*
*&  Include           MZ_NCPROGRAMAF01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  Z_FIGURA_1
*&---------------------------------------------------------------------*



FORM z_figura_1 .

  DATA: w_lines TYPE i.

  TYPES pict_line(256) TYPE c.

  DATA :  container TYPE REF TO cl_gui_custom_container,
          editor    TYPE REF TO cl_gui_textedit,
          picture   TYPE REF TO cl_gui_picture,
          pict_tab  TYPE TABLE OF pict_line,
          url(255)  TYPE c.

  DATA: graphic_url(255).

  DATA: BEGIN OF graphic_table OCCURS 0,
          line(255) TYPE x,
        END OF graphic_table.

  DATA: l_graphic_conv TYPE i.
  DATA: l_graphic_offs TYPE i.
  DATA: graphic_size   TYPE i.
  DATA: l_graphic_xstr TYPE xstring.

  CALL METHOD cl_gui_cfw=>flush.

* Aqui é declarado o container onde a imagem vai aparecer.

  CREATE OBJECT: container EXPORTING container_name = 'CUSTOM_CONTROL_1', picture EXPORTING parent = container.

* Metodo que carrega a imagem do SAP.

  CALL METHOD cl_ssf_xsf_utilities=>get_bds_graphic_as_bmp
    EXPORTING
      p_object       = 'GRAPHICS'
      p_name         = 'SUA_IMAGEM_AKI'
      p_id           = 'BMAP'
      p_btype        = 'BCOL'
    RECEIVING
      p_bmp          = l_graphic_xstr
    EXCEPTIONS
      not_found      = 1
      internal_error = 2
      OTHERS         3.

  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  graphic_size = XSTRLEN( l_graphic_xstr ).
  l_graphic_conv = graphic_size.
  l_graphic_offs = 0.

  WHILE l_graphic_conv > 255.

    graphic_table-line = l_graphic_xstr+l_graphic_offs(255).
    APPEND graphic_table.
    l_graphic_offs = l_graphic_offs + 255.
    l_graphic_conv = l_graphic_conv - 255.

  ENDWHILE.

  graphic_table-line = l_graphic_xstr+l_graphic_offs(l_graphic_conv).
  APPEND graphic_table.

  CALL FUNCTION 'DP_CREATE_URL'
    EXPORTING
      type     'IMAGE'
      subtype  = 'X-UNKNOWN'
      size     = graphic_size
      lifetime = 'T'
    TABLES
      data     = graphic_table
    CHANGING
      url      = url.

  CALL METHOD picture->load_picture_from_url
    EXPORTING
      url = url.

  CALL METHOD picture->set_display_mode
    EXPORTING
      display_mode = picture->display_mode_fit_center.

ENDFORM.                    " Z_FIGURA_1

quinta-feira, 14 de abril de 2011

Exits de boua..

Diquinha de Hoje

" Nunca coloque Check dentro de Exits,.... Nunca..."

terça-feira, 12 de abril de 2011

Só uma letra

Diquinha de hoje

" Nunca declare nada com um único caractér, pois eh mou treta selecionar isso Debuggando"

Programinha Orientado a Objeto

  "  Este programa Mostra como eh dahora trabalha com Orientação a Objeto,
" eh dificil mas eh dahora pegando o conceito vc consegue pelomenos entender
" os programas orientado a objeto que vc for dar manutenção, pq vc vê que o
" Código e mais estruturado e organizado
"  Extra - Quem me deu aula de OO foi o Flavio Furlan do (abap101.com) e
" o Mauricio Cruz da (www.abapzombie.blog.br) portanto qualquer coisa vcs
" falem com eles rsrsrsrsrs e/ou comentem aqui.

*&---------------------------------------------------------------------*
*& Report  ZMJ_PROG_OO.
*&
*&---------------------------------------------------------------------*

REPORT  zmj_prog_oo.

" Tela de Seleção .....
SELECTION-SCREEN BEGIN OF BLOCK WITH FRAME.
PARAMETERS: s_c TYPE OBLIGATORY  .
SELECTION-SCREEN END OF BLOCK a.

"  A 'Definition serve para declaração de tudo que será usado
*----------------------------------------------------------------------*
*       CLASS c1 DEFINITION
*----------------------------------------------------------------------*
CLASS c1 DEFINITION.

  " 'Public Section conterá atributos visiveis pra todos ( progs, functions, etc)
  PUBLIC SECTION.
    "  Olhando bem com o method eh, faz vc lembra de algo ne, e claro parece
    " uma função a ideia eh essa mesmo, contem os importing changing e exporting
    METHODS:   set IMPORTING value(set_value) TYPE i,
               add,
               get EXPORTING value(get_value) TYPE i.

    "  Caso ela vire uma 'SuperClass (classe Mãe) no 'Protected Section os atributos
    " e metodos seram somente usados nas subclasses e nela mesma 
  PROTECTED SECTION.

    " 'Private section conterá atributos visiveis somente dentro da classe.
  PRIVATE SECTION.
    DATA contador TYPE .
ENDCLASS.                    "c1 DEFINITION

"  A 'Implementation serve para mostrar o q tudo que foi declarado faz,
" dica - Toda vez que abrir uma classe ou metodo ja fecha pra visualizar
" melhor oq está Fazendo.
*----------------------------------------------------------------------*
*       CLASS c1 IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS c1 IMPLEMENTATION.

  " 'Method que compara a variavel 'Contador com o variavel definida do 'Method
  METHOD set.
    contador = set_value.
  ENDMETHOD.                    "set

  " 'Method que adiciona +2 na variavel 'Contador
  METHOD add.
    ADD 2 TO contador.
  ENDMETHOD.                    "add

  " 'Method que compara variavel definida do 'Method com a varival 'Contador
  METHOD get.
    get_value = contador.
  ENDMETHOD.                    "get
ENDCLASS.                    "c1 IMPLEMENTATION

" Daki pra baixo estaremos trabalhando com tudo que declaramos acima.

" Data cnt com referencia a classe criada dando assim acesso a tudo da classe.
DATA obj_1 TYPE REF TO c1.
DATA TYPE .

" Inicio da seleção ....

START-OF-SELECTION.

  " Para estar trabalhando com ele ainda vc precisa cria-lo como objeto
  CREATE OBJECT obj_1.

  "  Chama o 'Method set para o objeto 'obj_1 onde o valor exportado é a variável
  " declarada como tipo inteiro (linha 75)
  CALL METHOD obj_1->set
    EXPORTING
      set_value = n.

  " Faz n vezes a chamada no 'Method add conforme imput na tela de seleção.
  DO s_c TIMES.
    CALL METHOD obj_1->add.
  ENDDO.

  " Chama o 'Method set para o objeto 'obj_1 onde o valor importado é a variável
  CALL METHOD obj_1->get
    IMPORTING
      get_value = n.

  " Mostra a variável pra 6 vê que funciona.
  WRITE n.

Perform's

  "  Este tipo de código e muito usado em Batch Imput, Alimentando fieldcat,
" e muitas outras coisas, O perform e usado pra organizar e pra trabalhar
" com rotinas.
"  Testem aih pessoal, daki por diante soh estarei mandando os posts
" prontos pra testar eh soh copiar e colar aih assim vcs podem debuggar
" e ver como funciona pro sistema e tambem caso vc tenham que usa o codigo
" pra algum trampo rsrs.

*&---------------------------------------------------------------------*
*& Report  ZMJ_PROG_FORMS.
*&
*&---------------------------------------------------------------------*

REPORT  zmj_prog_forms.

" Tipos ......
types begin of ty_mara,
          matnr type mara-matnr,
          ernam type mara-ernam,
          pstat type mara-pstat,
        end of ty_mara
         .

" Estruturas ......
DATA : st_itteste  type ty_mara
        .

" Tabelas Internas .....
DATA : it_itteste  type table of ty_mara
        .

" Variaveis .....
DATA : vg_repid TYPE sy-repid
       .

" inicialization
vg_repid = sy-repid
.

" Inicio do processo ....
PERFORM : z_alimenta,
          z_alimenta2
                .

*&---------------------------------------------------------------------*
*&      Form  Z_ALIMENTA
*&---------------------------------------------------------------------*
"  Aqui é imput de dados na tabela interna da forma mais simples possivel,
" onde eh usado um form normal.

form Z_ALIMENTA .

  clear : it_itteste. " limpa a tabela para receber os dados

  st_itteste-matnr = '88988298839'" Dados do primeiro registro
  st_itteste-ernam = 'EU MESMO'.
  st_itteste-pstat = 'REGISTRO 1'.
  APPEND st_itteste TO it_itteste.  " Coloca o registro na tabela

  st_itteste-matnr = '90889878787'" Dados do segundo registro
  st_itteste-ernam = 'EU MESMO2'.
  st_itteste-pstat = 'REGISTRO 2'.
  APPEND st_itteste TO it_itteste.  " Coloca o registro na tabela

endform.                    " Z_ALIMENTA

*&---------------------------------------------------------------------*
*&      Form  Z_ALIMENTA2
*&---------------------------------------------------------------------*

FORM z_alimenta2.

  clear : it_itteste. " limpa a tabela para receber os dados

"  O 'Perform declarado aki estah informando que estará usando os dados
" abaixo, eh muito importante a sequencia de dados pois eh pela sequencia
" que o 'Form se relaciona com os dados do 'Perform

  PERFORM z_alimenta_itteste USING :
        '88988298839' 'EU MESMO'  'REGISTRO 1',  " Dados do registro 1
        '90889878787' 'EU MESMO2' 'REGISTRO 2'  " Dados do registro 2
          .

ENDFORM.                    " Z_ALIMENTA2

*&---------------------------------------------------------------------*
*&      Form  Z_ALIMENTA_ITTESTE
*&---------------------------------------------------------------------*
"  O 'Form foi declado onde o primeiro dado do registro que tah no
" 'Perform eh a variavel p_matnr que tem o tipo mara-matnr essa variável
" poderia ter qualquer nome e qualquer tipo

FORM z_alimenta_itteste  USING  p_matnr TYPE mara-matnr
                                p_ernam TYPE mara-ernam
                                p_pstat type mara-pstat.

  st_itteste-matnr = p_matnr. " Relaciona a variavel com o campo da estr.
  st_itteste-ernam = p_ernam.
  st_itteste-pstat = p_pstat.

 APPEND st_itteste TO it_itteste.  " Coloca o registro na tabela
ENDFORM.                    " Z_ALIMENTA_ITTESTE.