Usando SUBMIT para invocar otro Programa

Hola amigos de la comunidad SAP, en esta oportunidad voy a mostrar 2 Programas.
El primero es un programa que contendrá el ALV y el segundo es otro programa que sólo contendrá la pantalla de selección e invocará al primer programa que contiene el ALV para mostrar la data según lo seleccionado en pantalla.

Objetivo:

Primero: Crear una tabla Z que contendrá un registro de usuarios; en mi caso a la tabla Z le puse el nombre: ZTAQ_USUARIO

Segundo: La tabla Z creada debe poder ser actualizado desde la transacción SM30

Tercero: Registramos las entradas nuevas.

 Cuarto: Crear un programa Z que contenga el ALV a mostrar la data; este programa también puede tener una pantalla de selección; en nuestro caso inclusive podrá permitir al usuario seleccionar que tipo de ALV desea mostrar: ALV GRID / ALV GRID OO.

Programa: ZAQR052
Título del Programa: Programa que puede ser invocado desde otro programa usando GET PARAMETER ID

Ejemplo:
Ejecutamos el Programa seleccionando la opción ALV GRID

Ejecutamos el Programa seleccionando la opción ALV GRID OO
Aquí veremos que para el ALV GRID OO hemos incluido algunos hyperlinks como vemos en la imagen:

Si hacemos click en el hyperlink 'SAP ABAP & WEB DYNPRO' 

Automáticamente nos direccionará al link de este Blog. 


Quinto: Crear un programa Z que sólo contenga la pantalla de selección y que para mostrar al ALV invoque al otro programa (programa: ZAQR052, el que contiene el ALV) usando SUBMIT.

Programa: ZAQR051
Título del Programa: Programa que invoca a otro programa usando SUBMIT

Ejemplo:
Este programa en su pantalla de selección a modo de diferenciarse del otro programa tiene un parámetro que es de tipo ListBox donde se podrá seleccionar el usuario.

Automáticamente se mostrará su nombre del usuario seleccionado:

Al ejecutar veremos los datos del usuario seleccionado. Observaremos que para mostrar el ALV ha invocado al otro programa que contiene el ALV lo cual también nos podemos dar cuenta por el título del reporte.

CÓDIGO FUENTE: 
PROGRAMA: ZAQR052

*&---------------------------------------------------------------------*
*& Report  ZAQR052

*&---------------------------------------------------------------------*

*&Programa que muestra 2 tipos de ALV: ALV GRID & ALV GRID OO

*&Y que también considera el ser llamado desde otro programa usando

*& GET PARAMETER ID XXX FIELD YYY.

*&En caso de mostrar un ALV OO mostrará links segun usuario

*&---------------------------------------------------------------------*


REPORT  zaqr052.


*&---------------------------------------------------------------------*

*& Tables

*&---------------------------------------------------------------------*

TABLES: ztaq_usuario"Tabla ZTAQ_USUARIO contiene registro de usuarios


*&----------------------------------------------------------------------------------&*

*Global Types

*&----------------------------------------------------------------------------------&*

TYPESBEGIN OF gty_usuario,

         usuario TYPE ztaq_usuario-usuario,
         nombre  TYPE ztaq_usuario-nombre,
         hobby   TYPE ztaq_usuario-hobby,

*Definimos un campo adicional para el control del hyperlink en el campo Hobby

         hobby_handle  TYPE int4,
       END OF gty_usuario.


*&----------------------------------------------------------------------------------&*

*Internal TABLES

*&----------------------------------------------------------------------------------&*

DATA: gt_users TYPE STANDARD TABLE OF gty_usuario.



*&----------------------------------------------------------------------------------&*

*Tablas internas para el ALV GRID

*&----------------------------------------------------------------------------------&*

DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,

      gt_sort TYPE slis_t_sortinfo_alv.


*&----------------------------------------------------------------------------------&*

* Estructuras ALV Grid

*&----------------------------------------------------------------------------------&*

DATA: gs_layout TYPE slis_layout_alv.



*&----------------------------------------------------------------------------------&*

*Tablas internas para el ALV GRID OO

*&----------------------------------------------------------------------------------&*

DATA: gt_fcat TYPE lvc_t_fcat,

      gt_hype TYPE lvc_t_hype.


*&----------------------------------------------------------------------------------&*

*Referencia a objetos para el ALV GRID OO

*&----------------------------------------------------------------------------------&*

DATA go_grid TYPE REF TO cl_gui_custom_container,

       go_alv  TYPE REF TO cl_gui_alv_grid.


*&----------------------------------------------------------------------------------&*

*Estructura ALV GRID

*&----------------------------------------------------------------------------------&*

DATA: gs_layo TYPE lvc_s_layo.



*&----------------------------------------------------------------------------------&*

*ALV's Variables

*&----------------------------------------------------------------------------------&*

DATA: gv_program TYPE sy-repid,

      gv_titulo  TYPE sy-title.


*&----------------------------------------------------------------------------------&*

* Field-symbols

*&----------------------------------------------------------------------------------&*

FIELD-SYMBOLS <user> LIKE LINE OF gt_users.



*&---------------------------------------------------------------------*

*& SELECTION-SCREEN

*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.

SELECT-OPTIONSso_user FOR ztaq_usuario-usuario.

SELECTION-SCREEN END OF BLOCK b01.



SELECTION-SCREENBEGIN OF BLOCK b02 WITH FRAME TITLE text-002.

PARAMETERS      rb_alv   RADIOBUTTON GROUP rb1 DEFAULT 'X' USER-COMMAND uc1,

                  rb_alvoo RADIOBUTTON GROUP rb1.

SELECTION-SCREENEND OF BLOCK b02.




*&---------------------------------------------------------------------*

*& START-OF-SELECTION

*&---------------------------------------------------------------------*

START-OF-SELECTION.

  PERFORM get_data.
  PERFORM set_hyperlink.


*&---------------------------------------------------------------------*

*& END-OF-SELECTION

*&---------------------------------------------------------------------*

* Este evento se dispara cuando se terminó la selección de datos

*&---------------------------------------------------------------------*

END-OF-SELECTION.

  IF rb_alv EQ 'X'.
    PERFORM init_layout.
    PERFORM fill_catalog.
    PERFORM build_sort.
    PERFORM call_alv.
  ELSEIF rb_alvoo EQ 'X'.
    PERFORM init_layout_oo.
    PERFORM fill_catalog_oo.
    PERFORM fill_hyperlink.
    CALL SCREEN 0100.
  ENDIF.


*&---------------------------------------------------------------------*

*&      Form  GET_DATA

*&---------------------------------------------------------------------*

*Obtenemos los usuarios segun lo seleccionado por pantalla

*----------------------------------------------------------------------*

FORM get_data .

  DATA pa_user TYPE ztaq_usuario-usuario.

  GET PARAMETER ID 'USR' FIELD pa_user.
  IF sy-subrc EQ 0."Si este programa es invocado desde otro programa
    SELECT usuario nombre hobby
    INTO CORRESPONDING FIELDS OF TABLE gt_users
    FROM ztaq_usuario
    WHERE usuario EQ pa_user.
  ELSE.
    SELECT usuario nombre hobby
    INTO CORRESPONDING FIELDS OF TABLE gt_users
    FROM ztaq_usuario
    WHERE usuario IN so_user.
  ENDIF.

ENDFORM.                    " GET_DATA



*&---------------------------------------------------------------------*

*&      Form  INIT_LAYOUT

*&---------------------------------------------------------------------*

FORM init_layout .

*Indicamos que cada registro del reporte se muestre con colores intercalados

  gs_layout-zebra 'X'.


*Optimizamos el ancho de la columna segun el tamaño de carácteres

  gs_layout-colwidth_optimize 'X'.

ENDFORM.                    " INIT_LAYOUT



*&---------------------------------------------------------------------*

*&      Form  FILL_CATALOG

*&---------------------------------------------------------------------*

*Tabla interna FIELDCAT se llena con los campos que mostraremos en el ALV

*----------------------------------------------------------------------*

FORM fill_catalog.

  DATAls_fieldcat TYPE slis_fieldcat_alv.

  CLEAR ls_fieldcat.
  ls_fieldcat-tabname   'GT_USERS'"NOM TABLA CON ESTRUCTURA DE ALV.
  ls_fieldcat-fieldname 'USUARIO'" NOM DEL CAMPO A MOSTRAR.
  ls_fieldcat-key       'X'.
  ls_fieldcat-seltext_l 'Usuario'."TEXTO QUE MOSTRARA EL CAMPO
  ls_fieldcat-col_pos 1" POS. QUE TENDRA EL CAMPO EN EL ALV.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-tabname 'GT_USERS'"NOM TABLA CON ESTRUCTURA DE ALV.
  ls_fieldcat-fieldname =  'NOMBRE'" NOM DEL CAMPO A MOSTRAR.
  ls_fieldcat-seltext_l 'Nombre'."TEXTO QUE MOSTRARA EL CAMPO
  ls_fieldcat-col_pos 2" POS. QUE TENDRA EL CAMPO EN EL ALV.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-tabname 'GT_USERS'"NOM TABLA CON ESTRUCTURA DE ALV.
  ls_fieldcat-fieldname =  'HOBBY'" NOM DEL CAMPO A MOSTRAR.
  ls_fieldcat-seltext_l 'Hobby'."TEXTO QUE MOSTRARA EL CAMPO
  ls_fieldcat-col_pos 3" POS. QUE TENDRA EL CAMPO EN EL ALV.
  APPEND ls_fieldcat TO gt_fieldcat.

ENDFORM.                    " FILL_CATALOG



*&---------------------------------------------------------------------*

*&      Form  BUILD_SORT

*&---------------------------------------------------------------------*

*Primero: Indicamos el número de la columna por la cual vamos a ordenar

*Segundo: Indicamos el nombre del campo relacionado a dicha columna

*Finalmente: Indicamos que la ordenación va ha ser ascendente

*----------------------------------------------------------------------*

FORM build_sort .

  FIELD-SYMBOLS <sort> LIKE LINE OF gt_sort.
  APPEND INITIAL LINE TO gt_sort ASSIGNING <sort>.
  <sort>-spos 1.
  <sort>-fieldname 'USUARIO'.
  <sort>-up 'X'.

ENDFORM.                    " BUILD_SORT



*&---------------------------------------------------------------------*

*&      Form  CALL_ALV

*&---------------------------------------------------------------------*

* Invocamos al ALV GRID

*----------------------------------------------------------------------*

FORM call_alv .

  gv_program sy-repid.
  gv_titulo 'DETALLE'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_buffer_active    ' '
      i_callback_program gv_program  "PROGRAMA AL CUAL ESTARÁ ENLAZADO EL ALV.
      i_grid_title       gv_titulo   "TITULO QUE VA A LLEVAR EL LISTADO ALV.
      is_layout          gs_layout   "ALMACENA EL FORMATO DEL LISTADO
      it_fieldcat        gt_fieldcat "ALMACENA LOS CAMPOS QUE CONFORMAN EL ALV.
      it_sort            gt_sort[]   "ALMACENA EL ORDEN DEL ALV.
    TABLES
      t_outtab           gt_users    "TABLA INTERNA QUE ALMACENA TODOS LOS REGISTROS OBTENIDOS.
    EXCEPTIONS
      program_error      1
      OTHERS             2.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

ENDFORM.                    " CALL_ALV



*&---------------------------------------------------------------------*

*&      Form  FILL_CATALOG_OO

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM fill_catalog_oo .

  DATAls_fcat TYPE lvc_s_fcat.

  CLEAR ls_fcat.
  ls_fcat-tabname   'GT_USERS'"NOM TABLA CON ESTRUCTURA DE ALV.
  ls_fcat-fieldname 'USUARIO'" NOM DEL CAMPO A MOSTRAR.
  ls_fcat-coltext   'Usuario'."TEXTO QUE MOSTRARA EL CAMPO
  ls_fcat-key       'X'"Indica que este campo es clave
  ls_fcat-col_pos   1" POS. QUE TENDRA EL CAMPO EN EL ALV.
  APPEND ls_fcat TO gt_fcat.

  CLEAR ls_fcat.
  ls_fcat-tabname 'GT_USERS'"NOM TABLA CON ESTRUCTURA DE ALV.
  ls_fcat-fieldname =  'NOMBRE'" NOM DEL CAMPO A MOSTRAR.
  ls_fcat-coltext 'Nombre'."TEXTO QUE MOSTRARA EL CAMPO
  ls_fcat-col_pos 2" POS. QUE TENDRA EL CAMPO EN EL ALV.
  APPEND ls_fcat TO gt_fcat.

  CLEAR ls_fcat.
  ls_fcat-tabname 'GT_USERS'"NOM TABLA CON ESTRUCTURA DE ALV.
  ls_fcat-fieldname =  'HOBBY'" NOM DEL CAMPO A MOSTRAR.
  ls_fcat-coltext 'Hobby'."TEXTO QUE MOSTRARA EL CAMPO
  ls_fcat-col_pos 3" POS. QUE TENDRA EL CAMPO EN EL ALV.
  ls_fcat-web_field 'HOBBY_HANDLE'.
  APPEND ls_fcat TO gt_fcat.

ENDFORM.                    " FILL_CATALOG_OO



*&---------------------------------------------------------------------*

*&      Module  STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE status_0100 OUTPUT.

  SET PF-STATUS '100'.
ENDMODULE.                 " STATUS_0100  OUTPUT



*&---------------------------------------------------------------------*

*&      Module  USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE user_command_0100 INPUT.

  DATA ok_code TYPE sy-ucomm.

  ok_code sy-ucomm.

  CASE ok_code.
    WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT



*&---------------------------------------------------------------------*

*&      Form  FILL_HYPERLINK

*&---------------------------------------------------------------------*

* LLenamos la tabla interna con los links:

* cada link será identificado por un número

* Ejemplo:

* 1 -> 'http://www.aalcantaraq.blogspot.com'

* 2 -> 'http://www.crystalisconsulting.com/peru/'

*&---------------------------------------------------------------------*

FORM fill_hyperlink .

  DATAls_hype  TYPE lvc_s_hype.

  MOVE '1' TO ls_hype-handle,
         'http://www.aalcantaraq.blogspot.com' TO ls_hype-href.
  APPEND ls_hype TO gt_hype.

  CLEAR ls_hype.
  MOVE '2' TO ls_hype-handle,
         'http://www.crystalisconsulting.com/peru/' TO ls_hype-href.
  APPEND ls_hype TO gt_hype.

ENDFORM.                    " FILL_HYPERLINK



*&---------------------------------------------------------------------*

*&      Module  CALL_ALV  OUTPUT

*&---------------------------------------------------------------------*

MODULE call_alv_oo OUTPUT.

  CREATE OBJECT go_grid
    EXPORTING
      container_name              'CONTAINER'
    EXCEPTIONS
      cntl_error                  1
      cntl_system_error           2
      create_error                3
      lifetime_error              4
      lifetime_dynpro_dynpro_link 5
      OTHERS                      6.

  IF sy-subrc EQ 0.
  ENDIF.

  CREATE OBJECT go_alv
    EXPORTING
      i_parent          go_grid
    EXCEPTIONS
      error_cntl_create 1
      error_cntl_init   2
      error_cntl_link   3
      error_dp_create   4
      OTHERS            5.
  IF sy-subrc <> 0.
  ENDIF.

  CALL METHOD go_alv->set_table_for_first_display
    EXPORTING
      it_hyperlink                  gt_hype
      is_layout                     gs_layo
    CHANGING
      it_outtab                     gt_users
      it_fieldcatalog               gt_fcat
    EXCEPTIONS
      invalid_parameter_combination 1
      program_error                 2
      too_many_lines                3
      OTHERS                        4.

  IF sy-subrc <> 0.
  ENDIF.

ENDMODULE.                 " CALL_ALV  OUTPUT

*&---------------------------------------------------------------------*

*&      Form  INIT_LAYOUT_OO

*&---------------------------------------------------------------------*

FORM init_layout_oo .

*Indicamos que el reporte por registro se muestre con colores intercalados

  gs_layo-zebra 'X'.


*Optimizamos el ancho de la columna segun el tamaño de carácteres

  gs_layo-cwidth_opt 'X'.

ENDFORM.                    " INIT_LAYOUT_OO



*&---------------------------------------------------------------------*

*&      Form  SET_HYPERLINK

*&---------------------------------------------------------------------*

*Segun usuario seteamos el link a la cual invocará

*----------------------------------------------------------------------*

FORM set_hyperlink .

  READ TABLE gt_users ASSIGNING <user> WITH KEY usuario 'AALCANTARA'.
  IF sy-subrc EQ 0.
    <user>-hobby_handle '1'.
  ENDIF.

  READ TABLE gt_users ASSIGNING <user> WITH KEY usuario 'CRYSTALIS'.
  IF sy-subrc EQ 0.
    <user>-hobby_handle '2'.
  ENDIF.

ENDFORM.                    " SET_HYPERLINK


CÓDIGO FUENTE: 
PROGRAMA: ZAQR051

*&---------------------------------------------------------------------*
*& Report  ZAQR051
*&---------------------------------------------------------------------*
*&Programa muestra un ALV GRID segun lo seleccionado en pantalla
*&Pero que el ALV se encuentra en otro programa
*&Para ello invoca al otro programa usando la sentencia SUBMIT
*&Los pasos que realiza son los siguientes:
*& 1: SET PARAMETER ID XXX FIELD YYY.
*& 2: SUBMIT name_another_program AND RETURN.
*& 3: CALL 'UNSET_PARAMETER' ID 'MEMORY_ID' FIELD XXX.
*&---------------------------------------------------------------------*

REPORT  zaqr051.

*&----------------------------------------------------------------------------------&*
* Type-pools
*&----------------------------------------------------------------------------------&*
TYPE-POOLSvrm"Value Request Manager: Typen und Konstanten

*&----------------------------------------------------------------------------------&*
* TABLES
*&----------------------------------------------------------------------------------&*
TABLESztaq_usuario"Tabla ZTAQ_USUARIO contiene el registro de usuarios

*&----------------------------------------------------------------------------------&*
*Global Types
*&----------------------------------------------------------------------------------&*
TYPESBEGIN OF gty_usuario,
         usuario TYPE ztaq_usuario-usuario,
         nombre  TYPE ztaq_usuario-nombre,
       END OF gty_usuario.

*&----------------------------------------------------------------------------------&*
*Internal TABLES
*&----------------------------------------------------------------------------------&*
DATAgt_users TYPE STANDARD TABLE OF gty_usuario,
      gt_values TYPE vrm_values.

*&----------------------------------------------------------------------------------&*
*Structures
*&----------------------------------------------------------------------------------&*
DATA: gs_value LIKE LINE OF gt_values.

*&----------------------------------------------------------------------------------&*
* Field-symbols
*&----------------------------------------------------------------------------------&*
FIELD-SYMBOLS <user> LIKE LINE OF gt_users.

*&----------------------------------------------------------------------------------&*
* Global Variables
*&----------------------------------------------------------------------------------&*
DATA: gv_ucomm TYPE sy-ucomm.

*&----------------------------------------------------------------------------------&*
* SELECTION-SCREEN
*&----------------------------------------------------------------------------------&*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.
PARAMETERS:     pa_user TYPE AS LISTBOX VISIBLE LENGTH 20  USER-COMMAND upd,
                pa_name     TYPE znombre.
SELECTION-SCREEN END OF BLOCK b01.

*&----------------------------------------------------------------------------------&*
* INITIALIZATION
*&----------------------------------------------------------------------------------&*
INITIALIZATION.
  PERFORM get_users.
  PERFORM fill_list_box.

*&----------------------------------------------------------------------------------&*
* AT SELECTION-SCREEN
*&----------------------------------------------------------------------------------&*
*Este evento es lanzado cuando un usuario selecciona una opción de la ListBox
*&----------------------------------------------------------------------------------&*
AT SELECTION-SCREEN.
  gv_ucomm sy-ucomm.
  IF sy-ucomm EQ 'UPD'.
    READ TABLE gt_users ASSIGNING <user> INDEX pa_user.
    IF sy-subrc EQ 0.
      pa_name <user>-nombre.
    ENDIF.
  ENDIF.

*&----------------------------------------------------------------------------------&*
*AT SELECTION-SCREEN OUTPUT
*&----------------------------------------------------------------------------------&*
*El evento OUTPUT es también lanzado para re-dibujar la pantalla del reporte ABAP
*los que le permite ser utilizado para mostrar, ocultar y/o desactivar campos...
*Para este ejemplo haremos de que el parámetro 'Nombre' sea sólo visible y
*que no permita modificar.
*Tener en cuenta en este punto que la variable del sistema sy-ucomm se ha renovado
*por lo que necesita para utilizar el valor capturado anteriormente en GV_UCOMM.
*&----------------------------------------------------------------------------------&*
AT SELECTION-SCREEN OUTPUT.
  CASE gv_ucomm.
    WHEN 'UPD'"Cuando se hizo alguna selección del ListBox
*El bucle 'LOOP AT SCREEN' se utiliza para cambiar las propiedades de visualización
*de los campos en pantalla.
*Es decir, te permite ocultar,mostrar o configurar como sálida
*sólo los campos en la pantalla de seleccion de ABAP
      LOOP AT SCREEN.
        IF screen-name EQ 'PA_NAME'.
*          screen-active = 0. "remove field from screen
          screen-input 0"Set field as display only
          MODIFY SCREEN.
        ENDIF.
      ENDLOOP.
  ENDCASE.

*&---------------------------------------------------------------------*
*&      Form  GET_USERS
*&---------------------------------------------------------------------*
* Obtenemos los usuarios consultando a la tabla ZTAQ_USUARIO
*----------------------------------------------------------------------*
FORM get_users .
  SELECT usuario nombre
    INTO CORRESPONDING FIELDS OF TABLE gt_users
    FROM ztaq_usuario.
ENDFORM.                    " GET_USERS

*&---------------------------------------------------------------------*
*&      Form  FILL_LIST_BOX
*&---------------------------------------------------------------------*
*LLenamos la lista del Combo Box con los usuarios obtenidos
*----------------------------------------------------------------------*
FORM fill_list_box .
  DATAlv_tabix TYPE c.

  "Recorremos la tabla interna que contiene a los usuarios
  "Y lo pasamos a la tabla interna que ingresará a la función:
  "'VRM_SET_VALUES'
  LOOP AT gt_users ASSIGNING <user>.
    CLEAR gs_value.
    MOVE sy-tabix TO lv_tabix.
    gs_value-key lv_tabix.
    gs_value-text <user>-usuario.
    APPEND gs_value TO gt_values.
  ENDLOOP.

  "seteando los datos para el combo box
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              'PA_USER' "El nombre de nuestro parámetro ListBox
      values          gt_values
    EXCEPTIONS
      id_illegal_name 1
      OTHERS          2.

ENDFORM.                    " FILL_LIST_BOX

*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM show_data.

*&---------------------------------------------------------------------*
*&      Form  show_data
*&---------------------------------------------------------------------*
*Utilizamos SUBMIT para invocar al programa ZAQR052 la cual contiene el alv
*Para ello tenemos que setear el parámetro del usuario seleccionado por pantalla
*De manera que en el otro programa segun ese parámtero seleccionado
*mostrará sus datos en el ALV
*&---------------------------------------------------------------------*
FORM show_data.
  READ TABLE gt_users ASSIGNING <user> INDEX pa_user.
  IF sy-subrc EQ 0.
*En FIELD se pone el valor a escribir en 'USR' que pasa a la memoria SAP
    SET PARAMETER ID 'USR' FIELD <user>-usuario.
  ENDIF.

*Invocando al otro Programa que contiene el ALV
  SUBMIT zaqr052 AND RETURN.

*Liberamos la memoria SAP del id 'USR'.
  CALL 'UNSET_PARAMETER' ID 'MEMORY_ID' FIELD 'USR'.
*Esto existe desde 1996 ver NOTA OSS 62440
ENDFORM.                    "SHOW_DATA



DEBUGEANDO 
PROGRAMA: ZAQR052

Cuando el programa no es invocado desde otro programa mediante la sentencia SUBMIT , luego de usar la sentencia GET PARAMETER ID XXX FIELD YYY la sentencia SY-SUBRC nos retornará un valor igual a 4 caso contrario el valor será 0.

Como en la pantalla de seleccionamos no especificamos que usuarios mostrar el SO_USER esta vacio, por ende luego de consultar la tabla ZTAQ_USUARIO la tabla interna GT_USERS contendrá todos los usuarios existentes en dicha tabla.

los usuarios registrados:

Le decimos que para los usuarios AALCANTARA y CRYSTALIS asignar sus hyperlinks correspondientes la cual cada link ha sido identificado por un número:

Vemos que ahora se actualizado el campo HOBBY_HANDLE para dichos usuarios:

Ejecutando:
 

DEBUGEANDO 
PROGRAMA ZAQR051
Aqui observaremos que el programa ZAQR051 invocará al programa ZAQR052 usando la sentencia SUBMIT

El usuario seleccionado en pantalla seteamos en el ID 'USR'

Con SUBMIT invocamos al otro programa ZAQR052 la cual contiene el ALV... nos aseguramos que luego de ser invocado  se libere la memoria SAP del id 'USR' usando la sentencia: CALL 'UNSET_PARAMETER' ID 'MEMORY_ID' FIELD 'USR'

Ahora ya estamos dentro del programa ZAQR052 listos para ejecutar la sentencia:
 GET PARAMETER ID 'USR' FIELD pa_user.
Como vemos en la imagen la flecha esta apuntando a la línea 119

Luego de haber ejecutado la siguiente sentencia:
 GET PARAMETER ID 'USR' FIELD pa_user.
Ahora la sentencia SY-SUBRC nos retorna su valor igual a 0 lo cual nos indica que proviene de el SUBMIT y sólo realiza la consulta a la tabla ZTAQ_USERS para dicho parámetro (PA_USER) seleccionado:

Nuestra tabla interna GT_USERS ahora tiene un registro:

Los datos del único registro que será mostrado en el ALV GRID

Ejecutando:

Conclusión sobre este Post:
Utilizar la sentencia SUBMIT nos ayuda a reutilizar algún otro programa ya existente, disminuyendo el tiempo de desarrollo y por supuesto la cantidad de líneas de código... Por otro lado cabe resaltar la importancia del uso de la sentencia CALL 'UNSET_PARAMETER' ID 'MEMORY_ID' FIELD XXX. la cual nos permite liberar la memoria SAP del id utilizado luego de haber invocado al otro programa por la sentencia SUBMIT.

Nos vemos en el siguiente Blog ;)
MAGALEX

Comentarios

Entradas populares de este blog

Modificando Vista de Actualización SM30

User Exit para VA01 y VA02

Buttons and events in ALV GRID and ALV GRID OO