1. *--[
  2. *--[ El patrón se crea en la SE38 -> Utilidades, una vez que se le da el nombre
  3. *--[ Se mete directamente este código como línea única: *$&$MUSTER
  4. *--[
  5. *--[ Luego debe crearse una función con el nombre del patrón terminada en:
  6. *--[  _EDITOR_EXIT
  7. *--[
  8. *--[ La función a crear debe ser de este TIPO
  9. FUNCTION [NOMBRE_PATRON]_EDITOR_EXIT.
  10. *"----------------------------------------------------------------------
  11. *"*"Interfase local
  12. *"  TABLES
  13. *"      BUFFER TYPE  RSWSOURCET
  14. *"  EXCEPTIONS
  15. *"      CANCELLED
  16. *"----------------------------------------------------------------------
  17.  
  18. CONSTANTS: c_importing TYPE i VALUE 1,
  19.            c_exporting TYPE i VALUE 2,
  20.            c_changing  TYPE i VALUE 3,
  21.            c_tables    TYPE i VALUE 4,
  22.            c_raise     TYPE i VALUE 5,
  23.            c_call      TYPE i VALUE 0,
  24.            c_end       TYPE i VALUE 99,
  25.            c_tabs      TYPE c LENGTH 30 VALUE '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'.
  26.  
  27. TYPES: BEGIN OF ty_out,
  28.          ord  TYPE i,
  29.          pos  TYPE i,
  30.          line TYPE string,
  31.        END OF ty_out.
  32. DATA: t_out  TYPE STANDARD TABLE OF ty_out,
  33.       l_out  TYPE ty_out.
  34.  
  35. data: field type DYNPREAD-FIELDNAME.
  36.  
  37. *  CALL FUNCTION 'RS_HELP_HANDLING'
  38. *       EXPORTING
  39. *            DYNPFIELD                 = FIELD
  40. *            DYNPNAME                  = SY-DYNNR
  41. *            OBJECT                    = 'FB'
  42. *            PROGNAME                  = 'SAPLSFUNCTION_BUILDER'
  43. *            SUPPRESS_SELECTION_SCREEN = 'X'.
  44.   DATA:
  45.     fieldtab       TYPE STANDARD TABLE OF dynpread WITH HEADER LINE.
  46.  
  47.     fieldtab-fieldname = 'RS38L-NAME'.
  48.   APPEND fieldtab.
  49.     PERFORM call_f4
  50.      in program SAPLSEUH
  51.                 TABLES fieldtab
  52.                     USING 'FB'
  53.                           ''
  54.                           'X'
  55.                           ''.
  56. read table fieldtab into data(l_tab) index 1.
  57. IF sy-subrc = 0 AND NOT l_tab-FIELDVALUE IS INITIAL.
  58.  
  59.   DATA(l_func) = l_tab-FIELDVALUE.
  60.  
  61.   SELECT * FROM fupararef INTO TABLE @DATA(t_func)
  62.     WHERE funcname = @l_func.
  63.  
  64.   LOOP AT t_func INTO DATA(X_func).
  65.     AT FIRST.
  66.       l_out-ord = c_call.
  67.       l_out-pos = 99.
  68.       l_out-line = 'CALL FUNCTION ''' && l_func && ''''.
  69.       TRANSLATE l_out-line USING '~ '. APPEND l_out TO t_out.
  70.     ENDAT.
  71.     CLEAR l_out.
  72.     CASE x_func-paramtype.
  73.  
  74.       WHEN 'I' OR 'E' OR 'C' OR 'T'.
  75.  
  76.         CASE x_func-paramtype.
  77.           WHEN 'I'.
  78.             DATA(lc_orden) = c_importing.
  79.             DATA(lc_tit) = 'EXPORTING'.
  80.             DATA(lc_prevar) = 'LF_I_'.
  81.             DATA(lc_posvar) = ''.
  82.           WHEN 'E'.
  83.             lc_orden = c_exporting.
  84.             lc_tit = 'IMPORTING'.
  85.             lc_prevar = 'LF_E_'.
  86.             lc_posvar = ''.
  87.           WHEN 'C'.
  88.             lc_orden = c_changing.
  89.             lc_tit = 'CHANGING'.
  90.             lc_prevar = 'LF_C_'.
  91.             lc_posvar = ''.
  92.           WHEN 'T'.
  93.             lc_orden = c_tables.
  94.             lc_tit = 'TABLES'.
  95.             lc_prevar = 'LF_C_'.
  96.             lc_posvar = '~STANDARD~TABLE~ OF~'.
  97.         ENDCASE.
  98.  
  99.  
  100.         l_out-ord = lc_orden. l_out-pos = 0. l_out-line = '~~' && lc_tit.
  101.         TRANSLATE l_out-line USING '~ '. APPEND l_out TO t_out.
  102.  
  103.         l_out-ord = lc_orden.
  104.         l_out-pos = X_func-pposition.
  105.         l_out-line = '[[~]] 22 julio 2021 a las 01h41' && X_func-parameter && '~=~' && lc_prevar && X_func-parameter.
  106.         IF NOT X_func-optional IS INITIAL.
  107.           l_out-line = l_out-line && ' "Opcional'.
  108.         ENDIF.
  109.         TRANSLATE l_out-line USING '~ '. APPEND l_out TO t_out.
  110.  
  111.         l_out-ord = 0.
  112.         l_out-pos = 1.
  113.         IF x_func-structure IS INITIAL.
  114.           x_func-structure = 'C'.
  115.         ENDIF.
  116.  
  117.         l_out-line = 'DATA:~' && lc_prevar && X_func-parameter && '~TYPE~' && lc_posvar && x_func-structure && '.'.
  118.         TRANSLATE l_out-line USING '~ '. APPEND l_out TO t_out.
  119.       WHEN 'X'.
  120.         lc_orden = c_raise.
  121.         lc_tit = 'EXCEPTIONS'.
  122.         lc_prevar = ''.
  123.         lc_posvar = ''.
  124.         l_out-ord = lc_orden. l_out-pos = 0. l_out-line = '~~' && lc_tit.
  125.         TRANSLATE l_out-line USING '~ '. APPEND l_out TO t_out.
  126.  
  127.         l_out-ord = lc_orden.
  128.         l_out-pos = X_func-pposition.
  129.         l_out-line = '[[~]] 22 julio 2021 a las 01h41' && X_func-parameter && '~=~' && X_func-pposition.
  130.         TRANSLATE l_out-line USING '~ '. APPEND l_out TO t_out.
  131.         l_out-pos = 999.
  132.         l_out-line = '[[~]] 22 julio 2021 a las 01h41others~~=~99.'.
  133.         TRANSLATE l_out-line USING '~ '. APPEND l_out TO t_out.
  134.     ENDCASE.
  135.     AT LAST.
  136.       l_out-ord = c_end.
  137.       l_out-pos = 1. l_out-line = '.'. APPEND l_out TO t_out.
  138.  
  139.       l_out-pos = l_out-pos + 1.
  140.       l_out-line = 'if sy-subrc eq 0.'. APPEND l_out TO t_out.
  141.  
  142.       l_out-pos = l_out-pos + 1.
  143.       l_out-line = ' '. APPEND l_out TO t_out.
  144.  
  145.       l_out-pos = l_out-pos + 1.
  146.       l_out-line = 'else.'. APPEND l_out TO t_out.
  147.  
  148.       l_out-pos = l_out-pos + 1.
  149.       l_out-line = ' '. APPEND l_out TO t_out.
  150.  
  151.  
  152.       l_out-pos = l_out-pos + 1.
  153.       l_out-line = 'endif.'. APPEND l_out TO t_out.
  154.  
  155.       SORT t_out BY ord ASCENDING pos ASCENDING.
  156.       DELETE ADJACENT DUPLICATES FROM t_out.
  157.  
  158. *--[ Tabulamos iguales.
  159.       CLEAR lc_orden.
  160.       LOOP AT t_out INTO l_out WHERE line CP '*=*'.
  161.         FIND '=' IN l_out-line.
  162.         IF sy-fdpos > lc_orden.
  163.           lc_orden = sy-fdpos.
  164.         ENDIF.
  165.       ENDLOOP.
  166.  
  167.       LOOP AT t_out INTO l_out WHERE line CP '*=*'.
  168.         FIND '=' IN l_out-line.
  169.         IF sy-fdpos < lc_orden.
  170.           sy-fdpos = lc_orden - sy-fdpos.
  171.           sy-lisel = c_tabs.
  172.           sy-lisel+sy-fdpos(1) = '='. ADD 1 TO sy-fdpos.
  173.           sy-lisel = sy-lisel+0(sy-fdpos).
  174.           REPLACE '=' IN l_out-line WITH sy-lisel.
  175.           TRANSLATE l_out-line USING '~ '.
  176.         ENDIF.
  177.  
  178.         MODIFY t_out INDEX sy-tabix FROM l_out.
  179.       ENDLOOP.
  180.  
  181.     ENDAT.
  182.  
  183.   ENDLOOP.
  184.  
  185. *--[ Mostramos salida
  186.   LOOP AT t_out INTO l_out.
  187.     append l_out-line to BUFFER.
  188. *    WRITE: / l_out-line.
  189.   ENDLOOP.
  190.  
  191. ENDIF.
  192.  
  193. ENDFUNCTION.