quinta-feira, 30 de junho de 2011

Agora é soh estrutura.

" Tabelas com ' Header Line ' está extinto, por favor usar estruturas com o mesmo tipo da tabela."

quarta-feira, 29 de junho de 2011

ALV - Parte 1

  " hahuahua, tava dando uma olhadinha nos posts que já fiz e
" percebi que tah faltando uma das coisas principais para um
" Abap Junior que eh saber mexer pelomenos no basico do ALV pois
" hoje a maioria dos relatorios solicitados são em ALV, o
" usuário tem uma maior flexibilidade com os dados podendo organizar,
" toda a vez que falarem um report pra vc a primeira coisa que tem
" que vir na sua cabeça eh um ALV, muitos consultores que eu conheço
" já tem um arquivinho com o ALV padrão deles, façam o de vcs tb, mas
" por favor não façam por fazer entendam oq cada coisa significa que
" assim vc conseguirá dar manutenção em qualquer ALV, aki estarei
" colocando um alv basico e com este arquivo estarei trabalhando pra
" fala tudo sobre isso, como colocar botão no ALV, eventos, layout,
" pf-status, e todas as propriedades que essa função pode ter entaum
" vamos lá...


REPORT z_alv_basico.

" Tabelas transparentes ....
TABLES : mara
  .
" type-pools .....
" Essa declaração e necessária pois e o grupo de tipos usados no ALV.
TYPE-POOLS: slis
           .

" Tipos .....
TYPES :

  BEGIN OF ty_mara,
    matnr TYPE mara-matnr,  " Nº do material
    ersda TYPE mara-ersda,  " Data de criação
    ernam TYPE mara-ernam,  " Nome do responsável que adicionou o objeto
    pstat TYPE mara-pstat,  " Status de atualização
    mtart TYPE mara-mtart,  " Tipo de material
  END OF   ty_mara .

" Estruturas ....
DATA : st_mara TYPE ty_mara
      .

" Tabelas Internas ....
DATA : it_mara TYPE TABLE OF ty_mara
      .

" Declarações usadas no ALV.
" Declaração da tabela e da estrutura que estaram com as informações dos campos
" do ALV
DATA : it_fieldcat TYPE slis_t_fieldcat_alv,
       st_fieldcat TYPE slis_fieldcat_alv
      .

" Tela de seleção .....
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS :
    so_matnr FOR mara-matnr NO INTERVALS,   " Nº do material
    so_pstat FOR mara-pstat NO INTERVALS    " Status de atualização
                .

SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.

  PERFORM : z_feed_table,
            z_fieldcat,
            z_alv
           .

*&---------------------------------------------------------------------*
*&      Form  Z_feed_table
*&---------------------------------------------------------------------*
" Fazendo um select simples pra traze algum dado pra nos podemos visualizar
" no nosso ALV bunitão.

" não entende sobre select, clique aki :

" http://abapjuniores.blogspot.com/2011/06/for-all-entries-in-basico.html

FORM z_feed_table .

  SELECT matnr
         ersda
         ernam
         pstat
         mtart
    INTO TABLE it_mara
    FROM mara
    UP TO 100 ROWS
    WHERE matnr IN so_matnr
    AND   pstat IN so_pstat
    .

ENDFORM.                    " Z_feed_table

*&---------------------------------------------------------------------*
*&      Form  Z_FIELDCAT
*&---------------------------------------------------------------------*
" Por melhores praticas eu criei um form pra trata com o fieldcat que significa
" catalogo de campos,
FORM z_fieldcat .
  " Este perfome alimenta a tabela que será utilizada na função que cria um ALV
  " pois na função eh necessário informar os campos é suas propriedades, entrando
  " no tipo da estrutura e da tabela di fieldcat vc verá o tanto de parametros que
  " um campo pode ter .

  " Não lembra muita coisa sobre Perform, clique aki :

  " http://abapjuniores.blogspot.com/2011/04/performs.html

    PERFORM z_feed_fieldcat USING :
      "Fname  Seltext                 check   Edit  Col_pos
      'MATNR' 'Material'              ' '    ' '    0        ,
      'ERSDA' 'Data de criação'       ' '    ' '    1        ,
      'ERNAM' 'Nome do responsável'   ' '    ' '    2        ,
      'PSTAT' 'Status'                ' '    ' '    3        ,
      'MTART' 'Tipo de material'      ' '    ' '    4
              .

ENDFORM.                    " Z_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  Z_FEED_FIELDCAT
*&---------------------------------------------------------------------*
FORM z_feed_fieldcat  USING    fieldname
                               seltext_m
                               checkbox
                               edit
                               col_pos .

  st_fieldcat-fieldname   = fieldname.      " Nome do campo
  st_fieldcat-seltext_m   = seltext_m.      " texto do campo
  st_fieldcat-checkbox    = checkbox.       " se o campo é do tipo CheckBox
  st_fieldcat-edit        = edit.           " se o campo pode ser editavel
  st_fieldcat-col_pos     = col_pos.        "Em que posição fica a coluna
  " Coloca a estrutura alimentada na Tabela.
  APPEND st_fieldcat TO it_fieldcat.
  " Limpa a estrutura e volta pra poxima linha do form.
  CLEAR  st_fieldcat.
ENDFORM.                    " Z_FEED_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  Z_ALV
*&---------------------------------------------------------------------*
form Z_ALV .
"  Aki tah o prato principal deste Post, a function que torna o ALV em
" realidade, como vc pode ver esta function tem muitos parametros de exporting
" cada um com seu objetivo para que o ALV saia bunitinho, eu ia colocar
" um post falando sobre essa function, mas são muitas as propriedades
" entaum vou fazer ao contrário essa, depois que fala sobre cada propriedade
" eu lanço um post sobre esta function com o link explicando cada
" parametro, não sei quando, mais um dia eu termino rsrs.
" Aki eu soh estou preenchendo os parametros minimos pra que a function
" funcione,
" Obs.: se vc naum quiser colocar o field catalog tudo bem mas aih vc vai
" ter que colocar uma estrutura z ou naum no parametro 'I_STRUCTURE_NAME'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
*   I_INTERFACE_CHECK                 = ' '
*   I_BYPASSING_BUFFER                = ' '
*   I_BUFFER_ACTIVE                   = ' '
    i_callback_program                = sy-repid    " Nome do programa
*   i_callback_pf_status_set          = ' '
*   i_callback_user_command           = ' '
*   I_CALLBACK_TOP_OF_PAGE            = ' '
*   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*   I_CALLBACK_HTML_END_OF_LIST       = ' '
*   I_STRUCTURE_NAME                  =
*   I_BACKGROUND_ID                   = ' '
*   I_GRID_TITLE                      =
*   I_GRID_SETTINGS                   =
*   is_layout                         =
    it_fieldcat                       = it_fieldcat " catalogo de campos
*   IT_EXCLUDING                      =
*   IT_SPECIAL_GROUPS                 =
*   IT_SORT                           =
*   IT_FILTER                         =
*   IS_SEL_HIDE                       =
*   I_DEFAULT                         = 'X'
*   i_save                            = 'X'
*   IS_VARIANT                        =
*   IT_EVENTS                         =
*   IT_EVENT_EXIT                     =
*   IS_PRINT                          =
*   IS_REPREP_ID                      =
*   I_SCREEN_START_COLUMN             = 0
*   I_SCREEN_START_LINE               = 0
*   I_SCREEN_END_COLUMN               = 0
*   I_SCREEN_END_LINE                 = 0
*   I_HTML_HEIGHT_TOP                 = 0
*   I_HTML_HEIGHT_END                 = 0
*   IT_ALV_GRAPHICS                   =
*   IT_HYPERLINK                      =
*   IT_ADD_FIELDCAT                   =
*   IT_EXCEPT_QINFO                   =
*   IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER           =
*   ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab                          = it_mara   " Tabela com os dados
   EXCEPTIONS
     program_error                     = 1
     OTHERS                            = 2
            .
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

endform.                    " Z_ALV

' For all Entries in ' Básico

  "  Vamos fazer um select bem simples usando o comando 'for all entries in',
" esse comando é mais usado do que o 'Inner Join' pois é mais claro
" para dar manutenção.

REPORT zselect_data.

" Tabelas transparentes ....
TABLES : mara
  .

" Tipos .....
TYPES :

  BEGIN OF ty_mara,
    matnr TYPE mara-matnr,
    ersda TYPE mara-ersda,
    ernam TYPE mara-ernam,
  END OF   ty_mara,

  BEGIN OF ty_makt,
    matnr TYPE makt-matnr,
    spras TYPE makt-spras,
    maktx TYPE makt-maktx,
  END OF   ty_makt,

  BEGIN OF ty_mard,
    matnr TYPE mard-matnr,
    werks TYPE mard-werks,
    lgort TYPE mard-lgort,
    pstat TYPE mard-pstat,
  END OF   ty_mard,

  BEGIN OF ty_outtab,
    check TYPE c,
    matnr TYPE mara-matnr,
    ersda TYPE mara-matnr,
    maktx TYPE makt-maktx,
    werks TYPE mard-werks,
    lgort TYPE mard-lgort,
    pstat TYPE mard-pstat,
  END OF ty_outtab
       .

" Estruturas ....
DATA : st_mara    TYPE ty_mara,
       st_makt    TYPE ty_makt,
       st_mard    TYPE ty_mard,
       st_outtab  TYPE ty_outtab,
       st_outtab2 TYPE ty_outtab
      .

" Tabelas internas ....
DATA : it_mara    TYPE TABLE OF ty_mara,
       it_makt    TYPE TABLE OF ty_makt,
       it_mard    TYPE TABLE OF ty_mard,
       it_outtab  TYPE TABLE OF ty_outtab,
       it_outtab2 TYPE TABLE OF ty_outtab
      .


" Tela de seleção .....
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS : so_matnr FOR mara-matnr.
PARAMETERS :     p_spras TYPE makt-spras,
                 p_werks TYPE mard-werks,
                 p_lgort TYPE mard-lgort
            .
SELECTION-SCREEN END OF BLOCK b1.

" Start of selection .....

START-OF-SELECTION.

  PERFORM z_select_mara.
  " Confere se retornou dados no select
  IF sy-subrc = 0.
    PERFORM z_select_makt.
    PERFORM z_select_mard.
  ELSE.
    MESSAGE 'Não foi encontrados registro(s) com os dados informados ' TYPE 'I'.
  ENDIF.


  PERFORM : z_feed_table,
            z_show_data.

*&---------------------------------------------------------------------*
*&      Form  Z_SELECT_MARA
*&---------------------------------------------------------------------*
  " Seleciona os dados da tabela MARA e passa os campos selecionados para dentro
  " da tabela interna, tente sempre especificar os campos que vc quer trabalhar
  " para garantir uma performance melhor nunca coloque '*', nunca esqueça tb de
  " colocar os campos na mesma ordem que está na tabela standard e pra melhorar o
  " select tente sempre coloca todas as chaves primarias da tabela.

FORM z_select_mara .
  " pega os campos matnr, ersda e Ernam ...
  SELECT matnr
         ersda
         ernam
" da tabela mara ...
    FROM mara
" e coloca na tabela interna 'it_mara' ....
    INTO TABLE it_mara
" só pegue os 100 primeiros registros
    UP TO 100 ROWS
" a condição eh que soh pegue o registros que contenham no select options.
    WHERE matnr IN so_matnr
    .

ENDFORM.                    " Z_SELECT_MARA

*&---------------------------------------------------------------------*
*&      Form  Z_SELECT_MAKT
*&---------------------------------------------------------------------*
FORM z_select_makt .
  " Seleciona os dados da tabela MAKT e passa os campos selecionados para dentro
  " da tabela interna,
  SELECT  matnr
          spras
          maktx
" da tabela MAKT ...
    FROM makt
" e coloca na tabela interna 'it_makt' ....
    INTO TABLE it_makt
" para todas as entradas da tabela 'it_mara' (que jah esta preenchida)
    FOR ALL ENTRIES IN it_mara
" com estas condições, lembrando que tem que relacionar as tabelas nas condições
    WHERE matnr = it_mara-matnr
    AND   spras = p_spras
    .

ENDFORM.                    " Z_SELECT_MAKT

*&---------------------------------------------------------------------*
*&      Form  Z_SELECT_MARD
*&---------------------------------------------------------------------*
FORM z_select_mard .
  " faz o mesmo que o select de cima. rsrs
  SELECT  matnr
          werks
          lgort
          pstat
    FROM mard
    INTO TABLE it_mard
    FOR ALL ENTRIES IN it_mara
    WHERE matnr = it_mara-matnr
    AND   werks = p_werks
    AND   lgort = p_lgort
    .

ENDFORM.                    " Z_SELECT_MARD

*&---------------------------------------------------------------------*
*&      Form  Z_feed_table
*&---------------------------------------------------------------------*
FORM z_feed_table .
  " Esse loop eh muito importante, debbungando vc verá que ele pega
  " o primeiro registro e joga na estrutura...
  LOOP AT it_mara INTO st_mara.
    " depois lê as tabelas jogando pra um estrutura tb, se atender as
    " condições
    READ TABLE it_makt INTO st_makt WITH KEY matnr = st_mara-matnr
                                             spras = p_spras.
    READ TABLE it_mard INTO st_mard WITH KEY matnr = st_mara-matnr
                                             werks = p_werks
                                             lgort = p_lgort .
    " Aki é alimentado a estrutura com os valores que foram solicitados,
    st_outtab-check = space.
    st_outtab-matnr = st_mara-matnr.
    st_outtab-ersda = st_mara-ersda.
    st_outtab-maktx = st_makt-maktx.
    st_outtab-werks = st_mard-werks.
    st_outtab-lgort = st_mard-lgort.
    st_outtab-pstat = st_mard-pstat.
    " depois da estrutura devidamente preenchida este registro eh colocado
    " numa tabela de saida que poderá ser usado para preencher Relatório ALV
    APPEND st_outtab TO it_outtab.
    " Limpa a estrutura pra naum leva sujeira e começa o Loop tudo denovo.
    CLEAR : st_outtab.
  ENDLOOP.
ENDFORM.                    " Z_feed_table

*&---------------------------------------------------------------------*
*&      Form  Z_SHOW_DATA
*&---------------------------------------------------------------------*
FORM z_show_data .
  " Mostra os dados da tabela de saida
  LOOP AT it_outtab INTO st_outtab.

    WRITE : / st_outtab.

  ENDLOOP.

ENDFORM.                    " Z_SHOW_DATA

terça-feira, 28 de junho de 2011

Tudo ou nada num Select

"Se usar um parameters vazio na clausula where de um select, não trará registro, agora se usar um select-options vazio trará todos os registros."

terça-feira, 21 de junho de 2011

Controle de Caracteres

  "  Tentarei mostrar um código muito interessante onde vc consegue
" controlar os caracteres dentro de campos ou variaveis, desmembrando
" caso queira dentro de outras variáveis ou campos de de estruturas
" ou tabelas.
"  Debuggem, coloquem contadores em lugares diferentes e ve oq acontece
" mexam nisso pois com certeza um dia isso irá te ajudar.
*&---------------------------------------------------------------------*

REPORT  zmj_crtl_caract.

" Variáveis .....
DATA : vg_text TYPE string,
       vg_qtde TYPE i.

" Tela de seleção ...
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.
PARAMETERS:
         p_text  TYPE string OBLIGATORY,  " Texto ( Texto : ).
         p_value TYPE c
          .

SELECTION-SCREEN END OF BLOCK b01.

" Inicio da seleção ...

START-OF-SELECTION.

"  Aqui eu alimento uma variável com a quantidade de caracter do
" parameters que o usuário informado.
vg_qtde = strlen( p_text ).

  PERFORM : z_tira_carac,
            z_leitura_especif
           .

*&---------------------------------------------------------------------*
*&      Form  z_tira_carac
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM z_tira_carac .
"  Joga o texto informado pelo usuário pra dentro de uma variável
" para que vc possa trabalha deboua com a informação.
  vg_text = p_text.

  " Tira os 3 primeiros caracteres da variavel.
  DO 3 TIMES.
    SHIFT vg_text.
  ENDDO.

  WRITE : 'O texto sem os 3 primeiros digitos é : ', vg_text .

ENDFORM.                    " z_tira_carac

*&---------------------------------------------------------------------*
*&      Form  Z_LEITURA_ESPECIF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form Z_LEITURA_ESPECIF .

vg_text = p_text.

" Variáveis locais tarbalhando como contadores.
data : vl_cont TYPE i VALUE '1',
       vl_posi TYPE i
       .

DO vg_qtde TIMES.
    " verifica se primeiro caracter do texto e diferente do caracter informado
    IF vg_text(1ne p_value.
      " Anda um caracter e joga ele no final da string pois eh 'CIRCULAR'.
      shift vg_text CIRCULAR.
      add 1 to vl_cont.
    ENDIF.

ENDDO.

IF vl_cont >= vg_qtde.
  write : /, 'O caracter ', p_value,' Não foi encontrado no texto ', p_text, ' .'.
ELSE.
  write : /, 'O caracter ', p_value,' está na posição ', vl_cont, ' .'.
ENDIF.
  WRITE : /,'O texto com "Shift Circular" fica assim a',
          /,' partir do caracter selecionado : ', vg_text ,' .'.

endform.                    " Z_LEITURA_ESPECIF

segunda-feira, 13 de junho de 2011

Elementos de Texto


  "  Colocar textos na tela é muito importante pois será onde acontece
" a interação como usuário, deixar de forma explicita oq cada campo
" significa é muito importante para que não cause retrabalho pq o
" usuário não sabe aonde imputa as informações rsrsrs, é facil mas as
" vezes a gente esquece mesmo, 'a gente' eu neh.
" Caminho: 'Ir Para / Elemento de texto'






REPORT zmj_textos_tela.

TABLES : mara
        .

" No select-screen nos usamos o 'Textos de Seleção'





" O legal deste aih é que se vc tiver com preguiça vc pode 'ligar'
" com o campo da tabela que o objeto da tela de seleção se referencia,
" agora se tem que coloca um texto a mais ou como na maioria das vezes
" colocar ':' rsrsrs, aih eh soh digitar.

SELECTION-SCREENBEGIN OF BLOCK bl1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS : s_matnr FOR  mara-matnr OBLIGATORY
              .

PARAMETERS     : p_ersda TYPE mara-ersda,
                 p_ernam TYPE mara-ernam,
                 p_meins TYPE mara-meins
              .

SELECTION-SCREENEND OF BLOCK bl1.

" Write
*WRITE : / 'Material :'           , s_matnr ,
*        / 'Data de criação :'    , p_ersda ,
*        / 'Nome do responsável :', p_ernam ,
*        / 'Unidade :'            , p_meins
*        .
"  Aqui no 'Write' do programa estamos usando 'HardCode', mas está ERRADO
" pra efeito de Tradução sempre faça em elemento de texto, conforme ABAIXO,
" depois de escrever 'text-001' clique duas vezes encima e o SAP informa que
" não existe e se vc deseja criar, claro que vc deseja criar , aih vc vai
" para o 'Simbolo de texto'





.
WRITE : / text-001 , s_matnr ,  "' Material :'
        / text-002 , p_ersda ,  "' Data de criação :'
        / text-003 , p_ernam ,  "' Nome do responsável :'
        / text-004 , p_meins    "' Unidade :'
        .

"  Se vcs perceberem tem ainda uma 3º Abinha, chamada titulos de Lista lista
" e como se fosse um cabeçalho do Write, mas por favor pesoal nunca usem isso,
" é muito ruim de dar manutenção .




"  Agora visualizem o retorno e testem de outras formas... t+

segunda-feira, 6 de junho de 2011

Chegar na linha mais rápido

" Apertais Crtl+O e digite o numero da linha desejada, atalho muito interessante rsrsrs"