REPORT zxx_prg_workbench.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Definición de Pantalla
CONSTANTS c_vers TYPE string VALUE 'v1.06'.
*--[ 1.01 - 20230526 Añadido F4 para grabar los que vamos utilizando y hacer búsquedas más rápidas
*--[ 1.02 - 20230529 Corregido varios BUGS: CL_01 y Transación favoritos
*--[ 1.03 - 20230530 Mejorado el filtro de las órdenes para optimizar + rendimiento + REPO Browser
*--[ 1.04 - 20230531 +Cross Reference + Otimizaciones
*--[ 1.05 - 20230601 +Mejoras en LEFT OUTER JOIN + Textos en F4
*--[ 1.06 - 20230613 DUMP en TCODEs inexistentes + Evitar duplicados en TCODES + Nuevas TCODES
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 01(10) t01.
PARAMETERS: p_obj(255) LOWER CASE.
SELECTION-SCREEN PUSHBUTTON 61(4) t03 USER-COMMAND cros.
SELECTION-SCREEN PUSHBUTTON 66(12) t02 USER-COMMAND repo.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_exec TYPE i AS LISTBOX VISIBLE LENGTH 100 USER-COMMAND vlis.
PARAMETERS: p_FAVs TYPE i AS LISTBOX VISIBLE LENGTH 100 USER-COMMAND vfav.
SELECTION-SCREEN END OF BLOCK b01.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_mode AS CHECKBOX DEFAULT abap_true.
PARAMETERS: p_neww AS CHECKBOX DEFAULT abap_true.
PARAMETERS: trkorr AS CHECKBOX DEFAULT abap_false.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN COMMENT /01(40) g_vers.
SELECTION-SCREEN FUNCTION KEY 1. "<-- De momento es la única que se utiliza
SELECTION-SCREEN FUNCTION KEY 2.
SELECTION-SCREEN FUNCTION KEY 3.
SELECTION-SCREEN FUNCTION KEY 4.
SELECTION-SCREEN FUNCTION KEY 5.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Definición de id_classs y variables
TABLES: sscrfields. "<-- Para los botones en el PF-STATUS
TYPE-POOLS: vrm. "<-- Para los LISTBOX
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Botones más habituales
CONSTANTS: botones TYPE string VALUE
'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'.
CLASS CL_Main DEFINITION DEFERRED. "<--- Más abajo
TYPES: BEGIN OF ty_id_class,
id_class(2), "<-- Será el código de la cláse
euobj_id TYPE seu_obj, "<-- Código de Objeto
objeto(15), "<--- Será el texto del código de la clase
nombre(75), "<--- Obviamente será el nombre del objeto
descr(100), "<--- La descripción del objeto
END OF ty_id_class.
TYPES: BEGIN OF ty_tcode, tcode TYPE tstc-tcode, END OF ty_tcode.
DATA: list TYPE vrm_values,
value LIKE LINE OF list,
l_setname TYPE setnamenew,
t_bots TYPE STANDARD TABLE OF ty_tcode,
obj TYPE REF TO CL_Main.
RANGES: r_favs FOR tstc-tcode.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Definiciones de Clase
CLASS cl_root DEFINITION ABSTRACT. " Clase Principal
PUBLIC SECTION.
DATA: t_data TYPE STANDARD TABLE OF ty_id_class,
p_find TYPE char255,
t_bdc TYPE STANDARD TABLE OF bdcdata,
G_modo TYPE sy-ucomm,
g_neww TYPE xfeld,
g_orden TYPE xfeld.
DATA: r_prog TYPE RANGE OF seodescr,
r_prog_D TYPE RANGE OF seodescr.
METHODS:
object_call ABSTRACT IMPORTING p_nombre TYPE any,
object_cross ABSTRACT IMPORTING p_nombre TYPE any,
object_call_default IMPORTING p_name TYPE any
p_type TYPE any,
object_cross_default IMPORTING p_name TYPE any
p_type TYPE any,
object_save IMPORTING p_name TYPE any,
object_find.
ENDCLASS.
CLASS cl_root IMPLEMENTATION.
METHOD object_save.
DATA: l_leaf TYPE setleaf,
l_leafd TYPE setleaf,
l_leaft TYPE setlinet,
l_dat TYPE sy-datum,
l_datd TYPE sy-datum.
l_leaf-setname = |ZWB_EXE_{ sy-uname }|.
SELECT SINGLE lineid INTO @DATA(l_n) FROM setleaf WHERE setname = @l_leaf-setname AND valfrom = @p_name.
IF sy-subrc EQ 0.
l_leaf-lineid = l_n .
ELSE.
SELECT MAX( lineid ) INTO l_n FROM setleaf WHERE setname = l_leaf-setname.
l_leaf-lineid = l_n + 1.
ENDIF.
l_leaf-setclass = '0000'. "<- NPI
l_leaf-valsign = 'I'.
l_leaf-valoption = 'EQ'.
l_leaf-valfrom = p_name.
l_leaf-valto = sy-datum.
MODIFY setleaf FROM l_leaf.
CLEAR l_leaft.
MOVE-CORRESPONDING l_leaf TO l_leaft.
l_leaft-langu = sy-langu.
l_leaft-descript = me->t_data[ nombre = p_name ]-descr.
MODIFY setlineT FROM l_leaft.
l_datd = sy-datum - 90. "<-- 90 días de antiguedad
*--[ Esto puede ser lento, pero es la única forma de comparar por fechas
*--[ Borramos los antiguos
SELECT * FROM setleaf INTO CORRESPONDING FIELDS OF l_leafd WHERE setname = l_leaf-setname.
l_dat = l_leafd-valto.
CHECK l_dat < l_datd.
DELETE FROM setleaf WHERE setclass = l_leafd-setclass
AND subclass = l_leafd-subclass
AND setname = l_leafd-setname
AND lineid = l_leafd-lineid.
ENDSELECT.
ENDMETHOD.
METHOD object_call_default.
DATA(l_modo) = g_MODO.
IF p_name NP 'Z*' AND l_MODO = 'EDIT'. " Protección de edición
l_modo = 'SHOW'.
ENDIF.
SELECT SINGLE * FROM t000 INTO @DATA(l_t000)
WHERE mandt = @sy-mandt.
*--[ No editamos si no estamos en desarrollo
IF l_t000-CCCategory NE 'C'.
l_modo = 'SHOW'.
ELSE.
object_save( p_name ).
ENDIF.
CALL FUNCTION 'RS_TOOL_ACCESS' "<-- Acceso directo
EXPORTING
operation = l_modo "EDIT / SHOW
object_name = p_name
object_type = p_type
in_new_window = g_neww
EXCEPTIONS
not_executed = 0
invalid_object_type = 0
OTHERS = 0.
ENDMETHOD.
METHOD object_cross_default.
CALL FUNCTION 'RS_TOOL_ACCESS' "<-- Acceso directo
EXPORTING
operation = 'CROSSREF'
object_name = p_name
object_type = p_type
EXCEPTIONS
not_executed = 0
invalid_object_type = 0
OTHERS = 0.
ENDMETHOD.
METHOD object_find.
data(l_option) = COND #( WHEN me->p_find ca '*' THEN 'CP' ELSE 'EQ' ).
r_prog = VALUE #( ( sign = 'I' option = l_option low = to_upper( me->p_find ) ) ).
r_prog_d = VALUE #( ( sign = 'I' option = l_option low = me->p_find ) ).
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase para buscar programas.
CLASS cl_1 DEFINITION INHERITING FROM cl_root.
PUBLIC SECTION.
METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
ENDCLASS.
CLASS cl_1 IMPLEMENTATION.
METHOD object_call.
object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_cross.
object_cross_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_find.
super->object_find( ).
SELECT '01' AS id_class,
CASE WHEN subc = '1' THEN 'PROG' ELSE 'INCL' END AS euobj_id,
CASE WHEN subc = '1' THEN 'Programa' ELSE 'Include' END AS objeto,
a~prog AS nombre,
b~text AS descr
FROM d010sinf AS a
left OUTER join trdirt as b
on b~name = a~prog and
b~sprsl = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~prog IN @r_prog AND
a~prog NOT LIKE '%=%' "<-- Eliminamos objetos de clases
order by objeto DESCENDING, prog ASCENDING.
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase para buscar funciones
CLASS cl_2 DEFINITION INHERITING FROM cl_root.
PUBLIC SECTION.
METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
ENDCLASS.
CLASS cl_2 IMPLEMENTATION.
METHOD object_call.
object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_cross.
object_cross_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_find.
super->object_find( ).
SELECT '02' AS id_class,
'FUNC' AS euobj_id,
'Función' AS objeto,
a~funcname AS nombre,
b~stext AS descr
FROM tfdir AS a
LEFT OUTER JOIN tftit AS b
ON b~funcname = a~funcname and
spras = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~funcname IN @r_prog OR b~stext IN @r_prog_d .
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase para buscar diccionario
CLASS cl_3 DEFINITION INHERITING FROM cl_root.
PUBLIC SECTION.
METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
ENDCLASS.
CLASS cl_3 IMPLEMENTATION.
METHOD object_call.
object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_cross.
object_CROSS_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_find.
super->object_find( ).
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Desdoblo la búsqueda para que vaya más rápido
SELECT '03' AS id_class,
'TABD' AS euobj_id,
case tabclass when 'TRANSP' then 'Tabla'
when 'INTTAB' then 'Estructura'
when 'VIEW' then 'Vista'
when 'APPEND' then 'Append' END as objeto,
a~tabname AS nombre,
b~ddtext AS descr
FROM dd02l AS a
LEFT OUTER JOIN dd02t AS b
ON b~tabname = a~tabname and
b~ddlanguage = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~tabname IN @r_prog "OR b~ddtext IN @r_prog_d )
and a~AS4LOCAL = 'A'
and a~AS4VERS = '0000'
order by a~tabclass, a~tabname.
SELECT '03' AS id_class,
'TABD' AS euobj_id,
case tabclass when 'TRANSP' then 'Tabla'
when 'INTTAB' then 'Estructura'
when 'VIEW' then 'Vista'
when 'APPEND' then 'Append' END as objeto,
a~tabname AS nombre,
a~ddtext AS descr
FROM dd02t AS a
inner JOIN dd02l AS b
ON b~tabname = a~tabname
and a~AS4LOCAL = 'A'
and a~AS4VERS = '0000'
APPENDING CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~ddtext IN @r_prog_d
order by b~tabclass, b~tabname.
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase para buscar Clases
CLASS cl_4 DEFINITION INHERITING FROM cl_root.
PUBLIC SECTION.
METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
ENDCLASS.
CLASS cl_4 IMPLEMENTATION.
METHOD object_call.
object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_cross.
object_CROsS_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_find.
super->object_find( ).
SELECT '04' AS id_class,
'CLAS' AS euobj_id,
'Clase' AS objeto,
a~clsname AS nombre,
b~descript AS descr
FROM seoclass AS a
LEFT OUTER JOIN seoclasstx AS b
ON b~clsname = a~clsname and
b~langu = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~clsname IN @r_prog OR b~descript IN @r_prog_d.
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase para buscar SMARTFORMS
CLASS cl_5 DEFINITION INHERITING FROM cl_root.
PUBLIC SECTION.
METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
ENDCLASS.
CLASS cl_5 IMPLEMENTATION.
METHOD object_cross.
ENDMETHOD.
METHOD object_call.
DATA: i_formname TYPE tdsfname,
i_formtype TYPE tdsftype,
i_with_dialog TYPE tdsfflag.
i_formname = p_nombre.
object_save( i_formname ).
CALL FUNCTION 'FB_DISPLAY_FORM'
EXPORTING
i_formname = i_formname
i_formtype = i_formtype
i_with_dialog = space.
ENDMETHOD.
METHOD object_find.
super->object_find( ).
SELECT '05' AS id_class,
'SmartForm' AS objeto,
a~formname AS nombre,
b~caption AS descr
FROM stxfadm AS a
LEFT OUTER JOIN stxfadmt AS b
ON b~formname = a~formname and
b~langu = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~formname IN @r_prog OR b~caption IN @r_prog_d.
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase para buscar Transacciones
CLASS cl_6 DEFINITION INHERITING FROM cl_root.
PUBLIC SECTION.
METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
ENDCLASS.
CLASS cl_6 IMPLEMENTATION.
METHOD object_call.
object_call_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_cross.
object_cross_default( EXPORTING p_name = p_nombre p_type = me->t_data[ nombre = p_nombre ]-euobj_id ).
ENDMETHOD.
METHOD object_find.
super->object_find( ).
SELECT '06' AS id_class,
'TRAN' AS euobj_id,
'Transacción' AS objeto,
a~tcode AS nombre,
b~ttext AS descr
FROM tstc AS a
LEFT OUTER JOIN tstct AS b
ON b~tcode = a~tcode and
b~sprsl = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~tcode IN @r_prog OR b~ttext IN @r_prog_d.
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase para buscar Transportes
CLASS cl_7 DEFINITION INHERITING FROM cl_root.
PUBLIC SECTION.
METHODS: object_call REDEFINITION, object_cross REDEFINITION, object_find REDEFINITION.
ENDCLASS.
CLASS cl_7 IMPLEMENTATION.
METHOD object_cross.
ENDMETHOD.
METHOD object_call.
DATA: is_selection TYPE trwbo_selection.
is_selection-trkorrpattern = p_nombre.
CALL FUNCTION 'TR_SEARCH_AND_DISPLAY_REQUESTS'
EXPORTING
iv_username = '*'
is_selection = is_selection
iv_via_selscreen = abap_false
iv_cua_status = 'TDR_TOOL'
EXCEPTIONS
action_aborted_by_user = 1
OTHERS = 2.
ENDMETHOD.
METHOD object_find.
super->object_find( ).
CHECK g_orden = abap_true.
SELECT '07' AS id_class,
'Transporte' AS objeto,
a~trkorr AS nombre,
a~pgmid && ' ' && a~object && ' ' && a~obj_name && '-' && b~as4text AS descr
FROM e071 AS a
LEFT OUTER JOIN e07t AS b
ON b~trkorr = a~trkorr
AND b~langu = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE a~trkorr IN @r_prog OR a~obj_name IN @r_prog OR b~as4text IN @r_prog_d
ORDER BY a~trkorr DESCENDING.
SELECT '07' AS id_class,
'Transporte' AS objeto,
a~trkorr AS nombre,
b~as4text AS descr
FROM e070 AS a
LEFT JOIN e07t AS b
ON b~trkorr = a~trkorr
APPENDING CORRESPONDING FIELDS OF TABLE @me->t_data
WHERE ( a~trkorr IN @r_prog OR b~as4text IN @r_prog_d ) AND b~langu = @sy-langu
ORDER BY a~trkorr DESCENDING.
SORT me->t_data BY nombre DESCENDING.
delete me->t_data where descr cp 'CORR RELE*'.
ENDMETHOD.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Si necesitas añadir más id_classs de objetos con sus búsquedas y
*--[ Sus llamadas, sólo tienes que crear más clases con el nombre:
*--[ CL_nn
CLASS CL_Main DEFINITION.
PUBLIC SECTION.
CONSTANTS C_limite TYPE i VALUE 200.
TYPES: BEGIN OF ty_list,
Objeto TYPE REF TO cl_root,
END OF ty_list.
DATA: t_data TYPE STANDARD TABLE OF ty_id_class,
g_modo TYPE sy-ucomm.
DATA: objeto_list TYPE STANDARD TABLE OF ty_list.
METHODS: constructor IMPORTING p_modo TYPE xfeld
p_neww TYPE xfeld,
cross_me IMPORTING p_nombre TYPE any,
find_me IMPORTING p_find TYPE any
p_trkorr TYPE xfeld,
display_data RETURNING VALUE(nombre) TYPE char255.
PRIVATE SECTION.
METHODS: find_me_now IMPORTING p_find TYPE any
p_trkorr TYPE xfeld.
ENDCLASS.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Implementación de CONTROL
CLASS CL_Main IMPLEMENTATION.
METHOD display_data.
DATA: gs_selfield TYPE slis_selfield,
gt_fieldcat TYPE slis_t_FIELDCAT_ALV,
l_c TYPE i, l_s TYPE i,
g_exit(1) TYPE c.
CHECK lines( me->t_data ) > 1.
LOOP AT me->T_data INTO DATA(l_data).
IF l_c < strlen( l_data-nombre ). l_C = strlen( l_data-nombre ). ENDIF.
IF L_s < strlen( l_data-descr ). l_s = strlen( l_data-descr ). ENDIF.
AT LAST. L_c += 2. l_s += 2. ENDAT.
ENDLOOP.
gt_fieldcat = VALUE #( ( fieldname = 'ID_CLASS' outputlen = '10' seltext_l = 'ID Class' no_out = abap_true )
( fieldname = 'EUOBJ_ID' outputlen = '10' seltext_l = 'id_class' no_out = abap_true )
( fieldname = 'OBJETO' outputlen = '15' seltext_l = 'id_class Objeto' )
( fieldname = 'NOMBRE' outputlen = l_c seltext_l = 'Nombre del objeto' )
( fieldname = 'DESCR' outputlen = l_s seltext_l = 'Descripción' ) ).
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ ¡¡Por un POPUP HERMOSO!!
DATA(l_lines) = lines( me->t_data ).
IF l_lines > 30.
l_lines = 30.
ELSEIF l_lines < 10.
l_lines += 8.
ELSE.
l_lines += 5.
ENDIF.
l_c += L_s + 25.
CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = 'Sólo puede quedar uno...'
i_selection = abap_true
i_zebra = abap_true
i_screen_start_column = 5
i_screen_start_line = 5
i_screen_end_column = l_c
i_screen_end_line = l_lines
i_tabname = '1'
it_fieldcat = gt_fieldcat[]
IMPORTING
es_selfield = gs_selfield
e_exit = g_exit
TABLES
t_outtab = me->t_data[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
CHECK NOT gs_selfield IS INITIAL.
DATA(l_nada) = me->t_data[ gs_selfield-tabindex ].
* READ TABLE me->t_data INTO DATA(l_nada) INDEX gs_selfield-tabindex.
REFRESH me->t_data.
APPEND l_nada TO me->t_data.
ENDMETHOD.
METHOD constructor.
g_modo = COND #( WHEN p_modo = abap_true THEN 'EDIT' ELSE 'SHOW' ).
DATA: lo_ref TYPE REF TO object.
DO. "<--- repasamos todas las clases creadas
DATA(l_name) = |CL_{ sy-index }|.
TRY.
CREATE OBJECT lo_ref TYPE (l_name).
CATCH cx_root.
EXIT. "<-- ya no hay más
ENDTRY.
APPEND INITIAL LINE TO me->objeto_list ASSIGNING FIELD-SYMBOL(<f>). <f>-Objeto ?= lo_ref.
ASSIGN ('<F>-OBJETO->G_MODO') TO FIELD-SYMBOL(<fmodo>). <fmodo> = g_modo. "<-- ¡Trampa! Estas asignaciones de memoria
ASSIGN ('<F>-OBJETO->G_ORDEN') TO FIELD-SYMBOL(<forden>). <forden> = trkorr.
ASSIGN ('<F>-OBJETO->G_NEWW') TO FIELD-SYMBOL(<fNEWW>). <fneww> = p_neww.
ENDDO.
ENDMETHOD.
METHOD cross_me.
DATA: tmp TYPE REF TO cl_root.
find_me_now( EXPORTING p_find = p_nombre p_trkorr = abap_false ).
CHECK lines( me->t_data ) = 1.
tmp ?= me->objeto_list[ me->t_data[ 1 ]-id_class ]-objeto.
tmp->object_cross( me->t_data[ 1 ]-nombre ).
ENDMETHOD.
METHOD find_me_now.
DATA: tmp TYPE REF TO cl_root.
REFRESH me->t_data.
LOOP AT me->objeto_list INTO DATA(l_list).
tmp ?= l_list-objeto.
tmp->p_find = p_find.
tmp->object_find( ).
CHECK NOT tmp->t_data IS INITIAL.
APPEND LINES OF tmp->t_data TO me->t_data.
IF p_trkorr NE abap_true. "<-- Eliminamos las ordenes de transporte
DELETE me->t_data WHERE id_class = '07'.
ENDIF.
CHECK lines( me->t_data ) > C_limite.
MESSAGE s398(00) WITH 'Demasiadas' 'coincidencias,' 'afina.' '' DISPLAY LIKE 'E'.
EXIT.
ENDLOOP.
display_data( ).
ENDMETHOD.
METHOD find_me.
DATA: tmp TYPE REF TO cl_root.
find_me_now( EXPORTING p_find = p_find p_trkorr = P_TRKORR ).
DATA(l_lines) = lines( me->t_data ). "<-- Asignado a var, para ahorrar cíclos
CHECK l_lines < C_limite.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Sí sólo encontramos uno, lo ejecutamos directamente
CHECK l_lines = 1.
tmp = me->objeto_list[ me->t_data[ l_lines ]-id_class ]-objeto.
tmp->object_call( me->t_data[ l_lines ]-nombre ).
ENDMETHOD.
ENDCLASS.
INITIALIZATION.
PERFORM eve_initialization.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_obj.
PERFORM call_F4.
AT SELECTION-SCREEN.
PERFORM eve_at_selection_screen.
END-OF-SELECTION.
PERFORM eve_end_of_selection.
FORM eve_end_of_selection.
CREATE OBJECT obj EXPORTING p_modo = p_mode p_neww = p_neww.
obj->find_me( EXPORTING p_find = p_obj p_trkorr = trkorr ).
ENDFORM.
FORM call_listbox.
CHECK p_exec IS NOT INITIAL OR p_favs IS NOT INITIAL.
DATA(code) = COND tcode( WHEN sscrfields-ucomm = 'VLIS' THEN t_bots[ p_exec ] ELSE t_bots[ p_favs ] ).
CHECK NOT code IS INITIAL.
CLEAR: p_exec, p_favs.
CALL FUNCTION 'COPF_CALL_TRANSACTION'
EXPORTING
tcode = code
new_session = abap_true.
ENDFORM.
FORM call_repo.
CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
EXPORTING
object_type = 'P'
suppress_selection = 'X'
variant = 'SAP&MAIN'
IMPORTING
object_name_selected = p_obj
EXCEPTIONS
cancel = 1
wrong_type = 2
OTHERS = 3.
ENDFORM.
FORM call_f4.
TYPES: BEGIN OF ty_f4,
valfrom TYPE setleaf-valfrom,
valto TYPE setleaf-valto,
descript TYPE setlinet-descript,
END OF ty_f4.
DATA: t_tab TYPE STANDARD TABLE OF ty_f4,
lt_return TYPE TABLE OF ddshretval WITH HEADER LINE.
DATA(l_name) = |ZWB_EXE_{ sy-uname }|.
SELECT a~valfrom, a~valto, b~descript FROM setleaf AS a
LEFT OUTER JOIN setlinet AS b
ON b~setname = a~setname AND
b~lineid = a~lineid AND
b~langu = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @t_tab
WHERE a~setname = @l_name
ORDER BY valto DESCENDING.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'VALFROM'
value_org = 'S'
* window_title = ''
TABLES
value_tab = t_tab
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
p_obj = lt_return-fieldval.
ENDFORM.
FORM eve_initialization.
t01 = |Objeto|.
t02 = |@13@ Browser Repo|.
t03 = |@3A@|.
g_vers = c_vers.
sscrfields-functxt_01 = |Editar FAVoritos|.
data(l_uname) = sy-uname. "<- Para DEbugs
SPLIT botones AT '|' INTO TABLE DATA(t_bots2). APPEND LINES OF t_bots2 TO t_bots.
DATA(l_n) = lines( t_bots ). "<-- Normales
l_setname = |ZWB_FAV_{ l_uname }|.
DATA(m_bots) = t_bots[]. REFRESH m_bots.
SELECT valfrom AS tcode
FROM setleaf APPENDING TABLE m_bots
WHERE setname = l_setname.
SELECT report AS tcode FROM smen_buffc APPENDING TABLE m_bots
WHERE uname = l_uname
AND reporttype = 'TR'.
SORT m_bots.
DELETE ADJACENT DUPLICATES FROM m_bots.
loop at t_bots into data(l_vot).
read table m_bots TRANSPORTING NO FIELDS with key tcode = l_vot-tcode.
check sy-subrc eq 0.
delete m_bots index sy-tabix.
endloop.
APPEND LINES OF m_bots TO t_bots.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Transacciones de sistema + Favoritos
LOOP AT t_bots INTO DATA(l_bot).
AT FIRST.
SELECT * FROM tstct
INTO TABLE @DATA(t_trans)
FOR ALL ENTRIES IN @t_bots
WHERE sprsl = @sy-langu AND tcode = @t_bots-tcode.
ENDAT.
DATA(l_tabix) = sy-tabix.
try.
DATA(l_trans) = t_trans[ tcode = l_bot-tcode ].
catch cx_root.
delete t_bots index l_tabix.
continue.
ENDTRY.
list = VALUE #( BASE list ( text = |{ l_trans-tcode } - { l_trans-ttext }|
key = l_tabix ) ).
IF l_tabix = l_n.
CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'P_EXEC' values = list.
REFRESH list.
ENDIF.
AT LAST.
CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'P_FAVS' values = list.
ENDAT.
ENDLOOP.
ENDFORM.
FORM eve_at_selection_screen.
CASE sscrfields-ucomm.
WHEN 'FC01'. SET PARAMETER ID 'GSE' FIELD l_setname. CALL TRANSACTION 'GS02'.
WHEN 'CROS'. CREATE OBJECT obj EXPORTING p_modo = p_mode p_neww = p_neww.
obj->cross_me( EXPORTING p_nombre = p_obj ).
WHEN 'REPO'. PERFORM call_repo.
WHEN 'VLIS' OR 'VFAV'. PERFORM call_listbox.
ENDCASE.
ENDFORM.