20240203

Programa para pesquisar textos em tabelas

*&---------------------------------------------------------------------*
*& Report Z
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZF NO STANDARD PAGE HEADING LINE-SIZE 1023.

TABLESdd02l.

TYPE-POOLSicon.



typesbegin of ty_tab,
         name     type tabname,
         campo    type tabname,
         record   type sytabix,
         conteudo   type char255,
       end of ty_tab.

datagt_tabelas     type table of ty_tab,
      gt_tab         type table of ty_tab,
      wa_tabelas     type ty_tab.

* Definições
*-------------------------------------------------------------
* Definições: Tabelas, Estruturas e Variáveis
*-------------------------------------------------------------
DATAt_out_tab     TYPE REF TO data.
DATAwa_out_tab  TYPE REF TO data.

FIELD-SYMBOLS<fs_out_tab> TYPE STANDARD TABLE,
               <fsw_out_tab> TYPE any.




Datal_tabname TYPE tabname.




FIELD-SYMBOLS<ft_dyntable> TYPE STANDARD TABLE,
               <fw_dyntable> type any,
               <fw_fldval> TYPE ANY,
               <fw_struct>.
FIELD-SYMBOLS<conteudo>  TYPE ANY.

DATAt_newtable TYPE REF TO data,
      t_newline  TYPE REF TO data,
      t_fldcat   TYPE lvc_t_fcat.


datagt_dd02l  type table of dd02l,
      wa_dd02l  type dd02l.

datadefinition  type table of DD03P,
      wa_def      type DD03P.

datalv_tabname  type DDOBJNAME,
      gotstate LIKE dcobjif-gotstate.

datagv_ini      type syuzeit.
datagv_fim      type syuzeit.


* Tela de seleção
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  select-optionss_table     for dd02l-tabname OBLIGATORY.
  PARAMETERS:     p_txt       type ZDEFI_TXTMIN_50 OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.


* Processamento
START-OF-SELECTION.

  performf_busca_tabelas,
           f_pesquisa_tabelas,
           f_lista_dados.





*&---------------------------------------------------------------------*
*&      Form  F_BUSCA_TABELAS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_BUSCA_TABELAS .

  GET TIME FIELD gv_ini.

  SELECT tabname as4local as4vers tabclass
         FROM dd02l
         INTO table gt_dd02l
         WHERE tabname IN s_table
           AND tabclass <> 'CLUSTER'
           AND tabclass <> 'POOL'
           AND tabclass <> 'VIEW'
           AND as4local 'A'.

  DELETE gt_dd02l where tabclass <> 'TRANSP'.


ENDFORM.




*&---------------------------------------------------------------------*
*&      Form  F_PESQUISA_TABELAS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_PESQUISA_TABELAS .


  datalv_idx        type sytabix.
  datalv_lines      type i.
  datalv_pos        type sytabix.
  datalv_perc       type i.
  datalv_qtd        type p LENGTH 12 DECIMALS 0.

  lv_lines linesgt_dd02l ).

  clear lv_pos.
  LOOP AT gt_dd02l into wa_dd02l.

    add to lv_pos .
    lv_perc lv_pos * 100 / lv_lines.
    perform f_msg_rodape using lv_perc lv_pos lv_lines.

*   Nome da tabela
    l_tabname wa_dd02l-TABNAME.

*   Tabela dinâmica
    CREATE DATA t_out_tab TYPE TABLE OF (l_tabname).
    ASSIGN t_out_tab->TO <fs_out_tab>.

*   Estrutura da tabela dinâmica
    CREATE DATA wa_out_tab TYPE (l_tabname).
    ASSIGN wa_out_tab->TO <fsw_out_tab>.


*   Ignora tabelas com mais de 1 milhão de registros
    clear lv_qtd.
    select count(*)
      from (l_tabname)
      into lv_qtd.
    if lv_qtd > 999999 .
      clear wa_tabelas.
      wa_tabelas-name     l_tabname.
      wa_tabelas-campo    '*'.
      wa_tabelas-conteudo 'Mais de 1Mi Reg.'.
      wa_tabelas-RECORD   '1'.
      append wa_tabelas TO gt_tabelas.
      continue.
    endif.


*   Informa o nme da tabela em processamento no LOG do JOB
    message s398(00with 'Tab.' l_tabname.


*   Seleção de dados
    select *
      from (l_tabname)
      into table <fs_out_tab>.


    lv_tabname l_tabname .

*   busca os campos da tabela
    CALL FUNCTION 'DDIF_TABL_GET'
      EXPORTING
        NAME                lv_tabname
*       STATE               = 'A'
        LANGU               sy-langu
      IMPORTING
        GOTSTATE            gotstate
      TABLES
        DD03P_TAB           definition
      EXCEPTIONS
        ILLEGAL_INPUT       1
        OTHERS              2               .
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.


    clear lv_idx.
    LOOP AT <fs_out_tab> ASSIGNING <fsw_out_tab>.
      lv_idx sy-tabix.

      LOOP AT definition into wa_def.

*       Processa apenas os campos textos com mais de 40 posições
        if wa_def-inttype 'C' and wa_def-intlen >= 40.
          UNASSIGN <conteudo>.
          ASSIGN COMPONENT wa_def-fieldname OF STRUCTURE <fsw_out_tabTO <conteudo>.
          if <conteudo> is ASSIGNED.
            if <conteudo> CS p_txt.
              clear wa_tabelas.
              wa_tabelas-name     l_tabname.
              wa_tabelas-campo    wa_def-fieldname.
              wa_tabelas-conteudo <conteudo>.
              wa_tabelas-RECORD   lv_idx.
              append wa_tabelas TO gt_tabelas.
            endif.
          endif.
        endif.

      ENDLOOP.

    ENDLOOP.

  ENDLOOP.


ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  F_LISTA_DADOS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_LISTA_DADOS .



  if gt_tabelas[] is not initial.

    gt_tab[] gt_tabelas[].
    sort gt_tab by name.
    DELETE ADJACENT DUPLICATES FROM gt_tab COMPARING name.

    GET TIME FIELD gv_fim.

    write:'         Início:'gv_ini.
    write:'            Fim:'gv_fim.
    write:'Texto procurado:'p_txt.
    uline.

    write:'Lista de tabelas identificadas'.
    write:'------------------------------'.

    LOOP AT gt_tab into wa_tabelas.
      write:/10 wa_tabelas-name.
    ENDLOOP.
    uline.

    write:'Dados encontrados'.
    write:'-----------------'.

    LOOP AT gt_tabelas into wa_tabelas.
       write:/ wa_tabelas-NAMEwa_tabelas-CAMPOwa_tabelas-RECORDwa_tabelas-conteudo.
    ENDLOOP.
    uline.


  endif.



ENDFORM.



*&---------------------------------------------------------------------*
*&      Form  F_MSG_RODAPE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_PERC  text
*----------------------------------------------------------------------*
FORM F_MSG_RODAPE  USING    P_PERC  p_pos   p_lin.

  datalv_txt      type LENGTH 50.
  datalv_perc     type i.
  datalv_resto    type i.

  datalv_txt1     type LENGTH 5,
        lv_txt2     type LENGTH 5.

  lv_perc p_perc.

  lv_resto lv_perc mod .
  if lv_resto 0  .
    write lv_perc to lv_txt LEFT-JUSTIFIED.
    write p_pos to lv_txt1 LEFT-JUSTIFIED.
    write p_lin to lv_txt2 LEFT-JUSTIFIED.
    concatenate lv_txt '% processado' '-' lv_txt1 '/' lv_txt2 '-' wa_dd02l-TABNAME
           into lv_txt SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        PERCENTAGE       lv_perc
        TEXT             lv_txt     .   "'% processado'    .

  else.
    exit.

  endif .


ENDFORM.