ABAPZXXORDENES
Para conocer de un simple vistazo como y dónde están las órdenes, aún se tiene que optimizar esto
El dynpro 100, sólo tiene un CuCtr CC_ALV_01 y el G_OKCODE
El Estatus MAIN0100, sólo tiene el botón de BACK- REPORT z_xx_prg_ordenes.
- CONSTANTS: c_vers TYPE string VALUE 'v1.22' ##NO_TEXT,
- c_copyleft TYPE string VALUE 'CopyLeft 2023 Alex Bergonzini' ##NO_TEXT,
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[
- *--[ 1.02 20230613 Anyadido split de ventanas + pasado SCID
- *--[ 1.03 20230614 Ocultamos las columnas de SYS+RC todo en un SRC + BOTones
- *--[ 1.04 20230614 Cambiado totalmente el motor de busqueda, ahora lo recupera todo bien.
- *--[ + Navegacion al objeto + Un monton de nuevas funcionalidades
- *--[ 1.05 20230616 + UP/DOWN Ordenes
- *--[ 1.06 20230619 + Edicion de los objetos de las ordenes
- *--[ 1.07 20230620 + Corregido BUG de ordenes solitarias
- *--[ 1.08 20230621 + Corregido auto-tcode
- *--[ 1.09 20230622 + Change username + TCODES + POPUP To Release
- *--[ 1.10 20231102 + Gestion de versiones
- *--[ 1.11 20231219 + Anyaadido cambio de propietario automatico
- *--[ 1.12 20240103 + ALV Con contenido de claves R3TR-TABU/CDAT
- *--[ 1.13 20240104 + Anyadido boton de borrado de objetos + maquillajes
- *--[ 1.14 20240105 + Anyadimos objetos a las ordenes y correcciones
- *--[ 1.15 20240201 + Anyadida funcionalidad de cambio de título
- *--[ 1.16 20240205 + Anyadidos menus contextuales de raton
- *--[ 1.17 20240312 + Anyadidos filtros basicos de WB - CUS
- *--[ 1.18 20240315 + Versiones en las órdenes
- *--[ 1.19 20240322 + Error en busqueda de objetos
- *--[ 1.20 20240404 + Exportacion de las ordenes al clipboard + Transporte
- *--[ 1.21 20240411 + Boton Documentacion
- *--[ 1.22 20240508 + Desc de objecto + rendimiento + busca extensiva de FUNC
- *--[ Revisar la funcion: TRINT_TDR_USER_COMMAND
- *--[ ** NO DISCLAIMER ** NO WARRANTY ** NO CRY ** NO REGRETS **
- *--[
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Translate me
- C_There_can_be_only_one TYPE string VALUE 'Debes seleccionar 1' ##NO_TEXT,
- c_quick_01 TYPE iconquick VALUE 'Liberar' ##NO_TEXT,
- c_quick_02 TYPE iconquick VALUE 'Crear orden nueva' ##NO_TEXT,
- c_quick_03 TYPE iconquick VALUE 'Fusionar.' ##NO_TEXT,
- c_quick_04 TYPE iconquick VALUE 'Incluir objetos de otra orden' ##NO_TEXT,
- c_quick_05 TYPE iconquick VALUE 'SE09 - Mis ordenes' ##NO_TEXT,
- c_quick_06 TYPE iconquick VALUE 'Verificar pre-transporte' ##NO_TEXT,
- c_quick_07 TYPE iconquick VALUE 'STMS Gestion del STMS' ##NO_TEXT,
- c_quick_08 TYPE iconquick VALUE 'Bye Bye Bye' ##NO_TEXT,
- c_quick_09 TYPE iconquick VALUE 'Borrar orden' ##NO_TEXT,
- c_quick_10 TYPE iconquick VALUE 'Descargar orden' ##NO_TEXT,
- c_quick_11 TYPE iconquick VALUE 'Subir orden' ##NO_TEXT,
- c_quick_12 TYPE iconquick VALUE 'Cambiar titular' ##NO_TEXT,
- c_quick_13 TYPE iconquick VALUE 'Refrescar' ##NO_TEXT,
- c_quick_14 TYPE iconquick VALUE 'Verificacion' ##NO_TEXT,
- c_quick_15 TYPE iconquick VALUE 'Anyadir tarea' ##NO_TEXT,
- c_quick_16 TYPE iconquick VALUE 'Eliminar objeto' ##NO_TEXT,
- c_quick_17 TYPE iconquick VALUE 'Anyadir objetos' ##NO_TEXT,
- c_quick_18 TYPE iconquick VALUE 'Cambiar titulo' ##NO_TEXT,
- c_quick_19 TYPE iconquick VALUE 'Enviar a Clipboard' ##NO_TEXT,
- c_quick_20 TYPE iconquick VALUE 'Transportar' ##NO_TEXT,
- c_quick_21 TYPE iconquick VALUE 'Extras' ##NO_TEXT,
- c_quick_22 TYPE iconquick VALUE 'Documentacion' ##NO_TEXT,
- C_avl_01 TYPE scrtext_l VALUE 'Tarea' ##NO_TEXT,
- C_avl_02 TYPE scrtext_l VALUE 'Propietario' ##NO_TEXT,
- C_avl_03 TYPE scrtext_l VALUE 'Nombre Propietario' ##NO_TEXT,
- C_avl_04 TYPE scrtext_l VALUE 'ID' ##NO_TEXT,
- C_avl_05 TYPE scrtext_l VALUE 'Tipo Objeto' ##NO_TEXT,
- C_avl_06 TYPE scrtext_l VALUE 'Ultima version' ##NO_TEXT,
- C_avl_07 TYPE scrtext_l VALUE 'en fecha' ##NO_TEXT,
- C_avl_08 TYPE scrtext_l VALUE 'Objeto' ##NO_TEXT,
- C_avl_09 TYPE scrtext_l VALUE 'Orden' ##NO_TEXT,
- C_avl_10 TYPE scrtext_l VALUE 'LOG' ##NO_TEXT,
- C_avl_11 TYPE scrtext_l VALUE 'Tipo' ##NO_TEXT,
- C_avl_12 TYPE scrtext_l VALUE 'Sistema' ##NO_TEXT,
- C_avl_13 TYPE scrtext_l VALUE 'Fecha' ##NO_TEXT,
- C_avl_14 TYPE scrtext_l VALUE 'Hora' ##NO_TEXT,
- C_avl_15 TYPE scrtext_l VALUE 'RC' ##NO_TEXT,
- C_avl_16 TYPE scrtext_l VALUE 'Descripcion' ##NO_TEXT,
- c_avl_17 TYPE scrtext_l VALUE 'G.Versiones' ##NO_TEXT,
- c_avl_18 TYPE scrtext_l VALUE 'Clave' ##NO_TEXT,
- c_avl_19 TYPE scrtext_l VALUE 'IMG' ##NO_TEXT,
- c_avl_20 TYPE scrtext_l VALUE 'Pos.' ##NO_TEXT,
- c_avl_21 TYPE scrtext_l VALUE 'Doc' ##NO_TEXT,
- c_avl_22 TYPE scrtext_l VALUE 'Descripcion' ##NO_TEXT,
- c_pop_01 TYPE scrtext_l VALUE 'En Dialogo' ##NO_TEXT,
- c_pop_02 TYPE scrtext_l VALUE 'En Fondo' ##NO_TEXT,
- c_pop_03 TYPE scrtext_l VALUE 'Mensaje confirmacion' ##NO_TEXT,
- c_pop_04 TYPE scrtext_l VALUE 'Ver LOG' ##NO_TEXT,
- c_pop_05 TYPE scrtext_l VALUE 'Simulacion' ##NO_TEXT,
- c_mark_fields_01(22) VALUE 'Opciones de liberacion' ##NO_TEXT,
- c_mark_fields_02(22) VALUE 'Bajo tu responsalidad' ##NO_TEXT,
- c_msg_01 TYPE scrtext_l VALUE 'Tarea creada' ##NO_TEXT,
- c_msg_02 TYPE scrtext_l VALUE 'Cambios realizados' ##NO_TEXT,
- c_msg_03 TYPE scrtext_l VALUE 'Error, orden no permitida.' ##NO_TEXT,
- c_msg_04 TYPE scrtext_l VALUE 'Datos exportados al clipboard' ##NO_TEXT,
- c_msg_05 TYPE scrtext_l VALUE 'Máquina de destino' ##NO_TEXT,
- c_main_tit TYPE tstct-ttext VALUE 'Gestion de ordenes de transporte' ##NO_TEXT,
- C_scrfname TYPE scrfname VALUE 'CC_ALV_01' ##NO_TEXT,
- c_tcodes TYPE string VALUE 'ZE09|ZSE09|ZE10|ZSE10|ZE01|ZSE01' ##NO_TEXT.
- CLASS lcl_event_handler DEFINITION DEFERRED.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ INCLUDE Z_XX_I_ORDENES_TOP
- TABLES: sscrfields. "<-- Para los botones en el PF-STATUS
- TYPES: BEGIN OF ty_orden,
- trkorr TYPE e071-trkorr,
- as4user TYPE as4user,
- as4user_TXT(80),
- pgmid TYPE e071-pgmid,
- object TYPE e071-object,
- desc TYPE c LENGTH 100,
- trkorr_v TYPE e071-trkorr,
- fecha TYPE datum,
- vers TYPE char6,
- obj_name TYPE e071-obj_name,
- END OF ty_orden,
- BEGIN OF ty_sys,
- sys(30) ,
- END OF ty_sys,
- *--[ Se puede hacer dinamico, pero es mas facil trabajar
- *--[ de forma estatica.
- BEGIN OF ty_Zxx_st_ordenes,
- trkorr TYPE trkorr,
- log TYPE char10,
- doc TYPE char10,
- orden TYPE trkorr,
- tarea TYPE trkorr,
- as4user TYPE as4user,
- as4user_TXT(80),
- trfunction TYPE trfunction,
- trfunction_txt(30),
- sys01 TYPE sysysid,
- ico01 TYPE char10,
- dat01 TYPE datum,
- tim01 TYPE uzeit,
- rc01 TYPE sysubrc,
- sys02 TYPE sysysid,
- ico02 TYPE char10,
- dat02 TYPE datum,
- tim02 TYPE uzeit,
- rc02 TYPE sysubrc,
- sys03 TYPE sysysid,
- ico03 TYPE char10,
- dat03 TYPE datum,
- tim03 TYPE uzeit,
- rc03 TYPE sysubrc,
- sys04 TYPE sysysid,
- ico04 TYPE char10,
- dat04 TYPE datum,
- tim04 TYPE uzeit,
- rc04 TYPE sysubrc,
- as4text TYPE as4text,
- END OF ty_Zxx_st_ordenes,
- BEGIN OF ty_release,
- dialog(1),
- fondo(1),
- succes(1),
- log(1),
- simula(1),
- END OF ty_release,
- BEGIN OF ty_menu,
- id TYPE sy-ucomm,
- function TYPE ui_func,
- text TYPE gui_text,
- icon TYPE icon_d,
- ftype TYPE cua_ftyp,
- disabled TYPE cua_active,
- hidden TYPE cua_active,
- END OF ty_menu,
- BEGIN OF ty_toolbar,
- alv TYPE i,
- orden TYPE i,
- boton TYPE stb_button,
- menu TYPE ty_menu,
- END OF ty_toolbar,
- BEGIN OF ty_alv,
- grid TYPE REF TO cl_gui_alv_grid,
- layout TYPE lvc_s_layo,
- variant TYPE disvariant,
- fcat TYPE lvc_t_fcat,
- event TYPE REF TO lcl_event_handler,
- END OF ty_alv.
- DATA: t_menus TYPE STANDARD TABLE OF ty_toolbar,
- s_menus LIKE LINE OF t_menus,
- st_system_types LIKE ko100 OCCURS 100,
- t_ALV TYPE STANDARD TABLE OF ty_alv,
- g_ALV LIKE LINE OF t_ALV.
- DATA: g_okcode TYPE sy-ucomm,
- t_fcode TYPE TABLE OF sy-ucomm,
- e_rc TYPE i,
- index_rows TYPE lvc_t_row,
- G_rele_param TYPE ty_release,
- tt_system TYPE STANDARD TABLE OF tmscsys,
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Definiciones ALV
- cc_01 TYPE REF TO cl_gui_custom_container,
- cm_01 TYPE scrfname VALUE C_scrfname,
- G_Split TYPE REF TO cl_gui_splitter_container,
- G_Split_2 TYPE REF TO cl_gui_splitter_container,
- t_tab_00 TYPE STANDARD TABLE OF ty_sys,
- t_tab_01 TYPE STANDARD TABLE OF ty_Zxx_st_ordenes,
- t_tab_03 TYPE STANDARD TABLE OF ty_Zxx_st_ordenes,
- t_tab_02 TYPE STANDARD TABLE OF ty_orden,
- l_tab_01 LIKE LINE OF t_tab_01,
- dir_trans(1024),
- gt_toolbar TYPE ui_functions.
- CLASS lcl_event_handler DEFINITION FINAL.
- PUBLIC SECTION .
- DATA: p_id_list TYPE sysubrc,
- g_row_id TYPE lvc_s_row.
- METHODS:
- handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
- IMPORTING e_object, " e_interactive,
- handle_menu_button
- FOR EVENT menu_button OF cl_gui_alv_grid
- IMPORTING e_object e_ucomm,
- handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
- IMPORTING e_ucomm .
- METHODS:handle_hotspot_click
- FOR EVENT hotspot_click OF cl_gui_alv_grid
- IMPORTING e_row_id e_column_id,
- handle_context_menu
- FOR EVENT context_menu_request OF cl_gui_alv_grid
- IMPORTING e_object.
- PRIVATE SECTION.
- * DATA: lt_std_fcodes TYPE ui_functions,
- * lt_own_fcodes TYPE ui_functions.
- METHODS:
- get_id_list.
- ENDCLASS.
- DATA: G_event_01 TYPE REF TO lcl_event_handler,
- G_event_02 TYPE REF TO lcl_event_handler.
- CLASS lcl_event_handler IMPLEMENTATION .
- METHOD get_id_list.
- p_id_list = 1.
- IF me = t_alv[ 2 ]-event. p_id_list = 2. ENDIF.
- ENDMETHOD.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ AVL
- METHOD handle_hotspot_click.
- me->get_id_list( ). PERFORM handle_hotspot USING e_row_id e_column_id me->p_id_list.
- ENDMETHOD.
- METHOD handle_toolbar.
- me->get_id_list( ). PERFORM handle_toolbar USING e_object me->p_id_list.
- ENDMETHOD .
- METHOD handle_user_command .
- me->get_id_list( ). PERFORM handle_user_command USING e_ucomm me->p_id_list CHANGING g_row_id.
- ENDMETHOD.
- METHOD handle_context_menu.
- me->get_id_list( ). PERFORM handle_context_menu USING e_object CHANGING g_row_id.
- ENDMETHOD.
- METHOD handle_menu_button.
- me->get_id_list( ). PERFORM handle_menu_button USING e_object e_ucomm me->p_id_list.
- ENDMETHOD.
- ENDCLASS.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ INCLUDE Z_XX_I_ORDENES_SEL.
- TABLES: e071, e070, e07t, doktl.
- SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
- SELECT-OPTIONS: s_orden FOR e071-trkorr OBLIGATORY,
- s_obj FOR e071-obj_name,
- s_user FOR e070-as4user,
- s_date FOR e070-as4date.
- SELECTION-SCREEN SKIP 1.
- SELECT-OPTIONS:
- s_as4tex FOR e07t-as4text LOWER CASE,
- s_DOKTXT FOR doktl-doktext LOWER CASE.
- SELECTION-SCREEN SKIP 1.
- PARAMETERS: p_norel AS CHECKBOX DEFAULT abap_true,
- p_rel AS CHECKBOX DEFAULT abap_true,
- p_wb AS CHECKBOX DEFAULT abap_true,
- p_cus AS CHECKBOX DEFAULT abap_true,
- p_vers AS CHECKBOX DEFAULT abap_true.
- SELECTION-SCREEN SKIP 1.
- *--[ Como no sirve la lectura de la cola de transporte, ya que pueden haber
- *--[ m�s maquinas que no est�n en la capa de transporte y se transporte,
- *--[ lo pongo a manija, para que el luser lo modifique (VER INITIALIZATION)
- PARAMETERS: p_stms(30) OBLIGATORY. "<-- No sirve la cola de transportes... MEC!
- SELECTION-SCREEN END OF BLOCK b01.
- SELECTION-SCREEN SKIP 1.
- SELECTION-SCREEN COMMENT /01(40) g_vers.
- SELECTION-SCREEN FUNCTION KEY 1.
- SELECTION-SCREEN FUNCTION KEY 2.
- SELECTION-SCREEN FUNCTION KEY 3.
- SELECTION-SCREEN FUNCTION KEY 4.
- SELECTION-SCREEN FUNCTION KEY 5.
- *--[ Modules DYNPRO
- MODULE pbo_0100 OUTPUT. PERFORM pbo_0100. ENDMODULE.
- MODULE pai_0100 INPUT. PERFORM pai_0100. ENDMODULE.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ INCLUDE Z_XX_I_ORDENES_EVE.
- AT SELECTION-SCREEN.
- PERFORM eve_start_of_selection.
- INITIALIZATION.
- PERFORM eve_initialization.
- START-OF-SELECTION.
- PERFORM data_load.
- END-OF-SELECTION.
- PERFORM data_list.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ INCLUDE Z_XX_I_ORDENES_FRM2.
- FORM data_list.
- CALL SCREEN '0100'.
- ENDFORM.
- FORM eve_start_of_selection.
- CASE sscrfields-ucomm.
- WHEN 'FC01'. CALL TRANSACTION 'SE09'.
- WHEN 'FC02'. PERFORM create_new_request IN PROGRAM rddm0001 USING 'KWTCEO'.
- WHEN 'FC03'. PERFORM BUT_rename_owner.
- ENDCASE.
- ENDFORM.
- FORM BUT_Re_version USING p_orden.
- TYPES: BEGIN OF ty_e07t,
- desc(55),
- beg(1),
- vers TYPE n LENGTH 3,
- end(1),
- END OF ty_e07t,
- BEGIN OF ty_tot,
- obj_name TYPE e071-obj_name,
- num TYPE i,
- END OF ty_tot.
- DATA: l_txt TYPE ty_e07t,
- t_tot TYPE STANDARD TABLE OF ty_tot,
- l_tot LIKE LINE OF t_tot.
- CHECK p_vers = abap_true.
- CLEAR l_txt.
- REFRESH t_tot.
- l_txt-beg = '['. l_txt-end = ']'.
- SELECT SINGLE as4text INTO @DATA(l_txt_old) FROM e07t
- WHERE trkorr = @p_orden.
- CHECK l_txt_old NP '*[+++]'.
- l_txt-desc = l_txt_old.
- DATA(l_desc_old) = |{ l_txt-desc }%|. "<-- Buscamos una anterior
- DATA(l_desc_old_2) = |{ l_txt-desc }%[___]|.
- DATA l_new TYPE string.
- *--[ Evitamos las que no tienen numeración primero
- SELECT a~as4text INTO l_new FROM e07t AS a
- INNER JOIN e070 AS b
- ON b~strkorr = a~trkorr
- UP TO 1 ROWS
- WHERE a~langu = sy-langu
- AND a~as4text LIKE l_desc_old_2
- AND a~trkorr NE p_orden
- ORDER BY a~trkorr DESCENDING.
- ENDSELECT.
- IF l_new IS INITIAL.
- *--[ Si es nueva, buscamos la última
- SELECT a~as4text INTO l_new FROM e07t AS a
- INNER JOIN e070 AS b
- ON b~strkorr = a~trkorr
- UP TO 1 ROWS
- WHERE a~langu = sy-langu
- AND a~as4text LIKE l_desc_old
- AND a~trkorr NE p_orden
- ORDER BY a~trkorr DESCENDING.
- ENDSELECT.
- ENDIF.
- IF sy-subrc EQ 0 OR l_new IS NOT INITIAL.
- IF l_new CP '*[+++]'.
- l_txt = l_new.
- l_txt-vers += 1.
- ELSE.
- l_txt-desc = l_new.
- l_txt-vers = '001'.
- ENDIF.
- UPDATE e07t
- SET as4text = l_txt
- WHERE trkorr = p_orden
- AND langu = sy-langu.
- ELSE.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Buscamos a la antigua usanza
- SELECT b~obj_name FROM e070 AS a
- INNER JOIN e071 AS b
- ON b~trkorr = a~trkorr
- INTO CORRESPONDING FIELDS OF TABLE t_tot
- WHERE a~strkorr = p_orden.
- SORT t_tot. DELETE ADJACENT DUPLICATES FROM t_tot.
- LOOP AT t_tot ASSIGNING FIELD-SYMBOL(<f_tot>).
- SELECT COUNT( * ) INTO <f_tot>-num FROM e071 WHERE obj_name = <f_tot>-obj_name.
- ENDLOOP.
- SORT t_tot BY num DESCENDING.
- TRY.
- l_txt-vers = t_tot[ 1 ]-num.
- UPDATE e07t
- SET as4text = l_txt
- WHERE trkorr = p_orden
- AND langu = sy-langu.
- CATCH cx_root.
- ENDTRY.
- ENDIF.
- ENDFORM.
- FORM but_rename_owner.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Eliminamos la propiedad de la orden
- SELECT a~trkorr, b~as4user FROM e070 AS a
- INNER JOIN e070 AS b
- ON b~sTRKORR = a~trkorr AND
- b~as4user NE a~as4user
- WHERE a~as4user = @sy-uname AND
- a~trstatus IN ('D', 'L') AND
- a~strkorr IS INITIAL
- ORDER BY a~trkorr
- INTO TABLE @DATA(t_0).
- *--[ Eliminamos duplicados
- LOOP AT t_0 INTO DATA(l_0).
- DELETE t_0 WHERE trkorr = l_0-trkorr AND as4user NE l_0-as4user.
- ENDLOOP.
- *--[ Renombramos
- LOOP AT t_0 INTO l_0.
- PERFORM BUT_Re_version USING l_0-trkorr.
- UPDATE e070
- SET as4user = l_0-as4user
- WHERE trkorr = l_0-trkorr.
- AT LAST.
- MESSAGE s398(00) WITH c_msg_02.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM eve_initialization.
- g_vers = c_vers.
- sscrfields-functxt_01 = |@10@ SE09|.
- sscrfields-functxt_02 = |@0Y@ Orden|.
- sscrfields-functxt_03 = |@4F@ Cambiar Propietario+Version|.
- S_orden-sign = 'I'. S_orden-option = 'CP'. S_orden-low = sy-sysid && 'K*'. APPEND s_orden.
- s_user-sign = 'I'. s_user-option = 'EQ'. s_user-low = sy-uname. APPEND s_user.
- s_date-sign = 'I'. s_date-option = 'BT'. s_date-low = sy-datum - 15. s_date-high = sy-datum.
- * s_date-low = sy-datum - 30.
- APPEND s_date.
- p_rel = abap_false.
- p_norel = abap_true.
- *--[ Ver comentario en el par�metro
- IF sy-host CP 'g*'.
- P_stms = 'DS4>QS4>TS4>PS4'.
- ELSE.
- P_stms = 'DS4>IS4>PS4'.
- ENDIF.
- CALL FUNCTION 'TMS_MGR_READ_TRANSPORT_QUEUE'
- EXPORTING
- iv_count_only = abap_true
- iv_monitor = abap_true
- iv_progress_min = 1
- iv_progress_max = 100
- iv_expiration_date = sy-datum
- iv_allow_expired = abap_true
- TABLES
- tt_system = tt_system
- EXCEPTIONS
- read_config_failed = 1
- OTHERS = 2.
- IF sy-subrc <> 0.
- * Who cares!
- ENDIF.
- CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'DIR_TRANS'
- ID 'VALUE' FIELD dir_trans.
- PERFORM eve_initialization_tcode. "Egg Drop
- PERFORM cfg_toolbar_menu.
- DO 3 TIMES. APPEND g_alv TO t_alv. ENDDO.
- PERFORM get_system_types IN PROGRAM sapltr_objects TABLES st_system_types.
- ENDFORM.
- FORM eve_initialization_tcode.
- DATA: l_tstct TYPE tstct.
- SPLIT c_tcodes AT '|' INTO TABLE DATA(t_tcodes).
- LOOP AT t_tcodes INTO DATA(l_di).
- SELECT SINGLE * FROM tstct INTO CORRESPONDING FIELDS OF l_tstct
- WHERE tcode = l_di.
- CHECK sy-subrc NE 0.
- l_tstct-tcode = l_di.
- l_TSTCT-ttext = c_main_tit.
- CALL FUNCTION 'RPY_TRANSACTION_INSERT'
- EXPORTING
- transaction = l_tstct-tcode
- program = sy-repid
- dynpro = '1000'
- language = sy-langu
- development_class = '$TMP'
- transaction_type = 'R'
- shorttext = l_TSTCT-ttext
- professionel_user_transaction = abap_true
- html_enabled = abap_true
- java_enabled = abap_true
- wingui_enabled = abap_true
- EXCEPTIONS
- cancelled = 1
- already_exist = 2
- permission_error = 3
- name_not_allowed = 4
- name_conflict = 5
- illegal_type = 6
- object_inconsistent = 7
- db_access_error = 8
- OTHERS = 9.
- ENDLOOP.
- ENDFORM.
- FORM data_load.
- DATA: t_cofile TYPE ctslg_cofile,
- r_status TYPE RANGE OF e070-trstatus.
- DATA(mi_i) = COND #( WHEN p_norel = abap_true THEN 'I' ELSE 'E' ).
- r_status = VALUE #( ( sign = mi_i option = 'EQ' low = 'D' )
- ( sign = mi_i option = 'EQ' low = 'L' )
- ).
- mi_i = COND #( WHEN p_rel = abap_true THEN 'I' ELSE 'E' ).
- r_status = VALUE #( BASE r_status ( sign = mi_i option = 'EQ' low = 'O' )
- ( sign = mi_i option = 'EQ' low = 'R' )
- ( sign = mi_i option = 'EQ' low = 'N' )
- ).
- REFRESH: t_tab_02, t_tab_00, t_tab_01.
- SPLIT p_stms AT '>' INTO TABLE DATA(t_TS).
- T_tab_00 = VALUE #( FOR ls IN t_ts ( sys = ls ) ).
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Filtramos primero por documentación
- IF s_DOKTXT IS NOT INITIAL.
- DATA(ss_orden) = s_orden[].
- REFRESH s_orden.
- SELECT object AS low,
- 'I' AS sign,
- 'EQ' AS option
- FROM doktl
- APPENDING CORRESPONDING FIELDS OF TABLE @s_orden
- WHERE id = 'TA' AND
- typ = 'T' AND
- doktext IN @s_DOKTXT.
- IF sy-subrc NE 0.
- s_orden[] = ss_orden[].
- ENDIF.
- ENDIF.
- *--[ Buscamos objetos r�pido!
- IF lines( s_obj ) > 0.
- *--[ Si son funciones, buscamos algo más.
- SELECT DISTINCT funcname FROM funct INTO TABLE @DATA(t_funct)
- WHERE funcname IN @s_obj.
- IF sy-subrc EQ 0 AND lines( t_funct ) > 0.
- LOOP AT t_FUNCT INTO DATA(l_funct).
- DATA: l_funcname TYPE rs38l-name,
- l_GROUP TYPE rs38l-area,
- l_INCLUDE TYPE rs38l-include,
- l_prg_group TYPE trdir-name.
- l_FUNCNAME = l_funct-funcname.
- CALL FUNCTION 'FUNCTION_EXISTS'
- EXPORTING
- funcname = l_funcname
- IMPORTING
- group = l_group
- include = l_include
- EXCEPTIONS
- OTHERS = 1.
- IF sy-subrc EQ 0.
- s_obj = 'IEQ'. S_obj-low = l_include. APPEND s_obj.
- s_obj = 'IEQ'. S_obj-low = l_group. APPEND s_obj.
- CALL FUNCTION 'RS_PROGNAME_CONCATENATE'
- EXPORTING
- fugr_group = l_group
- IMPORTING
- fugr_progname_group = l_prg_group
- EXCEPTIONS
- OTHERS = 2.
- IF sy-subrc EQ 0.
- s_obj = 'IEQ'. S_obj-low = l_prg_group. APPEND s_obj.
- ENDIF.
- ENDIF.
- ENDLOOP.
- ENDIF.
- SELECT * FROM e071 INTO TABLE @DATA(t_objetos)
- WHERE obj_name IN @s_obj.
- IF s_DOKTXT IS INITIAL.
- refresh s_orden.
- endif.
- SELECT trkorr as LOW ,
- 'I' as SIGN,
- 'EQ' as option
- FROM e071 APPENDING CORRESPONDING FIELDS OF table @s_orden
- WHERE obj_name IN @s_obj.
- ENDIF.
- *--[ Estamos en una b�quedas compleja, ya que la tabla E070, puede tener �rdenes y tareas
- *--[ y las diferentes b�squedas de objeto, luser, descripci�n lo hacen complejo.
- *--[ Puede (seguro) tener fallos
- SELECT strkorr AS orden
- trkorr AS tarea
- as4user
- as4date AS dat01
- FROM e070 INTO CORRESPONDING FIELDS OF TABLE t_tab_01 ##TOO_MANY_ITAB_FIELDS
- WHERE trkorr IN s_orden AND
- strkorr NE e070-strkorr
- AND trstaTus IN r_status.
- *--[ Recuperamos todas las ordenes
- SELECT trkorr AS orden
- as4user
- as4date AS dat01
- FROM e070 APPENDING CORRESPONDING FIELDS OF TABLE t_tab_01 ##TOO_MANY_ITAB_FIELDS
- WHERE trkorr IN s_orden AND
- strkorr EQ e070-strkorr
- AND trstaTus IN r_status.
- *--[ Eliminamos �rdenes duplicadas
- *--[ Nos cargamos las fechas
- DELETE t_tab_01 WHERE as4user NOT IN s_user OR
- dat01 NOT IN s_date.
- SORT t_tab_01 BY tarea DESCENDING.
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<fo>) WHERE tarea IS NOT INITIAL.
- DELETE t_tab_01 WHERE orden = <fo>-orden AND tarea IS INITIAL.
- ENDLOOP.
- *--[ Añadimos todas las tareas de las �rdenes
- IF lines( t_tab_01 ) > 0.
- SELECT strkorr AS orden
- trkorr AS tarea
- as4user
- as4date AS Dat01
- FROM e070
- INTO CORRESPONDING FIELDS OF TABLE t_tab_03
- FOR ALL ENTRIES IN t_tab_01
- WHERE strkorr = t_tab_01-orden AND trstaTus IN r_status.
- *--[ Buscamos las �rdenes solitarias
- SELECT trkorr AS orden,
- as4user,
- trfunction AS trfunction,
- as4date AS Dat01 FROM e070
- INTO TABLE @DATA(t_tab_04)
- FOR ALL ENTRIES IN @t_tab_01
- WHERE trkorr = @t_tab_01-orden AND trstaTus IN @r_status AND strkorr = @e070-trkorr.
- LOOP AT t_tab_04 INTO DATA(l_4).
- TRY.
- DATA(l_lobo) = t_tab_03[ orden = l_4-orden ].
- CATCH cx_root.
- CLEAR l_tab_01.
- MOVE-CORRESPONDING l_4 TO l_tab_01. APPEND l_tab_01 TO t_tab_03.
- CONTINUE.
- ENDTRY.
- DELETE t_tab_04 WHERE orden = l_4-orden.
- ENDLOOP.
- SORT t_tab_03.
- DELETE ADJACENT DUPLICATES FROM t_tab_03.
- t_tab_01[] = t_tab_03[].
- ENDIF.
- SORT t_tab_01 BY trkorr ASCENDING.
- DELETE ADJACENT DUPLICATES FROM t_tab_01.
- REFRESH t_tab_03.
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<f>).
- AT FIRST.
- SELECT domvalue_l AS value,
- ddtext AS value_TXT
- FROM dd07t
- INTO TABLE @DATA(t_func)
- WHERE domname = 'TRFUNCTION' AND
- ddlanguage = @sy-langu.
- LOOP AT t_func ASSIGNING FIELD-SYMBOL(<ftf>) WHERE value CA 'KWT'.
- <ftf>-value_TXT = COND #( WHEN <ftf>-value = 'K' THEN 'WB' ELSE COND #( WHEN <ftf>-value = 'W' THEN 'CUS' ELSE 'TC' ) ).
- ENDLOOP.
- ENDAT.
- READ TABLE t_tab_03 TRANSPORTING NO FIELDS WITH KEY orden = <f>-orden.
- CHECK sy-subrc NE 0.
- <f>-trkorr = <f>-orden.
- IF <f>-as4text IS INITIAL.
- SELECT SINGLE as4text INTO <f>-as4text FROM e07t
- WHERE trkorr = <f>-trkorr
- AND langu = sy-langu.
- ENDIF.
- IF <f>-as4text NOT IN s_as4tex.
- DELETE t_tab_01 WHERE Orden = <f>-orden.
- CONTINUE.
- ENDIF.
- *--[ Buscamos los objetos, va a ser muy lento
- IF lines( s_obj ) > 0.
- * SELECT single b~trkorr, b~strkorr FROM e071 AS a
- * INNER JOIN e070 AS b
- * ON b~trkorr = a~trkorr OR
- * b~strkorr = a~trkorr
- * INTO @data(t_aux)
- * WHERE
- * obj_name IN @s_obj and
- * ( b~trkorr = @<f>-orden or
- * b~Strkorr = @<f>-orden or
- * b~trkorr = @<f>-tarea ).
- LOOP AT t_objetos INTO DATA(l_objetos) WHERE trkorr = <f>-orden OR trkorr = <f>-tarea.
- EXIT.
- ENDLOOP.
- IF sy-subrc NE 0.
- DELETE t_tab_01 WHERE Orden = <f>-orden AND trkorr = <f>-tarea.
- CONTINUE.
- ENDIF.
- ENDIF.
- FREE t_cofile.
- TRY.
- CALL FUNCTION 'TR_READ_GLOBAL_INFO_OF_REQUEST'
- EXPORTING
- iv_trkorr = <f>-trkorr
- IMPORTING
- es_cofile = t_cofile
- ev_user = <f>-as4user.
- CATCH cx_root.
- CONTINUE. "<-- Por si peta
- ENDTRY.
- IF <f>-as4user IS INITIAL.
- SELECT SINGLE as4user as4date FROM e070 INTO (<f>-as4user, <f>-dat01)
- WHERE trkorr = <f>-orden.
- ENDIF.
- PERFORM GET_USEr USING <f>-as4user CHANGING <f>-as4user_TXT.
- LOOP AT t_COFILE-systems INTO DATA(l_dat).
- READ TABLE t_tab_00 TRANSPORTING NO FIELDS WITH KEY sys = l_dat-SYStemid.
- IF sy-subrc NE 0.
- CONTINUE.
- ENDIF.
- *--[ Gloria a los field-symbols
- DATA(l_val) = '<f>-SYS0' && sy-tabix. CONDENSE l_val NO-GAPS. ASSIGN (l_val) TO FIELD-SYMBOL(<fSYS>).
- l_val = '<f>-DAT0' && sy-tabix. CONDENSE l_val NO-GAPS. ASSIGN (l_val) TO FIELD-SYMBOL(<fDAT>).
- l_val = '<f>-TIM0' && sy-tabix. CONDENSE l_val NO-GAPS. ASSIGN (l_val) TO FIELD-SYMBOL(<fTIM>).
- l_val = '<f>-RC0' && sy-tabix. CONDENSE l_val NO-GAPS. ASSIGN (l_val) TO FIELD-SYMBOL(<fRC>).
- l_val = '<f>-ICO0' && sy-tabix. CONDENSE l_val NO-GAPS. ASSIGN (l_val) TO FIELD-SYMBOL(<fico>).
- <fsys> = l_dat-SYStemid.
- DATA(l_save) = abap_false.
- LOOP AT l_dat-steps INTO DATA(l_steps).
- CASE l_steps-stepid.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Esto seguramente se tendr� que ampliar
- WHEN 'E'. l_save = abap_true.
- WHEN 'G'. l_save = abap_true.
- WHEN 'V'. l_save = abap_true.
- ENDCASE.
- CHECK l_save = abap_true.
- *--[ Esto es para quedarnos con la �ltima entrada en tablas
- DATA(l_lin) = lines( l_steps-actions ).
- <fdat> = l_steps-actions[ l_lin ]-date.
- <ftim> = l_steps-actions[ l_lin ]-time.
- <fRC> = l_steps-actions[ l_lin ]-rc.
- CASE <frc>.
- WHEN 0. <fico> = icon_green_light.
- WHEN 4. <fico> = icon_yellow_light.
- WHEN 8. <fico> = icon_red_light.
- WHEN OTHERS. <fico> = icon_cancel.
- ENDCASE.
- CLEAR l_save.
- ENDLOOP.
- ENDLOOP.
- IF NOT <f>-ico01 IS INITIAL.
- <f>-log = icon_display_text.
- ENDIF.
- *--[ No me queda mas remedio que buscar again
- SELECT SINGLE trfunction INTO <f>-trfunction FROM e070
- WHERE trkorr = <f>-trkorr.
- <f>-trfunction_txt = t_func[ value = <f>-trfunction ]-value_txt.
- IF p_wb NE abap_true. CHECK <f>-trfunction_txt NE 'WB'. ENDIF.
- IF p_cus NE abap_true. CHECK <f>-trfunction_txt NE 'CUS'. ENDIF.
- SELECT SINGLE dokversion INTO @DATA(l_doc) FROM dokhl
- WHERE id = 'TA'
- AND object = @<f>-trkorr
- AND langu = @sy-langu
- AND typ = 'T'.
- IF sy-subrc EQ 0.
- <f>-doc = icon_document.
- ENDIF.
- APPEND <f> TO t_tab_03.
- ENDLOOP.
- t_tab_01[] = t_tab_03[].
- *--[ Las primeras serán las últimas
- SORT t_tab_01 BY as4user ASCENDING sys01 ASCENDING trfunction ASCENDING trkorr DESCENDING.
- sy-pagno = lines( t_tab_01 ).
- MESSAGE s580(00) WITH sy-pagno '' '' ''.
- ENDFORM.
- FORM pbo_0100.
- SET PF-STATUS 'MAIN0100' EXCLUDING t_fcode.
- SET TITLEBAR 'TIT01' WITH c_main_tit c_vers.
- CHECK cc_01 IS INITIAL.
- t_alv[ 1 ]-layout-sel_mode = 'A'.
- t_alv[ 1 ]-layout-zebra = abap_true.
- t_alv[ 1 ]-variant-report = sy-repid. t_alv[ 1 ]-variant-handle = '1'.
- t_alv[ 2 ]-variant-report = sy-repid. t_alv[ 1 ]-variant-handle = '2'.
- t_alv[ 3 ]-variant-report = sy-repid. t_alv[ 1 ]-variant-handle = '3'.
- t_alv[ 3 ]-layout = t_alv[ 1 ]-layout.
- t_alv[ 2 ]-layout = t_alv[ 1 ]-layout.
- * t_alv[ 1 ]-layout-cwidth_opt = abap_true.
- t_alv[ 2 ]-layout-cwidth_opt = abap_false.
- cc_01 = NEW cl_gui_custom_container( container_name = cm_01 ).
- G_SPlIT = NEW cl_gui_splitter_container( parent = cc_01
- rows = 2
- columns = 1 ).
- G_SPlIT_2 = NEW cl_gui_splitter_container( parent = G_SPlIT->get_container( row = 2 column = 1 )
- rows = 1
- columns = 2 ).
- t_alv[ 1 ]-grid = NEW cl_gui_alv_grid( i_parent = g_split->get_container( row = 1 column = 1 ) ).
- t_alv[ 2 ]-grid = NEW cl_gui_alv_grid( i_parent = g_split_2->get_container( row = 1 column = 1 ) ).
- t_alv[ 3 ]-grid = NEW cl_gui_alv_grid( i_parent = g_split_2->get_container( row = 1 column = 2 ) ).
- g_split->set_row_height( id = 2 height = 0 ).
- g_split_2->set_column_width( id = 2 width = 0 ).
- PERFORM ALV_field_catalog.
- PERFORM alv_remove_buttons.
- t_alv[ 1 ]-grid->set_table_for_first_display(
- EXPORTING
- is_variant = t_alv[ 1 ]-variant
- is_layout = t_alv[ 1 ]-layout
- i_save = 'A'
- it_toolbar_excluding = gt_toolbar
- CHANGING
- it_fieldcatalog = t_alv[ 1 ]-fcat "gt_field
- it_outtab = t_tab_01 ).
- t_alv[ 2 ]-grid->set_table_for_first_display(
- EXPORTING
- is_variant = t_alv[ 2 ]-variant
- is_layout = t_alv[ 2 ]-layout
- i_save = 'A'
- it_toolbar_excluding = gt_toolbar
- CHANGING
- it_fieldcatalog = t_alv[ 2 ]-fcat "gt_field
- it_outtab = t_tab_02 ).
- t_alv[ 1 ]-event = NEW lcl_event_handler( ).
- g_alv = t_alv[ 1 ].
- SET HANDLER g_alv-event->handle_toolbar FOR t_alv[ 1 ]-grid.
- SET HANDLER g_alv-event->handle_user_command FOR t_alv[ 1 ]-grid.
- SET HANDLER g_alv-event->handle_menu_button FOR t_alv[ 1 ]-grid.
- SET HANDLER g_alv-event->handle_hotspot_click FOR t_alv[ 1 ]-grid.
- SET HANDLER g_alv-event->handle_context_menu FOR t_alv[ 1 ]-grid.
- g_alv-grid->set_toolbar_interactive( ).
- t_alv[ 2 ]-event = NEW lcl_event_handler( ).
- g_alv = t_alv[ 2 ].
- SET HANDLER g_alv-event->handle_toolbar FOR t_alv[ 2 ]-grid.
- SET HANDLER g_alv-event->handle_user_command FOR t_alv[ 2 ]-grid.
- SET HANDLER g_alv-event->handle_hotspot_click FOR t_alv[ 2 ]-grid.
- g_alv-grid->set_toolbar_interactive( ).
- ENDFORM.
- FORM ALV_field_catalog.
- "REFRESH: t_alv[ 1 ]-fcat, t_alv[ 2 ]-fcat.
- t_alv[ 3 ]-fcat = VALUE #( ( fieldname = 'AS4POS' scrtext_l = C_avl_20 outputlen = 5 )
- ( fieldname = 'TABKEY' scrtext_l = C_avl_18 outputlen = 100 ) ).
- t_alv[ 2 ]-fcat = VALUE #( ( fieldname = 'TRKORR' scrtext_l = C_avl_01 hotspot = abap_true )
- ( fieldname = 'AS4USER' scrtext_l = C_avl_02 )
- ( fieldname = 'AS4USER_TXT' scrtext_l = C_avl_03 )
- ( fieldname = 'PGMID' scrtext_l = C_avl_04 )
- ( fieldname = 'OBJECT' scrtext_l = C_avl_05 )
- ( fieldname = 'DESC' scrtext_l = c_avl_22 )
- ( fieldname = 'TRKORR_V' scrtext_l = C_avl_06 )
- ( fieldname = 'FECHA' scrtext_l = C_avl_07 )
- ( fieldname = 'VERS' scrtext_l = c_avl_17 icon = abap_true hotspot = abap_true )
- ( fieldname = 'OBJ_NAME' scrtext_l = C_avl_08 outputlen = 120 hotspot = abap_true )
- ).
- t_alv[ 1 ]-fcat = VALUE #( ( fieldname = 'TRKORR' key = abap_true tabname = 'E070' hotspot = abap_true scrtext_l = C_avl_09 )
- ( fieldname = 'LOG' key = abap_true icon = abap_true hotspot = abap_true outputlen = 4 scrtext_l = C_avl_10 no_out = CONV #( COND #( WHEN p_rel = abap_false THEN abap_true ELSE abap_false ) ) )
- ( fieldname = 'DOC' key = abap_true icon = abap_true hotspot = abap_true outputlen = 4 scrtext_l = C_avl_21 )
- ( fieldname = 'AS4USER' key = abap_true scrtext_l = C_avl_02 )
- ( fieldname = 'AS4USER_txt' key = abap_true scrtext_l = C_avl_03 )
- ( fieldname = 'TRFUNCTION' key = abap_true scrtext_l = C_avl_05 outputlen = 1 no_out = abap_true )
- ( fieldname = 'TRFUNCTION_TXT ' key = abap_true scrtext_l = C_avl_11 outputlen = 6 )
- ).
- DATA: l_sysn TYPE n LENGTH 2.
- DATA(l_no_out) = COND #( WHEN p_rel IS INITIAL AND NOT p_norel IS INITIAL THEN abap_true ELSE abap_false ).
- DO lines( t_tab_00 ) TIMES.
- l_sysn = sy-index.
- t_alv[ 1 ]-fcat = VALUE #( BASE t_alv[ 1 ]-fcat ( fieldname = 'SYS' && l_sysn rollname = 'SYSYSID' no_out = abap_true scrtext_l = C_avl_12 outputlen = 3 )
- ( fieldname = 'ICO' && l_sysn icon = abap_true rollname = 'CHAR06' scrtext_l = t_tab_00[ l_sysn ] no_out = l_no_out )
- ( fieldname = 'DAT' && l_sysn rollname = 'DATUM' scrtext_l = C_avl_13 no_out = l_no_out )
- ( fieldname = 'TIM' && l_sysn rollname = 'UZEIT' scrtext_l = C_avl_14 no_out = l_no_out )
- ( fieldname = 'RC' && l_sysn rollname = 'SYSUBRC' scrtext_l = C_avl_15 no_out = l_no_out outputlen = 2 ) ).
- ENDDO.
- t_alv[ 1 ]-fcat = VALUE #( BASE t_alv[ 1 ]-fcat ( fieldname = 'AS4TEXT' outputlen = 60 scrtext_l = C_avl_16 ) ).
- ENDFORM.
- FORM alv_remove_buttons.
- gt_toolbar = VALUE #( ( cl_gui_alv_grid=>mc_fg_edit )
- ( cl_gui_alv_grid=>mc_mb_subtot )
- ( cl_gui_alv_grid=>mc_mb_sum )
- ( cl_gui_alv_grid=>mc_fc_detail )
- ( cl_gui_alv_grid=>mc_fc_help )
- ( cl_gui_alv_grid=>mc_fc_html )
- ( cl_gui_alv_grid=>mc_fc_info )
- ( cl_gui_alv_grid=>mc_mb_view )
- ( cl_gui_alv_grid=>mc_fc_print )
- ).
- ENDFORM.
- FORM pai_0100.
- CASE g_okcode.
- WHEN 'BACK'. PERFORM but_exit_program.
- ENDCASE.
- ENDFORM.
- FORM handle_context_menu USING e_object TYPE REF TO cl_ctmenu
- CHANGING g_row_id TYPE lvc_s_row.
- DATA: li_sel_col TYPE i.
- DATA: lt_std_fcodes TYPE ui_functions,
- lt_own_fcodes TYPE ui_functions.
- PERFORM MENU_add_options USING e_object.
- t_alv[ 1 ]-grid->get_current_cell( IMPORTING e_col = li_sel_col es_row_id = g_row_id ).
- cl_gui_cfw=>flush( ).
- e_object->hide_functions( EXPORTING fcodes = lt_std_fcodes ).
- e_object->show_functions( EXPORTING fcodes = lt_own_fcodes ).
- cl_gui_cfw=>flush( ).
- ENDFORM.
- FORM handle_user_command USING uv_ucomm TYPE sy-ucomm
- p_list
- CHANGING p_row_id TYPE lvc_s_row.
- CASE p_list.
- WHEN 1. t_alv[ 1 ]-grid->get_selected_rows( IMPORTING et_index_rows = index_rows ).
- WHEN 2. t_alv[ 2 ]-grid->get_selected_rows( IMPORTING et_index_rows = index_rows ).
- ENDCASE.
- IF NOT p_row_id IS INITIAL AND lines( index_rows ) = 0.
- REFRESH index_rows.
- APPEND p_row_id TO index_rows.
- ENDIF.
- CASE uv_ucomm.
- WHEN 'SE09' OR 'MC05'. CALL TRANSACTION 'SE09'.
- WHEN 'MC02'. PERFORM but_newo.
- WHEN 'MC04'. PERFORM but_incluir_orden.
- WHEN 'MC01'. PERFORM but_liberar_orden.
- * WHEN 'VIEW'. PERFORM BUT_ver_orden.
- WHEN 'MC12'. PERFORM BUT_change_username.
- WHEN 'MC09'. PERFORM but_delete.
- WHEN 'MC03'. PERFORM but_merge.
- WHEN 'MC15'. PERFORM but_add_task.
- WHEN 'MC07'. CALL TRANSACTION 'STMS'.
- WHEN 'MC14'. PERFORM but_codo_inspector.
- WHEN 'VERL'. PERFORM BUT_ver_log.
- WHEN 'MC10'. PERFORM BUT_download.
- WHEN 'MC11'. PERFORM BUT_upload.
- WHEN 'MC06'. PERFORM BUT_check_log.
- WHEN 'MC13'. PERFORM but_refrescar.
- WHEN 'MC08'. PERFORM BUT_exit_program.
- WHEN 'MC16'. PERFORM BUT_delete_object.
- WHEN 'MC17'. PERFORM BUT_add_objetcs.
- WHEN 'MC18'. PERFORM BUT_tits. "<-- Te gusta y lo sabes! ;)
- WHEN 'MC19'. PERFORM BUT_2_Clipboard.
- WHEN 'MC20'. PERFORM BUT_Transportar.
- WHEN 'MC22'. PERFORM but_documentacion.
- ENDCASE.
- CLEAR p_row_id.
- ENDFORM.
- FORM BUT_2_Clipboard.
- DATA: t_data TYPE STANDARD TABLE OF char255,
- l_s TYPE char255,
- e_rc TYPE i.
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) INDEX l_rows-index.
- l_s = |{ <f>-trkorr } { <f>-as4user } { <f>-as4text }|.
- APPEND l_s TO t_data.
- AT LAST.
- CALL METHOD cl_gui_frontend_services=>clipboard_export
- EXPORTING
- no_auth_check = abap_false
- IMPORTING
- data = t_data
- CHANGING
- rc = e_rc
- EXCEPTIONS
- cntl_error = 1
- error_no_gui = 2
- not_supported_by_gui = 3
- no_authority = 4
- OTHERS = 5.
- IF sy-subrc EQ 0.
- MESSAGE s398(00) WITH c_msg_04.
- ENDIF.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM BUT_Transportar.
- DATA: it_return TYPE STANDARD TABLE OF ddshretval.
- *--[ Soporte al POPUP
- TYPES: BEGIN OF ty_data_system,
- sysnam TYPE tmssysnam,
- systxt TYPE as4text,
- END OF ty_data_system.
- DATA:
- t_data_system TYPE STANDARD TABLE OF ty_data_system,
- l_data_system LIKE LINE OF t_data_system.
- LOOP AT index_rows INTO DATA(l_rows).
- AT FIRST.
- LOOP AT tt_system INTO DATA(l_s).
- l_data_system = CORRESPONDING #( l_s ).
- APPEND l_data_system TO t_data_system.
- ENDLOOP.
- CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
- EXPORTING
- retfield = 'SYSNAM'
- value_org = 'S'
- window_title = c_msg_05 "'Máquina de destino'
- TABLES
- value_tab = t_data_system
- return_tab = it_return
- EXCEPTIONS
- parameter_error = 1
- no_values_found = 2
- OTHERS = 3.
- IF sy-subrc NE 0 OR lines( it_return ) = 0.
- EXIT.
- ENDIF.
- DATA(l_sys) = it_return[ 1 ]-fieldval.
- DATA(l_system) = tt_system[ sysnam = l_sys ].
- ENDAT.
- READ TABLE t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) INDEX l_rows-index.
- DATA: it_clients TYPE stms_clients.
- it_clients = VALUE #( ( client = sy-mandt clitxt = 'Default' ) ).
- *--[ Función de transporte
- CALL FUNCTION 'TMS_UI_IMPORT_TR_REQUEST'
- EXPORTING
- iv_system = l_system-sysnam
- iv_domain = l_system-domnam
- iv_request = <f>-trkorr
- iv_tarcli = '100'
- iv_systxt = l_system-systxt
- iv_reqtxt = <f>-as4text
- iv_ctc_active = abap_false
- iv_some_active = abap_true
- iv_verbose = abap_false
- iv_expert_mode = abap_false
- iv_check_strategy = abap_true
- * it_requests = lt_tr_requests
- it_clients = it_clients
- * it_all_requests = gs_disque-t_req_all
- EXCEPTIONS
- cancelled_by_user = 1
- import_request_denied = 2
- import_request_failed = 3
- OTHERS = 99.
- AT LAST.
- PERFORM but_refrescar.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM BUT_tits.
- DATA: t_fields TYPE STANDARD TABLE OF sval.
- DATA(l_save) = abap_false.
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) INDEX l_rows-index.
- DATA(l_returncode) = abap_false.
- t_fields = VALUE #( ( tabname = 'E07T' fieldname = 'AS4TEXT' value = <f>-as4text field_obl = abap_true ) ).
- DATA(l_title) = |{ <f>-trkorr }-{ <f>-as4text }|.
- CALL FUNCTION 'POPUP_GET_VALUES'
- EXPORTING
- no_value_check = abap_true
- popup_title = l_title
- * START_COLUMN = '5'
- * START_ROW = '5'
- IMPORTING
- returncode = l_returncode
- TABLES
- fields = t_fields
- EXCEPTIONS
- error_in_fields = 1
- OTHERS = 2.
- IF sy-subrc EQ 0 AND l_returncode = abap_false.
- DATA(l_d) = t_fields[ 1 ]-value.
- IF l_d NE <f>-as4text.
- <f>-as4text = l_d.
- l_save = abap_true.
- UPDATE e07t
- SET as4text = l_d
- WHERE trkorr = <f>-trkorr AND
- langu = sy-langu.
- ENDIF.
- ENDIF.
- ENDLOOP.
- IF l_save = abap_true.
- t_alv[ 1 ]-grid->refresh_table_display( ).
- ENDIF.
- ENDFORM.
- FORM BUT_add_objetcs.
- DATA: pv_exit(1),
- l_is_request TYPE trwbo_request_header.
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_02 ASSIGNING FIELD-SYMBOL(<f>) INDEX l_rows-index.
- SELECT SINGLE * FROM e070 INTO CORRESPONDING FIELDS OF l_is_request
- WHERE trkorr = <f>-trkorr.
- IF l_is_request-trfunction NA 'CDFKOPT'.
- SELECT SINGLE * FROM e070 INTO CORRESPONDING FIELDS OF l_is_request
- WHERE trkorr = l_is_request-strkorr.
- ENDIF.
- l_is_request-clients_filled = abap_true.
- CALL FUNCTION 'TR_SELECT_AND_APPEND_OBJECTS'
- EXPORTING
- is_request = l_is_request
- EXCEPTIONS
- OTHERS = 1.
- IF sy-subrc NE 0.
- MESSAGE s398(00) WITH c_msg_03 '' '' ''.
- ENDIF.
- AT LAST.
- LOOP AT t_tab_01 INTO DATA(l_01) WHERE trkorr = l_is_request-tRKORR OR
- trkorr = l_is_request-strkorr.
- PERFORM data_load_02 USING sy-tabix.
- EXIT.
- ENDLOOP.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM but_codo_inspector.
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) INDEX l_rows-index.
- CALL FUNCTION 'TR_INSPECT_OBJECTS'
- EXPORTING
- iv_trkorr = <f>-trkorr
- EXCEPTIONS
- invalid_request = 1
- OTHERS = 2.
- ENDLOOP.
- ENDFORM.
- FORM but_add_task.
- DATA: lv_username TYPE sy-uname.
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_01 INTO l_tab_01 INDEX l_rows-index.
- AT FIRST.
- CALL FUNCTION 'TR_POPUP_INPUT_SAPUSER'
- EXPORTING
- iv_description = 'Crear tarea para el usuario'
- iv_title = 'Añadir empleado'
- CHANGING
- cv_username = lv_username
- EXCEPTIONS
- action_aborted_by_user = 1
- OTHERS = 2.
- ENDAT.
- CALL FUNCTION 'TRINT_INSERT_NEW_COMM'
- EXPORTING
- wi_kurztext = l_tab_01-as4text
- wi_trfunction = abap_true "l_tab_01-trfunction
- iv_username = lv_username
- wi_strkorr = l_tab_01-trkorr
- wi_client = sy-mandt
- EXCEPTIONS
- no_systemname = 1
- no_systemtype = 2
- no_authorization = 3
- db_access_error = 4
- file_access_error = 5
- enqueue_error = 6
- number_range_full = 7
- invalid_input = 8
- OTHERS = 9.
- CHECK sy-subrc EQ 0.
- MESSAGE s398(00) WITH c_msg_01 '' '' ''.
- ENDLOOP.
- ENDFORM.
- FORM but_refrescar.
- PERFORM data_load.
- t_alv[ 1 ]-grid->refresh_table_display( ).
- ENDFORM.
- FORM BUT_change_username.
- DATA: l_header TYPE trwbo_request_header,
- l_flag(1).
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) INDEX l_rows-index.
- CALL FUNCTION 'TRINT_CHANGE_USERNAME'
- EXPORTING
- wi_dialog = abap_true
- wi_trkorr = <f>-trkorr
- wi_user = e070-as4user
- wi_start_column = 30
- wi_start_row = 14
- IMPORTING
- es_request_header = l_header
- EXCEPTIONS
- already_released = 1
- e070_update_error = 2
- not_exist_e070 = 3
- user_does_not_exist = 4
- unallowed_user = 5
- user_not_authorized = 6
- wrong_client = 7
- file_access_error = 8.
- IF sy-subrc EQ 0.
- SELECT SINGLE as4user INTO <f>-as4user FROM e070
- WHERE trkorr = <f>-trkorr.
- PERFORM get_user USING <f>-as4user CHANGING <f>-as4user_TXT.
- l_flag = abap_true.
- ENDIF.
- AT LAST.
- CHECK l_flag = abap_true.
- t_alv[ 1 ]-grid->refresh_table_display( ).
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM but_upload.
- TYPES: BEGIN OF ty_files,
- full_pc(1024),
- full_sap(1024),
- END OF ty_files.
- DATA: t_tab_files TYPE filetable,
- t_tab_save TYPE STANDARD TABLE OF ty_files,
- l_tab_save LIKE LINE OF t_tab_save,
- l_filename(1024),
- dir_cofiles TYPE eps2filnam,
- dir_data TYPE eps2filnam,
- l_filepath(1024),
- rc TYPE sysubrc.
- DATA: l_path TYPE sapb-sappfad,
- l_target TYPE sapb-sappfad.
- CALL METHOD cl_gui_frontend_services=>file_open_dialog
- EXPORTING
- multiselection = abap_true
- CHANGING
- file_table = t_tab_files
- rc = rc
- EXCEPTIONS
- file_open_dialog_failed = 1
- cntl_error = 2
- error_no_gui = 3
- not_supported_by_gui = 4
- OTHERS = 5.
- IF sy-subrc <> 0 OR lines( t_tab_files ) <= 0.
- EXIT.
- ENDIF.
- LOOP AT t_tab_files INTO DATA(l_files).
- AT FIRST.
- dir_cofiles = dir_trans && '/cofiles/'.
- dir_data = dir_trans && '/data/'.
- ENDAT.
- CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH'
- EXPORTING
- full_name = l_files-filename
- IMPORTING
- stripped_name = l_filename
- file_path = l_filepath
- EXCEPTIONS
- x_error = 1
- OTHERS = 2.
- IF sy-subrc EQ 0.
- * l_tab_save-full_pc = l_files-filename.
- * l_tab_save-full_sap = COND #( WHEN l_filename+0(1) CA 'RD' THEN dir_data && l_filename else dir_data && l_filename ).
- *
- * APPEND l_tab_save TO t_tab_save.
- t_tab_save = VALUE #( BASE t_tab_save ( full_pc = l_files-filename
- full_sap = COND #( WHEN l_filename+0(1) CA 'RD' THEN dir_data && l_filename ELSE dir_data && l_filename ) ) ).
- ENDIF.
- AT LAST.
- LOOP AT t_tab_save INTO l_tab_save.
- l_path = l_tab_save-full_pc.
- l_target = l_tab_save-full_sap.
- CALL FUNCTION 'ARCHIVFILE_CLIENT_TO_SERVER'
- EXPORTING
- path = l_path
- targetpath = l_target
- EXCEPTIONS
- error_file = 99
- OTHERS = 99.
- ENDLOOP.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM BUT_download.
- TYPES: BEGIN OF ty_files,
- full(1024).
- INCLUDE STRUCTURE eps2fili.
- TYPES:
- END OF ty_files.
- DATA: dir_cofiles TYPE eps2filnam,
- dir_data TYPE eps2filnam,
- t_tab_cofiles TYPE STANDARD TABLE OF eps2fili,
- t_tab_data TYPE STANDARD TABLE OF eps2fili,
- t_tab_files TYPE STANDARD TABLE OF ty_files,
- l_tab_files LIKE LINE OF t_tab_files,
- l_str01 TYPE string,
- l_str02 TYPE string,
- l_str03 TYPE string.
- LOOP AT index_rows INTO DATA(l_rows).
- AT FIRST.
- dir_cofiles = dir_trans && '/cofiles'.
- dir_data = dir_trans && '/data'.
- CALL FUNCTION 'EPS2_GET_DIRECTORY_LISTING'
- EXPORTING
- iv_dir_name = dir_cofiles
- file_mask = '*.*'
- TABLES
- dir_list = t_tab_cofiles
- EXCEPTIONS
- invalid_eps_subdir = 1
- sapgparam_failed = 2
- build_directory_failed = 3
- no_authorization = 4
- read_directory_failed = 5
- too_many_read_errors = 6
- empty_directory_list = 7
- OTHERS = 8.
- CALL FUNCTION 'EPS2_GET_DIRECTORY_LISTING'
- EXPORTING
- iv_dir_name = dir_data
- file_mask = '*.*'
- TABLES
- dir_list = t_tab_data
- EXCEPTIONS
- invalid_eps_subdir = 1
- sapgparam_failed = 2
- build_directory_failed = 3
- no_authorization = 4
- read_directory_failed = 5
- too_many_read_errors = 6
- empty_directory_list = 7
- OTHERS = 8.
- ENDAT.
- READ TABLE t_tab_01 INTO l_tab_01 INDEX l_rows-index.
- DATA(l_num) = '*' && l_tab_01-trkorr+4 && '*'.
- LOOP AT t_tab_cofiles INTO DATA(l_01) WHERE name CP l_num.
- CLEAR l_tab_files.
- MOVE-CORRESPONDING l_01 TO l_tab_files.
- l_tab_files-full = dir_cofiles && '/' && l_01-name.
- APPEND l_tab_files TO t_tab_files.
- ENDLOOP.
- LOOP AT t_tab_data INTO l_01 WHERE name CP l_num.
- CLEAR l_tab_files.
- MOVE-CORRESPONDING l_01 TO l_tab_files.
- l_tab_files-full = dir_data && '/' && l_01-name.
- APPEND l_tab_files TO t_tab_files.
- ENDLOOP.
- AT LAST.
- LOOP AT t_tab_files INTO l_tab_files.
- AT FIRST.
- CALL METHOD cl_gui_frontend_services=>file_save_dialog
- EXPORTING
- default_file_name = 'ordenes.txt'
- CHANGING
- filename = l_str01
- path = l_str02
- fullpath = l_str03
- EXCEPTIONS
- cntl_error = 1
- error_no_gui = 2
- not_supported_by_gui = 3
- invalid_default_file_name = 4
- OTHERS = 5.
- IF sy-subrc <> 0 OR l_str02 IS INITIAL.
- EXIT. "<-- Nada que descargar
- ENDIF.
- ENDAT.
- *--[ Descargamos los ficheros
- DATA: l_path TYPE sapb-sappfad,
- l_target TYPE sapb-sappfad.
- l_path = l_tab_files-full.
- l_target = l_str02 && '\' && l_tab_files-name.
- REPLACE ALL OCCURRENCES OF '//' IN l_target WITH '/'.
- CALL FUNCTION 'ARCHIVFILE_SERVER_TO_CLIENT'
- EXPORTING
- path = l_path
- targetpath = l_target
- EXCEPTIONS
- error_file = 1
- OTHERS = 2.
- ENDLOOP.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM but_documentacion.
- LOOP AT index_rows INTO DATA(l_rows).
- PERFORM but_documentacion_WORK USING l_rows-index.
- ENDLOOP.
- ENDFORM.
- FORM but_documentacion_WORK USING p_indice.
- DATA: t_docu TYPE STANDARD TABLE OF tline,
- l_docu LIKE LINE OF t_docu,
- t_lines TYPE STANDARD TABLE OF char72,
- s_lines LIKE LINE OF t_lines.
- READ TABLE t_tab_01 ASSIGNING FIELD-SYMBOL(<f>) INDEX p_indice.
- REFRESH t_docu.
- CALL FUNCTION 'TRINT_DOCU_INTERFACE'
- EXPORTING
- iv_object = <f>-trkorr
- TABLES
- tt_line = t_docu
- EXCEPTIONS
- error = 0.
- LOOP AT t_docu INTO l_docu.
- s_lines = l_docu-tdline .
- APPEND s_lines TO t_lines.
- ENDLOOP.
- CALL FUNCTION 'TERM_CONTROL_EDIT'
- EXPORTING
- titel = |{ c_quick_22 }: { <f>-trkorr }|
- langu = sy-langu
- TABLES
- textlines = t_lines
- EXCEPTIONS
- user_cancelled = 1
- OTHERS = 2.
- IF sy-subrc EQ 0.
- IF lines( t_lines ) > 0.
- REFRESH t_docu.
- LOOP AT t_lines INTO s_lines.
- l_docu-tdformat = '/'.
- l_docu-tdline = s_lines.
- APPEND l_docu TO t_docu.
- ENDLOOP.
- CALL FUNCTION 'TRINT_DOCU_INTERFACE'
- EXPORTING
- iv_action = 'M'
- iv_modify_appending = ' '
- iv_object = <f>-trkorr
- TABLES
- tt_line = t_docu
- EXCEPTIONS
- error = 0.
- <f>-doc = icon_document.
- ELSE.
- CLEAR <f>-doc.
- ENDIF.
- ENDIF.
- ENDFORM.
- FORM but_delete.
- DATA: lt_deleted_tasks TYPE cts_trkorrs.
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_01 INTO l_tab_01 INDEX l_rows-index.
- *--[ Eliminamos las tareas
- SELECT * FROM e070 INTO TABLE @DATA(T_tareas)
- WHERE Strkorr = @l_tab_01-trkorr AND
- ( trstatus = 'D' OR trstatus = 'L' ).
- LOOP AT t_tareas INTO DATA(l_tareas).
- CALL FUNCTION 'TR_DELETE_COMM'
- EXPORTING
- wi_dialog = abap_true
- wi_trkorr = l_tareas-trkorr
- IMPORTING
- et_deleted_tasks = lt_deleted_tasks
- EXCEPTIONS
- OTHERS = 1.
- ENDLOOP.
- REFRESH t_tareas.
- *--[ Eliminamos la orden
- SELECT * FROM e070 INTO TABLE T_tareas
- WHERE Strkorr = l_tab_01-trkorr.
- IF lines( t_tareas ) = 0.
- CALL FUNCTION 'TR_DELETE_COMM'
- EXPORTING
- wi_dialog = abap_true
- wi_trkorr = l_tab_01-trkorr
- IMPORTING
- et_deleted_tasks = lt_deleted_tasks
- EXCEPTIONS
- OTHERS = 1.
- ENDIF.
- REFRESH T_tareas.
- SELECT SINGLE * FROM e070 INTO @DATA(l_o) WHERE trkorr = @l_tab_01-trkorr.
- IF sy-subrc EQ 0.
- DELETE t_tab_01 INDEX l_rows-index.
- t_alv[ 1 ]-grid->REFRESH_table_display( ).
- ENDIF.
- ENDLOOP.
- ENDFORM.
- FORM but_liberar_orden_inc USING p_orden.
- DATA: l_orden TYPE e070-trkorr,
- es_request TYPE trwbo_request,
- et_deleted_tasks TYPE trwbo_t_e070.
- l_orden = p_orden.
- CHECK NOT l_orden IS INITIAL.
- CALL FUNCTION 'TR_RELEASE_REQUEST'
- EXPORTING
- iv_trkorr = l_orden
- iv_dialog = G_rele_param-dialog
- iv_as_background_job = G_rele_param-fondo
- iv_success_message = G_rele_param-succes
- iv_display_export_log = g_rele_param-log
- iv_simulation = G_rele_param-simula
- IMPORTING
- es_request = es_request
- et_deleted_tasks = et_deleted_tasks
- EXCEPTIONS
- OTHERS = 0.
- ENDFORM.
- FORM but_liberar_orden.
- DATA: ev_exit(1).
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_01 INTO l_tab_01 INDEX l_rows-index.
- SELECT * FROM e070 INTO TABLE @DATA(t_rele)
- WHERE strkorr = @l_tab_01-trkorr
- AND ( trstaTus = 'D' OR trstaTus = 'L' ).
- LOOP AT t_rele INTO DATA(l_rele).
- AT FIRST.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Reversionamos antes de liberar
- IF p_vers = abap_true.
- PERFORM BUT_Re_version USING l_tab_01-trkorr.
- ENDIF.
- UPDATE e070
- SET as4user = sy-uname
- WHERE trkorr = l_tab_01-trkorr.
- PERFORM but_liberar_orden_param.
- ENDAT.
- UPDATE e070
- SET as4user = sy-uname
- WHERE trkorr = l_rele-trkorr.
- PERFORM but_liberar_orden_inc USING l_rele-trkorr.
- UPDATE e070
- SET as4user = l_rele-as4user
- WHERE trkorr = l_rele-trkorr.
- AT LAST.
- *--[ Devolvemos el luser original.
- UPDATE e070
- SET as4user = l_tab_01-as4user
- WHERE trkorr = l_tab_01-trkorr.
- ENDAT.
- ENDLOOP.
- *--[ Orden sin tareas
- IF lines( t_rele ) = 0. PERFORM but_liberar_orden_param. ENDIF.
- PERFORM but_liberar_orden_inc USING l_tab_01-trkorr.
- UPDATE e070
- SET as4user = l_tab_01-as4user
- WHERE trkorr = l_tab_01-trkorr.
- ev_exit = abap_true.
- ENDLOOP.
- CHECK Ev_exit = abap_true.
- PERFORM but_refrescar.
- ENDFORM.
- FORM but_liberar_orden_param.
- DATA: t_fields TYPE STANDARD TABLE OF mcs01,
- t_marked_fields TYPE STANDARD TABLE OF mcs01.
- IF G_rele_param IS INITIAL.
- G_rele_param-dialog = g_rele_param-succes = G_rele_param-log = abap_true.
- ENDIF.
- t_fields = VALUE #( ( fieldname = 'DIALOG' scrtext_l = c_pop_01 )
- ( fieldname = 'FONDO' scrtext_l = c_pop_02 )
- ( fieldname = 'SUCCES' scrtext_l = c_pop_03 )
- ( fieldname = 'LOG' scrtext_l = c_pop_04 )
- ( fieldname = 'SIMULA' scrtext_l = c_pop_05 )
- ).
- t_marked_fields = VALUE #( ( fieldname = 'DIALOG' ) ( fieldname = 'SUCCES' ) ( fieldname = 'LOG' ) ).
- CALL FUNCTION 'MC_POPUP_TO_MARK_FIELDS'
- EXPORTING
- i_fields_marked = abap_false
- i_field_number_min = 0
- i_mark_by_table = abap_true
- i_object_name_plural = ''
- i_object_name_singular = ''
- i_popup_title = c_mark_fields_01
- i_textline = c_mark_fields_01
- i_text_length = 50
- TABLES
- t_fields = t_fields
- t_marked_fields = t_marked_fields
- EXCEPTIONS
- unvalid_text_length = 1
- OTHERS = 2.
- IF sy-subrc EQ 0.
- LOOP AT t_marked_fields INTO DATA(l_f).
- AT FIRST.
- CLEAR g_rele_param.
- ENDAT.
- DATA(l_txt) = to_upper( 'G_rele_param-' && l_f-fieldname ).
- ASSIGN (l_txt) TO FIELD-SYMBOL(<ff>).
- CHECK sy-subrc EQ 0.
- <ff> = abap_true.
- ENDLOOP.
- ENDIF.
- ENDFORM.
- FORM but_incluir_orden.
- DATA: cv_exit(1).
- IF lines( index_rows ) = 1.
- READ TABLE t_tab_01 INTO l_tab_01 INDEX index_rows[ 1 ]-index.
- PERFORM copy_object_list IN PROGRAM saplstrh
- USING l_tab_01-trkorr abap_false
- CHANGING cv_exit.
- ELSE.
- MESSAGE s398(00) WITH C_There_can_be_only_one '' '' ''.
- ENDIF.
- ENDFORM.
- FORM but_merge.
- DATA: ev_trkorr_from LIKE e070-trkorr,
- es_request_to TYPE trwbo_request,
- is_request_from TYPE trwbo_request.
- IF lines( index_rows ) = 1.
- READ TABLE t_tab_01 INTO l_tab_01 INDEX index_rows[ 1 ]-index.
- SELECT SINGLE * FROM e070 INTO CORRESPONDING FIELDS OF is_request_from-h
- WHERE trkorr = l_tab_01-trkorr.
- is_request_from-h-as4text = l_tab_01-as4text.
- is_request_from-h-clients_filled =
- is_request_from-objects_filled =
- is_request_from-attributes_filled =
- is_request_from-h-as4text_filled = abap_true.
- is_request_from-h-client = sy-mandt.
- CALL FUNCTION 'TR_MERGE_REQUESTS'
- EXPORTING
- is_request_from = is_request_from "
- iv_request_choice = abap_true
- iv_with_dialog = abap_true
- IMPORTING
- ev_trkorr_from = ev_trkorr_from
- es_request_to = es_request_to
- EXCEPTIONS
- OTHERS = 7.
- ELSE.
- MESSAGE s398(00) WITH C_There_can_be_only_one '' '' ''.
- ENDIF.
- ENDFORM.
- FORM but_newo.
- IF lines( index_rows ) = 1.
- READ TABLE t_tab_01 INTO l_tab_01 INDEX 1.
- DATA: lt_users TYPE trwbo_users .
- SELECT as4user AS user FROM e070
- INTO CORRESPONDING FIELDS OF TABLE lt_users
- WHERE strkorr = l_tab_01-trkorr.
- SELECT SINGLE * FROM e070 INTO @DATA(l_e070)
- WHERE trkorr = @l_tab_01-trkorr.
- CALL FUNCTION 'TR_REQUEST_MODIFY'
- EXPORTING
- iv_action = 'CREA'
- iv_new_request_type = l_tab_01-trfunction
- iv_new_task_type = abap_true
- iv_new_tarsystem = l_e070-tarsystem
- iv_new_as4text = l_tab_01-as4text
- it_users = lt_users
- iv_new_repoid = ''
- EXCEPTIONS
- OTHERS = 1.
- ELSE.
- PERFORM create_new_request IN PROGRAM rddm0001 USING 'KWTCEO'.
- ENDIF.
- ENDFORM.
- FORM handle_hotspot USING e_row_id TYPE lvc_s_row
- e_column_id TYPE lvc_s_col
- p_list.
- CASE e_column_id.
- WHEN 'DOC'.
- PERFORM but_documentacion_WORK USING e_row_id-index.
- t_alv[ 1 ]-grid->refresh_table_display( ).
- WHEN 'LOG'.
- READ TABLE t_tab_01 INTO DATA(l_01) INDEX e_row_id-index.
- IF NOT l_01-log IS INITIAL.
- SUBMIT rddprott AND RETURN
- WITH pv_korr = l_01-trkorr.
- ENDIF.
- WHEN 'OBJ_NAME'.
- READ TABLE t_tab_02 INTO DATA(l_02) INDEX e_row_id-index.
- IF l_02-pgmid = 'R3TR' AND ( l_02-object = 'TABU' OR l_02-object CP '*DAT' ).
- SELECT as4pos, tabkey FROM e071k INTO TABLE @DATA(T_tab_22)
- WHERE trkorr = @l_02-trkorr
- AND pgmid = @l_02-pgmid AND
- ( ( object = @l_02-object AND objname = @l_02-obj_name ) OR
- ( mastertype = @l_02-object AND mastername = @l_02-obj_name ) ).
- IF sy-subrc EQ 0.
- g_split_2->set_column_width( id = 2 width = 20 ).
- t_alv[ 1 ]-layout-sel_mode = 'C'.
- t_alv[ 3 ]-grid->set_table_for_first_display(
- EXPORTING
- is_variant = t_alv[ 3 ]-variant
- is_layout = t_alv[ 3 ]-layout
- i_save = 'A'
- it_toolbar_excluding = gt_toolbar
- CHANGING
- it_fieldcatalog = t_alv[ 3 ]-fcat "gt_field
- it_outtab = t_tab_22 ).
- t_alv[ 3 ]-grid->refresh_table_display( ).
- ENDIF.
- ELSE.
- g_split_2->set_column_width( id = 2 width = 0 ).
- CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
- EXPORTING
- iv_pgmid = l_02-pgmid
- iv_object = l_02-object
- iv_obj_name = l_02-obj_name
- iv_action = 'SHOW'
- EXCEPTIONS
- jump_not_possible = 1
- OTHERS = 2.
- IF sy-subrc <> 0.
- * Implement suitable error handling here
- ENDIF.
- ENDIF.
- WHEN 'VERS'.
- READ TABLE t_tab_02 INTO DATA(l_22) INDEX e_row_id-index.
- DATA: object_type LIKE vrsd-objtype,
- object_name LIKE vrsd-objname.
- object_name = l_22-obj_name.
- object_type = l_22-object.
- CALL FUNCTION 'SVRS_DISPLAY_DIRECTORY_NEW'
- EXPORTING
- object_type = object_type
- object_name = object_name
- display = abap_true
- compare = abap_true
- compare_remote = abap_true
- recall = abap_true
- EXCEPTIONS
- OTHERS = 2. "#EC FB_RC
- WHEN 'TRKORR'.
- IF p_list = 1.
- g_split_2->set_column_width( id = 2 width = 0 ).
- g_split->get_row_height( EXPORTING id = 2 IMPORTING result = e_rc ) .
- IF e_rc = 0.
- * g_split->SET_ROW_HEIGHT( id = 1 height = 60 ).
- g_split->set_row_height( id = 2 height = 40 ).
- ENDIF.
- PERFORM data_load_02 USING e_row_id-index.
- ELSEIF p_list = 2.
- DATA(l_orden) = t_tab_02[ e_row_id-index ]-trkorr.
- CALL FUNCTION 'TR_DISPLAY_REQUEST'
- EXPORTING
- i_trkorr = l_orden
- i_operation = 'DISPLAY'.
- ENDIF.
- ENDCASE.
- ENDFORM.
- FORM data_load_02 USING p_index.
- TRY.
- DATA(l_orden) = t_tab_01[ p_index ]-trkorr.
- DATA(l_user) = t_tab_01[ p_index ]-as4user.
- CATCH cx_root.
- EXIT.
- ENDTRY.
- SELECT * FROM e070 AS a
- INNER JOIN e071 AS b
- ON b~trkorr = a~trkorr
- INTO CORRESPONDING FIELDS OF TABLE t_tab_02
- WHERE a~trkorr = l_orden OR
- a~strkorr = l_orden.
- DELETE t_tab_02 WHERE pgmid EQ 'CORR'.
- SORT t_tab_02 BY trkorr pgmid object obj_name.
- DELETE ADJACENT DUPLICATES FROM t_tab_02 .
- LOOP AT t_tab_02 ASSIGNING FIELD-SYMBOL(<g>).
- <g>-vers = '@10@'.
- TRY.
- <g>-desc = st_system_types[ pgmid = <g>-pgmid object = <g>-object ]-text.
- CATCH cx_root.
- ENDTRY.
- PERFORM GET_USEr USING <g>-as4user CHANGING <g>-as4user_TXT.
- SELECT SINGLE korrnum datum INTO (<g>-trkorr_v, <g>-fecha) FROM vrsd
- WHERE objtype = <g>-object
- AND objname = <g>-obj_name
- AND versno = '00000'.
- ENDLOOP.
- *--[ Maquillamos columnas para hacerlo m�s bonito
- t_alv[ 2 ]-grid->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = t_alv[ 2 ]-fcat ).
- LOOP AT t_alv[ 2 ]-fcat ASSIGNING FIELD-SYMBOL(<fc>) WHERE no_out = abap_true.
- <fc>-no_out = abap_false.
- ENDLOOP.
- DATA(col_03) = 1.
- LOOP AT t_tab_02 ASSIGNING <g>.
- IF <g>-trkorr_v IS INITIAL. DATA(col_01) = 1. ENDIF.
- IF <g>-fecha IS INITIAL. DATA(col_02) = 1. ENDIF.
- IF <g>-as4user NE l_user. CLEAR col_03. ENDIF.
- ENDLOOP.
- IF NOT col_01 IS INITIAL. t_alv[ 2 ]-fcat[ fieldname = 'TRKORR_V' ]-no_out = abap_true. ENDIF.
- IF NOT col_03 IS INITIAL.
- t_alv[ 2 ]-fcat[ fieldname = 'AS4USER' ]-no_out = abap_true.
- t_alv[ 2 ]-fcat[ fieldname = 'AS4USER_TXT' ]-no_out = abap_true.
- ENDIF.
- IF NOT col_02 IS INITIAL.
- t_alv[ 2 ]-fcat[ fieldname = 'FECHA' ]-no_out = abap_true.
- * t_alv[ 2 ]-fcat[ fieldname = 'VERS']-no_out = abap_true.
- ENDIF.
- CLEAR: col_01, col_02.
- t_alv[ 2 ]-grid->set_frontend_fieldcatalog( EXPORTING it_fieldcatalog = t_alv[ 2 ]-fcat ).
- t_alv[ 2 ]-grid->refresh_table_display( ).
- ENDFORM.
- FORM handle_menu_button USING e_object TYPE REF TO cl_ctmenu
- e_ucomm
- p_list.
- LOOP AT t_menus INTO DATA(Di) WHERE alv = p_list AND menu-id = e_ucomm.
- e_object->add_function( fcode = di-menu-function
- icon = di-menu-icon
- text = di-menu-text ).
- ENDLOOP.
- ENDFORM.
- FORM cfg_toolbar_menu.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ MENU ALV 001 Cabecera Principal
- t_menus = VALUE #( BASE t_menus
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Definición de botones
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC13' " 'REFR' ##NO_TEXT
- boton-icon = icon_refresh
- boton-quickinfo = c_quick_13 ##NO_TEXT
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC14' "'CINS' ##NO_TEXT
- boton-icon = icon_inspection_characteristic
- boton-quickinfo = c_quick_14 ##NO_TEXT
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC01' "'FREE' ##NO_TEXT
- boton-icon = icon_release
- boton-quickinfo = c_quick_01 ##NO_TEXT
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC02' "'NEWO' ##NO_TEXT
- boton-icon = '@0Y@' "icon_transport
- boton-quickinfo = c_quick_02
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC03' "'MERG' ##NO_TEXT
- boton-icon = icon_wd_custom_controller "icon_activity
- boton-quickinfo = c_quick_03 ##NO_TEXT
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC04' "'INCL' ##NO_TEXT
- boton-icon = icon_replace
- boton-quickinfo = c_quick_04
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC09' "'DELE' ##NO_TEXT
- boton-icon = icon_delete
- boton-quickinfo = c_quick_09
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC12' "'LUSE'
- boton-icon = icon_activity_group
- boton-quickinfo = c_quick_12
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC15' "'ADDT'
- boton-icon = icon_personnel_administration
- boton-quickinfo = c_quick_15
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC18' "'TITS'
- boton-icon = icon_rename
- boton-quickinfo = c_quick_18
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC10' "'DOME'
- boton-icon = icon_parameter_import
- boton-quickinfo = c_quick_10
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC11' "'UPME'
- boton-icon = ICON_PARAMETER_export
- boton-quickinfo = c_quick_11
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC06' "'VERF' ##NO_TEXT
- boton-icon = icon_check
- boton-quickinfo = c_quick_06
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC19' "'BYEBYE' ##NO_TEXT
- boton-icon = icon_system_copy
- boton-text = 'Clipboard' ##NO_TEXT
- boton-quickinfo = c_quick_19
- boton-disabled = abap_false )
- ( alv = 1 orden = 10
- boton-butn_type = 0
- boton-function = 'MC20' "'BYEBYE' ##NO_TEXT
- boton-icon = icon_transport
- boton-text = 'Transportar' ##NO_TEXT
- boton-quickinfo = c_quick_20
- boton-disabled = abap_false )
- ( alv = 1 orden = 30
- boton-butn_type = 0
- boton-function = 'MC22' "'DELE' ##NO_TEXT
- boton-icon = icon_document
- boton-quickinfo = c_quick_22
- boton-disabled = abap_false )
- ( alv = 1 orden = 999
- boton-function = 'MC08' "'BYEBYE' ##NO_TEXT
- boton-icon = icon_cancel
- boton-text = 'Exit' ##NO_TEXT
- boton-quickinfo = c_quick_08
- boton-disabled = abap_false )
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Definición de Menús
- ( alv = 1 orden = 998
- boton-function = 'MN01' "'BYEBYE' ##NO_TEXT
- boton-icon = icon_system_sap_menu
- boton-text = c_quick_21 ##NO_TEXT
- boton-quickinfo = c_quick_21
- boton-butn_type = 2 "<-- Indica que es MENÚ
- boton-disabled = abap_false )
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Definición de SubMenús
- ( alv = 1 orden = 10
- menu-id = 'MN01'
- menu-function = 'MC05' "'BYEBYE' ##NO_TEXT
- menu-icon = icon_transport
- menu-text = c_quick_05 ##NO_TEXT
- menu-disabled = abap_false )
- ( alv = 1 orden = 20
- menu-id = 'MN01'
- menu-function = 'MC07' "'BYEBYE' ##NO_TEXT
- menu-icon = icon_system_stop_recording
- menu-text = c_quick_07 ##NO_TEXT
- menu-disabled = abap_false )
- ).
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ MENU ALV 002 Detalle de las órdenes
- t_menus = VALUE #( BASE t_menus ( alv = 2 orden = 20
- boton-butn_type = 0
- boton-function = 'MC16'
- boton-icon = icon_delete
- boton-text = ''
- boton-quickinfo = c_quick_16
- boton-disabled = abap_false )
- ( alv = 2 orden = 10
- boton-butn_type = 0
- boton-function = 'MC17'
- boton-icon = icon_create
- boton-text = ''
- boton-quickinfo = c_quick_17
- boton-disabled = abap_false )
- ).
- *--[ Posible codificación para un futuro
- *|ALV|ORDEN|TYPO|BOT|MENU|MENU_ID|FUNCTION|ICONO|TEXTO|QUICKINFO|DISABLE|
- *1|1|0|X|||MC17|icon_create||c_quick_17||
- SORT t_menus BY alv ASCENDING orden ASCENDING.
- ENDFORM.
- FORM handle_toolbar USING uo_object TYPE REF TO cl_alv_event_toolbar_set
- p_list.
- LOOP AT t_menus INTO DATA(di) WHERE alv = p_list AND boton IS NOT INITIAL.
- APPEND di-boton TO uo_object->mt_toolbar.
- ENDLOOP.
- ENDFORM.
- FORM BUT_ver_orden.
- DATA: is_selection TYPE trwbo_selection.
- IF lines( index_rows ) = 1.
- is_selection-trkorrpattern = t_tab_01[ index_rows[ 1 ] ]-trkorr.
- CALL FUNCTION 'TR_SEARCH_AND_DISPLAY_REQUESTS' ##FM_SUBRC_OK
- 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.
- ELSE.
- MESSAGE s398(00) WITH C_There_can_be_only_one '' '' ''.
- ENDIF.
- ENDFORM.
- FORM BUT_check_log.
- RANGES: p_ori_tr FOR e070-trkorr.
- IF lines( index_rows ) >= 1.
- REFRESH p_ori_tr.
- LOOP AT index_rows INTO DATA(l_i).
- p_ori_tr = 'IEQ'.
- p_ori_tr-low = t_tab_01[ l_i-index ]-trkorr. " l_tab_01-trkorr.
- APPEND p_ori_tr.
- AT LAST.
- SUBMIT /sdf/cmo_tr_check AND RETURN
- WITH p_source = 'DS4'
- WITH p_dgp = abap_true
- WITH p_target = '{PON AQUI EL DESTINO}' ##NO_TEXT
- WITH p_ori_tr IN p_ori_tr
- VIA SELECTION-SCREEN.
- ENDAT.
- ENDLOOP.
- ELSE.
- MESSAGE s398(00) WITH C_There_can_be_only_one '' '' ''.
- ENDIF.
- ENDFORM.
- FORM BUT_ver_log.
- IF lines( index_rows ) = 1.
- READ TABLE t_tab_01 INTO l_tab_01 INDEX index_rows[ 1 ]-index.
- SUBMIT rddprott AND RETURN WITH pv_korr = l_tab_01-trkorr.
- ELSE.
- MESSAGE s398(00) WITH C_There_can_be_only_one '' '' ''.
- ENDIF.
- ENDFORM.
- FORM BUT_delete_object.
- DATA: ls_object TYPE e071,
- ls_request TYPE trwbo_request,
- ls_line TYPE trwbo_s_e071.
- SORT index_rows BY index DESCENDING.
- LOOP AT index_rows INTO DATA(l_rows).
- READ TABLE t_tab_02 INDEX l_rows-index INTO DATA(l_02).
- SELECT SINGLE * FROM e071 INTO CORRESPONDING FIELDS OF ls_object
- WHERE trkorr = l_02-trkorr
- AND pgmid = l_02-pgmid
- AND object = l_02-object
- AND obj_name = l_02-obj_name.
- ls_line = CORRESPONDING #( ls_object ).
- ls_request-h = CORRESPONDING #( ls_object ).
- APPEND ls_line TO ls_request-objects.
- ls_request-objects_filled = abap_true.
- CALL FUNCTION 'TRINT_DELETE_COMM_OBJECT_KEYS'
- EXPORTING
- is_e071_delete = ls_object
- iv_dialog_flag = abap_true
- CHANGING
- cs_request = ls_request
- EXCEPTIONS
- r_user_cancelled = 1
- r_user_didnt_confirm = 2
- OTHERS = 3.
- CHECK sy-subrc EQ 0.
- DELETE t_tab_02 INDEX l_rows-index.
- t_alv[ 2 ]-grid->refresh_table_display( ).
- ENDLOOP.
- ENDFORM.
- FORM bUT_exit_program. " *--[ Destruir controladores y ALVs
- cc_01->free( ).
- FREE: cc_01.
- CLEAR: cc_01, t_alv[ 1 ]-grid, t_alv[ 2 ]-grid, t_alv[ 3 ]-grid.
- LEAVE TO SCREEN 0.
- ENDFORM.
- TYPES: BEGIN OF ty_users,
- user TYPE xubname,
- name(80),
- END OF ty_users.
- DATA: t_users TYPE STANDARD TABLE OF ty_users.
- FORM get_user USING p_user CHANGING p_user_txt.
- DATA l_user(80).
- CHECK NOT p_user IS INITIAL.
- TRY.
- p_user_txt = t_users[ user = p_user ]-name.
- CATCH cx_root.
- SELECT SINGLE f~bname && ' ' && p~name_first && ' ' && p~name_last INTO @p_user_txt
- FROM usr21 AS f INNER JOIN adrp AS p ON f~persnumber = p~persnumber
- WHERE f~bname = @p_user.
- REPLACE ALL OCCURRENCES OF p_user IN p_user_txt WITH ''.
- CONDENSE p_user_txt.
- IF p_user_txt IS INITIAL. p_user_txt = p_user. ENDIF.
- t_users = VALUE #( BASE t_users ( user = p_user name = p_user_txt ) ).
- ENDTRY.
- ENDFORM.
- FORM MENU_add_options USING p_e_object TYPE REF TO cl_ctmenu.
- TYPES: BEGIN OF ty_tab,
- text TYPE gui_text,
- fcode TYPE ui_func,
- END OF ty_tab.
- DATA: l_num TYPE n LENGTH 2,
- t_tab TYPE SORTED TABLE OF ty_tab WITH UNIQUE KEY text.
- DO 99 TIMES.
- l_num = sy-index.
- DATA(l_quick) = |c_quick_{ l_num }|.
- ASSIGN (l_quick) TO FIELD-SYMBOL(<f_quick>).
- IF sy-subrc NE 0.
- EXIT.
- ENDIF.
- t_tab = VALUE #( BASE t_tab ( fcode = |MC{ l_num }| text = <f_quick> ) ).
- ENDDO.
- LOOP AT t_tab INTO DATA(l_tab).
- p_e_object->add_function( EXPORTING fcode = l_tab-fcode text = l_tab-text ).
- ENDLOOP.
- ENDFORM.