Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Enrique.Borroni

Páginas: [1] 2 3
1
REPORT zalv_dinamico.

TABLES : sscrfields.
*
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE TYPE-POOLS
*-------------------------------------------------------------------------------------------------------------------*
*
TYPE-POOLS : abap.                                                                                                  " ABAP Language Type-Pool
TYPE-POOLS : slis.                                                                                                  " Tipos globales creacion de ALV
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE INCLUDES
*-------------------------------------------------------------------------------------------------------------------*
INCLUDE : <icon>.                                                                                                   " Definicion de Iconos - ASCII-Codes
INCLUDE : <cl_alv_control>.                                                                                         " Definicion de Estilos de Celdas ALV

*
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE TYPE-POOLS
*-------------------------------------------------------------------------------------------------------------------*
TYPE-POOLS : vrm.
TYPE-POOLS : sscr.
TYPE-POOLS : rsds.
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE INCLUDES
*-------------------------------------------------------------------------------------------------------------------*
*-------------------------------------------------------------------------------------------------------------------*
* CLASES ABAP
*-------------------------------------------------------------------------------------------------------------------*
CLASS cl_abap_char_utilities DEFINITION LOAD.
*-------------------------------------------------------------------------------------------------------------------*
* CONSTANTES : DEFINICION PARA SEPARADORES DE CAMPOS
*-------------------------------------------------------------------------------------------------------------------*

*
*VALORES DE VERADDERO/FALSO
CONSTANTS : co_falso               TYPE c LENGTH 001                       VALUE 'F'.                              " False
CONSTANTS : co_verdadero           TYPE c LENGTH 001                       VALUE 'T'.                              " Verdadero
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE DATOS GLOBALES
*-------------------------------------------------------------------------------------------------------------------*
*
DATA : gd_continuar               TYPE c LENGTH 01                        VALUE co_falso.
*
*VARIABLES PARA DYNPROS
DATA : ok_code                    TYPE sy-ucomm.
*
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE DATOS GLOBALES DINAMICOS :
*-------------------------------------------------------------------------------------------------------------------*
*
DATA : ref_line_type  TYPE REF TO cl_abap_structdescr.
DATA : ref_tabletype  TYPE REF TO cl_abap_tabledescr.
DATA : ref_wa         TYPE REF TO data.
*
DATA : ref_itab       TYPE REF TO data.
DATA : ref_out        TYPE REF TO cl_salv_table.
*
DATA : ref_functions  TYPE REF TO cl_salv_functions_list.
*
DATA : ref_header     TYPE REF TO cl_salv_form_layout_grid.
DATA : ref_label      TYPE REF TO cl_salv_form_label.
DATA : ref_tab        TYPE string.
*
DATA : ld_tabla       TYPE tabname.
*
FIELD-SYMBOLS : <fsym_itab> TYPE ANY TABLE.
FIELD-SYMBOLS : <fsym_field> TYPE ANY.

DATA : ls_functxt                           TYPE smp_dyntxt.
*
* DEFINICION DATOS LOCALES PARA TRATAMIENTO DINAMICO
DATA : lo_dynamic_struct                    TYPE REF TO cl_abap_structdescr.
DATA : lt_comp_tabla                        TYPE cl_abap_structdescr=>component_table.
DATA : lo_dref_comptbi                      TYPE REF TO data.
DATA : lo_dref_locstr                       TYPE REF TO data.
DATA : lo_dref_loctbi                       TYPE REF TO data.
*
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE TIPOS DE TABLAS - TABLAS INTERNAS :
*-------------------------------------------------------------------------------------------------------------------*
*
DATA : ld_selection_id                      TYPE rsdynsel-selid.                            " ID de selección para diferenciar entre varios conjuntos
*
DATA : ld_tabclass                          TYPE tabclass.                                  " Clase tabla
DATA : ld_tablename                         TYPE string.
DATA : ld_num_fields                        TYPE i.                                         " numero de campos
*
DATA : lt_expressions                       TYPE rsds_texpr.                                " Expresiones
DATA : lt_field_ranges                      TYPE rsds_trange.                               " Rangos
DATA : ls_field_ranges                      LIKE LINE OF lt_field_ranges.
*
DATA : lt_tables_ini                        TYPE STANDARD TABLE OF rsdstabs.                " Init: tablas
DATA : sl_tables_ini                        LIKE LINE OF lt_tables_ini.
*
DATA : lt_fields_ini                        TYPE STANDARD TABLE OF rsdsfields.              " Init: campos
DATA : sl_fields_ini                        LIKE LINE OF lt_fields_ini.
*
DATA : lt_where_cond                        TYPE rsds_twhere.                               " Datos para la tabla where
DATA : ls_where_clause                      LIKE LINE OF lt_where_cond.
*
DATA : lt_where_tab                         TYPE STANDARD TABLE OF rsds_where_tab.
DATA : ls_where_tab                         LIKE LINE OF lt_where_tab.
*
DATA : lt_tabfields_not_display             TYPE TABLE OF rsdsfields.
DATA : ls_tabfields_not_display             LIKE LINE OF lt_tabfields_not_display.
*
DATA : gd_titulo_externo                    TYPE c LENGTH 080.
*
*-------------------------------------------------------------------------------------------------------------------*
* DECLARACION DE FIELD-SYMBOLS
*-------------------------------------------------------------------------------------------------------------------*
*
* DEFINICION FIELD-SYMBOLS LOCALES PARA TRATAMIENTO DINAMICO
FIELD-SYMBOLS : <fs_valor_campo>            TYPE ANY.
*
FIELD-SYMBOLS : <fs_valor_struc>            TYPE ANY.
FIELD-SYMBOLS : <fs_comp_tabla>             LIKE LINE OF lt_comp_tabla.
*
FIELD-SYMBOLS : <fs_dynamic_tbi>            TYPE ANY TABLE.
FIELD-SYMBOLS : <fs_dynamic_str>            TYPE ANY.
*-------------------------------------------------------------------------------------------------------------------*
*
*-------------------------------------------------------------------------------------------------------------------*
*
PARAMETERS : pa_tab TYPE dd02l-tabname.

*-----------------------------------------------------------------------------------------------------------------*
* START-OF-SELECTION.
*-----------------------------------------------------------------------------------------------------------------*
START-OF-SELECTION.
*
  ld_tablename      = pa_tab.
*
  CLEAR : ld_tabclass.
  SELECT SINGLE tabclass INTO ld_tabclass
    FROM dd02l
      WHERE  tabname   EQ ld_tablename
      AND    as4local  EQ 'A'
      AND    tabclass  EQ 'TRANSP'.
*
  IF ( sy-subrc EQ 0 ) AND NOT ( ld_tabclass IS INITIAL ).
*
    PERFORM get_data_parametros_dynpro.
*
    PERFORM actualiza_titulo.
*
    CALL FUNCTION 'FREE_SELECTIONS_INIT'
      EXPORTING
        kind                     = 'T'
        expressions              = lt_expressions
      IMPORTING
        selection_id             = ld_selection_id
        field_ranges             = lt_field_ranges
      TABLES
        tables_tab               = lt_tables_ini
        fields_tab               = lt_fields_ini
        tabfields_not_display    = lt_tabfields_not_display
      EXCEPTIONS
        fields_incomplete        = 1
        fields_no_join           = 2
        field_not_found          = 3
        no_tables                = 4
        table_not_found          = 5
        expression_not_supported = 6
        incorrect_expression     = 7
        illegal_kind             = 8
        area_not_found           = 9
        inconsistent_area        = 10
        kind_f_no_fields_left    = 11
        kind_f_no_fields         = 12
        too_many_fields          = 13
        dup_field                = 14
        field_no_type            = 15
        field_ill_type           = 16
        dup_event_field          = 17
        node_not_in_ldb          = 18
        area_no_field            = 19
        OTHERS                   = 20.
    IF ( sy-subrc NE 0 ).

    ELSE.

    ENDIF.

*   MOSTRAR PANTALLA DE SELECCIÓN LIBRE
    CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
      EXPORTING
        selection_id            = ld_selection_id
        title                   = sy-title
        frame_text              = 'Parametros de Seleccion'
        status                  = '1'
        as_window               = abap_false
        no_intervals            = abap_true
      IMPORTING
        where_clauses           = lt_where_cond
        expressions             = lt_expressions
        field_ranges            = lt_field_ranges
        number_of_active_fields = ld_num_fields
      TABLES
        fields_tab              = lt_fields_ini
      EXCEPTIONS
        internal_error          = 1
        no_action               = 2
        selid_not_found         = 3
        illegal_status          = 4
        OTHERS                  = 5.
    IF ( sy-subrc EQ 0 ).
      gd_continuar = co_verdadero.
    ENDIF.
  ELSE.
    gd_continuar = co_falso.
  ENDIF.
*
  IF ( gd_continuar EQ co_verdadero ).
*
    IF ( gd_continuar EQ co_verdadero ).
      PERFORM get_main_data.
*
      IF ( <fs_dynamic_tbi>[] IS INITIAL ).
        MESSAGE i899(v1) WITH 'Sin Datos' DISPLAY LIKE 'I'.
        gd_continuar = co_falso.
      ENDIF.
    ELSE.
      gd_continuar = co_falso.
    ENDIF.
  ENDIF.
*
  IF ( gd_continuar EQ co_falso ).
    LEAVE TO SCREEN 0.
  ENDIF.
*
*-----------------------------------------------------------------------------------------------------------------*
* END-OF-SELECTION
*-----------------------------------------------------------------------------------------------------------------*
END-OF-SELECTION.

  PERFORM show_data_alv USING ld_tablename.



*-----------------------------------------------------------------------------------------------------------------*
* INCLUDES DE RUTINAS FORM
*-----------------------------------------------------------------------------------------------------------------*
*
*-------------------------------------------------------------------------------------------------------------------*
* FORM : GET_MAIN_DATA
*-------------------------------------------------------------------------------------------------------------------*
FORM get_main_data.
*
  DATA : lt_field                 TYPE ddfields.
*
  DATA : ld_existe_ori            TYPE c LENGTH 001 VALUE co_falso.
  DATA : ld_varaux                TYPE string.
  DATA : lt_where_aux             TYPE STANDARD TABLE OF rsdswhere.
  DATA : ls_where_aux             LIKE LINE OF lt_where_aux.

  DATA : ld_cantregi              TYPE sy-tabix.
  DATA : lt_campos                TYPE STANDARD TABLE OF string.
  DATA : ld_campo                 TYPE string.
  DATA : type_descr               TYPE REF TO cl_abap_typedescr.
  DATA : struct_descr             TYPE REF TO cl_abap_structdescr.
  DATA : components               TYPE cl_abap_structdescr=>component_table.
  DATA : component                LIKE LINE OF components.
  DATA : error                    TYPE REF TO cx_root.
*
* DEFINICION DATOS LOCALES PARA TRATAMIENTO DINAMICO
  DATA : lo_dref_locstr           TYPE REF TO data.
  DATA : lo_dref_loctbi           TYPE REF TO data.
  DATA : ld_tabname               TYPE tabname.
*
  ld_tabname  = ld_tablename.
*
  FIELD-SYMBOLS : <fs_dfies>      TYPE dfies.
  FIELD-SYMBOLS : <fs_where>      TYPE rsdswhere.
*
* GENERACION DINAMICA DE LA ESTRUCTURA
  CREATE DATA lo_dref_loctbi TYPE STANDARD TABLE OF (ld_tabname) WITH NON-UNIQUE DEFAULT KEY.
  ASSIGN lo_dref_loctbi->* TO <fs_dynamic_tbi>.
*
  CREATE DATA lo_dref_locstr LIKE LINE OF <fs_dynamic_tbi>.
  ASSIGN lo_dref_locstr->* TO <fs_dynamic_str>.
*
  IF ( sy-subrc EQ 0 ).
    TRY.
*
        CALL METHOD zcl_mm_blueyonder=>get_fields_structure
          EXPORTING
            iv_name   = ld_tabname
          IMPORTING
            et_fields = lt_field[].

        LOOP AT lt_field ASSIGNING <fs_dfies>.
          IF ( <fs_dfies>-datatype EQ 'CLNT' ) OR ( <fs_dfies>-datatype EQ 'STRU' ).

          ELSE.
            CLEAR : ld_campo.
            ld_campo = <fs_dfies>-fieldname.
            APPEND ld_campo TO lt_campos.
          ENDIF.
        ENDLOOP.

        IF NOT ( lt_campos[] IS INITIAL ).
          IF ( LINES( lt_where_cond ) GT 0 ).
            LOOP AT lt_where_cond INTO ls_where_clause WHERE tablename EQ ld_tablename.
              APPEND LINES OF ls_where_clause-where_tab[] TO lt_where_aux[].
            ENDLOOP.

            SELECT *
              INTO CORRESPONDING FIELDS OF TABLE <fs_dynamic_tbi>[]
                FROM  (ld_tablename)
                  WHERE (lt_where_aux) ORDER BY PRIMARY KEY.
          ELSE.
            SELECT *
              INTO CORRESPONDING FIELDS OF TABLE <fs_dynamic_tbi>[]
                FROM (ld_tablename)
                  WHERE (lt_where_aux) ORDER BY PRIMARY KEY.
          ENDIF.
        ENDIF.
      CATCH cx_sy_move_cast_error INTO error.
        MESSAGE error TYPE 'I' DISPLAY LIKE 'E'.
        RETURN.
    ENDTRY.
*
  ENDIF.
*
ENDFORM.                                                                                                            "
*-------------------------------------------------------------------------------------------------------------------*
* FORM : GET_DATA_PARAMETROS_DYNPRO
*-------------------------------------------------------------------------------------------------------------------*
FORM get_data_parametros_dynpro.
*
  DATA : ld_tabname               TYPE tabname.
  DATA : lt_field                 TYPE ddfields.
*
  DATA : ld_ddtext                TYPE ddtext.
*
  FIELD-SYMBOLS : <fs_dfies>      TYPE dfies.
*
  CLEAR : lt_expressions[], lt_field_ranges[], lt_tables_ini[], lt_fields_ini[],
          lt_where_cond[], lt_where_tab[], lt_tabfields_not_display[].
*
  sl_tables_ini-prim_tab  = ld_tablename.
  APPEND sl_tables_ini TO lt_tables_ini.
*
  ld_tabname  = ld_tablename.
  CALL METHOD zcl_mm_blueyonder=>get_fields_structure
    EXPORTING
      iv_name   = ld_tabname
    IMPORTING
      et_fields = lt_field[].
*
  LOOP AT lt_field ASSIGNING <fs_dfies>.
    IF ( <fs_dfies>-keyflag  EQ abap_true ) AND ( <fs_dfies>-datatype NE 'CLNT'    ).
      CLEAR : sl_fields_ini.
      sl_fields_ini-tablename      = ld_tabname.
      sl_fields_ini-fieldname      = <fs_dfies>-fieldname.
      sl_fields_ini-type           = 'S'.
      sl_fields_ini-where_leng     = <fs_dfies>-leng.
      APPEND sl_fields_ini TO lt_fields_ini.
    ENDIF.
  ENDLOOP.
*
  IF ( gd_titulo_externo IS INITIAL ).
    CLEAR : ld_ddtext.
    SELECT SINGLE ddtext INTO ld_ddtext
      FROM  dd02t
        WHERE  tabname     EQ ld_tabname
        AND    ddlanguage  EQ sy-langu
        AND    as4local    EQ 'A'.
    IF ( sy-subrc EQ 0 ) AND ( ld_ddtext IS INITIAL ).
      gd_titulo_externo = ld_ddtext.
    ENDIF.
  ENDIF.
*
ENDFORM.                                                                                                            "
*-------------------------------------------------------------------------------------------------------------------*
* FORM : ACTUALIZA_TITULO
*-------------------------------------------------------------------------------------------------------------------*
FORM actualiza_titulo.
*
  DATA : ld_titu_reporte                    TYPE string.
  DATA : ld_nomb_reporte                    TYPE string.
  DATA : ld_param_01                        TYPE c LENGTH 030 .
  DATA : ld_param_02                        TYPE c LENGTH 030 .
  DATA : ld_param_03                        TYPE c LENGTH 030 .
  DATA : ld_param_04                        TYPE c LENGTH 030 .
*
  DATA : ld_msg_aux_01                      TYPE string.
  DATA : ld_msg_aux_02                      TYPE string.
  DATA : ld_msg_aux_03                      TYPE string.
*
  DATA : ld_tabname               TYPE tabname.
  DATA : ld_ddtext                TYPE ddtext.

  SET TITLEBAR  'T_01'.
*
  ld_titu_reporte = 'T_01'.
  ld_nomb_reporte = 'ZALV_DINAMICO'.
*
  ld_tabname  = ld_tablename.
*
  CLEAR : ld_ddtext.
  SELECT SINGLE ddtext INTO ld_ddtext
    FROM  dd02t
      WHERE  tabname     EQ ld_tabname
      AND    ddlanguage  EQ sy-langu
      AND    as4local    EQ 'A'.
*
  ld_param_01 = 'Tabla :'.
  CONCATENATE ld_tabname '-' '(' INTO ld_param_02  SEPARATED BY space.
  CONCATENATE  ld_ddtext ')' INTO ld_param_03.
  SET TITLEBAR ld_titu_reporte OF PROGRAM ld_nomb_reporte WITH ld_param_01 ld_param_02 ld_param_03 ld_param_04.
*
ENDFORM.                                                                                                           "
*-------------------------------------------------------------------------------------------------------------------*
* FORM : SHOW_DATA_ALV
*-------------------------------------------------------------------------------------------------------------------*
FORM show_data_alv  USING    p_ld_tablename.
*
  CLEAR : ld_tabla.
  ld_tabla = p_ld_tablename.
*
* CREAR TIPO LINEA Y TIPO TABLA CON : RTTC
  ref_line_type ?= cl_abap_typedescr=>describe_by_name( ld_tabla ).
  ref_tabletype = cl_abap_tabledescr=>create( p_line_type = ref_line_type ).
*
* OBJETO CREADO CON : RTTC.
  CREATE DATA ref_itab TYPE HANDLE ref_tabletype.
  CREATE DATA ref_wa TYPE HANDLE ref_line_type.
*
* ASIGNAR TIPO
  ASSIGN ref_itab->* TO <fsym_itab>.
*
* LLAMAR ALV.
  TRY.
      CALL METHOD cl_salv_table=>factory
        IMPORTING
          r_salv_table = ref_out
        CHANGING
          t_table      = <fs_dynamic_tbi>.
    CATCH cx_salv_msg .
  ENDTRY.
*
  ref_functions = ref_out->get_functions( ).
  ref_functions->set_all( if_salv_c_bool_sap=>true ).
*
  CREATE OBJECT ref_header.
  CREATE OBJECT ref_label.
*
  ref_label = ref_header->create_label( row = 1 column = 1 ).
  CONCATENATE 'Contenido :' ld_tabla INTO ref_tab SEPARATED BY space.
  ref_label->set_text( ref_tab ).
  ref_out->set_top_of_list( ref_header ).
  ref_out->set_top_of_list_print( ref_header ).
  ref_out->display( ).
*
* LIMPIAR FIELD SYMBOLS
  UNASSIGN : <fsym_itab>.
  FREE ref_out.
*
ENDFORM.                                                                                                           "

2
Funciones / Funciones para determinar el tamaño de las tablas
« en: 13 de Enero de 2023, 08:54:52 am »
GET_TABLE_SIZE_ADA
GET_TABLE_SIZE_MSS
GET_TABLE_SIZE_ORA
GET_TABLE_SIZE_DB2
GET_TABLE_SIZE_DB4
GET_TABLE_SIZE_DB6
GET_TABLE_SIZE_INF
GET_TABLE_SIZE_ALL
GET_TABLE_SIZE_ALL

3
Módulos funcionales / Funciones para determinar el tamaño de tavb
« en: 13 de Enero de 2023, 08:38:46 am »
GET_TABLE_SIZE_ADA
GET_TABLE_SIZE_MSS
GET_TABLE_SIZE_ORA
GET_TABLE_SIZE_DB2
GET_TABLE_SIZE_DB4
GET_TABLE_SIZE_DB6
GET_TABLE_SIZE_INF
GET_TABLE_SIZE_ALL
GET_TABLE_SIZE_ALL

4
Aquí les dejo un report  que permite seleccionar archivos desde el servidor de aplicación o presentación.
Espero les sea de utilidad.

REPORT Z_GET_ARCHIVO_SRV_LOCAL.
*-----------------------------------------------------------------------------------------------------------------------------------------*
DATA : ld_rc(10)              TYPE c.
DATA : ld_filename            TYPE string.
*-----------------------------------------------------------------------------------------------------------------------------------------*
DATA : ld_location_flag       TYPE  dxlocation.     " Indicador: Servidor de aplicación o presentación : A = Server SAP   // P = PC Local
DATA : ld_server              TYPE  msname2.        " Nombre del servidor de aplicación (SOLO PARA SERVER SAP)
DATA : ld_path                TYPE  dxlpath.        " Vía acceso más larga
DATA : ld_filemask            TYPE  dxfilemask.     " Máscara p.nom.fichero
DATA : ld_fileoperation       TYPE  dxfileoper.     " Tipo de Operacion con el Archivo : R = Leer  // W = Escribir
*-----------------------------------------------------------------------------------------------------------------------------------------*
*

PARAMETERS : p_srv            RADIOBUTTON GROUP gr1.
PARAMETERS : p_loc            RADIOBUTTON GROUP gr1.
*
*-----------------------------------------------------------------------------------------------------------------------------------------*


*
*--->> PARA SELECIONAR ARCHIVOS DESDE EL SERVER SAP
IF ( p_srv EQ 'X' ).
  ld_location_flag  = 'A'.
  ld_path           = '/usr/sap/tmp'.
  ld_filemask       = '*.*'.
  ld_fileoperation  = 'R'.
ENDIF.

*
*--->> PARA SELECIONAR ARCHIVOS DESDE LOCAL PC
IF ( p_loc EQ 'X' ).
  ld_location_flag  = 'P'.
  ld_path           = 'C:\TEMP\'.
  ld_filemask       = '*.*'.
  ld_fileoperation  = 'R'.
ENDIF.


*-----------------------------------------------------------------------------------------------------------------------------------------*
START-OF-SELECTION.
*
  PERFORM get_filename_pc_sev USING     ld_location_flag
                                        ld_path
                                        ld_filemask
                                        ld_fileoperation
                              CHANGING  ld_rc
                                        ld_filename.
*
  WRITE : / 'RC       : ', ld_rc.
  WRITE : / 'ARCHIVO  : ', ld_filename.
*
END-OF-SELECTION.
*-----------------------------------------------------------------------------------------------------------------------------------------*
*
*
*-----------------------------------------------------------------------------------------------------------------------------------------*
*  FORM : GET_FILENAME_PC_SEV
*-----------------------------------------------------------------------------------------------------------------------------------------*
*       Leer Nombre de un archivo desde el servidor SAP o LOCAL
*-----------------------------------------------------------------------------------------------------------------------------------------*
*      -->P_LD_LOCATION_FLAG      Indicador: Servidor de aplicación o presentación : A = Server SAP   // P = PC Local
*      -->P_LD_PATH               Vía acceso más larga
*      -->P_LD_FILEMASK           Máscara p.nom.fichero
*      -->P_LD_FILEOPERATION      Tipo de Operacion con el Archivo : R = Leer  // W = Escribir
*      <--P_LD_RC
*      <--P_LD_FILENAME
*-----------------------------------------------------------------------------------------------------------------------------------------*
FORM get_filename_pc_sev  USING    p_location_flag
                                   p_path
                                   p_filemask
                                   p_fileoperation
                          CHANGING p_rc
                                   p_filename.

*
* ----->>> DECLARACION DE VARIABLES
  DATA  : ld_o_location_flag      TYPE dxlocation.                      " Indicador: Servidor de aplicación o presentación
  DATA  : ld_o_server             TYPE msname2.                         " Nombre del servidor de aplicación
  DATA  : ld_o_path               TYPE dxlpath.                         " Vía acceso más larga
  DATA  : ld_abend_flag           TYPE dxxabend.                        " Indicador: Cancelación del proceso
  DATA  : ld_filesys              TYPE filesys_d.                       " Grupo de sintaxis para nombres de ficheros y vías de acceso
  DATA  : lw_rfcsi_export         TYPE rfcsi.                           " RFC Versión log
  DATA  : ld_server               TYPE msname2.                         " Nombre del servidor de aplicación
*
  DATA  : ld_path                 TYPE string.                          " Path para Archivos PC
  DATA  : ld_mascara              TYPE string.                          " Marcara para Archivos PC
  DATA  : lt_file_table           TYPE STANDARD TABLE OF file_table.    " Tabla Interna para guardar archivo seleccionado desde el PC
  DATA  : lw_file_table           LIKE LINE OF lt_file_table.           "
  DATA  : ld_subrc                TYPE i.                               " Para retorno de la funcion de seleccion de archivos del PC

  IF ( p_location_flag EQ 'A' ).
  ENDIF.


  CASE p_location_flag.
*
*   ----->>> EJECUTAR FUNCION PARA SELECCIONAR ARCHIVO DESDE SERVIDOR DE APLICACION : 'SAP'
    WHEN 'A'.
*
*     ----->>> RECUPERAR EL SISTEMA OPERATIVO DEL LOS SERVIDORES DE APLICACIONES : APLICACION Y PRESENTACION
      SELECT SINGLE filesys
        FROM opsystem INTO ld_filesys
          WHERE opsys EQ sy-opsys.
*
*     ----->>> RECUPERAR DESTINO LOGICO DEL SISTEMA
      CALL FUNCTION 'RFC_SYSTEM_INFO'
        IMPORTING
          rfcsi_export = lw_rfcsi_export.
*
*     ----->>> RECUPERAR NOMBER DEL SERVER SAP
      ld_server = lw_rfcsi_export-rfcdest.
*
*     ----->>> SI RUTA ES VACIO : UTILIZAR '?'
      IF ( ld_server IS INITIAL ).
        ld_server = '?'.
      ENDIF.
*
*     ----->>> SI MASCARA PARA SELECCION DE TIPO DE ARCHIVOS ES VACIA : UTILIZAR '*.*'
      IF ( p_filemask IS INITIAL ).
        p_filemask = '*.*'.
      ENDIF.
*
*     ----->>> LLAMADA A LA FUNCION DE SELECCION DE ARCHIVOS EN SERVER SAP
      CALL FUNCTION 'F4_DXFILENAME_TOPRECURSION'
        EXPORTING
          i_location_flag = p_location_flag             " Indicador: Servidor de aplicación o presentación : A = Server SAP   // P = PC Local
          i_server        = ld_server                   " Nombre del servidor de aplicación
          i_path          = p_path                      " Vía acceso más larga
          filemask        = p_filemask                  " Máscara p.nom.fichero
          fileoperation   = p_fileoperation             " Tipo de Operacion con el Archivo : R = Leer  // W = Escribir
        IMPORTING
          o_location_flag = ld_o_location_flag
          o_server        = ld_o_server
          o_path          = ld_o_path
          abend_flag      = ld_abend_flag
        EXCEPTIONS
          rfc_error       = 1
          error_with_gui  = 2
          OTHERS          = 3.
*
*   ----->>> EJECUTAR FUNCION PARA SELECCIONAR ARCHIVO DESDE SERVIDOR DE PRESENTACION : 'LOCAL PC'
    WHEN 'P'.
*
      IF ( p_path IS INITIAL ).
        ld_path = 'C:\'.
      ELSE.
        ld_path     = p_path.
      ENDIF.
*
      IF ( p_filemask IS INITIAL ).
        ld_mascara  = '*.*'.
      ELSE.
        ld_mascara  = p_filemask.
      ENDIF.
*
*     ----->>> LLAMADA AL METODO DE SELECCION DE ARCHIVOS DESDE PC
      CALL METHOD cl_gui_frontend_services=>file_open_dialog
        EXPORTING
          window_title            = 'Seleccione Archivo'
          default_extension       = ld_mascara
          initial_directory       = ld_path
        CHANGING
          file_table              = lt_file_table
          rc                      = ld_subrc
        EXCEPTIONS
          file_open_dialog_failed = 1
          cntl_error              = 2
          error_no_gui            = 3
          not_supported_by_gui    = 4
          OTHERS                  = 5.
*
*   ----->>> VALIDA LA EJECUCION Y HOMOLOGA VALORES DE RETORNO DE LA RUTINA
    IF NOT ( lt_file_table IS INITIAL ).
        READ TABLE lt_file_table INTO lw_file_table INDEX 1.
        ld_o_path     = lw_file_table-filename.
        sy-subrc      = 0.
      ELSEIF ( ld_subrc GT 1 ).
        sy-subrc      = ld_subrc.
      ELSEIF ( lt_file_table IS INITIAL ).
        sy-subrc      = 0.
        ld_abend_flag = 'X'.
        ld_o_path     = ''.
      ENDIF.
  ENDCASE.
*
* ----->>> VALIDA LA EJECUCION Y RETORNA VALORES
  IF ( sy-subrc EQ 0 ) AND ( ld_o_path NE '' ).
    p_filename  = ld_o_path.
    p_rc        = 'OK'.
  ELSEIF ( ld_abend_flag EQ 'X' ) OR ( ld_o_path EQ '' ).
    p_rc        = 'CANCEL'.
  ELSE.
    p_rc        = 'ERROR'.
  ENDIF.
*
ENDFORM.                                                                                                                                                                   "
*-----------------------------------------------------------------------------------------------------------------------------------------*



5
Programación ABAP / Performance en Acceso a Tablas de SD
« en: 30 de Septiembre de 2016, 05:50:53 pm »
Hace un tiempo buscando mejorar el acceso a las tablas de SD encontre esto...Ojala les sirva.

1. Accesses to sales orders (tables VBAK, VBAP)

a) Search orders for customer number (field VBAK-KUNNR):

*Incorrect:
SELECT FROM vbak WHERE kunnr = ...
*Correct:   
SELECT FROM vakpa WHERE kunde = ... 
SELECT FROM vbak WHERE vbeln = vakpa-vbeln.


b) Search order items for material number (field VBAP-MATNR):

*Incorrect:
SELECT FROM vbap WHERE matnr = ...
*Correct:   
SELECT FROM vapma WHERE matnr = ...   
SELECT FROM vbap WHERE vbeln = vapma-vbeln
                   AND posnr = vapma-posnr



c) Other search helps for sales orders offer the matchcode tables and views M_VMVAx, x. = A, B, C, ... M; for example search for purchase order number of the customer, description and so on

2. Accesses to deliveries (tables LIKP, LIPS)

a) Search for deliveries with customer number (field LIKP-KUNNR):

*Incorrect:
SELECT FROM likp WHERE kunnr = ...
*Correct:
SELECT FROM vlkpa WHERE kunde = ...   
SELECT FROM likp WHERE vbeln = vlkpa-vbeln.


b) Search for delivery items with material number (field LIKP-MATNR):

*Incorrect:
SELECT FROM lips WHERE matnr = ...
*Correct:
SELECT FROM vlpma WHERE matnr = ...   
SELECT FROM lips WHERE vbeln = vlpma-vbeln
                   AND posnr = vlpma-posnr



c) Search for deliveries with sales order number (preceding document, field LIPS-VGBEL):

*Incorrect:
SELECT FROM lips WHERE vgbel = ...
*Correct:
SELECT FROM vbfa WHERE VBELV  = ...
                   AND VBTYP_N = 'J'   
SELECT FROM lips WHERE vbeln = vbfa-vbeln
                   AND posnr = vbfa-posnn



d) Other search helps for deliveries offer matchcode tables and views M_VMVLx, x. = A, B, C, ... M; for example search for goods issue date, picking date, transportation planning date and so on.


3. Accesses to invoices (tables VBRK, VBRP)

a) Search for invoices with customer number ("payer") (field VBRK-KUNRG):

*Incorrect:
SELECT FROM vbrk WHERE kunrg = ...
*Correct:
SELECT FROM vrkpa WHERE kunde = ...   
SELECT FROM vbrk WHERE vbeln = vrkpa-vbeln



b) Search for invoice items with material number (field VBRP-MATNR):

*Incorrect:
SELECT FROM vbrp WHERE matnr = ...
*Correct:
SELECT FROM vrpma WHERE matnr = ...   
SELECT FROM vbrp WHERE vbeln = vrpma-vbeln
                   AND posnr = vrpma-posnr



c) Search for invoices with delivery number (preceding document, field VBRP-VGBEL):

 
*Incorrect:
SELECT FROM vbrp WHERE vgbel = ...
*Correct:
SELECT FROM vbfa WHERE vbtyp_n = 'M'
                   AND vbelv  = ...   
SELECT FROM vbrp WHERE vbeln = vbfa-vbeln
                   AND posnr = vbfa-posnn



d) Search for invoices with order number (preceding document, field VBRP-AUBEL):

*Incorrect:
SELECT FROM vbrp WHERE aubel = ...
*Correct:
SELECT FROM vbfa WHERE vbtyp_n = 'M'                   
                   AND vbelv   = ...
SELECT FROM vbrp WHERE vbeln = vbfa-vbeln
                   AND posnr = vbfa-posnn



4. Other accesses in SD:

a) Document flow:
*Incorrect:
SELECT vbelv FROM vbfa WHERE vbeln ...


In table VBFA only the preceeding document is used to search for the subsequent document (for example, delivery for order). Searching the other way makes no sense with this table since the preceding documents (for example, order for delivery) are stored directly in the document tables. Thus reading in table VBFA is a one-way street.

*Correct:
SELECT vgbel FROM lips WHERE vbeln = ...
or
SELECT vgbel FROM vbrp WHERE vbeln = ...
or
SELECT aubel FROM vbrp WHERE vbeln = ...


b) Search for shipping unit item with delivery

Incorrect:
SELECT FROM vepo WHERE vbtyp = 'J'                   
                   AND vbeln = i_lips-vbeln
Correct:
SELECT FROM vbfa WHERE vbtyp_n = 'X'                   
                   AND vbelv = i_lips-vbeln
SELECT FROM vepo WHERE venum = vbfa-vbeln

6
Reports / Ingresar texto dentro de un cuadro de texto en una Dynpro
« en: 31 de Enero de 2016, 10:09:07 am »
Para ingresar texto en un cuadro de texto creado en la Dynpro
se debe hacer los siguiente :


*--------------------------------------------------------------------*
* Declaracion variables para el cuadro de textos
*--------------------------------------------------------------------*
*
CLASS event_handler DEFINITION.
 PUBLIC SECTION.
   METHODS: handle_f1 FOR EVENT f1 OF cl_gui_textedit
            IMPORTING sender,
            handle_f4 FOR EVENT f4 OF cl_gui_textedit
            IMPORTING sender.
ENDCLASS.
*--------------------------------------------------------------------*
DATA: init,
     container   TYPE REF TO cl_gui_custom_container,
     editor      TYPE REF TO cl_gui_textedit.
DATA: event_tab  TYPE cntl_simple_events,
     event       TYPE cntl_simple_event.
DATA handle      TYPE REF TO event_handler.
DATA: line(256)  TYPE c,
     text_tab    LIKE STANDARD TABLE OF line,
     field      LIKE line.
*--------------------------------------------------------------------*
* Declaracion de datos para el texto
*--------------------------------------------------------------------*
DATA: gt_THEADER LIKE THEAD.
DATA  BEGIN OF gt_TLINETAB OCCURS 10.
     INCLUDE STRUCTURE TLINE.
DATA: END OF gt_TLINETAB.
*--------------------------------------------------------------------*
* Implementacion de la Clase
*--------------------------------------------------------------------*
CLASS event_handler IMPLEMENTATION.
 METHOD handle_f1.
   DATA row TYPE i.
   MESSAGE i888(sabapdocu) WITH text-004.
   CALL METHOD sender->get_selection_pos
        IMPORTING from_line = row.
   CALL METHOD sender->get_line_text
        EXPORTING line_number = row
        IMPORTING text = field.
   CALL METHOD cl_gui_cfw=>set_new_ok_code   "raise PAI for
        EXPORTING new_code = 'F1'.           "system events
   CALL METHOD cl_gui_cfw=>flush.
 ENDMETHOD.
 METHOD handle_f4.
   DATA row TYPE i.
   MESSAGE i888(sabapdocu) WITH text-005.
   CALL METHOD sender->get_selection_pos
        IMPORTING from_line = row.
   CALL METHOD sender->get_line_text
        EXPORTING line_number = row
        IMPORTING text = field.
   CALL METHOD cl_gui_cfw=>flush.
 ENDMETHOD.
ENDCLASS.

*----->>> Crear custom container en la Dynpro, llamado 'CUST_TEXTO'
*----->>> En el PBO de la Dynpro crear modulo:
*---------------------------------------------------------------------*
*      Module  PBO_TEXTO  OUTPUT
*---------------------------------------------------------------------*
MODULE PBO_TEXTO OUTPUT.
 IF init is initial.
   init = 'X'.
*--------------------------------------------------------------------*
* Crear Control del Container
*--------------------------------------------------------------------*
   CREATE OBJECT: container EXPORTING container_name = 'CUST_TEXTO',
                  editor    EXPORTING parent = container,
                  handle.
*
   event-eventid = cl_gui_textedit=>event_f1.
   event-appl_event = ' '.                     
   APPEND event TO event_tab.
   event-eventid = cl_gui_textedit=>event_f4.
   event-appl_event = 'X'.                     
   APPEND event TO event_tab.
   CALL METHOD: editor->set_registered_events
                EXPORTING events = event_tab.
*--------------------------------------------------------------------*
*  Mostrar Status Bar en la Dynpro
*--------------------------------------------------------------------*
   CALL METHOD editor->set_toolbar_mode
     EXPORTING
       toolbar_mode = editor->false. 
   CALL METHOD editor->set_statusbar_mode
     EXPORTING
       statusbar_mode = editor->false.
*
   SET HANDLER handle->handle_f1
               handle->handle_f4 FOR editor.
 ENDIF.
 CALL METHOD editor->set_text_as_stream
   EXPORTING
     text = text_tab.
*
ENDMODULE.

*---->>> En el PAI de la Dynpro crear modulo:
*---------------------------------------------------------------------*
*      Module  PAI_TEXTO_REFRESH  INPUT
*---------------------------------------------------------------------*
MODULE PAI_TEXTO_REFRESH.
 CALL METHOD editor->get_text_as_stream
   IMPORTING
     text = text_tab.
ENDMODULE.

7
Reports / Genera Salida de como llenar una BAPI Completamente..
« en: 20 de Enero de 2015, 04:30:25 am »
REPORT y_ebf_044 NO STANDARD PAGE HEADING.
*
TABLES : tfdir.
*
*
*
PARAMETERS: pa_func             LIKE rs38l-name.
*
*
*      Fuente ABAP
DATA : lt_codfte                TYPE rswsourcet,
       wa_codfte                LIKE LINE OF lt_codfte.

*      Fuente ABAP
DATA : lt_fte_aux_00            TYPE rswsourcet,
       ld_fte_aux_00            LIKE LINE OF lt_fte_aux_00.

*      Fuente ABAP
DATA : lt_fte_aux               TYPE rswsourcet,
       wa_fte_aux               LIKE LINE OF lt_fte_aux_00.

*      Fuente ABAP
DATA : lt_fte_prefinal          TYPE rswsourcet,
       wa_fte_prefinal          LIKE LINE OF lt_fte_prefinal.

*      Fuente ABAP
DATA : lt_fte_final             TYPE rswsourcet,
       wa_fte_final             LIKE LINE OF lt_fte_prefinal.

*      Estructura interna de los datos de entorno de test
DATA : lt_datadir               TYPE STANDARD TABLE OF eudatadir WITH HEADER LINE.

*      Objetos del entorno de desarrollo
DATA : lt_eufunc                TYPE STANDARD TABLE OF eufunc WITH HEADER LINE.

*      Parametros IMPORT
DATA : lt_import                TYPE STANDARD TABLE OF rsimp WITH HEADER LINE.

*      Parametros Changing
DATA : lt_change                TYPE STANDARD TABLE OF rscha WITH HEADER LINE.

*      Pararametros EXPORT
DATA : lt_export                TYPE STANDARD TABLE OF rsexp WITH HEADER LINE.

*      Parametros TABLAS
DATA : lt_tables                TYPE STANDARD TABLE OF rstbl WITH HEADER LINE.

*      Parametros EXCEPTION
DATA : lt_except                TYPE STANDARD TABLE OF rsexc WITH HEADER LINE.

*      Biblioteca de funciones: Interfase documentación
DATA : lt_paradocu              TYPE STANDARD TABLE OF rsfdo WITH HEADER LINE.

*      Biblioteca de funciones: Parámetro Import
DATA : lt_param                 TYPE STANDARD TABLE OF rsimp WITH HEADER LINE.

*      Contador
DATA : ld_lines                 TYPE i.

*      Area de nombres
DATA : ld_namespace             LIKE rs38l-namespace.

*      Grupo funciones a la que está asignado el módulo funciones
DATA : ld_area                  LIKE rs38l-area.
*


*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_func.
*
  CALL FUNCTION 'RS_HELP_HANDLING'
    EXPORTING
      dynpfield                 = 'pa_func'
      dynpname                  = sy-dynnr
      object                    = 'FB'
      progname                  = 'Y_EBF_012'
      suppress_selection_screen = sy-input.

*
*
*
START-OF-SELECTION.
*
*
*
  PERFORM fu_import_interface_ext(sapms38l)
                             TABLES lt_import
                                    lt_change
                                    lt_export
                                    lt_tables
                                    lt_except
                                    lt_paradocu
                              USING pa_func.
*
  CALL FUNCTION 'FUNCTION_STUB_GENERATE'
    EXPORTING
      funcname           = pa_func
      ic_mode            = 'X'
    TABLES
      source             = lt_codfte
    EXCEPTIONS
      function_not_exist = 1
      OTHERS             = 2.
*
  IF ( sy-subrc EQ 0 ).


  ENDIF.

  DATA: ld_var_name TYPE string.
*
  FIELD-SYMBOLS: <fs> TYPE any.
*
  DATA: ld_string TYPE string.
  DATA: ld_search_string TYPE string.
*
  LOOP AT lt_codfte INTO wa_codfte.
*
    SEARCH wa_codfte FOR ' EXCEPTIONS'.
    IF ( sy-subrc EQ  0 ).
      EXIT.
    ENDIF.
    SEARCH wa_codfte FOR ' = '.
    CHECK sy-subrc EQ 0.
*
    LOOP AT lt_import.
      CONCATENATE '.' lt_import-parameter '.' INTO ld_search_string
                                              SEPARATED BY space.
*
      SEARCH wa_codfte FOR ld_search_string .
      IF ( sy-subrc EQ 0 ).
        CONCATENATE '= LD_' lt_import-parameter INTO ld_var_name.
        REPLACE '=' WITH ld_var_name INTO wa_codfte.
        MODIFY lt_codfte FROM wa_codfte.
*
        REPLACE '= LD_' WITH 'DATA: LD_' INTO ld_var_name.
        IF NOT lt_import-dbfield IS INITIAL.
          CONCATENATE ld_var_name 'TYPE' lt_import-dbfield '.'
                      INTO ld_fte_aux_00 SEPARATED BY space.
        ELSEIF lt_import-typ IS INITIAL.
          CONCATENATE ld_var_name 'TYPE'
                     'C' '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.
        ELSE.
          CONCATENATE ld_var_name 'TYPE'
                     lt_import-typ '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.
        ENDIF.
        APPEND ld_fte_aux_00 TO lt_fte_aux_00.
        IF lt_import-default IS INITIAL.
          CONCATENATE '* LD_' lt_import-parameter ' = '
               INTO wa_fte_aux.
        ELSE.
          CONCATENATE '* LD_' lt_import-parameter ' = '
                     lt_import-default '.'
               INTO wa_fte_aux.
        ENDIF.
        APPEND wa_fte_aux TO lt_fte_aux.
        CLEAR : wa_fte_aux.
        APPEND wa_fte_aux TO lt_fte_aux.

        lt_param-parameter = lt_import-parameter.
        lt_param-dbfield = lt_import-dbfield.
        lt_param-typ = lt_import-typ.
        APPEND lt_param.

        EXIT.
      ENDIF.
    ENDLOOP.
*
    LOOP AT lt_export.
      CONCATENATE '.' lt_export-parameter '.' INTO ld_search_string
                   SEPARATED BY space.
      SEARCH wa_codfte FOR ld_search_string .
      IF sy-subrc EQ 0.
        CONCATENATE '= LD_' lt_export-parameter INTO ld_var_name.
        REPLACE '=' WITH ld_var_name INTO wa_codfte.
        MODIFY lt_codfte FROM wa_codfte.

        REPLACE '= LD_' WITH 'DATA: LD_' INTO ld_var_name.
        IF NOT ( lt_export-dbfield IS INITIAL ).
          CONCATENATE ld_var_name 'TYPE' lt_export-dbfield '.'
                      INTO ld_fte_aux_00 SEPARATED BY space.
        ELSEIF lt_export-typ IS INITIAL.
          CONCATENATE ld_var_name 'TYPE'
                     'C' '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.
*
        ELSE.
          CONCATENATE ld_var_name 'TYPE'
                     lt_export-typ '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.
        ENDIF.
        APPEND ld_fte_aux_00 TO lt_fte_aux_00.

        EXIT.
      ENDIF.
    ENDLOOP.
*
    LOOP AT lt_change.
      CONCATENATE '.' lt_change-parameter '.' INTO ld_search_string
      SEPARATED BY space.
      SEARCH wa_codfte FOR ld_search_string .
      IF ( sy-subrc EQ 0 ).
        CONCATENATE '= LD_' lt_change-parameter INTO ld_var_name.
        REPLACE '=' WITH ld_var_name INTO wa_codfte.

        MODIFY lt_codfte FROM wa_codfte.

        REPLACE '= LD_' WITH 'DATA: LD_' INTO ld_var_name.
        IF NOT lt_change-dbfield IS INITIAL.
          CONCATENATE ld_var_name 'TYPE' lt_change-dbfield '.'
                      INTO ld_fte_aux_00 SEPARATED BY space.

        ELSEIF lt_change-typ IS INITIAL.
          CONCATENATE ld_var_name 'TYPE'
                     'C' '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.
        ELSE.
          CONCATENATE ld_var_name 'TYPE'
                     lt_change-typ '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.
        ENDIF.
        APPEND ld_fte_aux_00 TO lt_fte_aux_00.

        CONCATENATE '* LD_' lt_change-parameter   ' = '
                    lt_change-default
               INTO wa_fte_aux.
        APPEND wa_fte_aux TO lt_fte_aux.
        CLEAR : wa_fte_aux.
        APPEND wa_fte_aux TO lt_fte_aux.

        lt_param-parameter = lt_change-parameter.
        lt_param-dbfield = lt_change-dbfield.
        lt_param-typ = lt_change-typ.
        APPEND lt_param.

        EXIT.
      ENDIF.
    ENDLOOP.

    LOOP AT lt_tables.
      CONCATENATE '.' lt_tables-parameter '.' INTO ld_search_string
      SEPARATED BY space.
      SEARCH wa_codfte FOR ld_search_string .
      IF ( sy-subrc EQ 0 ).
        CONCATENATE '= LT_' lt_tables-parameter INTO ld_var_name.
        REPLACE '=' WITH ld_var_name INTO wa_codfte.
        MODIFY lt_codfte FROM wa_codfte.

        REPLACE '= LT_' WITH 'DATA: LT_' INTO ld_var_name.
        IF NOT ( lt_tables-dbstruct IS INITIAL ).
          CONCATENATE ld_var_name 'TYPE standard table of '
                      lt_tables-dbstruct '.'
                      INTO ld_fte_aux_00 SEPARATED BY space.

        ELSEIF ( lt_tables-typ IS INITIAL ).
          CONCATENATE ld_var_name 'TYPE standard table of '
                     'char255' '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.
        ELSE.
          CONCATENATE ld_var_name 'TYPE'
                     lt_tables-typ '.'
                     INTO ld_fte_aux_00 SEPARATED BY space.

        ENDIF.
        APPEND ld_fte_aux_00 TO lt_fte_aux_00.

        CONCATENATE 'DATA: WA_' lt_tables-parameter  space
                    ' LIKE LINE OF LT_' lt_tables-parameter '.'
                    INTO ld_fte_aux_00.
        APPEND ld_fte_aux_00 TO lt_fte_aux_00.

*
        DATA : lt_dfies_tab TYPE STANDARD TABLE OF dfies WITH HEADER LINE.
        DATA : ld_tabname TYPE ddobjname.

        ld_tabname = lt_tables-dbstruct.

        CALL FUNCTION 'DDIF_FIELDINFO_GET'
          EXPORTING
            tabname        = ld_tabname
          TABLES
            dfies_tab      = lt_dfies_tab
          EXCEPTIONS
            not_found      = 1
            internal_error = 2
            OTHERS         = 3.

        IF ( sy-subrc EQ 0 ).

        ENDIF.

        IF ( lt_dfies_tab[] IS INITIAL ).

          CONCATENATE '* WA_' lt_tables-parameter  ' = '
                 INTO wa_fte_aux.

          APPEND wa_fte_aux TO lt_fte_aux.
        ELSE.
          LOOP AT lt_dfies_tab.

            CONCATENATE '* WA_' lt_tables-parameter '-'
                        lt_dfies_tab-fieldname ' = '
                   INTO wa_fte_aux.

            APPEND wa_fte_aux TO lt_fte_aux.
          ENDLOOP.
        ENDIF.


        CONCATENATE '* APPEND WA_' lt_tables-parameter ' TO '
               ' LT_' lt_tables-parameter
               INTO wa_fte_aux.
        APPEND wa_fte_aux TO lt_fte_aux.
        CLEAR : wa_fte_aux.
        APPEND wa_fte_aux TO lt_fte_aux.

        EXIT.
      ENDIF.
    ENDLOOP.
  ENDLOOP.


  LOOP AT lt_fte_aux_00 INTO ld_fte_aux_00.
    WRITE : / ld_fte_aux_00.
    APPEND  ld_fte_aux_00  TO lt_fte_prefinal.
    APPEND  ld_fte_aux_00 TO lt_fte_final.


  ENDLOOP.
  APPEND INITIAL LINE TO lt_fte_prefinal.
  APPEND INITIAL LINE TO lt_fte_final.
  WRITE : /.

  LOOP AT lt_fte_aux INTO wa_fte_aux.
    WRITE : / wa_fte_aux.
    APPEND  wa_fte_aux  TO lt_fte_prefinal.
  ENDLOOP.
  WRITE : /.


  LOOP AT lt_codfte INTO wa_codfte.
    REPLACE '"' WITH '*' INTO wa_codfte.
    MODIFY lt_codfte FROM wa_codfte.


    WRITE : / wa_codfte.
    APPEND  wa_codfte  TO lt_fte_prefinal.
    APPEND  wa_codfte TO lt_fte_final.
  ENDLOOP.
*

8
Reports / Leer Valores Fijos de un Dominio
« en: 20 de Enero de 2015, 03:36:39 am »
Este es un pequeño ejemplo de como leer los valores fijos asociados a un Dominio.
*

REPORT y_ebf_012 NO STANDARD PAGE HEADING.

*
DATA    : it_dd07v                TYPE STANDARD TABLE OF dd07v,
              wa_dd07v              LIKE LINE OF it_dd07v.
*
*
PARAMETERS : pa_dom             LIKE dcobjdef-name OBLIGATORY.
*
*

START-OF-SELECTION.

  REFRESH : it_dd07v.
  CLEAR    : it_dd07v.
*
  CALL FUNCTION 'DDIF_DOMA_GET'
    EXPORTING
      name          = pa_dom
      langu         = sy-langu
    TABLES
      dd07v_tab     = it_dd07v
    EXCEPTIONS
      illegal_input = 1
      OTHERS        = 2.
*
  IF ( sy-subrc EQ 0 ).
*
    IF ( sy-subrc EQ 0 ).
      LOOP AT it_dd07v INTO wa_dd07v.
*
        WRITE / : wa_dd07v-domvalue_l.
        WRITE   : wa_dd07v-ddtext.
*
      ENDLOOP.
*
    ENDIF.
*
  ENDIF.

9
Bapis / SD_CUSTOMER_MAINTAIN_ALL - Ejemplo de Uso
« en: 05 de Diciembre de 2012, 06:36:35 am »
Ejemplo de como utilizar esta BAPI...


REPORT y_ebf_058.

*----------------------------------------------------------------------*
* DECLARACION DE VARIABLES
*----------------------------------------------------------------------*
*
DATA : ld_kunnr             TYPE kunnr.
DATA : ld_sd_cust_1321_done TYPE c.
DATA : ld_addnr             TYPE ad_addrnum.
*
*----------------------------------------------------------------------*
* DECLARACION DE TABLAS INTERNAS Y ESTRUCTURAS
*----------------------------------------------------------------------*
*
DATA : wa_kna1              TYPE kna1.                                " Maestro de clientes (parte general)
DATA : wa_knb1              TYPE knb1.                                " Maestro de clientes (sociedad)
DATA : wa_knvv              TYPE knvv.                                " Maestro de clientes datos comerciales
DATA : wa_bapiaddr1         TYPE bapiaddr1.                           " Estructura de referencia BAPI p.direcciones (org./empresa)
DATA : wa_bapiaddr2         TYPE bapiaddr2.                           " Estructura referencia BAPI p.direcciones (personas físicas)
*
DATA : it_xknvi             TYPE STANDARD TABLE OF fknvi,             " Change document structure; generated using RSSCD000
       wa_xknvi             TYPE fknvi,
       wx_xknvi             TYPE fknvi.
*
DATA : it_xknvp             TYPE STANDARD TABLE OF fknvp,             " Change document structure; generated using RSSCD000
       wa_xknvp             TYPE fknvp,
       wx_xknvp             TYPE fknvp.
*
DATA : it_yknvp             TYPE STANDARD TABLE OF fknvp,             " Change document structure; generated using RSSCD000
       wa_yknvp             TYPE fknvp,
       wx_yknvp             TYPE fknvp.
*
DATA : it_ad1vl             TYPE STANDARD TABLE OF bapiad1vl,         " Estructura BAPI p.distribución tp.dirección 1
       wa_ad1vl             TYPE bapiad1vl.
DATA : it_adsmtp            TYPE STANDARD TABLE OF bapiadsmtp,        " Estructura BAPI p.direcciones correo electr.(Bus.Addr.Serv.)
       wa_adsmtp            TYPE bapiadsmtp.
DATA : it_adtel             TYPE STANDARD TABLE OF bapiadtel,         " Estructura BAPI p.números teléfono (Business Address Serv.)
       wa_adtel             TYPE bapiadtel.
DATA : it_return            TYPE STANDARD TABLE OF bapiret2,          " Parámetro de retorno
       wa_return            TYPE bapiret2.
DATA : it_ad1vlx            TYPE STANDARD TABLE OF bapiad1vlx,        " Estructura referencia modif.BAPI p.estructura BAPIAD1VL
       wa_ad1vlx            TYPE bapiad1vlx.
DATA : it_adtelx            TYPE STANDARD TABLE OF bapiadtelx,        " Estructura referencia modif.BAPI p.estructura BAPIADTEL
       wa_adtelx            TYPE bapiadtelx.
DATA : it_adsmtx            TYPE STANDARD TABLE OF bapiadsmtx,        " Estructura referencia modif.BAPI p.estructura BAPIADSMTP
       wa_adsmtx            TYPE bapiadsmtx.
*
DATA : wx_kna1              TYPE kna1.                                "


*
*----------------------------------------------------------------------*
*  INICIO SECUENCIA DE CREACION DE PACIENTES
*----------------------------------------------------------------------*
*

*
*   -------------------------------------------------------------------*
*    LLENADO TBI : IT_KNA1 ( MAESTR DE CLIENTES DATOS GENERALES )
*   -------------------------------------------------------------------*
*
CLEAR   : wa_kna1.
*
wa_kna1-kunnr   = '0000000100'.                                     " Numero de Cliente
wa_kna1-land1   = 'CL'.                                             " Pais
wa_kna1-ktokd   = 'DPCT'.                                           " Grupo de Cuentas Deudor
wa_kna1-spras   = 'S'.                                              " Idioma
wa_kna1-name3   = 'Nombre 3'.                                       " Nombre 3
*

*
*   -------------------------------------------------------------------*
*    LLENADO TBI : IT_KNVV ( MAESTRO CLIENTE DATOS COMERCIALES )
*   -------------------------------------------------------------------*
*
CLEAR   : wa_knvv.
*
wa_knvv-kunnr   = '0000000100'.                                     " Numero de Cliente
wa_knvv-vkorg   = '1000'.                                           " Organizacion de Venta
wa_knvv-vtweg   = '10'.                                             " Canal de distribución
wa_knvv-spart   = '10'.                                             " Sector
wa_knvv-kdgrp   = '01'.                                             " Grupo de clientes
wa_knvv-waers   = 'CLP'.                                            " Moneda
wa_knvv-kalks   = '1'.                                              " Esquema calculo del paciente
wa_knvv-versg   = '1'.                                              " Grupo de estadísticas cliente
wa_knvv-zterm   = 'ZXXX'.                                           " Clave de condiciones de pago
wa_knvv-pltyp   = 'A1'.                                             " Tipo de lista de precios
wa_knvv-awahr   = '100'.                                            " Probabilidad de pedido de posición
wa_knvv-antlf   = '9'.                                              " Cantidad máxima de entregas parciales permitidas p/posición
wa_knvv-kzazu   = 'X'.                                              " Indicador de agrupamiento de pedidos
wa_knvv-vwerk   = 'CE0Q'.                                           " Centro suministrador
wa_knvv-vkbur   = '1001'.                                           " Oficina de ventas
wa_knvv-vkgrp   = 'GR1'.                                            " Grupo de Vendedores

*
*   -------------------------------------------------------------------*
*    LLENADO TBI : IT_BAPIADDR2 ( ESTR.BAPI DIREC.PERSONAS FISICAS )
*   -------------------------------------------------------------------*
*
CLEAR   : wa_bapiaddr2.
*
wa_bapiaddr2-firstname    = 'NOMBRE 1'.                             " Nombre Cliente
wa_bapiaddr2-lastname     = 'NOMBRE 2'.                             " Nombre Cliente
wa_bapiaddr2-langu_p      = 'S'.                                    " Idioma
wa_bapiaddr2-langup_iso   = 'S'.                                    " Idioma ISO
wa_bapiaddr2-fullname_x   = 'X'.

wa_bapiaddr2-house_no     = '1345'.                                 " Nº en la Direccion

wa_bapiaddr2-country      = 'CL'.                                   " Pais
wa_bapiaddr2-countryiso   = 'CL'.                                   " Pais ISO
wa_bapiaddr2-region       = '13'.                                   " Region
wa_bapiaddr2-time_zone    = 'CHILE'.                                " Zona Horaria
wa_bapiaddr2-e_mail       = 'CUALQUIER.CORREO@EMAIL.COM'.           " Direccion Correo
wa_bapiaddr2-city         = 'CITY'.
wa_bapiaddr2-district     = 'DISTRICT'.

*
*----------------------------------------------------------------------*
* DATOS DE IMPUESTOS
*----------------------------------------------------------------------*
*
REFRESH : it_xknvi.
CLEAR   : it_xknvi, wa_xknvi, wx_xknvi.

wa_xknvi-kunnr            = '0000000100'.                       " Numero de Cliente
wa_xknvi-aland            = 'CL'.                               " Pais
wa_xknvi-tatyp            = 'MWST'.                             " Tipo de Impuesto
wa_xknvi-taxkd            = '0'.                                " Tipo de Casificacion Fiscal (Exento )
wa_xknvi-kz               = 'U'.                                " Tipo de modificación (U, I, E, D)
APPEND wa_xknvi TO it_xknvi.
*
*----------------------------------------------------------------------*
*  DATOS DE INTERLOCUTOR COMERCIAL
*----------------------------------------------------------------------*
*
REFRESH : it_xknvp.
CLEAR   : it_xknvp, wa_xknvp, wx_xknvp.
*
wa_xknvp-kunnr            = '0000000100'.                           " Numero de Cliente
wa_xknvp-vkorg            = '1000'.                                 " Organizacion de Ventas
wa_xknvp-vtweg            = '10'.                                   " Canal de Disrtibucion
wa_xknvp-spart            = '10'.                                   " Funcion
wa_xknvp-parvw            = 'RG'.                                   " Tipo de Interlocutor
wa_xknvp-kunn2            = '99999999-9'.                           " Número de cliente del interlocutor
wa_xknvp-kz               = 'I'.                                    " Tipo de modificación (U, I, E, D)
*
APPEND wa_xknvp TO it_xknvp.


*   -------------------------------------------------------------------*
*    EJECUTAR BAPI MODIFICACION DE CLIENTES : SD_CUSTOMER_MAINTAIN_ALL
*   -------------------------------------------------------------------*
*
CALL FUNCTION 'SD_CUSTOMER_MAINTAIN_ALL'
  EXPORTING
    i_kna1                  = wa_kna1
    i_knb1                  = wa_knb1
    i_knvv                  = wa_knvv
    i_bapiaddr1             = wa_bapiaddr1
    i_bapiaddr2             = wa_bapiaddr2
    pi_postflag             = 'X'
    pi_cam_changed          = 'X'
  IMPORTING
    e_kunnr                 = ld_kunnr
    o_kna1                  = wx_kna1
    e_sd_cust_1321_done     = ld_sd_cust_1321_done
  TABLES
    t_xknvi                 = it_xknvi
    t_xknvp                 = it_xknvp
    t_yknvp                 = it_yknvp
  EXCEPTIONS
    client_error            = 1
    kna1_incomplete         = 2
    knb1_incomplete         = 3
    knb5_incomplete         = 4
    knvv_incomplete         = 5
    kunnr_not_unique        = 6
    sales_area_not_unique   = 7
    sales_area_not_valid    = 8
    insert_update_conflict  = 9
    number_assignment_error = 10
    number_not_in_range     = 11
    number_range_not_extern = 12
    number_range_not_intern = 13
    account_group_not_valid = 14
    parnr_invalid           = 15
    bank_address_invalid    = 16
    tax_data_not_valid      = 17
    no_authority            = 18
    company_code_not_unique = 19
    dunning_data_not_valid  = 20
    knb1_reference_invalid  = 21
    cam_error               = 22
    OTHERS                  = 23.
*
IF ( sy-subrc EQ 0 ).
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ENDIF.


10
Bapis / ADDR_MAINTAIN_COMPLETE - Modificar Datos de Direccion
« en: 05 de Diciembre de 2012, 06:14:15 am »
Aqui les dejo un pequeño ejemplo de como modificar datos de direccion...


REPORT y_test_050.

TYPE-POOLS: szadr.

*
*----------------------------------------------------------------------*
* DECLARACION DE VARIABLES
*----------------------------------------------------------------------*
*
DATA : ld_addnr             TYPE ad_addrnum.

*
*----------------------------------------------------------------------*
* DECLARACION DE TABLAS INTERNAS Y ESTRUCTURAS
*----------------------------------------------------------------------*
*

DATA : wx_kna1              TYPE kna1.                                "
DATA : addr_complete        TYPE szadr_addr1_complete.
DATA : adsmtp_line          TYPE szadr_adsmtp_line,
       addr1_line           TYPE szadr_addr1_line,
       adtel_line           TYPE szadr_adtel_line.

DATA : ld_recode            LIKE  szad_field-returncode.
DATA : lt_error             TYPE STANDARD TABLE OF addr_error.

* ----------------------------------------------------------------*
* EJECUTAR BAPI : ADDR_GET_COMPLETE
* ----------------------------------------------------------------*

*
*  Aqui codigo para obtener en WX_KNA1 en Numero de Direccion "ADRNR"
*



*

addr_complete-addrnumber = wx_kna1-adrnr.

*
*  Obtener Datos de Direccion Completos
*
CALL FUNCTION 'ADDR_GET_COMPLETE'
  EXPORTING
    addrnumber        = addr_complete-addrnumber
    addrhandle        = addr_complete-addrhandle
  IMPORTING
    addr1_complete    = addr_complete
  EXCEPTIONS
    parameter_error   = 1
    address_not_exist = 2
    internal_error    = 4
    OTHERS            = 5.

*
*  Aqui codigo de lo que se quiera modificar...
*



*
* Ejemplo : Para Modificar Datos de : addr1_line
*
READ TABLE addr_complete-addr1_tab INTO addr1_line INDEX 1 .
addr1_line-data-extension2  = 'TEST 01'.
addr1_line-data-house_num1  = '1232'.

MODIFY addr_complete-addr1_tab FROM addr1_line
                               INDEX 1.


*
* Ejemplo : Para Modificar el Telefono 01
*

CLEAR : adtel_line-adtel.
adtel_line-adtel-country      = 'CL'.                                    " Pais
adtel_line-adtel-tel_number   = '666222666'.                             " Telefono Fijo - 01
adtel_line-adtel-telnr_long   = '666222666'.                             " Telefono Fijo - 01
adtel_line-adtel-telnr_call   = '666222666'.                             " Telefono Fijo - 01
adtel_line-adtel-home_flag    = 'X'.                                     " Dirección destinatario en esta cl.comunicación (vínc.correo)
adtel_line-adtel-r3_user      = '1'.                                     " Tipo de Telefono
adtel_line-adtel-updateflag   = 'I'.
APPEND adtel_line TO addr_complete-adtel_tab.

*
* ----------------------------------------------------------------*
* EJECUTAR BAPI : ADDR_MAINTAIN_COMPLETE
* ----------------------------------------------------------------*

CALL FUNCTION 'ADDR_MAINTAIN_COMPLETE'
  EXPORTING
    updateflag               = 'U'
    addr1_complete           = addr_complete
    address_group            = 'BP'
    substitute_all_comm_data = ' '
    check_address            = ' '
  IMPORTING
    returncode               = ld_recode
  TABLES
    error_table              = lt_error
  EXCEPTIONS
    parameter_error          = 1
    address_not_exist        = 2
    handle_exist             = 4
    internal_error           = 5
    OTHERS                   = 6.
*
IF ( sy-subrc EQ 0 ).

  CALL FUNCTION 'ADDR_MEMORY_SAVE'
    EXPORTING
      execute_in_update_task = 'X'
    EXCEPTIONS
      address_number_missing = 1
      person_number_missing  = 2
      internal_error         = 3
      database_error         = 4
      reference_missing      = 5
      OTHERS                 = 6.

*
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.

*
ENDIF.


11
Reports / FIELD-SYMBOLS : Asignacion y Comparacion de Datos en Forma Dinamica
« en: 09 de Noviembre de 2012, 05:43:56 am »
La de idea de esta rutina es no tener que estar asignando variables, estructuras o comparando siempre línea a línea...
Esta idea llego cuando estaba desarrollando una aplicación que debe maneja bastantes datos en memoria, poder modificar
datos y luego reversar los datos, asignar valores a variables desde una pantalla a varios campos de distintas áreas de trabajo...
entonces pensé...si SAP maneja el concepto de áreas de trabajo...porque no aplicar esto a mi programa...entonces pensé en crear una
tabla interna con correlativos de áreas o procesos y los campos de estructuras o variables que deseo estar asignando de un lado a otro y
como resultado salió este programita...Ojala les sirva ...El código fuente da para mucho mas...

Cualquier idea o aporte...será bien recibido



REPORT y_proceso_dinamico.


*-----------------------------------------------------------------------------------------------------------------*
* Tabla para Catalogo de Campos de TBI's y Variables
* Para Utilizar Field-Symbols en Asignacion Dinamica
* De Datos desde un Lado a Otro...
*-----------------------------------------------------------------------------------------------------------------*
TYPES : BEGIN OF ty_itab,
          proceso(5)          TYPE n,                     " Correlativo Identifica Datos a Procesar
          tabla01             TYPE tabname,               " Area de Trabajo 01
          campo01             TYPE fieldname,             " Campo / Variable Area de Trabajo 01
          tabla02             TYPE tabname,               " Area de Trabajo 01
          campo02             TYPE fieldname,             " Campo / Variable Area de Trabajo 01
        END OF ty_itab.

DATA  : ti_itab               TYPE STANDARD TABLE OF ty_itab,
        wa_itab               TYPE ty_itab.
*-----------------------------------------------------------------------------------------------------------------*
DATA : gd_telefono_01(15)     TYPE c,
       gd_telefono_02(15)     TYPE c.
*-----------------------------------------------------------------------------------------------------------------*
DATA : lx_kna1                TYPE kna1.
*-----------------------------------------------------------------------------------------------------------------*
DATA : gd_retorno(1)          TYPE c.
*-----------------------------------------------------------------------------------------------------------------*
DATA : BEGIN OF wa_area_001,
         name1                LIKE lx_kna1-name1,
         ort01                LIKE lx_kna1-ort01,
         regio                LIKE lx_kna1-regio,
         name3                LIKE lx_kna1-name3,
         fono_01(20)          TYPE c,
         fono_02(20)          TYPE c,
         fecha                TYPE datum,
         hora                 TYPE uzeit,
       END OF wa_area_001.

DATA : gd_usuario(15)         TYPE c.
*
*-----------------------------------------------------------------------------------------------------------------*
* MACRO : MC_ADD_TO_ITAB : Agrega definiciones de asignacion o comparacion
*-----------------------------------------------------------------------------------------------------------------*
*
DEFINE mc_add_to_itab.
*
  clear : wa_itab.
  wa_itab-proceso   = &1.
  wa_itab-tabla01   = &2.
  wa_itab-campo01   = &3.
  wa_itab-tabla02   = &4.
  wa_itab-campo02   = &5.
  append wa_itab to ti_itab.
*
END-OF-DEFINITION.
*
*-----------------------------------------------------------------------------------------------------------------*
* START-OF-SELECTION
*-----------------------------------------------------------------------------------------------------------------*
*
START-OF-SELECTION.
*
  PERFORM llena_tbi_diccionario.
*-----------------------------------------------------------------------------------------------------------------*
*  llenado de las tablas internas o variables
*  Aqui el Codigo...de Ejemplo.  AREA 01
*-----------------------------------------------------------------------------------------------------------------*
  wa_area_001-name1       = 'JUAN PEREZ GONZALEZ'.
  wa_area_001-ort01       = 'CUALQUIER COSA'.
  wa_area_001-regio       = '13'.
  wa_area_001-name3       = 'NOMBRE TRES'.
  wa_area_001-fono_01     = '(56 2) 6771474'.
  wa_area_001-fono_02     = '(56 9) 9234532'.

  gd_usuario              = 'XXXX'.

  BREAK-POINT.
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO

*-----------------------------------------------------------------------------------------------------------------*
*  Mover de Izquierda a Derecha.
  PERFORM frm_proceso_dinamico USING 'DE_01_A_02'
                                     '00001'
                                CHANGING gd_retorno.
  BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO



*-----------------------------------------------------------------------------------------------------------------*
*  llenado de las tablas internas o variables
*  Aqui el Codigo...de Ejemplo.  AREA 02
*-----------------------------------------------------------------------------------------------------------------*
  lx_kna1-name1           = 'JOSE LX_KNA1'.
  gd_telefono_01          = '(56 2) LX_KNA1'.
  gd_telefono_02          = '(56 9) LX_KNA1'.
*-----------------------------------------------------------------------------------------------------------------*
*  Mover de Derecha a Izquierda.

  PERFORM frm_proceso_dinamico USING 'DE_02_A_01'
                                     '00001'
                                CHANGING gd_retorno.
  BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO

*-----------------------------------------------------------------------------------------------------------------*
*  Validar si contenido de los campos son iguales.
  PERFORM frm_proceso_dinamico USING '01_EQ_02'
                                     '00001'
                                CHANGING gd_retorno.
  BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO

*-----------------------------------------------------------------------------------------------------------------*
*  Mover de Izquierda a Derecha.
  PERFORM frm_proceso_dinamico USING 'DE_01_A_02'
                                     '00001'
                                CHANGING gd_retorno.

  BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO
*

*
END-OF-SELECTION.
*
*-----------------------------------------------------------------------------------------------------------------*
*  Aqui es donde vamos agregando las estrcuras, tablas o variables que deaseamos
*  asignar o comparar en un determinado momento
*-----------------------------------------------------------------------------------------------------------------*
*
FORM llena_tbi_diccionario.

  REFRESH : ti_itab.
  CLEAR   : ti_itab, wa_itab.

  mc_add_to_itab    '00001'   'WA_AREA_001'   'NAME1'                 'LX_KNA1'      'NAME1'.
  mc_add_to_itab    '00001'   'WA_AREA_001'   'ORT01'                 'LX_KNA1'      'ORT01'.
  mc_add_to_itab    '00001'   'WA_AREA_001'   'REGIO'                 'LX_KNA1'      'REGIO'.
  mc_add_to_itab    '00001'   'WA_AREA_001'   'NAME3'                 'LX_KNA1'      'NAME3'.
  mc_add_to_itab    '00001'   'WA_AREA_001'   'FONO_01'               ''             'GD_TELEFONO_01'.
  mc_add_to_itab    '00001'   'WA_AREA_001'   'FONO_02'               ''             'GD_TELEFONO_02'.
  mc_add_to_itab    '00001'   'WA_AREA_001'   'FECHA'                 ''             'SY-DATUM'.
  mc_add_to_itab    '00001'   'WA_AREA_001'   'HORA'                  ''             'SY-UZEIT'.
  mc_add_to_itab    '00001'   ''              'GD_USUARIO'            ''             'SY-UNAME'.

ENDFORM.                                                                                                          "
*
*-----------------------------------------------------------------------------------------------------------------*
* FORM : FRM_PROCESO_DINAMICO : Realiza Asignaciones o Comparaciones se excluyen
*                                                          las asignacines a variables de sistema "SY-*"
*-----------------------------------------------------------------------------------------------------------------*
*
FORM frm_proceso_dinamico  USING    p_ld_sentido
                                    p_ld_proceso
                           CHANGING p_gd_retorno.
*
  DATA : ld_tbicamp1(40)  TYPE c,
         ld_tbicamp2(40)  TYPE c.
  DATA : ld_var_aux1(100) TYPE c,
         ld_var_aux2(100) TYPE c.

  FIELD-SYMBOLS : <fs_scr>, <fs_tbi>.
  FIELD-SYMBOLS : <fs_ax1>, <fs_ax2>.

  p_gd_retorno = 'T'.
*

  LOOP AT ti_itab INTO wa_itab WHERE proceso EQ p_ld_proceso.
    CLEAR : ld_tbicamp1, ld_tbicamp2.
*
    IF ( wa_itab-tabla01 NE '' ).
      CONCATENATE wa_itab-tabla01 '-' wa_itab-campo01 INTO ld_tbicamp1.
    ELSE.
      MOVE wa_itab-campo01 TO ld_tbicamp1.
    ENDIF.
*
    IF ( wa_itab-tabla02 NE '' ).
      CONCATENATE wa_itab-tabla02 '-' wa_itab-campo02 INTO ld_tbicamp2.
    ELSE.
      MOVE wa_itab-campo02 TO ld_tbicamp2.
    ENDIF.

    ASSIGN (ld_tbicamp1) TO <fs_scr>.
    ASSIGN (ld_tbicamp2) TO <fs_tbi>.

    CASE p_ld_sentido.

      WHEN 'DE_01_A_02'.
*
        IF ( wa_itab-campo02+00(03) NE 'SY-' ).
          IF ( wa_itab-tabla01 EQ '' ) AND ( wa_itab-tabla02 EQ '' ).
            ASSIGN (ld_tbicamp2) TO <fs_ax2>.
            <fs_tbi> = <fs_scr>.
          ELSE.
            <fs_tbi> = <fs_scr>.
          ENDIF.
        ENDIF.


*
      WHEN 'DE_02_A_01'.
*
        IF ( wa_itab-campo01+00(03) NE 'SY-' ).

          IF ( wa_itab-tabla01 EQ '' ) AND ( wa_itab-tabla02 EQ '' ).
            ASSIGN (ld_tbicamp2) TO <fs_ax2>.
            <fs_scr> =  <fs_ax2>.
          ELSE.
            <fs_scr> = <fs_tbi>.
          ENDIF.
        ENDIF.
*
      WHEN '01_EQ_02'.

        IF ( <fs_tbi> NE <fs_scr> ).
          p_gd_retorno = 'F'.
          EXIT.
        ENDIF.

    ENDCASE.

*
  ENDLOOP.
*
ENDFORM.                                                                                                          "
*


12
Reports / Transformar Orden Spool a PDF
« en: 09 de Noviembre de 2012, 02:23:31 am »
Aqui dejo un pequeño ejemplo de como leer la ultima orden Spool del Usuario actual, transformarla a PDF y luego bajarla al PC.

REPORT Y_TEST_PDF_A_PC.
*
*---------------------------------------------------------------------------------------*
* DECLARACION DE VARIABLES
*---------------------------------------------------------------------------------------*
*
*
*---------->>>  Path + Nombre del Archivo de Salida
*
DATA : ld_archivo             TYPE string VALUE 'C:\PASO\TEST_PDF_002.PDF'.
*
*---------->>>
*
DATA : ld_bin_filesize        TYPE i.
DATA : ld_pdf_spoolid         TYPE rspoid.
DATA : ld_otf_pagecount       TYPE i.
DATA : ld_btc_jobname         TYPE btcjob.
DATA : ld_btc_jobcount        TYPE btcjobcnt.
DATA : ld_bin_file            TYPE xstring.
DATA : it_arch_pdf            TYPE STANDARD TABLE OF tline.
DATA : it_tsp01               TYPE STANDARD TABLE OF tsp01  WITH HEADER LINE.
*
*---------------------------------------------------------------------------------------*
* SELECCION DE DATOS - ULTIMA ORDEN SPOOL DEL USURIO
*---------------------------------------------------------------------------------------*
*
SELECT rqident INTO CORRESPONDING FIELDS OF TABLE it_tsp01
  FROM tsp01
    WHERE rqowner EQ sy-uname.
*
SORT it_tsp01 BY rqident DESCENDING.
*
READ TABLE it_tsp01 INDEX 1.
*
*---------------------------------------------------------------------------------------*
* CONVERTIR SPOOL A PDF
*---------------------------------------------------------------------------------------*
*
CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
  EXPORTING
    src_spoolid              = it_tsp01-rqident
    no_dialog                = ''
  IMPORTING
    pdf_bytecount            = ld_bin_filesize
    pdf_spoolid              = ld_pdf_spoolid
    btc_jobname              = ld_btc_jobname
    btc_jobcount             = ld_btc_jobcount
  TABLES
    pdf                      = it_arch_pdf
  EXCEPTIONS
    err_no_otf_spooljob      = 1
    err_no_spooljob          = 2
    err_no_permission        = 3
    err_conv_not_possible    = 4
    err_bad_dstdevice        = 5
    user_cancelled           = 6
    err_spoolerror           = 7
    err_temseerror           = 8
    err_btcjob_open_failed   = 9
    err_btcjob_submit_failed = 10
    err_btcjob_close_failed  = 11
    OTHERS                   = 12.
*
*---------------------------------------------------------------------------------------*
* BAJAR EL ARCHIVO PDF AL PC
*---------------------------------------------------------------------------------------*
*
IF ( sy-subrc EQ 0 ).

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize            = ld_bin_filesize
      filename                = ld_archivo
      filetype                = 'BIN'
    TABLES
      data_tab                = it_arch_pdf
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6.

ENDIF.
*
*---------------------------------------------------------------------------------------*
*

13
Programación ABAP / MOVIDO: Manuales ABAP 2008
« en: 18 de Mayo de 2010, 05:40:29 am »

14
Programación ABAP / MOVIDO: Manuales para programar
« en: 10 de Noviembre de 2009, 12:43:48 pm »

15
Busca Ampliaciones en SAP - User-Exit - BADI's - Etc por transaccion o Programa...Espero que les sirva ...

report  y_busca_ampliaciones line-size 255
                                 no standard page heading.

TYPE-POOLS:
  icon,
  rsfs,
  rsds,
  slis.              "Tipos de datos para listas genéricas.

TABLES:
  d010inc,          "Tabla de utilización para Includes ABAP
  dd03l,            "Campos de tabla
  modact,           "Modificaciones de la CMOD
  modsap,           "Ampliaciones SAP
  sxs_inter,        "Exit: Pág.definición: Interfaces
  sscrfields,       "Campos en las imágenes de selección
  tddir,            "Exits de campo activos para elementos de datos
  tddirs,           "Exits de campos en determinados dynpros
  tftit,            "Texto breve de un módulo de funciones
  trdirt,           "Textos tͭtulo p.programas en TRDIR
  tstc,             "Códigos de transacción SAP
  tstct.            "Textos de códigos de transacción

*----------------------------------------------------------------------*
* CONSTANTS
*----------------------------------------------------------------------*
CONSTANTS:
  c_sust(22)      TYPE c VALUE 'SUBSTITUTION',
  c_user_exit(22) TYPE c VALUE 'USEREXIT',
  c_badi(22)      TYPE c VALUE 'BADI',
  c_handler(30)   TYPE c VALUE 'CL_EXITHANDLER=>GET_INSTANCE',
  c_method(22)    TYPE c VALUE 'CALL METHOD',
  c_type_ref(22)  TYPE c VALUE 'TYPE REF TO',
  c_perform(22)   TYPE c VALUE 'PERFORM',
  c_form(22)      TYPE c VALUE 'FORM',
  c_endform(22)   TYPE c VALUE 'ENDFORM',
  c_bte(22)       TYPE c VALUE 'OPEN_FI_PERFORM',
  c_bte1(22)      TYPE c VALUE 'OUTBOUND_CALL',
  c_enhance(22)   TYPE c VALUE 'CALL CUSTOMER-FUNCTION',
  c_funcao_1(13)  TYPE c VALUE 'CALLFUNCTION''',
  c_funcao_2(13)  TYPE c VALUE 'CALL FUNCTION',
  c_enh(11)       TYPE c VALUE 'ENHANCEMENT',
  c_enh1(17)      TYPE c VALUE 'ENHANCEMENT-POINT',
  c_enh2(19)      TYPE c VALUE 'ENHANCEMENT-SECTION',
  c_endenh(14)    TYPE c VALUE 'ENDENHANCEMENT',
  c_endenh1(23)   TYPE c VALUE 'END-ENHANCEMENT-SECTION',
  c_include(07)   TYPE c VALUE 'INCLUDE',
  c_submit(06)    TYPE c VALUE 'SUBMIT',
  c_struct(11)    TYPE c VALUE ' STRUCTURE ',
  c_comentario    TYPE c VALUE '*',
  c_ponto         TYPE c VALUE '.',
  c_aspa          TYPE c VALUE '''',
  c_igual(3)      TYPE c VALUE ' = ',
  c_x             TYPE c VALUE 'X'.

CONSTANTS:
  c_ue(4)   TYPE c VALUE 'EXIT',
  c_b(4)    TYPE c VALUE 'BADI',
  c_bt(4)   TYPE c VALUE 'BTE',
  c_st(4)   TYPE c VALUE 'SUST',
  c_fdex(4) TYPE c VALUE 'FDEX',
  c_enht(4) TYPE c VALUE 'ENH',
  c_operation(4) TYPE c VALUE 'SHOW',
  c_type(4)      TYPE c VALUE 'PROG',
* Textos
  c_text_01  TYPE slis_fieldcat_alv-reptext_ddic VALUE 'Programa',
  c_text_02  TYPE slis_fieldcat_alv-reptext_ddic VALUE 'Nivel',
  c_text_03  TYPE slis_fieldcat_alv-reptext_ddic VALUE 'Linea',
  c_text_04  TYPE slis_fieldcat_alv-reptext_ddic VALUE 'Código fuente',
  c_text_05  TYPE slis_fieldcat_alv-reptext_ddic VALUE 'Tipo',
  c_text_06  TYPE string                         VALUE 'Breakpoint',
  c_text_07  TYPE slis_fieldcat_alv-reptext_ddic VALUE 'STOP',
  c_text_08  TYPE string                     VALUE 'Marcar todo',
  c_text_09  TYPE string                     VALUE 'Desmarcar todo',
  c_text_e01 TYPE slis_fieldcat_alv-reptext_ddic VALUE
    'Debe ingresar programa o transacción',
  c_text_e02 TYPE slis_fieldcat_alv-reptext_ddic VALUE
    'Debe ingresar solo programa o transacción',
  c_text_e03 TYPE slis_fieldcat_alv-reptext_ddic VALUE
    'Debe seleccionar un tipo de mejora'.

CONSTANTS:
  c_std_definition(3) TYPE c VALUE 'SAP',
  c_std_implmnt(3)    TYPE c VALUE 'KUN'.

*----------------------------------------------------------------------*
* TABLAS INTERNAS
*----------------------------------------------------------------------*
TYPES: BEGIN OF x_tadir,
          obj_name TYPE sobj_name,
          devclass TYPE devclass,
       END OF x_tadir.

TYPES: BEGIN OF x_slog,
          obj_name TYPE sobj_name,
       END OF x_slog.

DATA: BEGIN OF ti_programa OCCURS 0,
*        cf like rssource-line,
        cf(500),
      END   OF ti_programa.

DATA: BEGIN OF ti_includes OCCURS 0,
        nome     LIKE sy-repid,
        nivel(2) TYPE n,
      END   OF ti_includes.

DATA: BEGIN OF ti_user_exit OCCURS 0,
        programa  LIKE sy-repid,
        tipo(4),
        linea(10) TYPE n,
*        cf        LIKE rssource-line,
        cf(500),
        nivel(2)  TYPE n,
        break     LIKE icon-id,
        sel(1),
      END   OF ti_user_exit.

DATA: BEGIN OF ti_badi OCCURS 0,
        programa  LIKE sy-repid,
        tipo(4),
        linea(10) TYPE n,
*        cf        LIKE rssource-line,
        cf(500),
        nivel(2)  TYPE n,
        break     LIKE icon-id,
        sel(1),
      END   OF ti_badi.

DATA: BEGIN OF ti_bte OCCURS 0,
        programa  LIKE sy-repid,
        tipo(4),
        linea(10) TYPE n,
*        cf        LIKE rssource-line,
        cf(500),
        nivel(2)  TYPE n,
        break     LIKE icon-id,
        sel(1),
      END   OF ti_bte.

DATA: BEGIN OF ti_enh OCCURS 0,
        programa  LIKE sy-repid,
        tipo(4),
        linea(10) TYPE n,
*        cf        LIKE rssource-line,
        cf(500),
        nivel(2)  TYPE n,
        break     LIKE icon-id,
        sel(1),
      END   OF ti_enh.

DATA: BEGIN OF ti_enhobj OCCURS 0,
        enhname  LIKE enhobj-enhname,
        version  LIKE enhobj-version,
        obj_type LIKE enhobj-obj_type,
        obj_name LIKE enhobj-obj_name,
        sel(1),
      END   OF ti_enhobj.

DATA: BEGIN OF ti_fdex OCCURS 0,
        tipo(4),
*        cf        LIKE rssource-line,
        cf(500),
        sel(1),
      END   OF ti_fdex.

DATA:
  ti_tadir TYPE STANDARD TABLE OF x_tadir WITH HEADER LINE,
  ti_jtab  TYPE STANDARD TABLE OF x_slog  WITH HEADER LINE.

DATA: BEGIN OF ti_final OCCURS 0,
          name     LIKE modsap-name,
          member   LIKE modsap-member,
          include  LIKE rs38l-include, "(15), "Include name
          stext    LIKE tftit-stext,
          programa LIKE rs38l-include,
          sel(1),
      END OF ti_final.

DATA: BEGIN OF ti_sust OCCURS 0,
          substid   LIKE gb922-substid,
          subseqnr  LIKE gb922-subseqnr,
          conseqnr  LIKE gb922-conseqnr,
          substab   LIKE gb922-substab,
          subsfield LIKE gb922-subsfield,
          subsval   LIKE gb922-subsval,
          exitsubst LIKE gb922-exitsubst,
          sel(1),
      END OF ti_sust.

DATA: BEGIN OF ti_val OCCURS 0,
          valid    LIKE gb931-valid,
          valseqnr LIKE gb931-valseqnr,
          condid   LIKE gb931-condid,
          checkid  LIKE gb931-checkid,
          sel(1),
      END OF ti_val.

DATA : BEGIN OF ti_bdcdata OCCURS 0.
        INCLUDE STRUCTURE bdcdata.
DATA : END OF ti_bdcdata.

DATA: ti_gb31t TYPE TABLE OF gb31t WITH HEADER LINE.

DATA: BEGIN OF ti_cimp OCCURS 0,
        enhname    LIKE enhobj-enhname,
        obj_type   LIKE enhobj-obj_type,
        obj_name   LIKE enhobj-obj_name,
        elemusage  LIKE enhobj-elemusage,
        enhinclude(40),  "like ENHINCINX-ENHINCLUDE,
      END   OF ti_cimp.

*----------------------------------------------------------------------*
* VARIABLE GLOBALES
*----------------------------------------------------------------------*
DATA:
  functxt         TYPE smp_dyntxt,
  w_tini          LIKE sy-timlo,
  vg_caracter     TYPE c,
  vg_palavra(50)  TYPE c,
  vg_inicial      LIKE sy-index,
  vg_conta_aspa   TYPE n,
  vg_pname LIKE   tfdir-pname,
  vg_texto(50)    TYPE c,
  vg_contador     LIKE sy-tfill,
  vg_nivel(2)     TYPE n,
  vg_ini_contagem TYPE c, " INDICA QUE DEBE SER INICIADO EL CONTADOR
  vg_conta_espaco TYPE n. " TOTAL DE ESPACIOS ( MÁXIMO 2 )

*----------------------------------------------------------------------*
* DEFINICION DE Estructuras y tablas para ALV (FM).
*----------------------------------------------------------------------*
DATA:
  wa_cat     TYPE slis_fieldcat_alv,      " WA catálogo
  ti_cat     TYPE slis_t_fieldcat_alv,    " TI catálogo
  wa_layout  TYPE slis_layout_alv,        " WA opciones lista
  ti_header  TYPE slis_t_listheader,      " TI cabecera lista
  wa_header  TYPE slis_listheader,        " WA cabecera lista
  wa_events  TYPE slis_alv_event,         " WA eventos lista
  ti_events  TYPE slis_t_event,           " TI eventos lista
  wa_sort    TYPE slis_sortinfo_alv,      " WA sort
  ti_sort    TYPE slis_t_sortinfo_alv,    " TI sort
  wa_print   TYPE slis_print_alv.         " WA print

*----------------------------------------------------------------------*
* PARAMETROS
*----------------------------------------------------------------------*

*- DATOS OBLIGATORIOS.
SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE tit1 .

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text2,
                  POSITION 20.
PARAMETERS: p_tcode LIKE tstc-tcode.          "Transacción
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text1,
                  POSITION 20.
PARAMETERS: p_prog  LIKE sy-repid.            "Programa
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN END   OF BLOCK bl01.

SELECTION-SCREEN BEGIN OF BLOCK bl02 WITH FRAME TITLE tit2 .
SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text7,
                  POSITION 20.
PARAMETERS: p_ue AS CHECKBOX.             "User-exit

* Boton de Exit's en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 25(45) btn USER-COMMAND ext
                                        VISIBLE LENGTH 12.

* Boton de Proyectos de Exit's en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 38(45) ext1 USER-COMMAND ext1
                                         VISIBLE LENGTH 12.

* Boton de User-Exit's en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 51(45) ext2 USER-COMMAND ext2
                                         VISIBLE LENGTH 12.

SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text8,
                  POSITION 20.
PARAMETERS: p_badi AS CHECKBOX.           "Badi's
* Boton de Interface en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 25(60) badi USER-COMMAND badi
                                         VISIBLE LENGTH 25.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  POSITION 25.
PARAMETERS: p_handl AS CHECKBOX DEFAULT 'X'.
"CL_EXITHANDLER=>GET_INSTANCE
SELECTION-SCREEN: COMMENT 30(40) text12.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text9,
                  POSITION 20.
PARAMETERS: p_bte AS CHECKBOX.            "Bte
* Boton de Tx. FIBF en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 25(60) bte1 USER-COMMAND bte1
                                         VISIBLE LENGTH 1.
* Boton de Tx. Evento en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 29(60) bte2 USER-COMMAND bte2
                                         VISIBLE LENGTH 10.
* Boton de Tx. Proceso en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 40(60) bte3 USER-COMMAND bte3
                                         VISIBLE LENGTH 10.


SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(19) text14,
                  POSITION 20.
PARAMETERS: p_enh AS CHECKBOX.            "Punto de ampliación

* Boton de Tx. SENH en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 25(60) senh USER-COMMAND senh
                                         VISIBLE LENGTH 1.

* Boton de Customer Implementation en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 29(60) cimp USER-COMMAND cimp
                                        VISIBLE LENGTH 24.

SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text10,
                  POSITION 20.
PARAMETERS: p_sust AS CHECKBOX.            "Sustitución

* Boton de Sustitución en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 25(45) btn1 USER-COMMAND obb
                                        VISIBLE LENGTH 12.

* Boton de programa sustitución en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 38(45) sust USER-COMMAND sust
                                         VISIBLE LENGTH 15.

SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text13,
                  POSITION 20.
PARAMETERS: p_val AS CHECKBOX.            "Validación

* Boton de Validación en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 25(45) ob28 USER-COMMAND ob28
                                        VISIBLE LENGTH 12.

* Boton de programa sustitución en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 38(45) val USER-COMMAND val
                                         VISIBLE LENGTH 15.

SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text11,
                  POSITION 20.
PARAMETERS: p_fdex AS CHECKBOX.            "Field-exit

* Boton de Field-exit en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 25(60) btn2 USER-COMMAND fdex
                                        VISIBLE LENGTH 28.

SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN END   OF BLOCK bl02.

*- DATOS OPCIONALES.
SELECTION-SCREEN BEGIN OF BLOCK bl03 WITH FRAME TITLE tit3.

SELECTION-SCREEN: BEGIN OF LINE.
* Boton de ALL en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 18(60) all USER-COMMAND all
                                         VISIBLE LENGTH 1.
* Boton de DAL en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 21(60) dal USER-COMMAND dal
                                         VISIBLE LENGTH 1.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: ULINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text3,
                  POSITION 20.
PARAMETERS: p_incl AS CHECKBOX DEFAULT 'X'.   "Includes
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text4,
                  POSITION 20.
PARAMETERS: p_func AS CHECKBOX DEFAULT 'X'.   "Funciones
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text5,
                  POSITION 20.
PARAMETERS: p_submit AS CHECKBOX DEFAULT 'X'. "Submit
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 1(15) text6,
                  POSITION 20.
PARAMETERS: p_nivel(2) TYPE n DEFAULT '04'.   "Nivel
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN END   OF BLOCK bl03.

* Botón de Marcar todo en el STATUS GUI.
SELECTION-SCREEN: FUNCTION KEY 1.
* Botón de Desmarcar todo en el STATUS GUI.
SELECTION-SCREEN: FUNCTION KEY 2.
* Botón de Breakpoint en el STATUS GUI.
SELECTION-SCREEN: FUNCTION KEY 3.

*-----------------------------------------------------------------------
* DEFINICIÓN DE MACROS
*-----------------------------------------------------------------------
DEFINE icon_create.
* Creo para el botón indicado, el icono y los textos correspondientes.

  call function 'ICON_CREATE'
    exporting
      name   = &2
      text   = &3
      info   = &4
    importing
      result = &1
    exceptions
      others = 0.

END-OF-DEFINITION. "icon_create

*-----------------------------------------------------------------------
* INICIALIZACIÓN DE VARIABLES
*-----------------------------------------------------------------------
INITIALIZATION.

  PERFORM def_text_parameter.

  PERFORM def_botones.

  CLEAR   ti_gb31t.
  REFRESH ti_gb31t.

* Obtengo Validación/Sustitución/Eventos/Texto.
  SELECT *
    INTO TABLE ti_gb31t
    FROM gb31t
    WHERE spras EQ sy-langu.

*-----------------------------------------------------------------------
* AT SELECTION-SCREEN
*-----------------------------------------------------------------------

AT SELECTION-SCREEN.

  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      MOVE 'X' TO : p_ue, p_badi, p_bte, p_sust, p_val, p_fdex, p_enh.
    WHEN 'FC02'.
      CLEAR: p_ue, p_badi, p_bte, p_sust, p_val, p_fdex, p_enh.
    WHEN 'FC03'.
      PERFORM breakpoint.
    WHEN 'EXT'.
      PERFORM visualizar_ampliacion.
    WHEN 'EXT1'.
      PERFORM visualizar_proyecto.
    WHEN 'EXT2'.
      PERFORM visualizar_fm_exit.
    WHEN 'BADI'.
      PERFORM visualizar_interface.
    WHEN 'OBB'.
      CALL TRANSACTION 'OBBH'.
    WHEN 'OB28'.
      CALL TRANSACTION 'OB28'.
    WHEN 'SUST' OR 'VAL'.
      PERFORM visualizar_programa.
    WHEN 'FDEX'.
      SUBMIT rsmodprf AND RETURN.
    WHEN 'BTE1'.
      CALL TRANSACTION 'FIBF'.
    WHEN 'BTE2'.
      PERFORM cargar_bte USING 'E'.
    WHEN 'BTE3'.
      PERFORM cargar_bte USING 'P'.
    WHEN 'SENH'.
      SUBMIT sapmsenh VIA SELECTION-SCREEN
        AND RETURN.
    WHEN 'CIMP'.
      PERFORM visualizar_imp_enh.
    WHEN 'ALL'.
      MOVE 'X' TO : p_incl, p_func, p_submit.
    WHEN 'DAL'.
      CLEAR: p_incl, p_func, p_submit.
    WHEN OTHERS.
* Do Nothing !!.
  ENDCASE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.

  PERFORM repid_f4.

*----------------------------------------------------------------------*
* INICIO
*----------------------------------------------------------------------*
START-OF-SELECTION.

  GET TIME FIELD w_tini.

*- CONSISTENCIAS DE LOS PARAMETROS.
  PERFORM consisti_parametros.

*- INICIALIZA TABLA.
  PERFORM inicializa_tabela.

*- VERIFICA SI EN EL PROGRAMA EXISTE ALGUN INCLUDE, FUNCION O SUBMIT.
  PERFORM verifica_include_funcao_submit.

*- ANALISA LOS INCLUDES Y BUSCA POR USER-EXIT, BADI'S Y BTE.
  PERFORM busca_user_exit_badi_bte.

*- ANALISA LOS INCLUDES Y BUSCA LOS FIELD-EXIT'S.
  PERFORM buscar_field_exit.

*- OBTENGO LOS EXIT's DE LA TRANSACCIÓN.
  PERFORM buscar_user_exit.

*- OBTENGO LAS PUNTOS DE AMPLIACIÓN.
  PERFORM buscar_enh.

*- OBTENGO LAS SUSTITUCIONES.
  PERFORM buscar_sustituciones.

*- OBTENGO LAS VALIDACIONES.
  PERFORM buscar_validaciones.

*- CARGO LOS BREAKPOINTS.
  PERFORM cargar_break.

*- VISUALIZA LAS AMPLIACIONES ENCONTRADAS.
  PERFORM exibe_user_exit.

*----------------------------------------------------------------------*
* FIN
*----------------------------------------------------------------------*
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  BUSCA_USER_EXIT_BADI_BTE
*&---------------------------------------------------------------------*
*       Busca EXIT's, BADI's y BTE en el código fuente.
*----------------------------------------------------------------------*
FORM busca_user_exit_badi_bte.

*- VERIFICA SI EN LOS INCLUDES SELECIONADOS EXISTEN EXITS.
  LOOP AT ti_includes.

    DESCRIBE TABLE ti_includes.
    PERFORM evitar_time_out USING sy-tfill.

*- BORRA LA TABLA INTERNA.
    REFRESH ti_programa.

*- REALIZA LECTURA DE INCLUDE ALMACENANDO EN TABLA INTERNA
    READ REPORT ti_includes-nome INTO ti_programa.

    LOOP AT ti_programa.

      IF p_ue EQ 'X'.
        PERFORM buscar_exit.
        PERFORM busca_enhancements.
      ENDIF.

      IF p_badi EQ 'X'.
        PERFORM buscar_badi.
      ENDIF.

      IF p_bte EQ 'X'.
        PERFORM buscar_bte.
      ENDIF.

      IF p_enh EQ 'X'.
        PERFORM buscar_punto_ampliacion.
      ENDIF.

    ENDLOOP.
  ENDLOOP.

ENDFORM.                               " BUSCA_USER_EXIT_BADI_BTE

*&---------------------------------------------------------------------*
*&      Form  BUSCA_ENHANCEMENTS
*&---------------------------------------------------------------------*
*       Busca las llamadas a los USER-EXIT.
*----------------------------------------------------------------------*
FORM busca_enhancements.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE EN ALGUN ENHANCEMENT.
  SEARCH ti_programa-cf FOR c_enhance.
*- SE ENCONTRO EL ENHANCEMENT Y LA LINEA NO ESTÁ COMENTADA.
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.
    CLEAR ti_user_exit.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
    SHIFT ti_programa-cf LEFT DELETING LEADING space.
    MOVE: ti_includes-nome  TO ti_user_exit-programa,
          c_ue              TO ti_user_exit-tipo,
          sy-tabix          TO ti_user_exit-linea,
          ti_programa-cf    TO ti_user_exit-cf,
          ti_includes-nivel TO ti_user_exit-nivel.
    APPEND ti_user_exit.
  ENDIF.

ENDFORM.                               " BUSCA_ENHANCEMENTS

*&---------------------------------------------------------------------*
*&      Form  EXIBE_USER_EXIT
*&---------------------------------------------------------------------*
*       Muestra los datos.
*----------------------------------------------------------------------*
FORM exibe_user_exit.

  PERFORM armar_alv.
  PERFORM mostrar_listado.

ENDFORM.                               " EXIBE_USER_EXIT

*&---------------------------------------------------------------------*
*&      Form  PROCURA_INCLUDE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM procura_include.

  CLEAR vg_palavra.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUN INCLUDE.
  SEARCH ti_programa-cf FOR c_include.
*- SE ENCONTRO EN EL INCLUDE Y LA LINEA NO ESTÁ COMENTADA.
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUN STRUCTURE.
    SEARCH ti_programa-cf FOR c_struct.

    IF sy-subrc IS INITIAL.
      EXIT.
    ENDIF.

*- VERIFICA TODOS LOS 500 CARACTERES DE LA LINEA PARA MONTAR NOMBRE
*- DEL INCLUDE
    DO 500 TIMES.
      vg_inicial = sy-index - 1.
      MOVE ti_programa-cf+vg_inicial(1) TO vg_caracter.
      IF NOT vg_caracter IS INITIAL.
*- VERIFICA SI NO ES FIN DE COMANDO.
        IF vg_caracter EQ c_ponto.
          EXIT.
        ENDIF.
*- ARMA PALABRA.
        CONCATENATE vg_palavra vg_caracter INTO vg_palavra.
*- CONVIERTE A MAYUSCULA PARA FUTURA COMPARACION.
        TRANSLATE vg_palavra TO UPPER CASE.
*- SE ENCONTRO ALGUN INCLUDE
        IF vg_palavra EQ c_include.
          CLEAR vg_palavra.
        ENDIF.
      ENDIF.
    ENDDO.
*- GRABA NOMBRE DEL INCLUDE PARA FUTURA BUSQUEDA POR USER EXIT.
    READ TABLE ti_includes WITH KEY nome = vg_palavra.
    IF NOT sy-subrc IS INITIAL.
      IF vg_nivel LE p_nivel.
        MOVE: vg_palavra TO ti_includes-nome,
              vg_nivel   TO ti_includes-nivel.
        APPEND ti_includes.
      ENDIF.
    ENDIF.

  ENDIF.

ENDFORM.                               " PROCURA_INCLUDE

*&---------------------------------------------------------------------*
*&      Form  PROCURA_FUNCAO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM procura_funcao.

  CLEAR: vg_conta_aspa,
         vg_palavra.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUNA FUNCION.
  SEARCH ti_programa-cf FOR c_funcao_2.
*- SE ENCONTRO UNA FUNCION Y LA LINEA NO ESTA COMENTADA..
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.
*- VERIFICA TODOS LOS 500 CARACTERES DE LA LINEA PARA MONTAR NOMBRE
*- DE LA INCLUDE
    DO 500 TIMES.
      vg_inicial = sy-index - 1.
      MOVE ti_programa-cf+vg_inicial(1) TO vg_caracter.
      IF NOT vg_caracter IS INITIAL.
*- VERIFICA SI NO ES FIN DE COMANDO.
        IF vg_caracter EQ c_aspa.
          ADD 1 TO vg_conta_aspa.
          IF vg_conta_aspa EQ 2.
            EXIT.
          ENDIF.
        ENDIF.
*- ARMA PALABRA.
        CONCATENATE vg_palavra vg_caracter INTO vg_palavra.
*- CONVIERTE A MAYUSCULA PARA FUTURA COMPARACION.
        TRANSLATE vg_palavra TO UPPER CASE.
*- SE ENCONTRO ALGUN INCLUDE
        IF vg_palavra EQ c_funcao_1.
          CLEAR vg_palavra.
        ENDIF.
      ENDIF.
    ENDDO.
*- BUSCA NOMBRE DE LA FUNCION PARA FUTURA BUSQUEDA POR USER EXIT.
    CLEAR vg_pname.
    SELECT SINGLE pname
           INTO   vg_pname
           FROM   tfdir
           WHERE  funcname EQ vg_palavra.
    IF sy-subrc EQ 0.

      READ TABLE ti_includes WITH KEY nome = vg_pname.
      IF NOT sy-subrc IS INITIAL.
        IF vg_nivel LE p_nivel.
          MOVE: vg_pname TO ti_includes-nome,
                vg_nivel TO ti_includes-nivel.
          APPEND ti_includes.
        ENDIF.
      ENDIF.

    ENDIF.
  ENDIF.

ENDFORM.                               " PROCURA_FUNCAO

*&---------------------------------------------------------------------*
*&      Form  VERIFICA_INCLUDE_FUNCAO_SUBMIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM verifica_include_funcao_submit.

  CHECK p_ue  IS NOT INITIAL OR p_badi IS NOT INITIAL
     OR p_bte IS NOT INITIAL OR p_enh  IS NOT INITIAL.

  LOOP AT ti_includes.

    ADD 1 TO vg_contador.
    DESCRIBE TABLE ti_includes.
    PERFORM evitar_time_out USING sy-tfill.
    MOVE ti_includes-nivel TO vg_nivel.
    ADD 1 TO vg_nivel.

*- BORRA TABLA INTERNA.
    REFRESH ti_programa.

*- REALIZA LECTURA DE INCLUDE/FUNCION ALMACENANDO EN TABLA INTERNA
    READ REPORT ti_includes-nome INTO ti_programa.

    LOOP AT ti_programa.

*- PROCURA POR INCLUDES.
      IF p_incl EQ c_x.
        PERFORM procura_include.
      ENDIF.
*- PROCURA POR FUNCION.
      IF p_func EQ c_x.
        PERFORM procura_funcao.
      ENDIF.
*- PROCURA POR SUBMIT.
      IF p_submit EQ c_x.
        PERFORM procura_submit.
      ENDIF.

    ENDLOOP.

  ENDLOOP.

ENDFORM.                               " VERIFICA_INCLUDE_FUNCAO_SUBMIT

*&---------------------------------------------------------------------*
*&      Form  EVITAR_TIME_OUT
*&---------------------------------------------------------------------*
*       Evito el TIME OUT visualizando un mensaje
*----------------------------------------------------------------------*
FORM evitar_time_out USING p_tfill LIKE sy-tfill.

  DATA:
    vl_total(10) TYPE n,
    vl_atual(10) TYPE n,
    l_tout       LIKE sy-timlo,
    l_time(10)   TYPE c.

  GET TIME FIELD l_tout.

  l_tout = l_tout - w_tini.

  MOVE:
    p_tfill     TO vl_total,
    vg_contador TO vl_atual.

  SHIFT vl_total LEFT DELETING LEADING '0'.
  SHIFT vl_atual LEFT DELETING LEADING '0'.
  WRITE l_tout TO l_time.

  CONCATENATE 'Tpo:' l_time 'Total:' vl_total 'Actual:' vl_atual
         INTO vg_texto
         SEPARATED BY space.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      text = vg_texto.

ENDFORM.                               " EVITAR_TIME_OUT

*&---------------------------------------------------------------------*
*&      Form  PROCURA_SUBMIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM procura_submit.

  CLEAR: vg_conta_espaco, vg_palavra, vg_ini_contagem.

*- VERIFICA SI LA LINEA DEL PROGRAMA EXISTE ALGUN INCLUDE.
  SEARCH ti_programa-cf FOR c_submit.
*- SE ENCONTRO EN EL INCLUDE Y LA LINEA NO ESTÁ COMENTADA.
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.
*- VERIFICA TODOS LOS 500 CARACTERES DE LA LINEA PARA MONTAR NOMBRE
*- DEL INCLUDE
    DO 500 TIMES.
      vg_inicial = sy-index - 1.
      MOVE ti_programa-cf+vg_inicial(1) TO vg_caracter.
      IF vg_ini_contagem EQ c_x AND vg_caracter IS INITIAL.
        ADD 1 TO vg_conta_espaco.
      ENDIF.

      IF NOT vg_caracter IS INITIAL.
        MOVE c_x TO vg_ini_contagem.
        IF vg_caracter EQ c_ponto.
          EXIT.
        ENDIF.
*- ARMA PALABRA.
        IF vg_conta_espaco LT 2.
          CONCATENATE vg_palavra vg_caracter INTO vg_palavra.
*- CONVIERTE A MAYUSCULA PARA FUTURA COMPARACION..
          TRANSLATE vg_palavra TO UPPER CASE.
*- SE ENCONTRO ALGUN INCLUDE
          IF vg_palavra EQ c_submit.
            CLEAR vg_palavra.
          ENDIF.
        ELSE.
          EXIT.
        ENDIF.
      ENDIF.
    ENDDO.
*- BUSCA NOMBRE DE LA FUNCION PARA FUTURA BUSQUEDA POR USER EXIT.
    READ TABLE ti_includes WITH KEY nome = vg_palavra.
    IF NOT sy-subrc IS INITIAL.
      IF vg_nivel LE p_nivel.
        MOVE: vg_palavra TO ti_includes-nome,
              vg_nivel   TO ti_includes-nivel.
        APPEND ti_includes.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.                               " PROCURA_SUBMIT

*&---------------------------------------------------------------------*
*&      Form  CONSISTI_PARAMETROS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM consisti_parametros.

  IF p_nivel IS INITIAL.
    MOVE 1 TO p_nivel.
  ENDIF.

  IF p_prog IS INITIAL AND p_tcode IS INITIAL.
*- EL NOMBRE DEL PROGRAMA Y EL NOMBRE DE LA TRANSACCION NO PUEDEN SER
*- NULOS. UNO DE ELLOS DEBE SER INFORMADO.
    MESSAGE ID '00' TYPE 'I' NUMBER '398' WITH c_text_e01.
    STOP.
  ENDIF.

  IF NOT p_prog IS INITIAL AND NOT p_tcode IS INITIAL.
*- SE SOLICITA AL USUARIO QUE INFORME NOMBRE DE PROGRAMA O TRANSACCION.
    MESSAGE ID '00' TYPE 'I' NUMBER '398' WITH c_text_e02.
    STOP.
  ENDIF.

  IF p_ue IS INITIAL    AND p_badi IS INITIAL AND p_bte IS INITIAL
  AND p_sust IS INITIAL AND p_val IS INITIAL  AND p_fdex IS INITIAL
  AND p_enh  IS INITIAL.
*- SE SOLICITA AL USUARIO QUE INFORME UN TIPO DE MEJORA.
    MESSAGE ID '00' TYPE 'I' NUMBER '398' WITH c_text_e03.
    STOP.
  ENDIF.

ENDFORM.                               " CONSISTI_PARAMETROS

*&---------------------------------------------------------------------*
*&      Form  INICIALIZA_TABELA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM inicializa_tabela.

  DATA:
    e_tstc  TYPE tstc,
    l_tcode TYPE sy-tcode.

  REFRESH ti_includes.

  IF NOT p_prog IS INITIAL.

    MOVE: p_prog TO ti_includes-nome,
          '0'    TO ti_includes-nivel.
    APPEND ti_includes.

*- BUSCO EL PROGRAMA.
    READ REPORT ti_includes-nome INTO ti_programa.

    IF sy-subrc EQ 0.
      REFRESH ti_programa.
    ELSE.
*- EL PROGRAMA NO EXISTE.
      MESSAGE s893(pz) WITH 'El programa' p_prog 'no existe.'.
      STOP.
    ENDIF.

  ELSEIF NOT p_tcode IS INITIAL.

    SELECT SINGLE *
      FROM tstc
      WHERE tcode EQ p_tcode.

    IF sy-subrc EQ 0.

      IF tstc-pgmna IS NOT INITIAL.
        MOVE: tstc-pgmna TO ti_includes-nome,
               '0'       TO ti_includes-nivel.
        APPEND ti_includes.
      ELSE.
* Se trata de una transacción de parámetros. Obtengo la transacción
* asociada.
        CALL FUNCTION 'RS_TRANSACTION_SINGLE_GET'
          EXPORTING
            parameter_tcode = p_tcode
          IMPORTING
            tcode           = l_tcode.

        SELECT SINGLE *
          INTO e_tstc
          FROM tstc
          WHERE tcode EQ l_tcode.

        IF sy-subrc EQ 0.
          MOVE: e_tstc-pgmna TO ti_includes-nome,
                 '0'       TO ti_includes-nivel.
          APPEND ti_includes.
        ELSE.
*- LA TRANSACCIÓN NO EXISTE.
          MESSAGE s893(pz) WITH 'La transacción' p_tcode 'no existe.'.
        ENDIF.
      ENDIF.
    ELSE.
*- LA TRANSACCIÓN NO EXISTE.
      MESSAGE s893(pz) WITH 'La transacción' p_tcode 'no existe.'.
      STOP.
    ENDIF.
  ENDIF.

ENDFORM.                               " INICIALIZA_TABELA

*&---------------------------------------------------------------------*
*&      Form  armar_alv
*&---------------------------------------------------------------------*
*       Armo el ALV.
*----------------------------------------------------------------------*
FORM armar_alv .

  DATA:
    l_repid TYPE sy-repid.

  MOVE sy-repid TO l_repid.

  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
    EXPORTING
      i_callback_program      = l_repid
      i_callback_user_command = 'USER_COMMAND'.

  IF p_ue IS NOT INITIAL.
    PERFORM construir_catalogo_exit.
    PERFORM definir_layout  USING    'TI_USER_EXIT'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_USER_EXIT'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_USER_EXIT'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'User-exit'
      TABLES
        t_outtab                   = ti_user_exit
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.


    PERFORM construir_catalogo_uexit.
    PERFORM definir_layout  USING    'TI_FINAL'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_UEXIT'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_FINAL'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_FINAL'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'User-exit Tx.CMOD'
      TABLES
        t_outtab                   = ti_final
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

  ENDIF.

  IF p_badi IS NOT INITIAL.
    PERFORM construir_catalogo_badi.
    PERFORM definir_layout  USING    'TI_BADI'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_BADI'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_BADI'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_BADI'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'Badis'
      TABLES
        t_outtab                   = ti_badi
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

  ENDIF.

  IF p_bte IS NOT INITIAL.
    PERFORM construir_catalogo_bte.
    PERFORM definir_layout  USING    'TI_BTE'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_BTE'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_BTE'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_BTE'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'BTE'
      TABLES
        t_outtab                   = ti_bte
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

  ENDIF.

  IF p_enh IS NOT INITIAL.
    PERFORM construir_catalogo_enh.
    PERFORM definir_layout  USING    'TI_ENH'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_ENH'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_ENH'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_ENH'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'ENH'
      TABLES
        t_outtab                   = ti_enh
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

    PERFORM construir_catalogo_enhobj.
    PERFORM definir_layout  USING    'TI_ENHOBJ'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_ENHOBJ'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_ENHOBJ'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_ENHOBJ'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'ENHOBJ'
      TABLES
        t_outtab                   = ti_enhobj
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

  ENDIF.

  IF p_sust IS NOT INITIAL.
    PERFORM construir_catalogo_sust.
    PERFORM definir_layout  USING    'TI_SUST'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_SUST'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_SUST'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_SUST'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'Sustituciones'
      TABLES
        t_outtab                   = ti_sust
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

  ENDIF.

  IF p_val IS NOT INITIAL.
    PERFORM construir_catalogo_val.
    PERFORM definir_layout  USING    'TI_VAL'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_VAL'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_VAL'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_VAL'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'Validaciones'
      TABLES
        t_outtab                   = ti_val
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

  ENDIF.

  IF p_fdex IS NOT INITIAL.
    PERFORM construir_catalogo_fdex.
    PERFORM definir_layout  USING    'TI_FDEX'
                            CHANGING wa_layout.
    PERFORM construir_eventos USING 'TOP_OF_PAGE_FDEX'.
    PERFORM sort TABLES ti_sort
                 USING 'TI_FDEX'.

    CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
      EXPORTING
        is_layout                  = wa_layout
        it_fieldcat                = ti_cat
        i_tabname                  = 'TI_FDEX'
        it_events                  = ti_events
        it_sort                    = ti_sort
        i_text                     = 'Field-exit'
      TABLES
        t_outtab                   = ti_fdex
      EXCEPTIONS
        program_error              = 1
        maximum_of_appends_reached = 2
        OTHERS                     = 3.

  ENDIF.

ENDFORM.                    " armar_alv

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_EXIT
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV
*----------------------------------------------------------------------*
FORM construir_catalogo_exit .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_USER_EXIT'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'PROGRAMA'  'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' c_text_01,
  'TIPO'      'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_05,
  'NIVEL'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_02,
  'BREAK'     'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_07,
  'LINEA'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_03,
  'CF'        ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_04.

ENDFORM.                    " construir_catalogo_EXIT

*&---------------------------------------------------------------------*
*&      Form  asignar_campo_a_catalogo
*&---------------------------------------------------------------------*
*       Asignar campo al catalogo ALV
*----------------------------------------------------------------------*
FORM asignar_campo_a_catalogo TABLES pt_cat STRUCTURE wa_cat
                          USING  p_fieldname    LIKE wa_cat-fieldname
                                 p_key          LIKE wa_cat-key
                                 p_col_pos      TYPE c
                                 p_fix_column   LIKE wa_cat-fix_column
                                 p_hotspot      LIKE wa_cat-hotspot
                                 p_do_sum       LIKE wa_cat-do_sum
                                 p_input        LIKE wa_cat-input
                                 p_checkbox     LIKE wa_cat-checkbox
                                 p_no_out       LIKE wa_cat-no_out
                                 p_icon         LIKE wa_cat-icon
                                p_reptext_ddic LIKE wa_cat-reptext_ddic.

  STATICS l_col_pos LIKE sy-cucol.

* Asignar atributos de campo en el catalogo de cabecera ALV
  CLEAR wa_cat.
  READ TABLE pt_cat INTO wa_cat
             WITH KEY fieldname = p_fieldname.

  CHECK sy-subrc EQ 0.

  IF NOT p_reptext_ddic IS INITIAL.
    wa_cat-seltext_l = wa_cat-seltext_m =
    wa_cat-seltext_s = wa_cat-reptext_ddic = p_reptext_ddic.
  ENDIF.

  IF p_col_pos EQ 'X'.
* Inicializo el conteo para ordenar las columnas.
    l_col_pos = 1.
  ELSE.
    ADD 1 TO l_col_pos.
  ENDIF.

  wa_cat-fieldname     = p_fieldname.
  wa_cat-key           = p_key.
  wa_cat-col_pos       = l_col_pos.
  wa_cat-fix_column    = p_fix_column.
  wa_cat-hotspot       = p_hotspot.
  wa_cat-do_sum        = p_do_sum.
  wa_cat-edit = wa_cat-input = p_input.
  wa_cat-checkbox      = p_checkbox.
  wa_cat-no_out        = p_no_out.
  wa_cat-icon          = p_icon.

  MODIFY pt_cat FROM wa_cat INDEX sy-tabix.

ENDFORM.                    " asignar_campo_a_catalogo

*&---------------------------------------------------------------------*
*&      Form  definir_layout
*&---------------------------------------------------------------------*
*       Definir atributos del layout de reporte
*----------------------------------------------------------------------*
FORM definir_layout USING    p_table  TYPE slis_layout_alv-box_tabname
                    CHANGING p_layout TYPE slis_layout_alv .

  CLEAR p_layout.

  IF p_table NE 'TI_CIMP'.
* Marco el campo para la selección.
    p_layout-box_fieldname         = 'SEL'.
    p_layout-box_tabname           = p_table.
  ENDIF.
  p_layout-zebra                 = 'X'.
  p_layout-colwidth_optimize     = 'X'.
  p_layout-no_vline              = ' '.
  p_layout-no_colhead            = ' '.
  p_layout-lights_condense       = 'X'.
  p_layout-detail_popup          = 'X'.
  p_layout-detail_initial_lines  = 'X'.
  p_layout-flexible_key          = ' '.
  p_layout-key_hotspot           = ' '.
  p_layout-confirmation_prompt   = 'X'.

ENDFORM.                    " definir_layout

*&---------------------------------------------------------------------*
*&      Form  construir_eventos
*&---------------------------------------------------------------------*
*       Asignar eventos soportados
*----------------------------------------------------------------------*
FORM construir_eventos USING p_form LIKE wa_events-form.
  DATA:
    l_type(1) TYPE n.

  REFRESH: ti_events.
  CLEAR:   wa_events.

* ALV Simple Block append.
  l_type = 2.

* Buscar secciones para eventos
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      i_list_type = l_type
    IMPORTING
      et_events   = ti_events.

* Leer evento 'TOP_OF_PAGE'
  READ TABLE ti_events WITH KEY name = slis_ev_top_of_page
                           INTO wa_events.
* Asignar Rutina FORM 'TOP_OF_PAGE' a evento
  IF sy-subrc = 0.
    MOVE p_form TO wa_events-form.
    MODIFY ti_events FROM wa_events INDEX sy-tabix.
  ENDIF.

ENDFORM.                    " construir_eventos

*&---------------------------------------------------------------------*
*&      Form  top_of_page
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_includes.
  WRITE sy-tfill TO l_tfill_inc.
  CONDENSE l_tfill_inc NO-GAPS.

  DESCRIBE TABLE ti_user_exit.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                              l_tfill_inc
                              'User-exit'.

ENDFORM.                    "top_of_page

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_UEXIT
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_uexit.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_final.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'USER-EXITs Tx.SMOD'.

ENDFORM.                    "TOP_OF_PAGE_UEXIT

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_FDEX
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_fdex.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_fdex.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'FIELD-EXITs'.

ENDFORM.                    "TOP_OF_PAGE_FDEX

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_BADI
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_badi.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_includes.
  WRITE sy-tfill TO l_tfill_inc.
  CONDENSE l_tfill_inc NO-GAPS.

  DESCRIBE TABLE ti_badi.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'BADIs'.

ENDFORM.                    "TOP_OF_PAGE_BADI

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_BTE
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_bte.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_includes.
  WRITE sy-tfill TO l_tfill_inc.
  CONDENSE l_tfill_inc NO-GAPS.

  DESCRIBE TABLE ti_bte.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'BTEs'.

ENDFORM.                    "TOP_OF_PAGE_BTE

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_ENH
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_enh.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_includes.
  WRITE sy-tfill TO l_tfill_inc.
  CONDENSE l_tfill_inc NO-GAPS.

  DESCRIBE TABLE ti_enh.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'Puntos de ampliación'.

ENDFORM.                    "TOP_OF_PAGE_ENH

*&---------------------------------------------------------------------*
*&      Form  sort
*&---------------------------------------------------------------------*
*       Creo el sort del ALV (FM).
*----------------------------------------------------------------------*
*      -->PT_sort     Tabla
*      -->P_tabname   Nombre de la tabla
*----------------------------------------------------------------------*
FORM sort  TABLES   pt_sort
           USING    p_tabname TYPE any.

  CLEAR:  pt_sort, wa_sort.
  REFRESH pt_sort.

  CASE p_tabname.
    WHEN 'TI_SUST'.

      wa_sort-fieldname = 'SUBSTID'.
      wa_sort-tabname   = p_tabname.
      wa_sort-up        = 'X'.
      wa_sort-comp      = 'X'.
      APPEND wa_sort TO pt_sort.

      CLEAR:  pt_sort, wa_sort.

      wa_sort-fieldname = 'SUBSEQNR'.
      wa_sort-tabname   = p_tabname.
      wa_sort-up        = 'X'.
      wa_sort-comp      = 'X'.
      APPEND wa_sort TO pt_sort.

      CLEAR:  pt_sort, wa_sort.

      wa_sort-fieldname = 'CONSEQNR'.
      wa_sort-tabname   = p_tabname.
      wa_sort-up        = 'X'.
      wa_sort-comp      = 'X'.
      APPEND wa_sort TO pt_sort.

    WHEN 'TI_VAL'.

      wa_sort-fieldname = 'VALID'.
      wa_sort-tabname   = p_tabname.
      wa_sort-up        = 'X'.
      wa_sort-comp      = 'X'.
      APPEND wa_sort TO pt_sort.

      CLEAR:  pt_sort, wa_sort.

      wa_sort-fieldname = 'VALSEQNR'.
      wa_sort-tabname   = p_tabname.
      wa_sort-up        = 'X'.
      wa_sort-comp      = 'X'.
      APPEND wa_sort TO pt_sort.

    WHEN 'TI_ENHOBJ'.

      wa_sort-fieldname = 'ENHNAME'.
      wa_sort-tabname   = p_tabname.
      wa_sort-up        = 'X'.
      wa_sort-comp      = 'X'.
      APPEND wa_sort TO pt_sort.

      CLEAR:  pt_sort, wa_sort.

      wa_sort-fieldname = 'VERSION'.
      wa_sort-tabname   = p_tabname.
      wa_sort-up        = 'X'.
      wa_sort-comp      = 'X'.
      APPEND wa_sort TO pt_sort.

    WHEN OTHERS.

      IF p_tabname NE 'TI_FINAL'.

        wa_sort-fieldname = 'TIPO'.
        wa_sort-tabname   = p_tabname.
        wa_sort-up        = 'X'.
        wa_sort-comp      = 'X'.
        APPEND wa_sort TO pt_sort.

        CLEAR:  pt_sort, wa_sort.

        IF p_tabname NE 'TI_FDEX'.

          wa_sort-fieldname = 'NIVEL'.
          wa_sort-tabname   = p_tabname.
          wa_sort-up        = 'X'.
          wa_sort-comp      = 'X'.
          APPEND wa_sort TO pt_sort.

          CLEAR:  pt_sort, wa_sort.

          wa_sort-fieldname = 'PROGRAMA'.
          wa_sort-tabname   = p_tabname.
          wa_sort-up        = 'X'.
          wa_sort-comp      = 'X'.
          APPEND wa_sort TO pt_sort.

          CLEAR:  pt_sort, wa_sort.

          wa_sort-fieldname = 'LINEA'.
          wa_sort-tabname   = p_tabname.
          wa_sort-up        = 'X'.
          wa_sort-comp      = 'X'.
          APPEND wa_sort TO pt_sort.

        ENDIF.

      ELSE.

        wa_sort-fieldname = 'NAME'.
        wa_sort-tabname   = p_tabname.
        wa_sort-up        = 'X'.
        wa_sort-comp      = 'X'.
        APPEND wa_sort TO pt_sort.

        CLEAR:  pt_sort, wa_sort.

        wa_sort-fieldname = 'MEMBER'.
        wa_sort-tabname   = p_tabname.
        wa_sort-up        = 'X'.
        wa_sort-comp      = 'X'.
        APPEND wa_sort TO pt_sort.
      ENDIF.
  ENDCASE.

ENDFORM.                    " sort

*&---------------------------------------------------------------------*
*&      Form  mostrar_listado
*&---------------------------------------------------------------------*
*       Mostrar listado ALV
*----------------------------------------------------------------------*
FORM mostrar_listado .

  wa_print-reserve_lines = 2.

  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'
    EXPORTING
      is_print      = wa_print
    EXCEPTIONS
      program_error = 1
      OTHERS        = 2.

ENDFORM.                    " mostrar_listado

*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       Evaluar acciones del usuario
*----------------------------------------------------------------------
FORM user_command USING ucomm   LIKE sy-ucomm
                        sfields TYPE slis_selfield.

  DATA l_break TYPE c.

* Rescatar el registro seleccionado.
  CASE sfields-tabname.
    WHEN 'TI_USER_EXIT'.
      READ TABLE ti_user_exit INDEX sfields-tabindex.
    WHEN 'TI_BADI'.
      READ TABLE ti_badi INDEX sfields-tabindex.
    WHEN 'TI_BTE'.
      READ TABLE ti_bte INDEX sfields-tabindex.
    WHEN 'TI_ENH'.
      READ TABLE ti_enh INDEX sfields-tabindex.
    WHEN 'TI_ENHOBJ'.
      READ TABLE ti_enhobj INDEX sfields-tabindex.
    WHEN 'TI_FDEX'.
      READ TABLE ti_fdex INDEX sfields-tabindex.
    WHEN 'TI_FINAL'.
      READ TABLE ti_final INDEX sfields-tabindex.
    WHEN 'TI_SUST'.
      READ TABLE ti_sust INDEX sfields-tabindex.
    WHEN 'TI_VAL'.
      READ TABLE ti_val INDEX sfields-tabindex.
    WHEN 'TI_CIMP'.
      READ TABLE ti_cimp INDEX sfields-tabindex.
  ENDCASE.


* Seleccion de opcion.
  CASE ucomm.
*   DOUBLE CLICK.
    WHEN '&IC1'.
*     Evaluar valor de campo seleccionado.
      CHECK NOT sfields-value IS INITIAL.

      CASE sfields-tabname.
        WHEN 'TI_USER_EXIT'.
*       USER-EXIT.
          IF ti_user_exit-tipo EQ sfields-value(4).
            SEARCH ti_user_exit-cf FOR c_enhance.
            CHECK sy-subrc EQ 0.
            PERFORM visualizar_exit USING ti_user_exit-programa
                                          ti_user_exit-cf.
          ELSEIF ti_user_exit-cf(60) EQ sfields-value.
            PERFORM visualizar_linea USING ti_user_exit-programa
                                           ti_user_exit-linea.
            MOVE 'X' TO l_break.
          ELSEIF ti_user_exit-break EQ sfields-value(4)
              OR ti_user_exit-break+1(2) EQ sfields-value(2).
            PERFORM asignar_break USING ti_user_exit-programa
                                        ti_user_exit-linea
                                        ti_user_exit-break.
            MOVE 'X' TO l_break.
          ENDIF.

        WHEN 'TI_FINAL'.
*       USER-EXIT Tx. CMOD.
          IF ti_final-name EQ sfields-value.
            CALL FUNCTION 'MOD_SAP_HEAD'
              EXPORTING
                mode          = 'SHOM'
                modname       = ti_final-name
              EXCEPTIONS
                attr_enqueued = 1
                text_enqueued = 2
                OTHERS        = 3.

          ELSEIF ti_final-include EQ sfields-value.
            PERFORM visualizar_linea USING ti_final-programa
                                           '1'.
            MOVE 'X' TO l_break.
          ENDIF.

        WHEN 'TI_BADI'.
*       Badi.
          IF ti_badi-tipo EQ sfields-value(4).
            PERFORM visualizar_badi USING ti_badi-cf.
          ELSEIF ti_badi-cf(60) EQ sfields-value.
            PERFORM visualizar_linea USING ti_badi-programa
                                           ti_badi-linea.
            MOVE 'X' TO l_break.
          ELSEIF ti_badi-break EQ sfields-value(4)
              OR ti_badi-break+1(2) EQ sfields-value(2).
            PERFORM asignar_break USING ti_badi-programa
                                        ti_badi-linea
                                        ti_badi-break.
            MOVE 'X' TO l_break.
          ENDIF.

        WHEN 'TI_BTE'.
*       BTE.
          IF ti_bte-tipo EQ sfields-value(4).
            PERFORM fibf USING ti_bte-cf.
          ELSEIF ti_bte-cf(60) EQ sfields-value.
            PERFORM visualizar_linea USING ti_bte-programa
                                           ti_bte-linea.
            MOVE 'X' TO l_break.
          ELSEIF ti_bte-break EQ sfields-value(4)
              OR ti_bte-break+1(2) EQ sfields-value(2).
            PERFORM asignar_break USING ti_bte-programa
                                        ti_bte-linea
                                        ti_bte-break.
            MOVE 'X' TO l_break.
          ENDIF.

        WHEN 'TI_ENH'.
*       Punto de ampliación.
          IF ti_enh-cf(60) EQ sfields-value.
            PERFORM visualizar_linea USING ti_enh-programa
                                           ti_enh-linea.
            MOVE 'X' TO l_break.
          ELSEIF ti_enh-tipo EQ sfields-value(4).
            PERFORM bi_se18 USING ti_enh-cf.
          ENDIF.

        WHEN 'TI_ENHOBJ'.
*       Punto de ampliación.
          IF ti_enhobj-enhname EQ sfields-value(30).
            PERFORM bi_se19 USING ti_enhobj-enhname.
          ENDIF.

        WHEN 'TI_SUST'.
*       Sustituciones.
          IF ti_sust-substid  EQ sfields-value(7) OR
             ti_sust-subseqnr EQ sfields-value(3).
            PERFORM visualizar_sust USING ti_sust-substid
                                          ti_sust-subseqnr.
          ENDIF.

        WHEN 'TI_VAL'.
*       Validaciones.
          IF ti_val-valid    EQ sfields-value(7) OR
             ti_val-valseqnr EQ sfields-value(3).
            PERFORM visualizar_val USING ti_val-valid
                                         ti_val-valseqnr.
          ENDIF.


        WHEN 'TI_FDEX'.
*       Field-exit.
          IF ti_fdex-tipo EQ sfields-value.
            SUBMIT rsmodprf AND RETURN.
          ELSEIF ti_fdex-cf(60) EQ sfields-value.
* Visualizo el field-exit.
            CALL FUNCTION 'RS_FUNCTION_SHOW'
              EXPORTING
                funcname = ti_fdex-cf.

            CALL FUNCTION 'RS_NAVIGATION_MONITOR'.
          ENDIF.

        WHEN 'TI_CIMP'.
*       Customer implementation.

          CASE sfields-fieldname.
            WHEN 'ENHNAME'.
              PERFORM bi_se19 USING ti_cimp-enhname.
            WHEN 'ENHINCLUDE'.
              PERFORM visualizar_enh_cf USING ti_cimp-enhinclude.
            WHEN OTHERS.
* DO NOTHING !!!
          ENDCASE.

        WHEN OTHERS.
* DO NOTHING !!!
      ENDCASE.

    WHEN OTHERS.
*     DO NOTHING !!!
  ENDCASE.

  IF l_break IS NOT INITIAL AND sfields-tabname NE 'TI_CIMP'.
    WAIT UP TO 1 SECONDS.
    PERFORM cargar_break.
  ENDIF.
  sfields-refresh = 'X'.

ENDFORM.                    "user_command

*&---------------------------------------------------------------------*
*&      Form  visualizar_linea
*&---------------------------------------------------------------------*
*       Visualizo la linea de código del programa.
*----------------------------------------------------------------------*
FORM visualizar_linea USING p_programa TYPE sy-repid
                            p_linea.

* Visualizo la linea seleccionada en el programa.
  CALL FUNCTION 'RS_TOOL_ACCESS'
    EXPORTING
      operation           = c_operation
      object_name         = p_programa
      object_type         = c_type
      position            = p_linea
    EXCEPTIONS
      not_executed        = 1
      invalid_object_type = 2
      OTHERS              = 3.

ENDFORM.                    " visualizar_linea

*&---------------------------------------------------------------------*
*&      Form  buscar_exit
*&---------------------------------------------------------------------*
*       Buscar USER-EXIT.
*----------------------------------------------------------------------*
FORM buscar_exit .

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUN USER-EXIT.
  SEARCH ti_programa-cf FOR c_user_exit.
*- SE ENCONTRO UN USER-EXIT Y SE VERIFICA SI LA LINEA NO ESTA COMENTADA
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.

*- VERIFICO QUE NO TRAIGA LOS ENDFORM.
    SEARCH ti_programa-cf FOR c_endform.
    CHECK sy-subrc NE 0.

*- VERIFICO QUE NO TRAIGA LOS PERFORM.
    SEARCH ti_programa-cf FOR c_perform.
    CHECK sy-subrc NE 0.

*- VERIFICO QUE NO TRAIGA LAS ASIGNACIONES.
    SEARCH ti_programa-cf FOR c_igual.
    CHECK sy-subrc NE 0.

    CLEAR ti_user_exit.
*- REMUEVE ESPACIOS EN EL INÍCIO DEL STRING.
    SHIFT ti_programa-cf LEFT DELETING LEADING space.
    MOVE: ti_includes-nome  TO ti_user_exit-programa,
          c_ue              TO ti_user_exit-tipo,
          sy-tabix          TO ti_user_exit-linea,
          ti_programa-cf    TO ti_user_exit-cf,
          ti_includes-nivel TO ti_user_exit-nivel.
    APPEND ti_user_exit.
  ENDIF.

ENDFORM.                    " buscar_exit

*&---------------------------------------------------------------------*
*&      Form  buscar_badi
*&---------------------------------------------------------------------*
*       Buscar BADI.
*----------------------------------------------------------------------*
FORM buscar_badi .

  DATA:
    l_subrc LIKE sy-subrc.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUNA BADI.
  SEARCH ti_programa-cf FOR c_badi.
*- SE ENCONTRO UNA BADI Y SE VERIFICA SI LA LINEA NO ESTÁ COMENTADA.
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.

    SEARCH ti_programa-cf FOR c_include.
    IF sy-subrc NE 0.
      CLEAR l_subrc.
      SEARCH ti_programa-cf FOR c_method.
      IF sy-subrc NE 0.
        SEARCH ti_programa-cf FOR c_funcao_2.
        IF sy-subrc NE 0.
          SEARCH ti_programa-cf FOR c_perform.
          IF sy-subrc NE 0.
            SEARCH ti_programa-cf FOR c_type_ref.
            IF sy-subrc NE 0.
              SEARCH ti_programa-cf FOR c_form.
              MOVE '4' TO l_subrc.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.

      IF l_subrc EQ 0.
        CLEAR ti_badi.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
        SHIFT ti_programa-cf LEFT DELETING LEADING space.
        MOVE: ti_includes-nome  TO ti_badi-programa,
              c_b               TO ti_badi-tipo,
              sy-tabix          TO ti_badi-linea,
              ti_programa-cf    TO ti_badi-cf,
              ti_includes-nivel TO ti_badi-nivel.
        APPEND ti_badi.
      ENDIF.
    ENDIF.
  ELSE.
    CHECK p_handl IS NOT INITIAL.
*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUNA INSTANCIA DE
*- UNA BADI.
    SEARCH ti_programa-cf FOR c_handler.
*- SE ENCONTRO UNA INSTANCIA DE IMPLEMENACIÓN Y SE VERIFICA SI LA LINEA
*- NO ESTÁ COMENTADA.
    IF  sy-subrc EQ 0
    AND ti_programa-cf+0(1) NE c_comentario.

      SEARCH ti_programa-cf FOR c_include.
      CHECK sy-subrc NE 0.
      CLEAR ti_badi.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
      SHIFT ti_programa-cf LEFT DELETING LEADING space.
      MOVE: ti_includes-nome  TO ti_badi-programa,
            c_b               TO ti_badi-tipo,
            sy-tabix          TO ti_badi-linea,
            ti_programa-cf    TO ti_badi-cf,
            ti_includes-nivel TO ti_badi-nivel.
      APPEND ti_badi.
    ENDIF.
  ENDIF.

ENDFORM.                    " buscar_badi

*&---------------------------------------------------------------------*
*&      Form  buscar_bte
*&---------------------------------------------------------------------*
*       Buscar BTE.
*----------------------------------------------------------------------*
FORM buscar_bte .

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUNA BTE.
  SEARCH ti_programa-cf FOR c_bte.
*- SE ENCONTRO UNA BTE Y SE VERIFICA SI LA LINEA NO ESTÁ COMENTADA.
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.
* 'OPEN_FI_PERFORM'.

*- VERIFICO QUE TRAIGA EL LLAMADO A LA FUNCIÓN DE LA BTE.
    SEARCH ti_programa-cf FOR c_funcao_2.
    CHECK sy-subrc EQ 0.
*- VERIFICO QUE NO TRAIGA LOS INCLUDE DEL GRUPO DE FUNCIÓN.
    SEARCH ti_programa-cf FOR c_include.
    CHECK sy-subrc NE 0.
*- VERIFICO QUE NO TRAIGA LOS ENDFORM.
    SEARCH ti_programa-cf FOR c_endform.
    CHECK sy-subrc NE 0.

    CLEAR ti_bte.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
    SHIFT ti_programa-cf LEFT DELETING LEADING space.
    MOVE: ti_includes-nome  TO ti_bte-programa,
          c_bt              TO ti_bte-tipo,
          sy-tabix          TO ti_bte-linea,
          ti_programa-cf    TO ti_bte-cf,
          ti_includes-nivel TO ti_bte-nivel.
    APPEND ti_bte.
  ENDIF.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUNA BTE.
  SEARCH ti_programa-cf FOR c_bte1.
*- SE ENCONTRO UNA BTE Y SE VERIFICA SI LA LINEA NO ESTÁ COMENTADA.
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.
* 'OUTBOUND_CALL'.

*- VERIFICO QUE TRAIGA EL LLAMADO A LA FUNCIÓN DE LA BTE.
    SEARCH ti_programa-cf FOR c_funcao_2.
    CHECK sy-subrc EQ 0.
*- VERIFICO QUE NO TRAIGA LOS INCLUDE DEL GRUPO DE FUNCIÓN.
    SEARCH ti_programa-cf FOR c_include.
    CHECK sy-subrc NE 0.
*- VERIFICO QUE NO TRAIGA LOS ENDFORM.
    SEARCH ti_programa-cf FOR c_endform.
    CHECK sy-subrc NE 0.

    CLEAR ti_bte.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
    SHIFT ti_programa-cf LEFT DELETING LEADING space.
    MOVE: ti_includes-nome  TO ti_bte-programa,
          c_bt              TO ti_bte-tipo,
          sy-tabix          TO ti_bte-linea,
          ti_programa-cf    TO ti_bte-cf,
          ti_includes-nivel TO ti_bte-nivel.
    APPEND ti_bte.
  ENDIF.

ENDFORM.                    " buscar_bte

*&---------------------------------------------------------------------*
*&      Form  repid_f4
*&---------------------------------------------------------------------*
*       Ejecuto el F4 para buscar programas.
*----------------------------------------------------------------------*
FORM repid_f4 .

  CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
    EXPORTING
      object_type          = 'PROG'
      object_name          = p_prog
      suppress_selection   = 'X'
    IMPORTING
      object_name_selected = p_prog
    EXCEPTIONS
      cancel               = 1
      wrong_type           = 2
      OTHERS               = 3.

ENDFORM.                                                    " repid_f4

*&---------------------------------------------------------------------*
*&      Form  visualizar_badi
*&---------------------------------------------------------------------*
*       Visualizo las definiciones de la BADI.
*---------------------------------------------------------------------*
FORM visualizar_badi  USING p_cf LIKE ti_user_exit-cf.

  DATA:
    l_answer(1),
    l_inter_name LIKE sxs_inter-inter_name,
    l_cf TYPE i.

  DATA: BEGIN OF lt_cf OCCURS 0,
          linea(500),
        END OF lt_cf.

  SEARCH p_cf FOR c_type_ref.

  CHECK sy-subrc IS INITIAL.

  REFRESH lt_cf.

  l_cf = 500 - sy-fdpos.

  SPLIT p_cf+sy-fdpos(l_cf) AT space INTO TABLE lt_cf.

  CHECK sy-subrc IS INITIAL.

  READ TABLE lt_cf INDEX 4.

  TRANSLATE lt_cf-linea TO UPPER CASE.
  TRANSLATE lt_cf-linea USING '. , '.

  MOVE lt_cf-linea TO l_inter_name.

* Obtengo a partir de la interface la definición de la BADI.
  SELECT SINGLE *
    FROM sxs_inter
    WHERE inter_name EQ l_inter_name.

  CHECK sy-subrc IS INITIAL.

* Muestro POP-UP para selección de si se desea visualiar la definición
* o la implementación de la BADI.
  CALL FUNCTION 'POPUP_WITH_2_BUTTONS_TO_CHOOSE'
    EXPORTING
      defaultoption = '1'
      diagnosetext1 = 'Definición BADI:'
      diagnosetext2 = sxs_inter-exit_name
      diagnosetext3 = '.'
      textline1     = ' '
      textline2     = 'Defina la visualización:'
      textline3     = ' '
      text_option1  = 'Definición BADI'
      text_option2  = 'Implementación BADI'
      titel         = 'Seleccionar tipo:'
    IMPORTING
      answer        = l_answer.

  CASE l_answer.
    WHEN '1'.
* Visualizo la definición de la BADI.
      CALL FUNCTION 'SXO_BADI_SHOW'
        EXPORTING
          exit_name         = sxs_inter-exit_name
        EXCEPTIONS
          action_canceled   = 1
          access_failure    = 2
          badi_not_exixting = 3
          OTHERS            = 4.

    WHEN '2'.
* Visualizo la implementación de la BADI.
      CALL FUNCTION 'SXO_IMPL_FOR_BADI_OVER'
        EXPORTING
          exit_name         = sxs_inter-exit_name
        EXCEPTIONS
          no_imps_existing  = 1
          badi_not_existing = 2
          action_canceled   = 3
          OTHERS            = 4.

      IF sy-subrc = 1.
        MESSAGE s380(enhancement) WITH sxs_inter-exit_name.
      ENDIF.

    WHEN OTHERS.
* Do Nothing !!
  ENDCASE.

ENDFORM.                    " visualizar_badi

*&---------------------------------------------------------------------*
*&      Form  visualizar_exit
*&---------------------------------------------------------------------*
*       Visualizo el USER-EXIT.
*----------------------------------------------------------------------*
*      -->P_REPID Nombre del programa.
*      -->P_CF    Linea de código del programa.
*----------------------------------------------------------------------*
FORM visualizar_exit USING p_repid LIKE sy-repid
                           p_cf    LIKE ti_user_exit-cf.

  DATA:
    l_exit        LIKE rs38l-name,
    l_modname     LIKE modact-name,
    l_standard(3) TYPE c,
    l_cf          TYPE i,
    l_linea(500)  TYPE c.

  DATA: BEGIN OF lt_cf OCCURS 0,
          linea(500),
        END OF lt_cf.

  CLEAR: d010inc, modsap, modact.

* Obtengo el programa de control.
  SELECT SINGLE *
    FROM d010inc
    WHERE include EQ p_repid.

  IF sy-subrc NE 0.
* No se trata de un INCLUDE.
    MOVE p_repid TO d010inc-master.
  ENDIF.

  SEARCH p_cf FOR c_enhance.

  CHECK sy-subrc IS INITIAL.

  REFRESH lt_cf.

  l_cf = 500 - sy-fdpos.

  MOVE p_cf+sy-fdpos(l_cf) TO l_linea.

  SPLIT l_linea AT space INTO TABLE lt_cf.
* Obtengo la posición del número del exit.
  READ TABLE lt_cf INDEX 3.

  TRANSLATE lt_cf USING ''' '.
  CONDENSE lt_cf NO-GAPS.

* Armo el nombre del exit.
  CONCATENATE 'EXIT' d010inc-master lt_cf INTO l_exit
    SEPARATED BY '_'.

* Obtengo la ampliación.
  SELECT SINGLE *
    FROM modsap
    WHERE member EQ l_exit.

  CHECK sy-subrc IS INITIAL.

* Verifico las modificaciones.
  SELECT SINGLE *
    FROM modact
    WHERE member EQ modsap-name.

  IF sy-subrc IS INITIAL.
* Se encontró el proyecto para la ampliación.
    MOVE:
      modact-name   TO l_modname,
      c_std_implmnt TO l_standard.

    CALL FUNCTION 'MOD_COMPONENTS'
      EXPORTING
        mode               = 'SHOM'
        modname            = l_modname
        p_standard         = l_standard
      EXCEPTIONS
        permission_failure = 1
        not_found          = 2
        OTHERS             = 3.

  ELSE.
* No hay proyecto para la ampliación.
    MOVE:
      modsap-name      TO l_modname.

    CALL FUNCTION 'MOD_SAP_HEAD'
      EXPORTING
        mode          = 'SHOM'
        modname       = l_modname
      EXCEPTIONS
        attr_enqueued = 1
        text_enqueued = 2
        OTHERS        = 3.

  ENDIF.

ENDFORM.                    " visualizar_exit

*&---------------------------------------------------------------------*
*&      Form  buscar_field_exit
*&---------------------------------------------------------------------*
*       Busco los field-exit's de los campos de las DYNPRO's.
*----------------------------------------------------------------------*
FORM buscar_field_exit .

  DATA: BEGIN OF lt_campo OCCURS 0,
          repid     LIKE sy-repid,
          dnum      LIKE d020s-dnum,
          tabname   LIKE dd03l-tabname,
          fieldname LIKE dd03l-fieldname,
        END OF lt_campo.

  DATA: BEGIN OF lt_fe OCCURS 0,
          cf(500),
        END OF lt_fe.

  DATA:
    l_prog   LIKE sy-repid,
    lt_d020s LIKE d020s OCCURS 0 WITH HEADER LINE,
    lt_d021s LIKE d021s OCCURS 0 WITH HEADER LINE,
    lt_dd03l LIKE dd03l OCCURS 0 WITH HEADER LINE.

  CHECK p_fdex IS NOT INITIAL.

  CLEAR ti_fdex.
  REFRESH: lt_d020s, lt_d021s, lt_dd03l, lt_fe.

  MOVE: c_fdex TO ti_fdex-tipo.
  APPEND ti_fdex.

  IF p_prog IS NOT INITIAL.
    MOVE p_prog   TO l_prog.
  ELSE.
    MOVE tstc-pgmna TO l_prog.
  ENDIF.

* Obtengo las DYNPRO del programa.
  SELECT *
    FROM d020s
    INTO CORRESPONDING FIELDS OF TABLE lt_d020s
    WHERE prog EQ l_prog.

  LOOP AT lt_d020s.

    DESCRIBE TABLE ti_includes.
    PERFORM evitar_time_out USING sy-tfill.

    REFRESH lt_d021s.

* Obtengo los campos de la DYNPRO.
    CALL FUNCTION 'RS_SCRP_GET_SCREEN_INFOS'
      EXPORTING
        dynnr                 = lt_d020s-dnum
        progname              = lt_d020s-prog
      TABLES
        fieldlist             = lt_d021s
      EXCEPTIONS
        dynpro_does_not_exist = 1
        no_field_list         = 2
        cancelled             = 3
        OTHERS                = 4.

* Recorro solo los campos de entrada/salida.
    LOOP AT lt_d021s WHERE ityp = 'C'
                        OR ityp = 'N'
                        OR ityp = 'X'.

      SEARCH lt_d021s-fnam FOR '-'.

      IF sy-subrc IS INITIAL.

        MOVE:
          lt_d020s-prog TO lt_campo-repid,
          lt_d020s-dnum TO lt_campo-dnum.

* Separo el campo de la tabla o estructura.
        SPLIT lt_d021s-fnam AT '-' INTO lt_campo-tabname
                                        lt_campo-fieldname.

        APPEND lt_campo.

      ENDIF.

    ENDLOOP.
  ENDLOOP.

  CHECK lt_campo[] IS NOT INITIAL.

  SORT lt_campo BY repid dnum tabname fieldname.
  DELETE ADJACENT DUPLICATES FROM lt_campo.

* Obtengo los elementos de datos.
  SELECT *
    FROM dd03l
    INTO CORRESPONDING FIELDS OF TABLE lt_dd03l
    FOR ALL ENTRIES IN lt_campo
    WHERE tabname   EQ lt_campo-tabname
      AND fieldname EQ lt_campo-fieldname.

  SORT lt_dd03l BY rollname.
  DELETE ADJACENT DUPLICATES FROM lt_dd03l.

  LOOP AT lt_dd03l.

    CLEAR: tddir, tddirs.

    SELECT SINGLE *
      FROM tddir
      WHERE de EQ lt_dd03l-rollname.

    CHECK sy-subrc IS INITIAL.

    DESCRIBE TABLE ti_includes.
    PERFORM evitar_time_out USING sy-tfill.

    IF tddir-activ EQ 'S'.
* Selectivo en dynpros.
      SELECT SINGLE *
        FROM tddirs
        WHERE de    EQ lt_dd03l-rollname
          AND prog  EQ lt_d020s-prog.

      CHECK sy-subrc IS INITIAL.
* Verifico si se trata del programa en cuestión.
    ENDIF.

* Armo la FM.
    CONCATENATE 'FIELD_EXIT_' lt_dd03l-rollname INTO lt_fe-cf.

    IF tddirs-exitnr IS NOT INITIAL.
      CONCATENATE ti_user_exit-cf tddirs-exitnr INTO lt_fe-cf
        SEPARATED BY '_'.
    ENDIF.

    READ TABLE lt_fe WITH KEY cf = lt_fe-cf.

    CHECK sy-subrc IS NOT INITIAL.
* Aún no se encontró el field-exit.
    APPEND lt_fe.
  ENDLOOP.

  LOOP AT lt_fe.
* Cargo los field-exit's.
    MOVE:
      c_fdex   TO ti_fdex-tipo,
      lt_fe-cf TO ti_fdex-cf.
    APPEND ti_fdex.

  ENDLOOP.

ENDFORM.                    " buscar_field_exit

*&---------------------------------------------------------------------*
*&      Form  fibf
*&---------------------------------------------------------------------*
*       Visualizo la BTE.
*----------------------------------------------------------------------*
*      -->P_CF  Código fuente
*----------------------------------------------------------------------*
FORM fibf  USING p_cf LIKE ti_bte-cf.

  DATA:
    l_fdpos       TYPE sy-fdpos,
    l_cf          TYPE i,
    l_tipo        TYPE c,
    l_linea(500)  TYPE c.

  SEARCH p_cf FOR c_bte.

  IF sy-subrc IS INITIAL.
* 'OPEN_FI_PERFORM'.
    l_fdpos = sy-fdpos + 16.

    l_cf = 500 - l_fdpos.

    MOVE p_cf+l_fdpos(l_cf) TO l_linea.

    MOVE l_linea+9(1) TO l_tipo.

  ELSE.

    SEARCH p_cf FOR c_bte1.

    CHECK sy-subrc IS INITIAL.
* 'OUTBOUND_CALL'.
    l_fdpos = sy-fdpos + 14.

    l_cf = 500 - l_fdpos.

    MOVE p_cf+l_fdpos(l_cf) TO l_linea.

    MOVE l_linea+9(1) TO l_tipo.

  ENDIF.

  IF l_tipo IS NOT INITIAL.

    PERFORM visualizar_bte USING l_tipo
                                 l_linea.

  ELSE.
    CALL TRANSACTION 'FIBF'.
  ENDIF.

ENDFORM.                    " fibf

*&---------------------------------------------------------------------*
*&      Form  breakpoint
*&---------------------------------------------------------------------*
*       Seteo los breakpoint para las intancias de las BADI's
*       y para los eventos de las BTE's.
*----------------------------------------------------------------------*
FORM breakpoint .

  TYPES: BEGIN OF showbreakpointstruc.
  INCLUDE TYPE breakpoint.
  TYPES:   mainprog TYPE trdir-name,
          text(72),
          mark(1).
  TYPES: END OF showbreakpointstruc.
  DATA: showbreakpointtab TYPE TABLE OF showbreakpointstruc.

  IF p_badi IS NOT INITIAL AND p_handl IS NOT INITIAL.
* Break en el método GET_INSTANCE de la clase CL_EXITHANDLER para
* obtener la definiciones de las BADI's.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = '25'
        program      = 'CL_EXITHANDLER================CM001'
        mainprogram  = 'CL_EXITHANDLER================CP'
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.
  ENDIF.

  IF p_bte IS NOT INITIAL.
* Break en el módulo de funciones BF_FUNCTIONS_FIND para obtener los
* eventos de las BTE's de proceso.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = '15'
        program      = 'LITSRU02'
        mainprogram  = 'SAPLITSR'
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.

* Break en el módulo de funciones PC_FUNCTION_FIND para obtener los
* eventos de las P&S (publicación y suscripción) BTE's.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = '18'
        program      = 'LITSRU07'
        mainprogram  = 'SAPLITSR'
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.
  ENDIF.

  IF p_sust IS NOT INITIAL.
* Break en el módulo de funciones G_VSR_SUBSTITUTION_CALL del cual se
* desprende el llamado a las sustituciones.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = '42'
        program      = 'LGBL5U04'
        mainprogram  = 'SAPLGBL5'
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.

* Break en el módulo de funciones G_VSR_MULTI_SUBSTITUTION_CALL del cual
* se desprende el llamado a las sustituciones.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = '21'
        program      = 'LGBL5U09'
        mainprogram  = 'SAPLGBL5'
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.
  ENDIF.

  IF p_val IS NOT INITIAL.
* Break en el módulo de funciones G_VSR_VALIDATION_CALL del cual se
* desprende el llamado a las validaciones.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = '30'
        program      = 'LGBL5U01'
        mainprogram  = 'SAPLGBL5'
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.

* Break en el módulo de funciones G_VSR_MULTI_VALIDATION_CALL del cual
* se desprende el llamado a las validaciones.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = '15'
        program      = 'LGBL5U08'
        mainprogram  = 'SAPLGBL5'
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.
  ENDIF.


* Visualizo todos los breakpoint.
  CALL FUNCTION 'RS_SHOW_BREAKPOINTS'
    EXPORTING
      objektinfp  = '*'
      objekttypp  = 'PG'
      text1p      = ' '
      text2p      = ' '
      text3p      = ' '
    TABLES
      breakpoints = showbreakpointtab.

ENDFORM.                    " breakpoint

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_badi
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV.
*----------------------------------------------------------------------*
FORM construir_catalogo_badi .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_BADI'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'PROGRAMA'  'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' c_text_01,
  'TIPO'      'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_05,
  'NIVEL'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_02,
  'BREAK'     'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_07,
  'LINEA'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_03,
  'CF'        ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_04.

ENDFORM.                    " construir_catalogo_badi

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_bte
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV.
*----------------------------------------------------------------------*
FORM construir_catalogo_bte .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_BTE'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'PROGRAMA'  'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' c_text_01,
  'TIPO'      'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_05,
  'NIVEL'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_02,
  'BREAK'     'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' 'X' c_text_07,
  'LINEA'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_03,
  'CF'        ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_04.

ENDFORM.                    " construir_catalogo_bte

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_FDEX
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV.
*----------------------------------------------------------------------*
FORM construir_catalogo_fdex .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_FDEX'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'TIPO'      'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_05,
  'CF'        ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_04.

ENDFORM.                    " construir_catalogo_FDEX

*&---------------------------------------------------------------------*
*&      Form  cargar_break
*&---------------------------------------------------------------------*
*       Cargo los break-points en las tablas correspondientes.
*----------------------------------------------------------------------*
FORM cargar_break .

  TYPES: BEGIN OF showbreakpointstruc.
  INCLUDE TYPE breakpoint.
  TYPES:   mainprog TYPE trdir-name,
          text(72),
          mark(1).
  TYPES: END OF showbreakpointstruc.

  DATA:
    l_tabix   TYPE sy-tabix,
    l_line    TYPE breakpoint-line,
    l_program TYPE breakpoint-program,
    wa_break  TYPE showbreakpointstruc,
    lt_break  TYPE TABLE OF showbreakpointstruc.

* Obtengo todos los breakpoints marcados.
  CALL FUNCTION 'RS_GET_ALL_BREAKPOINTS'
    TABLES
      breakpointtab = lt_break.

  CHECK lt_break[] IS NOT INITIAL.

  IF p_ue IS NOT INITIAL.
    LOOP AT ti_user_exit.
      l_tabix = sy-tabix.

      MOVE:
        ti_user_exit-linea    TO l_line,
        ti_user_exit-programa TO l_program.

      READ TABLE lt_break INTO wa_break
                          WITH KEY program = l_program
                                   line    = l_line.

      IF sy-subrc IS INITIAL.
        MOVE icon_breakpoint TO ti_user_exit-break.
      ELSE.
        MOVE icon_space TO ti_user_exit-break.
      ENDIF.
      MODIFY ti_user_exit INDEX l_tabix.
    ENDLOOP.
  ENDIF.

  IF p_badi IS NOT INITIAL.
    LOOP AT ti_badi.
      l_tabix = sy-tabix.

      MOVE:
        ti_badi-linea    TO l_line,
        ti_badi-programa TO l_program.

      READ TABLE lt_break INTO wa_break
                          WITH KEY program = l_program
                                   line    = l_line.

      IF sy-subrc IS INITIAL.
        MOVE icon_breakpoint TO ti_badi-break.
      ELSE.
        MOVE icon_space TO ti_badi-break.
      ENDIF.
      MODIFY ti_badi INDEX l_tabix.
    ENDLOOP.
  ENDIF.

  IF p_bte IS NOT INITIAL.
    LOOP AT ti_bte.
      l_tabix = sy-tabix.

      MOVE:
        ti_bte-linea    TO l_line,
        ti_bte-programa TO l_program.

      READ TABLE lt_break INTO wa_break
                          WITH KEY program = l_program
                                   line    = l_line.

      IF sy-subrc IS INITIAL.
        MOVE icon_breakpoint TO ti_bte-break.
      ELSE.
        MOVE icon_space TO ti_bte-break.
      ENDIF.
      MODIFY ti_bte INDEX l_tabix.
    ENDLOOP.
  ENDIF.

ENDFORM.                    " cargar_break

*&---------------------------------------------------------------------*
*&      Form  asignar_break
*&---------------------------------------------------------------------*
*       Asigno el break a la linea.
*----------------------------------------------------------------------*
*      -->P_PROGRAMA  text
*      -->P_LINEA  text
*      -->P_BREAK  text
*----------------------------------------------------------------------*
FORM asignar_break  USING p_programa TYPE sy-repid
                          p_linea    LIKE ti_bte-linea
                          p_break    TYPE icon-id.

  TYPES: BEGIN OF showbreakpointstruc.
  INCLUDE TYPE breakpoint.
  TYPES:   mainprog TYPE trdir-name,
          text(72),
          mark(1).
  TYPES: END OF showbreakpointstruc.
  DATA: showbreakpointtab TYPE TABLE OF showbreakpointstruc.

  DATA:
    l_tabix   TYPE sy-tabix,
    l_line    TYPE breakpoint-line,
    l_program TYPE breakpoint-program,
    wa_break  TYPE showbreakpointstruc,
    lt_break  TYPE TABLE OF showbreakpointstruc.

* Obtengo todos los breakpoints marcados.
  CALL FUNCTION 'RS_GET_ALL_BREAKPOINTS'
    TABLES
      breakpointtab = lt_break.

  SELECT SINGLE *
    FROM d010inc
    WHERE include = p_programa.

  IF sy-subrc IS NOT INITIAL.
    MOVE p_programa TO d010inc-master.
  ENDIF.

  MOVE:
    p_linea    TO l_line,
    p_programa TO l_program.

  READ TABLE lt_break INTO wa_break
                      WITH KEY program = l_program
                               line    = l_line.

  IF sy-subrc IS INITIAL.
* Borro el break.
    CALL FUNCTION 'RS_DELETE_BREAKPOINT'
      EXPORTING
        index    = p_linea
        mainprog = d010inc-master
        program  = p_programa.
  ELSE.
* Seteo el breakpoint.
    CALL FUNCTION 'RS_SET_BREAKPOINT'
      EXPORTING
        index        = p_linea
        program      = p_programa
        mainprogram  = d010inc-master
      EXCEPTIONS
        not_executed = 1
        OTHERS       = 2.
  ENDIF.

* Visualizo todos los breakpoint.
  CALL FUNCTION 'RS_SHOW_BREAKPOINTS'
    EXPORTING
      objektinfp  = '*'
      objekttypp  = 'PG'
      text1p      = ' '
      text2p      = ' '
      text3p      = ' '
    TABLES
      breakpoints = showbreakpointtab.

ENDFORM.                    " asignar_break

*&---------------------------------------------------------------------*
*&      Form  buscar_user_exit
*&---------------------------------------------------------------------*
*       Obtengo los user-exits.
*----------------------------------------------------------------------*
FORM buscar_user_exit .

  IF p_prog IS INITIAL.
    MOVE tstc-pgmna TO p_prog.
  ENDIF.

  PERFORM get_objects.     "Get Objects

ENDFORM.                    " buscar_user_exit

*&---------------------------------------------------------------------*
*& Form get_objects
*&---------------------------------------------------------------------*
* Get Objects
*----------------------------------------------------------------------*
FORM get_objects.

  DATA:
    l_fname LIKE rs38l-name,
    l_group LIKE rs38l-area,
    l_include LIKE rs38l-include,
    l_namespace LIKE rs38l-namespace,
    l_str_area LIKE rs38l-str_area.

  DATA: v_include LIKE rodiobj-iobjnm.
  DATA: e_t_include TYPE STANDARD TABLE OF abapsource WITH HEADER LINE.
  DATA:
    l_line TYPE string,
    l_tabix LIKE sy-tabix.

  SELECT obj_name devclass
    INTO TABLE ti_tadir
    FROM tadir
    WHERE pgmid    = 'R3TR' AND
          object   = 'PROG' AND
          obj_name = p_prog.

  IF sy-subrc = 0.

    SORT ti_tadir BY obj_name devclass.

    SELECT obj_name
      INTO TABLE ti_jtab
      FROM tadir
      FOR ALL ENTRIES IN ti_tadir
      WHERE pgmid    = 'R3TR' AND
            object   = 'SMOD' AND
            devclass = ti_tadir-devclass.

    IF sy-subrc = 0.
      SORT ti_jtab BY obj_name.
    ENDIF.
  ENDIF.

*- Get UserExit names
  LOOP AT ti_jtab.

    SELECT name member
      INTO (ti_final-name, ti_final-member)
      FROM modsap
      WHERE name = ti_jtab-obj_name AND
            typ  = 'E'.

      APPEND ti_final.
      CLEAR ti_final.
    ENDSELECT.
  ENDLOOP.
*- Process it_final contents.
  LOOP AT ti_final.
    l_tabix = sy-tabix.
    CLEAR:
      l_fname, l_group, l_include, l_namespace, l_str_area.

    l_fname = ti_final-member.

    CALL FUNCTION 'FUNCTION_EXISTS'
      EXPORTING
        funcname           = l_fname
      IMPORTING
        group              = l_group
        include            = l_include
        namespace          = l_namespace
        str_area           = l_str_area
      EXCEPTIONS
        function_not_exist = 1
        OTHERS             = 2.

    IF sy-subrc = 0.
      IF NOT l_include IS INITIAL.
*- Get Source code of include.
        CLEAR: v_include, e_t_include, e_t_include[].
        v_include = l_include.
        CALL FUNCTION 'MU_INCLUDE_GET'
          EXPORTING
            i_include   = v_include
          TABLES
            e_t_include = e_t_include.

        LOOP AT e_t_include.
          IF e_t_include-line CS 'INCLUDE'.
            CLEAR l_line.
            l_line = e_t_include-line.
            CONDENSE l_line NO-GAPS.
            TRANSLATE l_line USING '. '.
            l_line = l_line+7.
            ti_final-include  = l_line.
            ti_final-programa = l_include.
            MODIFY ti_final INDEX l_tabix
              TRANSPORTING include programa.
          ENDIF.
        ENDLOOP.

        CLEAR tftit.
        SELECT SINGLE stext
          INTO ti_final-stext
          FROM tftit
          WHERE spras = sy-langu AND
                funcname = ti_final-member.
        MODIFY ti_final INDEX l_tabix TRANSPORTING stext.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDFORM.                                         " get_objects

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_uexit
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV
*----------------------------------------------------------------------*
FORM construir_catalogo_uexit .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_FINAL'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'NAME'      'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'MEMBER'    'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'STEXT'     ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'INCLUDE'   ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'PROGRAMA'  ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'X' ' ' ' '.

ENDFORM.                    " construir_catalogo_uexit

*&---------------------------------------------------------------------*
*&      Form  visualizar_ampliacion
*&---------------------------------------------------------------------*
*       Visualizo la ampliación de un exit.
*----------------------------------------------------------------------*
FORM visualizar_ampliacion .

  DATA:
    l_ret     TYPE c,
    l_member  TYPE modsap-member,
    lt_fields TYPE sval OCCURS 0 WITH HEADER LINE.

  MOVE:
    'MODSAP'    TO lt_fields-tabname,
    'MEMBER'    TO lt_fields-fieldname,
    'User-Exit' TO lt_fields-fieldtext.

  APPEND lt_fields.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      popup_title     = 'Ingrese user-exit:'
    IMPORTING
      returncode      = l_ret
    TABLES
      fields          = lt_fields
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.

* Verifico que no haya cancelado.
  CHECK l_ret NE 'A'.

  READ TABLE lt_fields INDEX 1.

  CHECK sy-subrc IS INITIAL.

  IF lt_fields-value IS INITIAL.
*   El exit de función & no existe
    MESSAGE e015(enhancement) WITH lt_fields-value.
  ELSE.
    MOVE lt_fields-value TO l_member.
  ENDIF.

  SELECT SINGLE *
    FROM modsap
    WHERE member EQ l_member.

  IF sy-subrc IS INITIAL.

* Visualizo la ampliación.
    CALL FUNCTION 'MOD_SAP_HEAD'
      EXPORTING
        mode          = 'SHOM'
        modname       = modsap-name
      EXCEPTIONS
        attr_enqueued = 1
        text_enqueued = 2
        OTHERS        = 3.

  ELSE.
*   El exit de función & no existe
    MESSAGE e015(enhancement) WITH l_member.
  ENDIF.

ENDFORM.                    " visualizar_ampliacion

*&---------------------------------------------------------------------*
*&      Form  visualizar_bte
*&---------------------------------------------------------------------*
*       Visualizo la BTE.
*----------------------------------------------------------------------*
*      -->P_TIPO   Tipo de BTE
*      -->P_LINEA  Evento o proceso.
*----------------------------------------------------------------------*
FORM visualizar_bte  USING p_tipo  TYPE c
                           p_linea.

  RANGES:
    r_event FOR tbe01-event,
    r_procs FOR tps01-procs.

  REFRESH: r_event, r_procs.

  CASE p_tipo.
    WHEN 'E'.
* Interface de publicación y suscripción.
      MOVE:
        'I'          TO r_event-sign,
        'EQ'         TO r_event-option,
        p_linea(8)   TO r_event-low.
      APPEND r_event.

      SUBMIT rfopfi00
             WITH event IN r_event
             WITH xonlk = ' '
             AND RETURN.
    WHEN 'P'.
* Interface de proceso.
      MOVE:
        'I'          TO r_procs-sign,
        'EQ'         TO r_procs-option,
        p_linea(8)   TO r_procs-low.
      APPEND r_procs.

      SUBMIT rfopfi01
             WITH procs IN r_procs
             WITH xonlk = ' '
             AND RETURN.
    WHEN OTHERS.
* Do nothing !!
  ENDCASE.

ENDFORM.                    " visualizar_bte

*&---------------------------------------------------------------------*
*&      Form  cargar_bte
*&---------------------------------------------------------------------*
*       Ingreso la BTE que quiero visualizar.
*----------------------------------------------------------------------*
*      -->P_TIPO   Tipo de BTE
*----------------------------------------------------------------------*
FORM cargar_bte  USING p_tipo TYPE c.

  DATA:
    l_linea(500)  TYPE c.

  DATA:
    l_ret     TYPE c,
    lt_fields TYPE sval OCCURS 0 WITH HEADER LINE.

  CASE p_tipo.
    WHEN 'E'.
* Interface de publicación y suscripción.
      MOVE:
        'TBE01' TO lt_fields-tabname,
        'EVENT' TO lt_fields-fieldname.
    WHEN 'P'.
* Interface de proceso.
      MOVE:
        'TPS01' TO lt_fields-tabname,
        'PROCS' TO lt_fields-fieldname.
    WHEN OTHERS.
* Do nothing !!
  ENDCASE.
  APPEND lt_fields.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      popup_title     = 'Ingrese BTE:'
    IMPORTING
      returncode      = l_ret
    TABLES
      fields          = lt_fields
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.

* Verifico que no haya cancelado.
  CHECK l_ret NE 'A'.

  READ TABLE lt_fields INDEX 1.

  CHECK sy-subrc IS INITIAL.

  MOVE lt_fields-value TO l_linea.

  PERFORM visualizar_bte USING p_tipo
                               l_linea.

ENDFORM.                    " cargar_bte

*&---------------------------------------------------------------------*
*&      Form  visualizar_interface
*&---------------------------------------------------------------------*
*       Visualizo la definición de la BADI que corresponde a la
*       interface.
*----------------------------------------------------------------------*
FORM visualizar_interface .

  DATA:
    l_linea(500)  TYPE c.

  DATA:
    l_ret        TYPE c,
    l_inter_name TYPE sxs_inter-inter_name,
    lt_fields    TYPE sval OCCURS 0 WITH HEADER LINE.

* Interface.
  MOVE:
    'SXS_INTER'  TO lt_fields-tabname,
    'INTER_NAME' TO lt_fields-fieldname.
  APPEND lt_fields.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      popup_title     = 'Ingrese interface:'
    IMPORTING
      returncode      = l_ret
    TABLES
      fields          = lt_fields
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.

* Verifico que no haya cancelado.
  CHECK l_ret NE 'A'.

  READ TABLE lt_fields INDEX 1.

  CHECK sy-subrc IS INITIAL.

  TRANSLATE lt_fields-value TO UPPER CASE.
  MOVE lt_fields-value TO l_inter_name.

* Obtengo a partir de la interface la definición de la BADI.
  SELECT SINGLE *
    FROM sxs_inter
    WHERE inter_name EQ l_inter_name.

  IF sy-subrc IS INITIAL.
* Visualizo la definición de la BADI.
    CALL FUNCTION 'SXO_BADI_SHOW'
      EXPORTING
        exit_name         = sxs_inter-exit_name
      EXCEPTIONS
        action_canceled   = 1
        access_failure    = 2
        badi_not_exixting = 3
        OTHERS            = 4.

  ELSE.
*   El interface & es erróneo.
    MESSAGE e226(enhancement) WITH l_inter_name.
  ENDIF.

ENDFORM.                    "visualizar_interface

*&---------------------------------------------------------------------*
*&      Form  buscar_sustituciones
*&---------------------------------------------------------------------*
*       Obtengo las sustituciones creadas.
*----------------------------------------------------------------------*
FORM buscar_sustituciones .

  CHECK p_sust IS NOT INITIAL.

  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE ti_sust
    FROM gb922.

ENDFORM.                    " buscar_sustituciones

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_sust
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV.
*----------------------------------------------------------------------*
FORM construir_catalogo_sust .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_SUST'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'SUBSTID'   'X' ' ' 'X' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'SUBSEQNR'  'X' ' ' 'X' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'CONSEQNR'  'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'SUBSTAB'   ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'SUBSFIELD' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'SUBSVAL'   ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'EXITSUBST' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '.

ENDFORM.                    " construir_catalogo_sust

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_SUST
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_sust.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_sust.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'Sustituciones'.

ENDFORM.                    "TOP_OF_PAGE_SUST

*&---------------------------------------------------------------------*
*&      Form  visualizar_sust
*&---------------------------------------------------------------------*
*       Visualizo la sustitución.
*----------------------------------------------------------------------*
*      -->P_SUBSTID  Nombre de la sustitución
*      -->P_SUBSEQNR Número de paso de la sustitución
*----------------------------------------------------------------------*
FORM visualizar_sust  USING p_substid  TYPE gb922-substid
                            p_subseqnr TYPE gb922-subseqnr.

  DATA:
    l_valuser LIKE gb31-valuser,
    l_valeven LIKE gb31-valevent.

  CALL FUNCTION 'G_BOOL_EXIST_SUBSTITUTION'
    EXPORTING
      substitution = p_substid
    IMPORTING
      valevent_fnd = l_valeven
      valuser_fnd  = l_valuser
    EXCEPTIONS
      not_found    = 1
      OTHERS       = 4.

  CALL FUNCTION 'G_SUBSTITUTION_ENVIRONMENT'
    EXPORTING
      bsubevent         = 'X'
      bsubuser          = 'X'
      subevent          = l_valeven
      substid           = p_substid
      subuser           = l_valuser
      view_only         = 'X'
      action_mode       = 'V'
      skip_first_screen = 'X'
      step              = p_subseqnr
    EXCEPTIONS
      not_found         = 1
      OTHERS            = 2.

ENDFORM.                    " visualizar_sust

*&---------------------------------------------------------------------*
*&      Form  buscar_validaciones
*&---------------------------------------------------------------------*
*       Obtengo las validaciones creadas.
*----------------------------------------------------------------------*
FORM buscar_validaciones .

  CHECK p_val IS NOT INITIAL.

  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE ti_val
    FROM gb931.

ENDFORM.                    " buscar_validaciones

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_val
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV.
*----------------------------------------------------------------------*
FORM construir_catalogo_val .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_VAL'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'VALID'     'X' ' ' 'X' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'VALSEQNR'  'X' ' ' 'X' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'CONDID'    ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'CHECKID'   ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '.

ENDFORM.                    " construir_catalogo_val

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_VAL
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_val.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_val.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'Validaciones'.

ENDFORM.                    "TOP_OF_PAGE_VAL
*&---------------------------------------------------------------------*
*&      Form  visualizar_val
*&---------------------------------------------------------------------*
*       Visualizo la validación.
*----------------------------------------------------------------------*
*      -->P_VALID    Validación
*      -->P_VALSEQNR Número secuencial de una etapa de validación
*----------------------------------------------------------------------*
FORM visualizar_val  USING p_valid    TYPE gb931-valid
                           p_valseqnr TYPE gb931-valseqnr.

  DATA:
    l_valuser LIKE gb31-valuser,
    l_valeven LIKE gb31-valevent.

  CALL FUNCTION 'G_BOOL_EXIST_VALIDATION'
    EXPORTING
      validation   = p_valid
    IMPORTING
      valuser_fnd  = l_valuser
      valevent_fnd = l_valeven
    EXCEPTIONS
      not_found    = 1
      null_id      = 2.

  CALL FUNCTION 'G_VALIDATION_ENVIRONMENT'
    EXPORTING
      action_mode       = 'V'
      skip_first_screen = 'X'
      bvalevent         = 'X'
      bvaluser          = 'X'
      valid             = p_valid
      valuser           = l_valuser
      valevent          = l_valeven
      view_only         = 'X'
      step              = p_valseqnr
    EXCEPTIONS
      not_found         = 1
      OTHERS            = 2.

ENDFORM.                    " visualizar_val

*&---------------------------------------------------------------------*
*&      Form  visualizar_proyecto
*&---------------------------------------------------------------------*
*       Visualizo el proyecto asosiado a una ampliación.
*----------------------------------------------------------------------*
FORM visualizar_proyecto .

  DATA:
    l_ret     TYPE c,
    l_name    TYPE modsap-name,
    l_member  TYPE modact-member,
    l_modname TYPE modact-name,
    l_standard(3) TYPE c,
    lt_fields TYPE sval OCCURS 0 WITH HEADER LINE.

  MOVE:
    'MODSAP' TO lt_fields-tabname,
    'NAME'   TO lt_fields-fieldname.

  APPEND lt_fields.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      popup_title     = 'Ingrese ampliación:'
    IMPORTING
      returncode      = l_ret
    TABLES
      fields          = lt_fields
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.

* Verifico que no haya cancelado.
  CHECK l_ret NE 'A'.

  READ TABLE lt_fields INDEX 1.

  CHECK sy-subrc IS INITIAL.

  IF lt_fields-value IS INITIAL.
*   La ampliación & no existe
    MESSAGE e012(enhancement) WITH lt_fields-value.
  ELSE.
    MOVE lt_fields-value TO l_name.
  ENDIF.

  SELECT SINGLE *
    FROM modsap
    WHERE name EQ l_name.

  IF sy-subrc IS INITIAL.

    MOVE l_name TO l_member.

    SELECT SINGLE *
      FROM modact
      WHERE member EQ l_member.

    IF sy-subrc IS INITIAL.
* Se encontró el proyecto para la ampliación.
      MOVE:
        modact-name   TO l_modname,
        c_std_implmnt TO l_standard.

      CALL FUNCTION 'MOD_COMPONENTS'
        EXPORTING
          mode               = 'SHOM'
          modname            = l_modname
          p_standard         = l_standard
        EXCEPTIONS
          permission_failure = 1
          not_found          = 2
          OTHERS             = 3.
    ELSE.
*   Indicar un proyecto de ampliación
      MESSAGE e398(00)
        WITH 'La ampliación ' l_name ' no tiene proyecto.'.
    ENDIF.

  ELSE.
*   La ampliación & no existe
    MESSAGE e012(enhancement) WITH lt_fields-value.
  ENDIF.

ENDFORM.                    " visualizar_proyecto

*&---------------------------------------------------------------------*
*&      Form  buscar_punto_ampliación
*&---------------------------------------------------------------------*
*       Obtengo los puntos de ampliación ya implementados.
*----------------------------------------------------------------------*
FORM buscar_punto_ampliacion .

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUN PUNTO DE
*- AMPLIACIÓN.
  SEARCH ti_programa-cf FOR c_enh1.
*- SE ENCONTRO UN PUNTO DE AMPLIACIÓN Y SE VERIFICA SI LA LINEA NO ESTÁ
*- COMENTADA.
  IF  sy-subrc EQ 0
  AND ti_programa-cf+0(1) NE c_comentario.

*- VERIFICO QUE NO TRAIGA LOS INCLUDE DEL GRUPO DE FUNCIÓN.
    SEARCH ti_programa-cf FOR c_include.
    CHECK sy-subrc NE 0.
*- VERIFICO QUE NO TRAIGA LOS ENDENHANCEMENT.
    SEARCH ti_programa-cf FOR c_endenh.
    CHECK sy-subrc NE 0.

*- VERIFICO QUE NO TRAIGA LOS END-ENHANCEMENT-SECTION.
    SEARCH ti_programa-cf FOR c_endenh1.
    CHECK sy-subrc NE 0.

    CLEAR ti_enh.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
    SHIFT ti_programa-cf LEFT DELETING LEADING space.
    MOVE: ti_includes-nome  TO ti_enh-programa,
          c_enht            TO ti_enh-tipo,
          sy-tabix          TO ti_enh-linea,
          ti_programa-cf    TO ti_enh-cf,
          ti_includes-nivel TO ti_enh-nivel.
    APPEND ti_enh.
  ELSE.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUN PUNTO DE
*- AMPLIACIÓN.
    SEARCH ti_programa-cf FOR c_enh2.
*- SE ENCONTRO UN PUNTO DE AMPLIACIÓN Y SE VERIFICA SI LA LINEA NO ESTÁ
*- COMENTADA.
    IF  sy-subrc EQ 0
    AND ti_programa-cf+0(1) NE c_comentario.

*- VERIFICO QUE NO TRAIGA LOS ENDENHANCEMENT.
      SEARCH ti_programa-cf FOR c_endenh.
      CHECK sy-subrc NE 0.

*- VERIFICO QUE NO TRAIGA LOS END-ENHANCEMENT-SECTION.
      SEARCH ti_programa-cf FOR c_endenh1.
      CHECK sy-subrc NE 0.

      CLEAR ti_enh.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
      SHIFT ti_programa-cf LEFT DELETING LEADING space.
      MOVE: ti_includes-nome  TO ti_enh-programa,
            c_enht            TO ti_enh-tipo,
            sy-tabix          TO ti_enh-linea,
            ti_programa-cf    TO ti_enh-cf,
            ti_includes-nivel TO ti_enh-nivel.
      APPEND ti_enh.
    ELSE.

*- VERIFICA SI EN LA LINEA DEL PROGRAMA EXISTE ALGUN PUNTO DE
*- AMPLIACIÓN.
      SEARCH ti_programa-cf FOR c_enh.
*- SE ENCONTRO UN PUNTO DE AMPLIACIÓN Y SE VERIFICA SI LA LINEA NO ESTÁ
*- COMENTADA.
      IF  sy-subrc EQ 0
      AND ti_programa-cf+0(1) NE c_comentario.

*- VERIFICO QUE TRAIGA LOS ENHANCEMENT.
        CHECK ti_programa-cf(11) EQ c_enh.

        CLEAR ti_enh.
*- REMUEVE ESPACIOS EN EL INICIO DEL STRING.
        SHIFT ti_programa-cf LEFT DELETING LEADING space.
        MOVE: ti_includes-nome  TO ti_enh-programa,
              c_enht            TO ti_enh-tipo,
              sy-tabix          TO ti_enh-linea,
              ti_programa-cf    TO ti_enh-cf,
              ti_includes-nivel TO ti_enh-nivel.
        APPEND ti_enh.

      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.                    " buscar_punto_ampliación

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_enh
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV.
*----------------------------------------------------------------------*
FORM construir_catalogo_enh .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_ENH'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'PROGRAMA'  'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' c_text_01,
  'TIPO'      'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_05,
  'NIVEL'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_02,
  'BREAK'     'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' 'X' c_text_07,
  'LINEA'     'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' c_text_03,
  'CF'        ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' c_text_04.

ENDFORM.                    " construir_catalogo_enh

*&---------------------------------------------------------------------*
*&      Form  buscar_enh
*&---------------------------------------------------------------------*
*       Busco los puntos de ampliación del programa.
*----------------------------------------------------------------------*
FORM buscar_enh .

*  DATA:
*    l_obj_name TYPE enhobj-obj_name.

  DATA: BEGIN OF lt_obj_name OCCURS 0,
          obj_name TYPE enhobj-obj_name,
        END OF lt_obj_name.

  CHECK p_enh IS NOT INITIAL.

*  IF p_prog IS NOT INITIAL.
*    MOVE p_prog TO l_obj_name.
*  ELSE.
*    MOVE tstc-pgmna TO l_obj_name.
*  ENDIF.

  REFRESH lt_obj_name.

  LOOP AT ti_includes.
    APPEND ti_includes-nome TO lt_obj_name.
  ENDLOOP.

  SELECT enhname version obj_type obj_name
    INTO CORRESPONDING FIELDS OF TABLE ti_enhobj
    FROM enhobj
    FOR ALL ENTRIES IN lt_obj_name
    WHERE obj_type EQ 'PROG'
      AND obj_name EQ lt_obj_name-obj_name.

ENDFORM.                    " buscar_enh

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_enhobj
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV.
*----------------------------------------------------------------------*
FORM construir_catalogo_enhobj .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_ENHOBJ'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'SEL'       'X' 'X' 'X' ' ' ' ' 'X' 'X' ' ' ' ' ' ',
  'ENHNAME'   'X' ' ' 'X' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'VERSION'   'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'OBJ_TYPE'  ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'X' ' ' ' ',
  'OBJ_NAME'  ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '.

ENDFORM.                    " construir_catalogo_enhobj

*&---------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE_ENHOBJ
*&---------------------------------------------------------------------*
*       Mostrar cabecera de página
*----------------------------------------------------------------------
FORM top_of_page_enhobj.

  DATA:
    l_tfill_inc(20)  TYPE c,
    l_tfill_cant(20) TYPE c.

  DESCRIBE TABLE ti_enhobj.
  WRITE sy-tfill TO l_tfill_cant.
  CONDENSE l_tfill_cant NO-GAPS.

* Construir encabezado del reporte
  PERFORM set_header USING l_tfill_cant
                           l_tfill_inc
                           'Puntos de ampliación'.

ENDFORM.                    "TOP_OF_PAGE_ENHOBJ

*&---------------------------------------------------------------------*
*&      Form  bi_se19
*&---------------------------------------------------------------------*
*       Visualizo el punto de ampliación implementado.
*----------------------------------------------------------------------*
*      -->P_ENHNAME  Punto de ampliación implementado.
*----------------------------------------------------------------------*
FORM bi_se19  USING p_enhname TYPE enhobj-enhname .

* Visualizo la linea seleccionada en el programa.
  CALL FUNCTION 'RS_TOOL_ACCESS'
    EXPORTING
      operation           = c_operation
      object_name         = p_enhname
      object_type         = 'ENHO'
    EXCEPTIONS
      not_executed        = 1
      invalid_object_type = 2
      OTHERS              = 3.

ENDFORM.                                                    " bi_se19

*&---------------------------------------------------------------------*
*&      Form  BDC_DYNPRO
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.

  CLEAR ti_bdcdata.
  ti_bdcdata-program  = program.
  ti_bdcdata-dynpro   = dynpro.
  ti_bdcdata-dynbegin = 'X'.
  APPEND ti_bdcdata.

ENDFORM.                               " BDC_DYNPRO

*&---------------------------------------------------------------------*
*&      Form  BDC_FIELD
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.

  CLEAR ti_bdcdata.
  ti_bdcdata-fnam = fnam.
  ti_bdcdata-fval = fval.
  APPEND ti_bdcdata.

ENDFORM.                    "BDC_FIELD

*&---------------------------------------------------------------------*
*&      Form  visualizar_programa
*&---------------------------------------------------------------------*
*       Visualizo el programa que se genera dinámicamente para las
*       sustituciones y validaciones de FI.
*----------------------------------------------------------------------*
FORM visualizar_programa .

  DATA:
    l_selfield     TYPE slis_selfield,
    l_exit         TYPE c,
    l_repid        TYPE sy-repid,
    l_boolpool(8).

  CHECK ti_gb31t[] IS NOT INITIAL.

  DO.

* Visualizo los distintos eventos para que puedan realizar la selección.
    CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
      EXPORTING
        i_title          = 'Validación/Sustitución Evento'
        i_zebra          = 'X'
        i_tabname        = 'TI_GB31T'
        i_structure_name = 'GB31T'
      IMPORTING
        es_selfield      = l_selfield
        e_exit           = l_exit
      TABLES
        t_outtab         = ti_gb31t
      EXCEPTIONS
        program_error    = 1
        OTHERS           = 2.

    IF l_exit EQ 'X'.
      EXIT.
    ENDIF.

    CHECK l_exit IS INITIAL.

* Obtengo el nombre del programa de sustitución y validación asociado
* a la selección del usuario.
    PERFORM create_bool_filename(saplgbl5)
              USING    ti_gb31t-valuser
                       ti_gb31t-valevent
              CHANGING l_boolpool
              IF FOUND.

    CHECK l_boolpool IS NOT INITIAL.

    MOVE l_boolpool TO l_repid.

* Visualizo el programa.
    PERFORM visualizar_linea USING l_repid
                                   '01'.

  ENDDO.

ENDFORM.                    " visualizar_programa

*&---------------------------------------------------------------------*
*&      Form  texto_tope
*&---------------------------------------------------------------------*
*       Encabezado que explica la funcionalidad de algunas columnas
*       del reporte.
*----------------------------------------------------------------------*
FORM texto_tope .

  STATICS l_flag TYPE c.

  DATA l_tit(65) TYPE c.

  CHECK l_flag IS INITIAL.

  l_flag = 'X'.

  WRITE 'FUNCIOANALIDAD DE LAS COLUMNAS:' TO l_tit CENTERED.
  FORMAT COLOR = 1.

  WRITE:
* Título.
  /(70)   sy-uline,
  /1(1)   sy-vline,
   3      l_tit,
   70(1)  sy-vline,
  /(70)   sy-uline,
*1er linea.
  /1(1)   sy-vline,
   3      'TIPO: Se visualiza las definiciones de los objetos de',
   70(1)  sy-vline,
*2da linea.
  /1(1)   sy-vline,
   3      '      ampliación.',
   70(1)  sy-vline,
*3ra linea.
  /1(1)   sy-vline,
   3      'STOP: Agrega un BREAK en la línea de código seleccionada.',
   70(1)  sy-vline,
*4ta linea.
  /1(1)   sy-vline,
   3      'CÓDIGO FUENTE: Se visualiza la línea de código en el ',
   70(1)  sy-vline,
*5ta linea.
  /1(1)   sy-vline,
   3      '               programa correspondiente.',
   70(1)  sy-vline,
* Cierro el cuadro.
   /(70)  sy-uline.

  SKIP.

ENDFORM.                    " texto_tope

*&---------------------------------------------------------------------*
*&      Form  bi_se18
*&---------------------------------------------------------------------*
*       Visualizo la definición del enhancement point.
*&---------------------------------------------------------------------*
FORM bi_se18  USING  p_cf.

  DATA:
    l_enhspotname TYPE enhspotname,
    l_off TYPE i,
    l_cf  TYPE i.

  DATA: BEGIN OF lt_cf OCCURS 0,
          linea(500),
        END OF lt_cf.

  FIND FIRST OCCURRENCE OF ' SPOT ' IN p_cf MATCH OFFSET l_off.

  CHECK l_off IS NOT INITIAL.

  ADD 7 TO l_off.
  l_cf = 500 - l_off.

  SPLIT p_cf+l_off(l_cf) AT space INTO TABLE lt_cf.

  CHECK sy-subrc IS INITIAL.

* Obtengo el nombre de la definición del enhancement.
  READ TABLE lt_cf INDEX 1.

  TRANSLATE lt_cf-linea TO UPPER CASE.
  TRANSLATE lt_cf-linea USING '. , '.

  MOVE lt_cf-linea TO l_enhspotname.

* Visualizo la linea seleccionada en el programa.
  CALL FUNCTION 'RS_TOOL_ACCESS'
    EXPORTING
      operation           = c_operation
      object_name         = l_enhspotname
      object_type         = 'ENHS'
    EXCEPTIONS
      not_executed        = 1
      invalid_object_type = 2
      OTHERS              = 3.

ENDFORM.                                                    " bi_se18

*&---------------------------------------------------------------------*
*&      Form  visualizar_fm_exit
*&---------------------------------------------------------------------*
*       Se visualiza el módulo de funciones del user-exit's que
*       contiene al include Z indicado.
*----------------------------------------------------------------------*
FORM visualizar_fm_exit .

  DATA:
    l_ret     TYPE c,
    l_flag    TYPE c,
    l_name    TYPE trdir-name,
    lt_fields TYPE sval OCCURS 0 WITH HEADER LINE,
    lt_tfdir  TYPE tfdir OCCURS 0 WITH HEADER LINE.

  DATA:
    v_include LIKE rodiobj-iobjnm,
    l_fname LIKE rs38l-name,
    l_group LIKE rs38l-area,
    l_include LIKE rs38l-include,
    l_namespace LIKE rs38l-namespace,
    l_str_area LIKE rs38l-str_area,
    lt_incl TYPE STANDARD TABLE OF abapsource WITH HEADER LINE.

  MOVE:
    'RS38L'   TO lt_fields-tabname,
    'INCLUDE' TO lt_fields-fieldname,
    'Include' TO lt_fields-fieldtext.

  APPEND lt_fields.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      popup_title     = 'Ingrese ampliación:'
    IMPORTING
      returncode      = l_ret
    TABLES
      fields          = lt_fields
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.

* Verifico que no haya cancelado.
  CHECK l_ret NE 'A'.

  READ TABLE lt_fields INDEX 1.

  CHECK sy-subrc IS INITIAL.

  IF lt_fields-value IS INITIAL OR lt_fields-value(1) NE 'Z'.
*   La ampliación & no existe
    MESSAGE e012(enhancement) WITH lt_fields-value.
  ELSE.
    MOVE lt_fields-value TO l_name.
  ENDIF.

* Obtengo los FM de los exit's.
  SELECT *
    INTO TABLE lt_tfdir
    FROM tfdir
    WHERE funcname LIKE 'EXIT_%'.

  LOOP AT lt_tfdir.

    CLEAR:
      l_group, l_include, l_namespace, l_str_area.

    l_fname = lt_tfdir-funcname.
* Obtengo el include del user-exti's.
    CALL FUNCTION 'FUNCTION_EXISTS'
      EXPORTING
        funcname           = l_fname
      IMPORTING
        group              = l_group
        include            = l_include
        namespace          = l_namespace
        str_area           = l_str_area
      EXCEPTIONS
        function_not_exist = 1
        OTHERS             = 2.

    IF sy-subrc = 0.
      IF NOT l_include IS INITIAL.
*- Obtengo el código fuente del user-exit's.
        CLEAR: v_include, lt_incl, lt_incl[].
        v_include = l_include.
        CALL FUNCTION 'MU_INCLUDE_GET'
          EXPORTING
            i_include   = v_include
          TABLES
            e_t_include = lt_incl.

        IF lt_incl[] IS NOT INITIAL.
* Verifico si alguna de las líneas contiene el include.
          FIND FIRST OCCURRENCE OF l_name
            IN TABLE lt_incl.

          CHECK sy-subrc IS INITIAL.

* Visualizo el FM del user-exit.
          PERFORM visualizar_linea USING l_include
                                         '01'.
          l_flag = 'X'.
          EXIT.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

  CHECK l_flag IS INITIAL.

*   La ampliación & no existe
  MESSAGE e012(enhancement) WITH lt_fields-value.

ENDFORM.                    " visualizar_fm_exit

*&---------------------------------------------------------------------*
*&      Form  def_text_parameter
*&---------------------------------------------------------------------*
*       Defino los textos de los parámetros de selección.
*----------------------------------------------------------------------*
FORM def_text_parameter .

  tit1   = 'Parámetros:'.
  tit2   = 'Tipo de ampliación:'.
  tit3   = 'Tipo de ejecución:'.
  text1  = 'Programa'.
  text2  = 'Transacción'.
  text3  = 'Includes'.
  text4  = 'Funciones'.
  text5  = 'Submit'.
  text6  = 'Nivel'.
  text7  = 'User-exit'.
  text8  = 'Badi'.
  text9  = 'BTE'.
  text10 = 'Sustitución'.
  text11 = 'Field-exit'.
  text12 = c_handler.
  text13 = 'Validación'.
  text14 = 'Punto de ampliación'.

ENDFORM.                    " def_text_parameter

*&---------------------------------------------------------------------*
*&      Form  def_botones
*&---------------------------------------------------------------------*
*       Defino los textos de las botoneras de la pantalla de selección.
*----------------------------------------------------------------------*
FORM def_botones .

* Agrego el boton de marcar todo en STATUS GUI.
  functxt-icon_id   = icon_select_all.
  functxt-quickinfo = c_text_08.
  sscrfields-functxt_01 = functxt.

* Agrego el boton de desmarcar todo en STATUS GUI.
  functxt-icon_id   = icon_deselect_all.
  functxt-quickinfo = c_text_09.
  sscrfields-functxt_02 = functxt.

* Agrego el boton de Breakpoint en STATUS GUI.
  functxt-icon_id   = icon_message_critical.
  functxt-quickinfo = c_text_06.
  functxt-icon_text = c_text_06.
  sscrfields-functxt_03 = functxt.


* icon_create:   RESULT  name  text info.
  icon_create:

* Creo la visualización del botón de exit's en la DYNPRO.
  btn icon_display_note 'Ampliación' 'Visualizar ampliación',
* Creo la visualización del botón de proyectos exit's en la DYNPRO.
  ext1 icon_display_note 'Proyecto' 'Visualizar Proyecto',
* Creo la visualización del botón de proyectos exit's en la DYNPRO.
  ext2 icon_display_note 'User-exit' 'Visualizar User-exit',
* Creo la visualización del botón de Interface en la DYNPRO.
  badi icon_availability_display 'Interface' 'Visualizar Def.Interface',
* Creo la visualización del botón de sustitución en la DYNPRO.
  btn1 icon_display_text 'Tx. OBBH' 'Visualizar sustituciones',
* Creo la visualización del botón de sustitución en la DYNPRO.
  sust icon_report 'Prog.Generado' 'Vis.programa generado',
* Creo la visualización del botón de sustitución en la DYNPRO.
  ob28 icon_display_text 'Tx. OB28' 'Visualizar validaciones',
* Creo la visualización del botón de sustitución en la DYNPRO.
  btn2 icon_display 'Field-exits' 'Visualizar Field-exits',
* Creo la visualización del botón de FIBF en la DYNPRO.
  bte1 icon_toggle_display '' 'Visualizar FIBF',
* Creo la visualización del botón de Evento en la DYNPRO.
  bte2 icon_show_events  'Evento' 'Visualizar Evento',
* Creo la visualización del botón de Proceso en la DYNPRO.
  bte3 icon_bw_apd 'Proceso' 'Visualizar Proceso',
* Creo Marcar todo en la DYNPRO.
  all  icon_select_all '' c_text_08,
* Creo Desmarcar todo en la DYNPRO.
  dal  icon_deselect_all '' c_text_09,
* Creo la visualización del botón de SENH en la DYNPRO.
  senh icon_detail '' 'Visualizar SENH',
* Creo la visualización del botón de Customer Implement. en la DYNPRO.
  cimp icon_table_settings 'Cust.Impl.' 'Customer Implementation'.

  MOVE sust TO val.

ENDFORM.                    " def_botones

*&---------------------------------------------------------------------*
*&      Form  set_header
*&---------------------------------------------------------------------*
*       Creo el encabezado del ALV correspondiente.
*----------------------------------------------------------------------*
FORM set_header  USING p_cant
                       p_inc
                       p_text.

  DATA:
    l_tit(65) TYPE c.

  STATICS l_col TYPE i.

  PERFORM texto_tope.

  IF l_col IS INITIAL OR l_col EQ 7.
    l_col = 3.
  ELSE.
    ADD 1 TO l_col.
  ENDIF.

  FORMAT COLOR = l_col.

  WRITE p_text TO l_tit CENTERED.

  TRANSLATE l_tit USING ' *'.

  WRITE:
* Título.
  /(70)   sy-uline,
  /1(1)   sy-vline,
   3      l_tit,
   70(1)  sy-vline,
  /(70)   sy-uline.

  FORMAT COLOR = 2.

  IF p_tcode IS INITIAL.
    CONCATENATE 'Ampliaciones encontradas en el programa' p_prog
           INTO l_tit SEPARATED BY space.
  ELSE.
    CONCATENATE 'Ampliaciones encontradas en la transacción' p_tcode
           INTO l_tit SEPARATED BY space.
  ENDIF.

  WRITE:
* Título.
  /1(1)   sy-vline,
   3      l_tit,
   70(1)  sy-vline.

  IF p_tcode IS INITIAL.
* Obtengo la descripción del programa.
    SELECT SINGLE *
      FROM trdirt
      WHERE name  EQ p_prog
        AND sprsl EQ sy-langu.

    CONCATENATE 'Descripción:' trdirt-text
      INTO l_tit SEPARATED BY space.

  ELSE.
* Obtengo la descripción de la transacción.
    SELECT SINGLE *
      FROM tstct
      WHERE sprsl EQ sy-langu
        AND tcode EQ p_tcode.

    CONCATENATE 'Descripción:' tstct-ttext
      INTO l_tit SEPARATED BY space.

  ENDIF.

  WRITE:
  /1(1)   sy-vline,
   3      l_tit,
   70(1)  sy-vline,
  /(70)   sy-uline.

  IF p_inc IS NOT INITIAL.

    CONCATENATE 'PGMs analizados:' p_inc
      INTO l_tit SEPARATED BY space.

    WRITE:
    /1(1)   sy-vline,
     3      l_tit,
     70(1)  sy-vline.

    CONCATENATE 'Nivel:' p_nivel
      INTO l_tit SEPARATED BY space.

    WRITE:
    /1(1)   sy-vline,
     3      l_tit,
     70(1)  sy-vline.

  ENDIF.

  CONCATENATE 'Cant.Ampliaciones:' p_cant
    INTO l_tit SEPARATED BY space.

  WRITE:
  /1(1)   sy-vline,
   3      l_tit,
   70(1)  sy-vline,
* Cierro el cuadro.
 /(70)  sy-uline.

  SKIP.

ENDFORM.                    " set_header

*&---------------------------------------------------------------------*
*&      Form  visualizar_imp_enh
*&---------------------------------------------------------------------*
*       Visualizo las implementaciones del cliente de los enhancement
*       de cualquier tipo.
*----------------------------------------------------------------------*
FORM visualizar_imp_enh .

  DATA:
    l_repid LIKE sy-repid.

  l_repid = sy-repid.

  PERFORM get_imp_enh.
  PERFORM construir_catalogo_cimp.
  PERFORM definir_layout  USING    'TI_CIMP'
                          CHANGING wa_layout.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      i_callback_program      = l_repid
      i_callback_user_command = 'USER_COMMAND'
      is_layout               = wa_layout
      it_fieldcat             = ti_cat
      i_default               = 'X'
      i_save                  = 'A'
    TABLES
      t_outtab                = ti_cimp
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.

ENDFORM.                    " visualizar_imp_enh

*&---------------------------------------------------------------------*
*&      Form  construir_catalogo_cimp
*&---------------------------------------------------------------------*
*       Construir catalogo de campos para ALV
*----------------------------------------------------------------------*
FORM construir_catalogo_cimp .

  DATA:
    l_repid  LIKE sy-repid.

  REFRESH: ti_cat.

  l_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_internal_tabname     = 'TI_CIMP'
      i_inclname             = l_repid
    CHANGING
      ct_fieldcat            = ti_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Asignar atributos de campo en el catalogo de reporte ALV
  PERFORM asignar_campo_a_catalogo TABLES ti_cat
                                   USING:

  'ENHNAME'    'X' 'X' 'X' 'X' ' ' ' ' ' ' ' ' ' ' ' ',
  'OBJ_TYPE'   ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'OBJ_NAME'   ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'ELEMUSAGE'  ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ',
  'ENHINCLUDE' ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' '.

ENDFORM.                    " construir_catalogo_cimp

*&---------------------------------------------------------------------*
*&      Form  get_imp_enh
*&---------------------------------------------------------------------*
*       Obtengo las implementaciones creadas.
*----------------------------------------------------------------------*
FORM get_imp_enh .

  SELECT enhobj~enhname enhobj~obj_type enhobj~obj_name enhobj~elemusage
         enhincinx~enhinclude
    FROM enhobj LEFT OUTER JOIN enhincinx ON
      enhobj~enhname = enhincinx~enhname
    INTO TABLE ti_cimp
    WHERE enhobj~enhname LIKE 'Z%' OR
          enhobj~enhname LIKE 'Y%' AND
          enhobj~version EQ 'A'.

  SORT ti_cimp BY enhname obj_type.

ENDFORM.                    " get_imp_enh

*&---------------------------------------------------------------------*
*&      Form  visualizar_enh_cf
*&---------------------------------------------------------------------*
*       Visualizo el código fuente del enhancement.
*----------------------------------------------------------------------*
FORM visualizar_enh_cf  USING p_enhinclude TYPE any.

  DATA:
  l_changed LIKE s38e-buf_varied,
  l_subrc   LIKE sy-subrc,
  lt_source TYPE TABLE OF string.

  CHECK p_enhinclude IS NOT INITIAL.

  READ REPORT p_enhinclude INTO lt_source.

  CHECK sy-subrc IS INITIAL.

  CALL FUNCTION 'EDITOR_TABLE'
    EXPORTING
      display = 'X'
      name    = p_enhinclude
    IMPORTING
      changed = l_changed
      subrc   = l_subrc
    TABLES
      content = lt_source.

ENDFORM.                    " visualizar_enh_cf

Páginas: [1] 2 3