1. REPORT zxx_prg_workbench.
  2.  
  3. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  4. *--[ Definición de Pantalla
  5. CONSTANTS c_vers TYPE string VALUE 'v1.06'.
  6. *--[ 1.01 - 20230526 Añadido F4 para grabar los que vamos utilizando y hacer búsquedas más rápidas
  7. *--[ 1.02 - 20230529 Corregido varios BUGS: CL_01 y Transación favoritos
  8. *--[ 1.03 - 20230530 Mejorado el filtro de las órdenes para optimizar + rendimiento + REPO Browser
  9. *--[ 1.04 - 20230531 +Cross Reference + Otimizaciones
  10. *--[ 1.05 - 20230601 +Mejoras en LEFT OUTER JOIN + Textos en F4
  11. *--[ 1.06 - 20230613 DUMP en TCODEs inexistentes + Evitar duplicados en TCODES + Nuevas TCODES
  12.  
  13. SELECTION-SCREEN BEGIN OF LINE.
  14.   SELECTION-SCREEN COMMENT 01(10) t01.
  15.   PARAMETERS: p_obj(255) LOWER CASE.
  16.   SELECTION-SCREEN PUSHBUTTON 61(4) t03 USER-COMMAND cros.
  17.   SELECTION-SCREEN PUSHBUTTON 66(12) t02 USER-COMMAND repo.
  18. SELECTION-SCREEN END OF LINE.
  19.  
  20. SELECTION-SCREEN SKIP 1.
  21.  
  22. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-t01.
  23.   PARAMETERS: p_exec TYPE i AS LISTBOX VISIBLE LENGTH 100 USER-COMMAND vlis.
  24.   PARAMETERS: p_FAVs TYPE i AS LISTBOX VISIBLE LENGTH 100 USER-COMMAND vfav.
  25. SELECTION-SCREEN END OF BLOCK b01.
  26.  
  27. SELECTION-SCREEN SKIP 1.
  28.  
  29. PARAMETERS: p_mode AS CHECKBOX DEFAULT abap_true.
  30. PARAMETERS: p_neww AS CHECKBOX DEFAULT abap_true.
  31. PARAMETERS: trkorr AS CHECKBOX DEFAULT abap_false.
  32.  
  33. SELECTION-SCREEN SKIP 1.
  34.  
  35. SELECTION-SCREEN COMMENT /01(40) g_vers.
  36.  
  37. SELECTION-SCREEN FUNCTION KEY 1. "<-- De momento es la única que se utiliza
  38. SELECTION-SCREEN FUNCTION KEY 2.
  39. SELECTION-SCREEN FUNCTION KEY 3.
  40. SELECTION-SCREEN FUNCTION KEY 4.
  41. SELECTION-SCREEN FUNCTION KEY 5.
  42.  
  43. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  44. *--[ Definición de id_classs y variables
  45. TABLES: sscrfields.  "<-- Para los botones en el PF-STATUS
  46. TYPE-POOLS: vrm.     "<-- Para los LISTBOX
  47.  
  48. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  49. *--[ Botones más habituales
  50. CONSTANTS: botones TYPE string VALUE
  51.     'SE11|SE16|SM30|SE38|SE37|SE24|SE18|SE09|SE91|SE93|SM37|SM35|SM50|ST22|SM21|SM12|SU53|SUIM|SU01|ST05|SAT|SXI_MONITOR|SMARTFORMS|SPROXY|CODE_SCANNER'.
  52.  
  53. CLASS CL_Main DEFINITION DEFERRED. "<--- Más abajo
  54.  
  55. TYPES: BEGIN OF ty_id_class,
  56.          id_class(2),   "<-- Será el código de la cláse
  57.          euobj_id    TYPE seu_obj, "<-- Código de Objeto
  58.          objeto(15),   "<--- Será el texto del código de la clase
  59.          nombre(75),   "<--- Obviamente será el nombre del objeto
  60.          descr(100),   "<--- La descripción del objeto
  61.        END OF ty_id_class.
  62.  
  63. TYPES: BEGIN OF ty_tcode, tcode TYPE tstc-tcode, END OF ty_tcode.
  64.  
  65. DATA: list      TYPE vrm_values,
  66.       value     LIKE LINE OF list,
  67.       l_setname TYPE setnamenew,
  68.       t_bots    TYPE STANDARD TABLE OF ty_tcode,
  69.       obj       TYPE REF TO CL_Main.
  70.  
  71. RANGES: r_favs FOR tstc-tcode.
  72. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  73. *--[ Definiciones de Clase
  74. CLASS cl_root DEFINITION ABSTRACT. " Clase Principal
  75.  
  76.   PUBLIC SECTION.
  77.  
  78.     DATA: t_data  TYPE STANDARD TABLE OF ty_id_class,
  79.           p_find  TYPE char255,
  80.           t_bdc   TYPE STANDARD TABLE OF bdcdata,
  81.           G_modo  TYPE sy-ucomm,
  82.           g_neww  TYPE xfeld,
  83.           g_orden TYPE xfeld.
  84.  
  85.     DATA: r_prog   TYPE RANGE OF seodescr,
  86.           r_prog_D TYPE RANGE OF seodescr.
  87.  
  88.     METHODS:
  89.       object_call ABSTRACT IMPORTING p_nombre TYPE any,
  90.       object_cross ABSTRACT IMPORTING p_nombre TYPE any,
  91.       object_call_default IMPORTING p_name TYPE any
  92.                                     p_type TYPE any,
  93.       object_cross_default IMPORTING p_name TYPE any
  94.                                      p_type TYPE any,
  95.       object_save IMPORTING p_name TYPE any,
  96.       object_find.
  97.  
  98. ENDCLASS.
  99.  
  100. CLASS cl_root IMPLEMENTATION.
  101.  
  102.   METHOD object_save.
  103.     DATA: l_leaf  TYPE setleaf,
  104.           l_leafd TYPE setleaf,
  105.           l_leaft TYPE setlinet,
  106.           l_dat   TYPE sy-datum,
  107.           l_datd  TYPE sy-datum.
  108.  
  109.     l_leaf-setname = |ZWB_EXE_{ sy-uname }|.
  110.     SELECT SINGLE lineid INTO @DATA(l_n) FROM setleaf WHERE setname = @l_leaf-setname AND valfrom = @p_name.
  111.     IF sy-subrc EQ 0.
  112.       l_leaf-lineid = l_n .
  113.     ELSE.
  114.       SELECT MAX( lineid ) INTO l_n FROM setleaf WHERE setname = l_leaf-setname.
  115.       l_leaf-lineid = l_n + 1.
  116.     ENDIF.
  117.     l_leaf-setclass = '0000'. "<- NPI
  118.     l_leaf-valsign = 'I'.
  119.     l_leaf-valoption = 'EQ'.
  120.     l_leaf-valfrom = p_name.
  121.     l_leaf-valto   = sy-datum.
  122.     MODIFY setleaf FROM l_leaf.
  123.  
  124.     CLEAR l_leaft.
  125.     MOVE-CORRESPONDING l_leaf TO l_leaft.
  126.     l_leaft-langu = sy-langu.
  127.     l_leaft-descript = me->t_data[ nombre = p_name ]-descr.
  128.     MODIFY setlineT FROM l_leaft.
  129.  
  130.     l_datd = sy-datum - 90. "<-- 90 días de antiguedad
  131. *--[ Esto puede ser lento, pero es la única forma de comparar por fechas
  132. *--[ Borramos los antiguos
  133.     SELECT * FROM setleaf INTO CORRESPONDING FIELDS OF l_leafd WHERE setname = l_leaf-setname.
  134.       l_dat = l_leafd-valto.
  135.       CHECK l_dat < l_datd.
  136.       DELETE FROM setleaf WHERE setclass = l_leafd-setclass
  137.                             AND subclass = l_leafd-subclass
  138.                             AND setname  = l_leafd-setname
  139.                             AND lineid   = l_leafd-lineid.
  140.     ENDSELECT.
  141.   ENDMETHOD.
  142.  
  143.   METHOD object_call_default.
  144.     DATA(l_modo) = g_MODO.
  145.     IF p_name NP 'Z*' AND l_MODO = 'EDIT'. " Protección de edición
  146.       l_modo = 'SHOW'.
  147.     ENDIF.
  148.     SELECT SINGLE * FROM t000 INTO @DATA(l_t000)
  149.       WHERE mandt = @sy-mandt.
  150. *--[ No editamos si no estamos en desarrollo
  151.     IF l_t000-CCCategory NE 'C'.
  152.       l_modo = 'SHOW'.
  153.     ELSE.
  154.       object_save( p_name ).
  155.     ENDIF.
  156.     CALL FUNCTION 'RS_TOOL_ACCESS' "<-- Acceso directo
  157.       EXPORTING
  158.         operation           = l_modo "EDIT / SHOW
  159.         object_name         = p_name
  160.         object_type         = p_type
  161.         in_new_window       = g_neww
  162.       EXCEPTIONS
  163.         not_executed        = 0
  164.         invalid_object_type = 0
  165.         OTHERS              = 0.
  166.  
  167.   ENDMETHOD.
  168.  
  169.   METHOD object_cross_default.
  170.     CALL FUNCTION 'RS_TOOL_ACCESS' "<-- Acceso directo
  171.       EXPORTING
  172.         operation           = 'CROSSREF'
  173.         object_name         = p_name
  174.         object_type         = p_type
  175.       EXCEPTIONS
  176.         not_executed        = 0
  177.         invalid_object_type = 0
  178.         OTHERS              = 0.
  179.   ENDMETHOD.
  180.  
  181.   METHOD object_find.
  182.     data(l_option) = COND #( WHEN me->p_find ca '*' THEN 'CP' ELSE 'EQ' ).
  183.     r_prog   = VALUE #( ( sign = 'I' option = l_option low = to_upper( me->p_find ) ) ).
  184.     r_prog_d = VALUE #( ( sign = 'I' option = l_option low = me->p_find ) ).
  185.   ENDMETHOD.
  186. ENDCLASS.
  187.  
  188. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  189. *--[ Clase para buscar programas.
  190. CLASS cl_1 DEFINITION INHERITING FROM cl_root.
  191.   PUBLIC SECTION.
  192.     METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
  193. ENDCLASS.
  194.  
  195. CLASS cl_1 IMPLEMENTATION.
  196.   METHOD object_call.
  197.  
  198.     object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  199.  
  200.   ENDMETHOD.
  201.  
  202.   METHOD object_cross.
  203.  
  204.     object_cross_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  205.  
  206.   ENDMETHOD.
  207.  
  208.   METHOD object_find.
  209.     super->object_find( ).
  210.  
  211.     SELECT  '01' AS id_class,
  212.            CASE WHEN subc = '1' THEN 'PROG' ELSE 'INCL' END AS euobj_id,
  213.            CASE WHEN subc = '1' THEN 'Programa' ELSE 'Include' END AS objeto,
  214.             a~prog AS nombre,
  215.             b~text AS descr
  216.        FROM d010sinf AS a
  217.       left OUTER join trdirt as b
  218.       on b~name = a~prog and
  219.          b~sprsl = @sy-langu
  220.       INTO CORRESPONDING FIELDS OF TABLE @me->t_data
  221.       WHERE a~prog IN @r_prog AND
  222.             a~prog NOT LIKE '%=%' "<-- Eliminamos objetos de clases
  223.       order by objeto DESCENDING, prog ASCENDING.
  224.  
  225.   ENDMETHOD.
  226. ENDCLASS.
  227.  
  228. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  229. *--[ Clase para buscar funciones
  230. CLASS cl_2 DEFINITION INHERITING FROM cl_root.
  231.   PUBLIC SECTION.
  232.     METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
  233. ENDCLASS.
  234.  
  235. CLASS cl_2 IMPLEMENTATION.
  236.   METHOD object_call.
  237.     object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  238.   ENDMETHOD.
  239.  
  240.   METHOD object_cross.
  241.     object_cross_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  242.   ENDMETHOD.
  243.  
  244.   METHOD object_find.
  245.     super->object_find( ).
  246.  
  247.     SELECT  '02' AS id_class,
  248.             'FUNC' AS euobj_id,
  249.             'Función' AS objeto,
  250.             a~funcname AS nombre,
  251.             b~stext  AS descr
  252.        FROM tfdir AS a
  253.       LEFT OUTER JOIN tftit AS b
  254.       ON b~funcname = a~funcname and
  255.           spras = @sy-langu
  256.       INTO CORRESPONDING FIELDS OF TABLE @me->t_data
  257.       WHERE a~funcname IN @r_prog OR b~stext IN @r_prog_d .
  258.   ENDMETHOD.
  259. ENDCLASS.
  260.  
  261. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  262. *--[ Clase para buscar diccionario
  263. CLASS cl_3 DEFINITION INHERITING FROM cl_root.
  264.   PUBLIC SECTION.
  265.     METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
  266. ENDCLASS.
  267.  
  268. CLASS cl_3 IMPLEMENTATION.
  269.   METHOD object_call.
  270.     object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  271.   ENDMETHOD.
  272.  
  273.   METHOD object_cross.
  274.     object_CROSS_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  275.   ENDMETHOD.
  276.  
  277.   METHOD object_find.
  278.     super->object_find( ).
  279.  
  280.  
  281. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  282. *--[ Desdoblo la búsqueda para que vaya más rápido
  283.  
  284.     SELECT  '03' AS id_class,
  285.             'TABD' AS euobj_id,
  286.             case tabclass when 'TRANSP' then 'Tabla'
  287.                           when 'INTTAB' then 'Estructura'
  288.                           when 'VIEW'   then 'Vista'
  289.                           when 'APPEND' then 'Append' END as objeto,
  290.             a~tabname AS nombre,
  291.             b~ddtext  AS descr
  292.        FROM dd02l AS a
  293.       LEFT OUTER JOIN dd02t AS b
  294.       ON b~tabname = a~tabname and
  295.          b~ddlanguage = @sy-langu
  296.       INTO CORRESPONDING FIELDS OF TABLE @me->t_data
  297.       WHERE a~tabname IN @r_prog "OR b~ddtext IN @r_prog_d )
  298.             and a~AS4LOCAL = 'A'
  299.             and a~AS4VERS  = '0000'
  300.       order by a~tabclass, a~tabname.
  301.  
  302.     SELECT  '03' AS id_class,
  303.             'TABD' AS euobj_id,
  304.             case tabclass when 'TRANSP' then 'Tabla'
  305.                           when 'INTTAB' then 'Estructura'
  306.                           when 'VIEW'   then 'Vista'
  307.                           when 'APPEND' then 'Append' END as objeto,
  308.             a~tabname AS nombre,
  309.             a~ddtext  AS descr
  310.        FROM dd02t AS a
  311.       inner JOIN dd02l AS b
  312.       ON b~tabname = a~tabname
  313.             and a~AS4LOCAL = 'A'
  314.             and a~AS4VERS  = '0000'
  315.       APPENDING CORRESPONDING FIELDS OF TABLE @me->t_data
  316.       WHERE a~ddtext IN @r_prog_d
  317.       order by b~tabclass, b~tabname.
  318.  
  319.   ENDMETHOD.
  320. ENDCLASS.
  321.  
  322.  
  323.  
  324. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  325. *--[ Clase para buscar Clases
  326. CLASS cl_4 DEFINITION INHERITING FROM cl_root.
  327.   PUBLIC SECTION.
  328.     METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
  329. ENDCLASS.
  330.  
  331. CLASS cl_4 IMPLEMENTATION.
  332.   METHOD object_call.
  333.     object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  334.   ENDMETHOD.
  335.  
  336.   METHOD object_cross.
  337.     object_CROsS_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  338.  
  339.   ENDMETHOD.
  340.  
  341.   METHOD object_find.
  342.     super->object_find( ).
  343.  
  344.     SELECT  '04' AS id_class,
  345.             'CLAS' AS euobj_id,
  346.             'Clase' AS objeto,
  347.             a~clsname AS nombre,
  348.             b~descript AS descr
  349.        FROM seoclass AS a
  350.       LEFT OUTER JOIN seoclasstx AS b
  351.       ON b~clsname = a~clsname and
  352.          b~langu = @sy-langu
  353.        INTO CORRESPONDING FIELDS OF TABLE @me->t_data
  354.       WHERE a~clsname IN @r_prog OR b~descript IN @r_prog_d.
  355.   ENDMETHOD.
  356. ENDCLASS.
  357.  
  358. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  359. *--[ Clase para buscar SMARTFORMS
  360. CLASS cl_5 DEFINITION INHERITING FROM cl_root.
  361.   PUBLIC SECTION.
  362.     METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
  363. ENDCLASS.
  364.  
  365. CLASS cl_5 IMPLEMENTATION.
  366.   METHOD object_cross.
  367.  
  368.   ENDMETHOD.
  369.  
  370.   METHOD object_call.
  371.     DATA: i_formname    TYPE  tdsfname,
  372.           i_formtype    TYPE  tdsftype,
  373.           i_with_dialog TYPE  tdsfflag.
  374.     i_formname = p_nombre.
  375.     object_save( i_formname ).
  376.     CALL FUNCTION 'FB_DISPLAY_FORM'
  377.       EXPORTING
  378.         i_formname    = i_formname
  379.         i_formtype    = i_formtype
  380.         i_with_dialog = space.
  381.  
  382.   ENDMETHOD.
  383.  
  384.   METHOD object_find.
  385.     super->object_find( ).
  386.  
  387.     SELECT  '05' AS id_class,
  388.             'SmartForm' AS objeto,
  389.             a~formname  AS nombre,
  390.             b~caption   AS descr
  391.        FROM stxfadm AS a
  392.       LEFT OUTER JOIN stxfadmt AS b
  393.       ON b~formname = a~formname and
  394.          b~langu = @sy-langu
  395.       INTO CORRESPONDING FIELDS OF TABLE @me->t_data
  396.       WHERE a~formname IN @r_prog OR b~caption IN @r_prog_d.
  397.   ENDMETHOD.
  398. ENDCLASS.
  399.  
  400. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  401. *--[ Clase para buscar Transacciones
  402. CLASS cl_6 DEFINITION INHERITING FROM cl_root.
  403.   PUBLIC SECTION.
  404.         METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
  405. ENDCLASS.
  406.  
  407. CLASS cl_6 IMPLEMENTATION.
  408.   METHOD object_call.
  409.     object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  410.   ENDMETHOD.
  411.  
  412.   METHOD object_cross.
  413.     object_cross_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
  414.  
  415.   ENDMETHOD.
  416.  
  417.   METHOD object_find.
  418.     super->object_find( ).
  419.  
  420.     SELECT  '06' AS id_class,
  421.             'TRAN' AS euobj_id,
  422.             'Transacción' AS objeto,
  423.             a~tcode  AS nombre,
  424.             b~ttext   AS descr
  425.        FROM tstc AS a
  426.       LEFT OUTER JOIN tstct AS b
  427.       ON b~tcode = a~tcode and
  428.          b~sprsl = @sy-langu
  429.       INTO CORRESPONDING FIELDS OF TABLE @me->t_data
  430.       WHERE a~tcode IN @r_prog OR b~ttext IN @r_prog_d.
  431.  
  432.   ENDMETHOD.
  433. ENDCLASS.
  434.  
  435. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  436. *--[ Clase para buscar Transportes
  437. CLASS cl_7 DEFINITION INHERITING FROM cl_root.
  438.   PUBLIC SECTION.
  439.     METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
  440. ENDCLASS.
  441.  
  442. CLASS cl_7 IMPLEMENTATION.
  443.  
  444.   METHOD object_cross.
  445.  
  446.   ENDMETHOD.
  447.   METHOD object_call.
  448.     DATA: is_selection TYPE trwbo_selection.
  449.     is_selection-trkorrpattern = p_nombre.
  450.     CALL FUNCTION 'TR_SEARCH_AND_DISPLAY_REQUESTS'
  451.       EXPORTING
  452.         iv_username            = '*'
  453.         is_selection           = is_selection
  454.         iv_via_selscreen       = abap_false
  455.         iv_cua_status          = 'TDR_TOOL'
  456.       EXCEPTIONS
  457.         action_aborted_by_user = 1
  458.         OTHERS                 = 2.
  459.  
  460.   ENDMETHOD.
  461.  
  462.   METHOD object_find.
  463.     super->object_find( ).
  464.     CHECK g_orden = abap_true.
  465.     SELECT  '07' AS id_class,
  466.             'Transporte' AS objeto,
  467.             a~trkorr  AS nombre,
  468.             a~pgmid && ' ' && a~object && ' ' && a~obj_name && '-' && b~as4text   AS descr
  469.        FROM e071 AS a
  470.       LEFT OUTER JOIN e07t AS b
  471.       ON b~trkorr = a~trkorr
  472.          AND b~langu = @sy-langu
  473.       INTO CORRESPONDING FIELDS OF TABLE @me->t_data
  474.       WHERE a~trkorr IN @r_prog OR a~obj_name IN @r_prog OR b~as4text IN @r_prog_d
  475.       ORDER BY a~trkorr DESCENDING.
  476.  
  477.     SELECT  '07' AS id_class,
  478.             'Transporte' AS objeto,
  479.             a~trkorr  AS nombre,
  480.              b~as4text   AS descr
  481.        FROM e070 AS a
  482.       LEFT JOIN e07t AS b
  483.       ON b~trkorr = a~trkorr
  484.       APPENDING CORRESPONDING FIELDS OF TABLE @me->t_data
  485.       WHERE  ( a~trkorr IN @r_prog OR b~as4text IN @r_prog_d ) AND b~langu = @sy-langu
  486.       ORDER BY a~trkorr DESCENDING.
  487.     SORT me->t_data BY nombre DESCENDING.
  488.     delete me->t_data where descr cp 'CORR RELE*'.
  489.   ENDMETHOD.
  490. ENDCLASS.
  491.  
  492. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  493. *--[ Si necesitas a&#241;adir más id_classs de objetos con sus búsquedas y
  494. *--[ Sus llamadas, sólo tienes que crear más clases con el nombre:
  495. *--[ CL_nn
  496.  
  497. CLASS CL_Main DEFINITION.
  498.  
  499.   PUBLIC SECTION.
  500.     CONSTANTS C_limite TYPE i VALUE 200.
  501.  
  502.     TYPES: BEGIN OF ty_list,
  503.              Objeto TYPE REF TO cl_root,
  504.            END OF ty_list.
  505.  
  506.     DATA: t_data TYPE STANDARD TABLE OF ty_id_class,
  507.           g_modo TYPE sy-ucomm.
  508.  
  509.     DATA: objeto_list TYPE STANDARD TABLE OF ty_list.
  510.  
  511.     METHODS: constructor IMPORTING p_modo TYPE xfeld
  512.                                    p_neww TYPE xfeld,
  513.       cross_me IMPORTING p_nombre   TYPE any,
  514.       find_me IMPORTING p_find   TYPE any
  515.                         p_trkorr TYPE xfeld,
  516.       display_data RETURNING VALUE(nombre) TYPE char255.
  517.  
  518.   PRIVATE SECTION.
  519.  
  520.     METHODS: find_me_now IMPORTING p_find   TYPE any
  521.                                    p_trkorr TYPE xfeld.
  522.  
  523. ENDCLASS.
  524.  
  525. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  526. *--[ Implementación de CONTROL
  527.  
  528. CLASS CL_Main IMPLEMENTATION.
  529.  
  530.   METHOD display_data.
  531.  
  532.     DATA: gs_selfield TYPE slis_selfield,
  533.           gt_fieldcat TYPE slis_t_FIELDCAT_ALV,
  534.           l_c         TYPE i, l_s TYPE i,
  535.           g_exit(1)   TYPE c.
  536.  
  537.     CHECK lines( me->t_data ) > 1.
  538.  
  539.     LOOP AT me->T_data INTO DATA(l_data).
  540.       IF l_c < strlen( l_data-nombre ). l_C = strlen( l_data-nombre ). ENDIF.
  541.       IF L_s < strlen( l_data-descr ).  l_s = strlen( l_data-descr ). ENDIF.
  542.       AT LAST. L_c += 2. l_s += 2. ENDAT.
  543.     ENDLOOP.
  544.     gt_fieldcat = VALUE #( ( fieldname = 'ID_CLASS' outputlen = '10' seltext_l = 'ID Class' no_out = abap_true  )
  545.                            ( fieldname = 'EUOBJ_ID' outputlen = '10' seltext_l = 'id_class' no_out = abap_true  )
  546.                            ( fieldname = 'OBJETO'   outputlen = '15' seltext_l = 'id_class Objeto' )
  547.                            ( fieldname = 'NOMBRE'   outputlen = l_c  seltext_l = 'Nombre del objeto' )
  548.                            ( fieldname = 'DESCR'    outputlen = l_s  seltext_l = 'Descripción' ) ).
  549. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  550. *--[ &#161;&#161;Por un POPUP HERMOSO!!
  551.     DATA(l_lines) = lines( me->t_data ).
  552.     IF l_lines > 30.
  553.       l_lines = 30.
  554.     ELSEIF l_lines < 10.
  555.       l_lines += 8.
  556.     ELSE.
  557.       l_lines += 5.
  558.     ENDIF.
  559.     l_c += L_s + 25.
  560.  
  561.     CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
  562.       EXPORTING
  563.         i_title               = 'Sólo puede quedar uno...'
  564.         i_selection           = abap_true
  565.         i_zebra               = abap_true
  566.         i_screen_start_column = 5
  567.         i_screen_start_line   = 5
  568.         i_screen_end_column   = l_c
  569.         i_screen_end_line     = l_lines
  570.         i_tabname             = '1'
  571.         it_fieldcat           = gt_fieldcat[]
  572.       IMPORTING
  573.         es_selfield           = gs_selfield
  574.         e_exit                = g_exit
  575.       TABLES
  576.         t_outtab              = me->t_data[]
  577.       EXCEPTIONS
  578.         program_error         = 1
  579.         OTHERS                = 2.
  580.  
  581.     CHECK NOT gs_selfield IS INITIAL.
  582.     DATA(l_nada) = me->t_data[ gs_selfield-tabindex ].
  583. *    READ TABLE me->t_data INTO DATA(l_nada) INDEX gs_selfield-tabindex.
  584.     REFRESH me->t_data.
  585.     APPEND l_nada TO me->t_data.
  586.  
  587.   ENDMETHOD.
  588.  
  589.   METHOD constructor.
  590.     g_modo = COND #( WHEN p_modo = abap_true THEN 'EDIT' ELSE 'SHOW' ).
  591.     DATA: lo_ref TYPE REF TO object.
  592.     DO.                "<--- repasamos todas las clases creadas
  593.       DATA(l_name) = |CL_{ sy-index }|.
  594.       TRY.
  595.           CREATE OBJECT lo_ref TYPE (l_name).
  596.         CATCH cx_root.
  597.           EXIT. "<-- ya no hay más
  598.       ENDTRY.
  599.       APPEND INITIAL LINE TO me->objeto_list ASSIGNING FIELD-SYMBOL(<f>). <f>-Objeto ?= lo_ref.
  600.       ASSIGN ('<F>-OBJETO->G_MODO')  TO FIELD-SYMBOL(<fmodo>).  <fmodo>  = g_modo. "<-- &#161;Trampa! Estas asignaciones de memoria
  601.       ASSIGN ('<F>-OBJETO->G_ORDEN') TO FIELD-SYMBOL(<forden>). <forden> = trkorr.
  602.       ASSIGN ('<F>-OBJETO->G_NEWW')  TO FIELD-SYMBOL(<fNEWW>).  <fneww>  = p_neww.
  603.     ENDDO.
  604.   ENDMETHOD.
  605.  
  606.   METHOD cross_me.
  607.     DATA: tmp TYPE REF TO cl_root.
  608.     find_me_now( EXPORTING  p_find = p_nombre p_trkorr = abap_false ).
  609.     CHECK lines( me->t_data ) = 1.
  610.     tmp ?= me->objeto_list[ me->t_data[ 1 ]-id_class ]-objeto.
  611.     tmp->object_cross( me->t_data[ 1 ]-nombre ).
  612.   ENDMETHOD.
  613.  
  614.   METHOD find_me_now.
  615.     DATA: tmp TYPE REF TO cl_root.
  616.     REFRESH me->t_data.
  617.     LOOP AT me->objeto_list INTO DATA(l_list).
  618.       tmp ?= l_list-objeto.
  619.       tmp->p_find = p_find.
  620.       tmp->object_find( ).
  621.       CHECK NOT tmp->t_data IS INITIAL.
  622.       APPEND LINES OF tmp->t_data TO me->t_data.
  623.  
  624.       IF p_trkorr NE abap_true.                 "<-- Eliminamos las ordenes de transporte
  625.         DELETE me->t_data WHERE id_class = '07'.
  626.       ENDIF.
  627.       CHECK lines( me->t_data ) > C_limite.
  628.       MESSAGE s398(00) WITH 'Demasiadas' 'coincidencias,' 'afina.' '' DISPLAY LIKE 'E'.
  629.       EXIT.
  630.     ENDLOOP.
  631.     display_data( ).
  632.   ENDMETHOD.
  633.  
  634.   METHOD find_me.
  635.     DATA: tmp TYPE REF TO cl_root.
  636.     find_me_now( EXPORTING  p_find = p_find p_trkorr = P_TRKORR ).
  637.     DATA(l_lines) = lines( me->t_data ). "<-- Asignado a var, para ahorrar cíclos
  638.     CHECK  l_lines < C_limite.
  639.  
  640. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  641. *--[ Sí sólo encontramos uno, lo ejecutamos directamente
  642.     CHECK l_lines = 1.
  643.     tmp = me->objeto_list[ me->t_data[ l_lines ]-id_class ]-objeto.
  644.     tmp->object_call( me->t_data[ l_lines ]-nombre ).
  645.   ENDMETHOD.
  646.  
  647. ENDCLASS.
  648.  
  649. INITIALIZATION.
  650.   PERFORM eve_initialization.
  651.  
  652. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_obj.
  653.   PERFORM call_F4.
  654.  
  655. AT SELECTION-SCREEN.
  656.   PERFORM eve_at_selection_screen.
  657.  
  658. END-OF-SELECTION.
  659.   PERFORM eve_end_of_selection.
  660.  
  661. FORM eve_end_of_selection.
  662.   CREATE OBJECT obj EXPORTING p_modo = p_mode p_neww = p_neww.
  663.   obj->find_me( EXPORTING p_find = p_obj p_trkorr = trkorr ).
  664. ENDFORM.
  665.  
  666. FORM call_listbox.
  667.   CHECK p_exec  IS NOT INITIAL OR p_favs IS NOT INITIAL.
  668.   DATA(code) = COND tcode( WHEN sscrfields-ucomm = 'VLIS' THEN t_bots[ p_exec ] ELSE t_bots[ p_favs ] ).
  669.   CHECK NOT code IS INITIAL.
  670.   CLEAR: p_exec, p_favs.
  671.   CALL FUNCTION 'COPF_CALL_TRANSACTION'
  672.     EXPORTING
  673.       tcode       = code
  674.       new_session = abap_true.
  675. ENDFORM.
  676.  
  677. FORM call_repo.
  678.   CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
  679.     EXPORTING
  680.       object_type          = 'P'
  681.       suppress_selection   = 'X'
  682.       variant              = 'SAP&MAIN'
  683.     IMPORTING
  684.       object_name_selected = p_obj
  685.     EXCEPTIONS
  686.       cancel               = 1
  687.       wrong_type           = 2
  688.       OTHERS               = 3.
  689. ENDFORM.
  690.  
  691. FORM call_f4.
  692.   TYPES: BEGIN OF ty_f4,
  693.            valfrom  TYPE setleaf-valfrom,
  694.            valto    TYPE setleaf-valto,
  695.            descript TYPE setlinet-descript,
  696.          END OF ty_f4.
  697.   DATA: t_tab     TYPE STANDARD TABLE OF ty_f4,
  698.         lt_return TYPE TABLE OF ddshretval WITH HEADER LINE.
  699.  
  700.   DATA(l_name) = |ZWB_EXE_{ sy-uname }|.
  701.   SELECT a~valfrom, a~valto, b~descript FROM setleaf AS a
  702.     LEFT OUTER JOIN setlinet AS b
  703.     ON b~setname = a~setname AND
  704.        b~lineid  = a~lineid AND
  705.        b~langu   = @sy-langu
  706.     INTO CORRESPONDING FIELDS OF TABLE @t_tab
  707.     WHERE a~setname = @l_name
  708.     ORDER BY valto DESCENDING.
  709.  
  710.  
  711.   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  712.     EXPORTING
  713.       retfield        = 'VALFROM'
  714.       value_org       = 'S'
  715. *     window_title    = ''
  716.     TABLES
  717.       value_tab       = t_tab
  718.       return_tab      = lt_return
  719.     EXCEPTIONS
  720.       parameter_error = 1
  721.       no_values_found = 2
  722.       OTHERS          = 3.
  723.  
  724.   p_obj = lt_return-fieldval.
  725. ENDFORM.
  726.  
  727. FORM eve_initialization.
  728.   t01 = |Objeto|.
  729.   t02 = |@13@ Browser Repo|.
  730.   t03 = |@3A@|.
  731.   g_vers = c_vers.
  732.   sscrfields-functxt_01 = |Editar FAVoritos|.
  733.   data(l_uname) = sy-uname. "<- Para DEbugs
  734.   SPLIT botones AT '|' INTO TABLE DATA(t_bots2). APPEND LINES OF t_bots2 TO t_bots.
  735.  
  736.   DATA(l_n) = lines( t_bots ).           "<-- Normales
  737.   l_setname = |ZWB_FAV_{ l_uname }|.
  738.  
  739.   DATA(m_bots) = t_bots[]. REFRESH m_bots.
  740.   SELECT valfrom  AS  tcode
  741.     FROM setleaf APPENDING TABLE m_bots
  742.     WHERE setname   = l_setname.
  743.  
  744.   SELECT report AS tcode FROM smen_buffc APPENDING TABLE m_bots
  745.     WHERE uname      = l_uname
  746.       AND reporttype = 'TR'.
  747.   SORT m_bots.
  748.   DELETE ADJACENT DUPLICATES FROM m_bots.
  749.   loop at t_bots into data(l_vot).
  750.         read table m_bots TRANSPORTING NO FIELDS with key tcode = l_vot-tcode.
  751.         check sy-subrc eq 0.
  752.         delete m_bots index sy-tabix.
  753.   endloop.
  754.   APPEND LINES OF m_bots TO t_bots.
  755.  
  756. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  757. *--[ Transacciones de sistema + Favoritos
  758.  
  759.   LOOP AT t_bots INTO DATA(l_bot).
  760.     AT FIRST.
  761.       SELECT * FROM tstct
  762.         INTO TABLE @DATA(t_trans)
  763.         FOR ALL ENTRIES IN @t_bots
  764.         WHERE sprsl = @sy-langu AND tcode = @t_bots-tcode.
  765.     ENDAT.
  766.     DATA(l_tabix) = sy-tabix.
  767.     try.
  768.     DATA(l_trans) = t_trans[ tcode = l_bot-tcode ].
  769.     catch cx_root.
  770.          delete t_bots index l_tabix.
  771.          continue.
  772.     ENDTRY.
  773.     list = VALUE #( BASE list ( text =  |{ l_trans-tcode } - { l_trans-ttext }|
  774.                                 key  = l_tabix ) ).
  775.  
  776.     IF l_tabix = l_n.
  777.       CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'P_EXEC' values = list.
  778.       REFRESH list.
  779.     ENDIF.
  780.     AT LAST.
  781.       CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'P_FAVS' values = list.
  782.     ENDAT.
  783.  
  784.   ENDLOOP.
  785. ENDFORM.
  786.  
  787. FORM eve_at_selection_screen.
  788.   CASE sscrfields-ucomm.
  789.     WHEN 'FC01'.           SET PARAMETER ID 'GSE' FIELD l_setname. CALL TRANSACTION 'GS02'.
  790.     WHEN 'CROS'.           CREATE OBJECT obj EXPORTING p_modo = p_mode p_neww = p_neww.
  791.                            obj->cross_me( EXPORTING p_nombre = p_obj ).
  792.     WHEN 'REPO'.           PERFORM call_repo.
  793.     WHEN 'VLIS' OR 'VFAV'. PERFORM call_listbox.
  794.   ENDCASE.
  795. ENDFORM.