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.
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
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Tables
*&---------------------------------------------------------------------*
TABLES: ztaq_usuario. "Tabla ZTAQ_USUARIO contiene registro de usuarios
*&----------------------------------------------------------------------------------&*
*Global Types
*&----------------------------------------------------------------------------------&*
TYPES: BEGIN 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-OPTIONS: so_user FOR ztaq_usuario-usuario.
SELECTION-SCREEN END OF BLOCK b01.
SELECTION-SCREEN: BEGIN 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-SCREEN: END 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.
DATA: ls_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 .
DATA: ls_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 .
DATA: ls_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-POOLS: vrm. "Value Request Manager: Typen und Konstanten
*&----------------------------------------------------------------------------------&*
* TABLES
*&----------------------------------------------------------------------------------&*
TABLES: ztaq_usuario. "Tabla ZTAQ_USUARIO contiene el registro de usuarios
*&----------------------------------------------------------------------------------&*
*Global Types
*&----------------------------------------------------------------------------------&*
TYPES: BEGIN OF gty_usuario,
usuario TYPE ztaq_usuario-usuario,
nombre TYPE ztaq_usuario-nombre,
END OF gty_usuario.
*&----------------------------------------------------------------------------------&*
*Internal TABLES
*&----------------------------------------------------------------------------------&*
DATA: gt_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 c 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 .
DATA: lv_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
*& 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-POOLS: vrm. "Value Request Manager: Typen und Konstanten
*&----------------------------------------------------------------------------------&*
* TABLES
*&----------------------------------------------------------------------------------&*
TABLES: ztaq_usuario. "Tabla ZTAQ_USUARIO contiene el registro de usuarios
*&----------------------------------------------------------------------------------&*
*Global Types
*&----------------------------------------------------------------------------------&*
TYPES: BEGIN OF gty_usuario,
usuario TYPE ztaq_usuario-usuario,
nombre TYPE ztaq_usuario-nombre,
END OF gty_usuario.
*&----------------------------------------------------------------------------------&*
*Internal TABLES
*&----------------------------------------------------------------------------------&*
DATA: gt_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 c 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 .
DATA: lv_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 ;)
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
Publicar un comentario