quarta-feira, 12 de junho de 2013

Log de Modificações - CDHDR e CDPOS

*  Eae Pessoal, trabalhamos de corpo e alma num projeto quando estamos
* no começo, mas ABAP Junior é como um Estagiário no mundo SAP, portanto
* sempre haverá uns caras que vão falar que você fez merda, como apagar
* dados da 'MARA' ou usou alguma transação de forma errada onde acabou
* Modificando alguns dados mestres, mas pra vocês não ficarem a merce
* desses Bullings estou postando esse programa que mostra todas as
* modificações conforme o user, agora na próxima vez você executa esse
* programinha e isso retorna o log de modificações provando sua inocência.

*  O problema é que só será gravado os logs das tabelas que tiverem
* um 'flag' para registrar isso, para verificar se a tabela cria log de
* modificações é só entrar nele clicar no Botão 'Configurações técnicas'
* e olhar na ultima linha da tela que vão ver o Flag lá.




*&---------------------------------------------------------------------*
REPORT cdhdr_cdpos.

TYPE-POOLS :
  slis.

TYPES:
  
BEGIN OF ty_out,
    objectclas 
TYPE cdhdr-objectclas,
    objectid   
TYPE cdhdr-objectid,
    changenr   
TYPE cdhdr-changenr,
    username   
TYPE cdhdr-username,
    udate      
TYPE cdhdr-udate,
    utime      
TYPE cdhdr-utime,
    tcode      
TYPE cdhdr-tcode,
    tabname    
TYPE cdpos-tabname,
    tabkey     
TYPE cdpos-tabkey,
    fname      
TYPE cdpos-fname,
    chngind    
TYPE cdpos-chngind,
    text_case  
TYPE cdpos-text_case,
    unit_old   
TYPE cdpos-unit_old,
    unit_new   
TYPE cdpos-unit_new,
    cuky_old   
TYPE cdpos-cuky_old,
    cuky_new   
TYPE cdpos-cuky_new,
    value_new  
TYPE cdpos-value_new,
    value_old  
TYPE cdpos-value_old,
  
END OF   ty_out
  .

DATA :
  it_cdhdr  
TYPE TABLE OF cdhdr,
  st_cdhdr  
TYPE cdhdr,
  it_cdpos  
TYPE TABLE OF cdpos,
  st_cdpos  
TYPE cdpos,
  it_out    
TYPE TABLE OF ty_out,
  st_out    
TYPE ty_out,
  st_layout 
TYPE slis_layout_alv,
  it_fcat   
TYPE TABLE OF slis_fieldcat_alv,
  st_fcat   
TYPE slis_fieldcat_alv.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECT-OPTIONS :
  s_user 
FOR sy-uname.
SELECTION-
SCREEN END OF BLOCK   b1.

START-
OF-SELECTION.

  
PERFORM : z_selects,
            z_trata_dados,
            z_alv.

*&---------------------------------------------------------------------*
*&      Form  Z_SELECTS
*&---------------------------------------------------------------------*
FORM z_selects .

  
SELECT *
    
FROM cdhdr
    
INTO TABLE it_cdhdr
    
WHERE username IN s_user.

  
IF sy-subrc IS INITIAL.
    
SELECT *
      
FROM cdpos
      
INTO TABLE it_cdpos
      
FOR ALL ENTRIES IN it_cdhdr
      
WHERE objectclas = it_cdhdr-objectclas
        
AND objectid   = it_cdhdr-objectid
        
AND changenr   = it_cdhdr-changenr
        .
  
ENDIF.

ENDFORM.                    " Z_SELECTS

*&---------------------------------------------------------------------*
*&      Form  Z_ALV
*&---------------------------------------------------------------------*
FORM z_alv .

  
PERFORM z_fieldcat USING :
  
'OBJECTCLAS' 'CDHDR' 'Classe de objetos'                   ' '  ' '  1  ,
  
'OBJECTID'   'CDHDR' 'Valor do objeto'                     ' '  ' '  2  ,
  
'CHANGENR'   'CDHDR' 'Nº modificação do documento'         ' '  ' '  3  ,
  
'USERNAME'   'CDHDR' 'Nome usuário'                        ' '  ' '  4  ,
  
'UDATE'      'CDHDR' 'Data da modificação'                 ' '  ' '  5  ,
  
'UTIME'      'CDHDR' 'Hora da modificação'                 ' '  ' '  6  ,
  
'TCODE'      'CDHDR' 'Transação'                           ' '  ' '  7  ,
  
'TABNAME'    'CDPOS' 'Nome da tabela'                      ' '  ' '  8  ,
  
'TABKEY'     'CDPOS' 'Chave da linha de tabela modificada' ' '  ' '  9  ,
  
'FNAME'      'CDPOS' 'Nome do campo'                       ' '  ' '  10 ,
  
'CHNGIND'    'CDPOS' 'Tipo da modificação (U, I, E, D)'    ' '  ' '  11 ,
  
'TEXT_CASE'  'CDPOS' 'Código: X = modificação de texto'    ' '  ' '  12 ,
  
'UNIT_OLD'   'CDPOS' 'Unidade antiga'                      ' '  ' '  13 ,
  
'UNIT_NEW'   'CDPOS' 'Unidade Nova'                        ' '  ' '  14 ,
  
'CUKY_OLD'   'CDPOS' 'Moeda Antiga'                        ' '  ' '  15 ,
  
'CUKY_NEW'   'CDPOS' 'Moeda Nova'                          ' '  ' '  16 ,
  
'VALUE_NEW'  'CDPOS' 'Valor Novo'                          ' '  ' '  17 ,
  
'VALUE_OLD'  'CDPOS' 'valor Antigo'                        ' '  ' '  18
        .

st_layout-zebra = 'X'.
  st_layout-colwidth_optimize = 
'X'.

  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
*   I_INTERFACE_CHECK                 = ' '
*   I_BYPASSING_BUFFER                = ' '
*   I_BUFFER_ACTIVE                   = ' '
     i_callback_program                = sy-repid
*   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                  = 'CDPOS'
*   I_BACKGROUND_ID                   = ' '
*   I_GRID_TITLE                      =
*   I_GRID_SETTINGS                   =
     is_layout                         = st_layout
     it_fieldcat                       = it_fcat
*   IT_EXCLUDING                      =
*   IT_SPECIAL_GROUPS                 =
*   IT_SORT                           =
*   IT_FILTER                         =
*   IS_SEL_HIDE                       =
*   I_DEFAULT                         = 'X'
*   I_SAVE                            = ' '
*   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
*   IT_ALV_GRAPHICS                   =
*   IT_HYPERLINK                      =
*   IT_ADD_FIELDCAT                   =
*   IT_EXCEPT_QINFO                   =
*   I_HTML_HEIGHT_TOP                 =
*   I_HTML_HEIGHT_END                 =
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER           =
*   ES_EXIT_CAUSED_BY_USER            =
    
TABLES
      t_outtab                          = it_out
   
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

*&---------------------------------------------------------------------*
*&      Form  Z_TRATA_DADOS
*&---------------------------------------------------------------------*
FORM z_trata_dados .

  
LOOP AT it_cdpos INTO st_cdpos.

    st_out-objectclas = st_cdpos-objectclas.
    st_out-objectid   = st_cdpos-objectid.
    st_out-changenr   = st_cdpos-changenr.
    st_out-tabname    = st_cdpos-tabname.
    st_out-tabkey     = st_cdpos-tabkey.
    st_out-fname      = st_cdpos-fname.
    st_out-chngind    = st_cdpos-chngind.
    st_out-text_case  = st_cdpos-text_case.
    st_out-unit_old   = st_cdpos-unit_old.
    st_out-unit_new   = st_cdpos-unit_new.
    st_out-cuky_old   = st_cdpos-cuky_old.
    st_out-cuky_new   = st_cdpos-cuky_new.
    st_out-value_new  = st_cdpos-value_new.
    st_out-value_old  = st_cdpos-value_old.

    
READ TABLE it_cdhdr INTO st_cdhdr
      
WITH KEY objectclas = st_cdpos-objectclas
               objectid   = st_cdpos-objectid
               changenr   = st_cdpos-changenr.

    
IF sy-subrc IS INITIAL.
      st_out-username =  st_cdhdr-username.
      st_out-udate    =  st_cdhdr-udate.
      st_out-utime    =  st_cdhdr-utime.
      st_out-tcode    =  st_cdhdr-tcode.
      
APPEND st_out TO it_out.
    
ENDIF.

    
CLEAR st_out.
  
ENDLOOP.

  BREAK-POINT.

ENDFORM.                    " Z_TRATA_DADOS


*&---------------------------------------------------------------------*
*&      Form  Z_FIELDCAT
*&---------------------------------------------------------------------*
FORM z_fieldcat USING fieldname
                      TAB
                      seltext_m
                      
checkbox
                      
edit
                      col_pos .

  st_fcat-fieldname   = fieldname.      
" Nome do campo
  st_fcat-tabname     = tab.
  st_fcat-seltext_m   = seltext_m.      
" texto do campo
  st_fcat-
checkbox    = checkbox.       " se o campo é do tipo CheckBox
  st_fcat-
edit        = edit.           " se o campo pode ser editavel
  st_fcat-col_pos     = col_pos.        "Em que posição fica a coluna

  
APPEND st_fcat TO it_fcat.
  
CLEAR  st_fcat.

ENDFORM.                    " Z_FIELDCAT

7 comentários:

  1. Bom dia.
    Seria interessante ter mais opcoes na tela de seleção.
    Tabela, data de modificação e transação.

    Também foi feito um report pela SAP que faz isso.
    RSSCD200

    Abraço.

    Marcos.

    ResponderExcluir
  2. Mais opções seria melhor sim, mas dá pra brincar, mas pelo que vi o programa RSSCD200 resolve a maioria desses problemas rsrs, Valeo Pela Informação Marcos

    ResponderExcluir
  3. Olá Mauro, estou começando neste mundo ABAP agora e seu blog esta me ajudando muito.

    ResponderExcluir
  4. bom dia! além das tabelas CDHDR e CDPOS, qual tabela guarda o conteúdo anterior, autal e usuário que alterou a tabela?

    ResponderExcluir
  5. não precisam responder a pergunta acima, já identifiquei os campos, obrigado!

    ResponderExcluir
  6. Transação SCU3 - Analise de logs de modificação - Comparei o retorno e o esforço, com a SCU3 retorna os dados de criação, eliminação e modificação , com data, hora, usuário, transação, programa e os dados

    ResponderExcluir