depth1

SEARCH_FIELD_CONTENT

Oct 4th, 2019
1,313
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *&---------------------------------------------------------------------*
  2. *& Report ZSEARCH_FIELD_CONTENT
  3. *&---------------------------------------------------------------------*
  4. *& Recherche du contenu dans les tables.
  5. *& Tables transparentes et actives.
  6. *& Wildcards ABAP autorisés.
  7. *&---------------------------------------------------------------------*
  8. report zsearch_field_content.
  9. *----------------------------------------------------------------------*
  10. * DEFINITION
  11. *----------------------------------------------------------------------*
  12.  
  13. DATA:
  14.   table type tabname,
  15.   type  type datatype_d,
  16.   text  type char512.
  17.  
  18. *----------------------------------------------*
  19. * Classe principale contenant des methodes
  20. * statiques permettant de faire ce que le
  21. * programme est destiné à faire.
  22. *----------------------------------------------*
  23. class main definition.
  24.   public section.
  25.     types:
  26.       tr_tabname type range of tabname,
  27.       tr_type    type range of datatype_d,
  28.       ts_type_r  type line of tr_type,
  29.       tr_text    type range of char512.
  30.  
  31.     types:
  32.       begin of ts_fieldinfo,
  33.         tabname   type tabname,
  34.         fieldname type fieldname,
  35.         datatype  type datatype_d,
  36.       end of ts_fieldinfo,
  37.       tt_fieldinfo type standard table of ts_fieldinfo.
  38.  
  39.     constants:
  40.       infinite                  type i VALUE 9999999,
  41.       fieldinfo_package_size    type i value 10000, " TODO move
  42.       fieldcontent_package_size type i value 10000. " TODO move
  43.  
  44. *----------------------------------------------*
  45. * Recherche les données présentes dans
  46. * text_range dans les zones des tables
  47. * présentes dans table_range ayant une longeur
  48. * compris entre min_length et max_length inclus.
  49. *----------------------------------------------*
  50.     class-methods search
  51.       importing
  52.         table_range type tr_tabname
  53.         type_range  type tr_type
  54.         text_range  type tr_text.
  55.  
  56. *----------------------------------------------*
  57. * Traite les résultat trouvé par la méthode
  58. * search.
  59. * Les résultats sont reçu unitairement.
  60. *----------------------------------------------*
  61.     class-methods search_result
  62.       importing
  63.         tabname      type tabname
  64.         fieldname    type fieldname
  65.         fieldcontent type string.
  66.  
  67. endclass.
  68.  
  69. *----------------------------------------------------------------------*
  70. * SELECTION-SCREEN
  71. *----------------------------------------------------------------------*
  72. select-options s_table for table.
  73. select-options s_type  for type.
  74. select-options s_text  for text.
  75. " p_len TYPE i Longeur minimale de la donnée recherchée
  76. " s_tbl TYPE RANGE OF tabname Tables sur lesquelles rechercher
  77. " s_txt TYPE RANGE OF string Textes à trouver (>= p_len contrôle à faire)
  78.  
  79. *----------------------------------------------------------------------*
  80. * IMPLEMENTATION
  81. *----------------------------------------------------------------------*
  82. class main implementation.
  83.   method search.
  84.  
  85.     data:
  86.       illegal_where_datatype_range type tr_type,
  87.       type_r                       type ts_type_r.
  88.  
  89.     data:
  90.       string_buffer    type string.
  91.  
  92.     data:
  93.       field_min_length type i VALUE infinite.
  94.  
  95.     data:
  96.       fieldinfo_cursor type cursor,
  97.       fieldinfo_list   type tt_fieldinfo.
  98.  
  99.     data:
  100.       fieldcontent_cursor type cursor,
  101.       fieldcontent        type string.
  102.  
  103.     data:
  104.       select type string,
  105.       where  type string,
  106.       illegal_datatype_flag TYPE flag.
  107.  
  108.     data:
  109.       tableref type ref to data.
  110.  
  111.     field-symbols:
  112.       <table> type table.
  113.  
  114.     " Alimentation des datatype exclu pour la clause where
  115.     type_r = 'IEQLCHR'. APPEND type_r TO illegal_where_datatype_range.
  116.     type_r = 'IEQLRAW'. APPEND type_r TO illegal_where_datatype_range.
  117.     type_r = 'IEQRAW'.  APPEND type_r TO illegal_where_datatype_range.
  118.     type_r = 'IEQRSTR'. APPEND type_r TO illegal_where_datatype_range.
  119.     type_r = 'IEQSSTR'. APPEND type_r TO illegal_where_datatype_range.
  120.     type_r = 'IEQSTRG'. APPEND type_r TO illegal_where_datatype_range.
  121.  
  122.     " Calcul de la longeur minimale d'une zone à contrôler (en fonctioner des textes requété).
  123.     LOOP AT text_range INTO data(txt).
  124.       IF txt-low IS NOT INITIAL.
  125.         REPLACE ALL OCCURRENCES OF '*+' IN txt-low WITH ''.
  126.  
  127.         IF strlen( txt-low ) < field_min_length.
  128.           field_min_length = strlen( txt-low ).
  129.         ENDIF.
  130.       ENDIF.
  131.  
  132.       IF txt-high IS NOT INITIAL.
  133.         REPLACE ALL OCCURRENCES OF '*+' IN txt-high WITH ''.
  134.  
  135.         IF strlen( txt-high ) < field_min_length.
  136.           field_min_length = strlen( txt-high ).
  137.         ENDIF.
  138.       ENDIF.
  139.     ENDLOOP.
  140.     IF field_min_length EQ infinite.
  141.       CLEAR field_min_length.
  142.     ENDIF.
  143.  
  144.     " Sélection des zones candidates
  145.     open cursor fieldinfo_cursor
  146.       for
  147.         select dd03l~tabname dd03l~fieldname dd03l~datatype
  148.           from dd03l as dd03l
  149.           join
  150.             dd02l as dd02l on dd02l~tabname = dd03l~tabname
  151.           where
  152.             dd02l~tabclass = 'TRANSP'     and " Tables transparentes
  153.             dd02l~as4local = 'A'          and " Active
  154.             dd02l~is_gtt   = ' '          and " Non temporaire globale
  155.             dd03l~tabname in table_range  and
  156.             dd03l~datatype  in type_range and
  157.  
  158.             dd03l~intlen >= field_min_length.
  159.  
  160.     while fieldinfo_cursor is not initial.
  161.       fetch next cursor fieldinfo_cursor into table fieldinfo_list package size fieldinfo_package_size.
  162.  
  163.       if sy-subrc <> 0.
  164.         close cursor fieldinfo_cursor.
  165.         continue.
  166.       endif.
  167.  
  168.       " Aggregation des zones par tables
  169.       loop at fieldinfo_list into data(fieldinfo) group by fieldinfo-tabname.
  170.  
  171.         " Construction des champs de la table à sélectionner
  172.         " et de la condition de sélection (select, where)
  173.         clear:
  174.           select,
  175.           where,
  176.           illegal_datatype_flag.
  177.  
  178.         loop at group fieldinfo into data(d).
  179.           select = |{ select } { d-fieldname }|.
  180.  
  181.           " Exclusion des champs interdit dans les clauses where !
  182.           if d-datatype IN illegal_where_datatype_range AND illegal_datatype_flag EQ abap_false.
  183.             illegal_datatype_flag = abap_true.
  184.           ENDIF.
  185.  
  186.           if where IS NOT INITIAL.
  187.             where = |{  where } OR |.
  188.           endif.
  189.           where = |{ where } { d-fieldname }|.
  190.           where = |{ where } IN text_range |.
  191.         endloop.
  192.  
  193.         " Dans ce cas on ne met aucune clause where !
  194.         IF illegal_datatype_flag EQ abap_true.
  195.           CLEAR where.
  196.         ENDIF.
  197.  
  198.         " Création de la table interne au type de la table à
  199.         " sélectionner
  200.         create data tableref type table of (fieldinfo-tabname).
  201.         assign tableref->* to <table>.
  202.  
  203.         " Selection des données dans la table
  204.         open cursor fieldcontent_cursor
  205.           for
  206.              select (select)
  207.              from (fieldinfo-tabname)
  208.              where (where).
  209.  
  210.         while fieldcontent_cursor is not initial.
  211.           fetch next cursor fieldcontent_cursor into corresponding fields of table <table> package size fieldcontent_package_size.
  212.  
  213.           if sy-subrc <> 0.
  214.             close cursor fieldcontent_cursor.
  215.             continue.
  216.           endif.
  217.  
  218.           " Ajout des données à la restitution.
  219.           loop at <table> assigning field-symbol(<struct>).
  220.             " On re-regarde nos champs qu'on a sélectionné
  221.             loop at group fieldinfo into d.
  222.               assign component d-fieldname of structure <struct> to field-symbol(<field>).
  223.               if sy-subrc eq 0.
  224.                 fieldcontent = |{ <field> }|.
  225.  
  226.                 IF fieldcontent IN text_range.
  227.                   search_result( tabname = d-tabname fieldname = d-fieldname fieldcontent = fieldcontent ).
  228.                 ENDIF.
  229.               endif.
  230.             endloop.
  231.           endloop.
  232.         endwhile.
  233.       endloop.
  234.     endwhile.
  235.   endmethod.
  236.  
  237.   method search_result.
  238.     write at 01(30) tabname.
  239.     write at 31(30) fieldname.
  240.     write at 62 fieldcontent.
  241.     new-line.
  242.   endmethod.
  243. endclass.
  244.  
  245. *----------------------------------------------------------------------*
  246. * START-OF-SELECTION
  247. *----------------------------------------------------------------------*
  248. start-of-selection.
  249.   main=>search(
  250.       table_range = s_table[]
  251.       type_range  = s_type[]
  252.       text_range  = s_text[]
  253.   ).
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×