PDA

Ver la Versión Completa : Funciones Útiles para Ayudas de Búsqueda [Matchodes, F4] y Lectura/Escrit en Dynpros


romyggar
28/06/12, 16:28:47
Buenos Días Colegas, Después de un tiempo de estar rondando por este foro, me decidí a hacer una pequeña contribución, ya que en mas de una vez este foro me há ayudado con algunas dudas que he tenido.

Este hilo lo abrí con el objetivo de poner algunas funciones y algoritmos que me ayudaron a completar un desarrollo que tenía que realizar. Los objetivos eran:

- Mediante código Asociar una ayuda de búsqueda(A.B.) del diccionario, a un campo de una dynpro.

- Crear una ayuda de búsqueda en Tiempo de ejecución, a partir de una tabla interna cuyos valores dependen del valor de un campo "llenado" previamente(filtro para un "select"). Si tal campo no tiene valores correctos, la A.B. No debe "generarse".

- Modificar los valores de los campos de una dynpro sin pasar por el Process After Input (Antes de presionar "enter" o algún botón), y consecuentemente, antes del siguiente Process Before Output.

- Opcional: Leer los campos de una dynpro SIN usar la conexión implícita con el código ABAP, es decir, Antes del PAI o después del PBO. (cuando un campo de una dynpro tiene el mismo nombre de una variable ABAP, y además tienen un tipo de datos compatible, Durante el PAI se hace un transporte de datos Dynpro -> ABAP, y durante el PBO: ABAP -> Dynpro).

Para comodidad de quien lea esto, dividiré el código por respuestas a este mismo mensaje, resolviendo cada objetivo.:)

romyggar
28/06/12, 16:55:02
Primer Objetivo: Mediante código Asociar una ayuda de búsqueda(A.B.) del diccionario, a un campo de una dynpro.

--------------------------------------------------------------------------------------------------------------------------------------------------
El Evento en donde se debe poner los módulos a desarrollar es:

PROCESS ON VALUE-REQUEST.
FIELD P9900-MARCA MODULE F4_asociar.

--------------------------------------------------------------------------------------------------------------------------------------------------
El código del módulo es el siguiente:

MODULE F4_asociar.

DATA return_tab LIKE ddshretval OCCURS 0 WITH HEADER LINE.

Función ------------------------------------------------------------------------------------------------------------------------------------

CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = space
fieldname = space
searchhelp = 'SRM_F4_DATUM'
* SHLPPARAM = ' '
* DYNPPROG = ' '
* DYNPNR = ' '
* DYNPROFIELD = ' '
* STEPL = 0
value = 'P9900-FECHA'
* MULTIPLE_CHOICE = ' '
* DISPLAY = ' '
TABLES
return_tab = return_tab
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.

Explicación ---------------------------------------------------------------------------------------------------------------------------------

'P9900-FECHA': es el campo de la dynpro al cual se le va a "pegar" la ayuda de búsqueda del diccionario.
return_tab: La función necesita una tabla en donde se retornen los valores elegidos en la A.B.
'SRM_F4_DATUM': La A.B. creada previamente en el Diccionario de datos (mediante la SE11).

Notas -------------------------------------------------------------------------------------------------------------------------------------------

Nuevamente hay que poner los nombres en MAYÚSCULAS.


ENDMODULE. "F4_asociar.

romyggar
28/06/12, 16:59:03
Segundo objetivo: Crear una ayuda de búsqueda en Tiempo de ejecución

Supongo que ya hay algun hilo con etsa función, pero pienso que no sobra hacer el aporte, puede que resuelva alguna duda que en otros hilos no se resolvió....

--------------------------------------------------------------------------------------------------------------------------------------------------
El Evento en donde se debe poner los módulos a desarrollar es:

PROCESS ON VALUE-REQUEST.
FIELD P9900-MARCA MODULE F4_tabla_int.

--------------------------------------------------------------------------------------------------------------------------------------------------
El código del módulo es el siguiente:

MODULE F4_tabla_int.

Declaración de Datos -----------------------------------------------------------------------------------------------------------------------
Asi se debería declarar it_return1, y itab (la cual puede ser como se requiera).
DATA : it_return1 LIKE ddshretval OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF itab OCCURS 0,
marca LIKE tka01-kokrs,
bezei LIKE tka01-bezei,
END OF itab.

Función: ------------------------------------------------------------------------------------------------------------------------------------
Esta funcion sirve para generar una ayuda de búsqueda en tiempo de ejecución, además también permite indicar a que campo, dynpro y programa debe asignarse.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'MARCA'
value_org = 'S'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'P9900-MARCA'
TABLES
value_tab = itab
return_tab = it_return1
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Explicación ---------------------------------------------------------------------------------------------------------------------------------
'P9900-MARCA': Campo de la dynpro que se le pegará la ayuda de búsqueda
'MARCA': Campo de la ayuda de búsqueda que se exporta a la dynpro desde donde fue llamada.
itab: Tabla interna con los datos a visualizar en la ayuda de busqueda
it_return1: tabla que obtiene el valor elegido en la ayuda de busqueda.

Notas --------------------------------------------------------------------------------------------------------------------------------------
Los nombres entre tildes o comas flotantes sencillas, deben estar en MAYÚSCULAS.

Obviamente se debe "llenar" la tabla interna antes de llamar a la función.

:D

romyggar
28/06/12, 17:10:30
Tercer Objetivo: Modificar los valores de los campos de una dynpro sin pasar por el Process After Input.

--------------------------------------------------------------------------------------------------------------------------------------------------
El Evento en donde se debe poner los módulos a desarrollar es:

PROCESS ON VALUE-REQUEST.
FIELD P9900-MARCA MODULE F4_QQQQ. "Cualquier otro módulo útil"

--------------------------------------------------------------------------------------------------------------------------------------------------
El código del módulo es el siguiente:

MODULE F4_QQQQ.

Declaración de variables: --------------------------------------------------------------------------------------------------------------------
DATA dynpfields LIKE dynpread OCCURS 0 WITH HEADER LINE.

.....
.....
Código del módulo que realiza otra función (o funciones)
.....
.....


Preparación "Mini PBO": ----------------------------------------------------------------------------------------------------------------------
Aquí se esta tratando una dynpro con 2 campos llamados 'P9900-MARCA' y 'TXT_INFO'.

" nombre del campo en la dynpro
dynpfields-fieldname = 'P9900-MARCA'. "txt_info.

" Nuevo valor del campo escribir.
dynpfields-fieldvalue = it_return1-fieldval.

" Realizar Actualización Inmediatamente
dynpfields-fieldinp = 'X'.

APPEND dynpfields.

dynpfields-fieldname = 'TXT_INFO'. "txt_info.
dynpfields-fieldvalue = txt_info.
dynpfields-fieldinp = 'X'.
APPEND dynpfields.

Función: ------------------------------------------------------------------------------------------------------------------------------------

CALL FUNCTION 'DYNP_VALUES_UPDATE' "
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
TABLES
dynpfields = dynpfields
EXCEPTIONS
OTHERS = 8.

Explicación: ---------------------------------------------------------------------------------------------------------------------------------
dynpfields: Es una Tabla que tiene cada campo (con su respectivo valor) a actualizar. Cada registro que tenga la tabla corresponde a un campo en la diynpro indicada por sy-dynnr.

romyggar
28/06/12, 17:43:36
Objetivo Opcional: Leer los campos de una dynpro SIN usar la conexión implícita con el código ABAP, es decir, Antes del PAI o después del PBO.
--------------------------------------------------------------------------------------------------------------------------------------------------
Este es un programa que desarrollé justamente para el foro, es sencillo y corto.


REPORT YAVQZ_READDYNP_1.

Declaración de Variables: -------------------------------------------------------------------------------------------------------------------
DATA: dynpro_values TYPE TABLE OF dynpread WITH HEADER LINE,
field_value LIKE LINE OF dynpro_values.


Creación de una Dynpro mediante código: ---------------------------------------------------------------------------------------------------
PARAMETERS: s_SFLI TYPE SFLIGHT-CARRID,
s_SCARR TYPE SCARR-CARRNAME.

* Este es el Process After Input mediante código
AT SELECTION-SCREEN.
s_SCARR = s_SFLI.

* Este es el PROCESS ON VALUE-REQUEST mediante código
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_SCARR.
PERFORM f4_for_portfolios.

--------------------------------------------------------------------------------------------------------------------------------------------------
FORM f4_for_portfolios.

* Se le indica cuales son los campos a leer desde la dynpro, en este caso solamente es S_SFLI.

dynpro_values-fieldname = 'S_SFLI'.
APPEND dynpro_values.

Función: ------------------------------------------------------------------------------------------------------------------------------------
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr " '1000'
translate_to_upper = 'X'
TABLES
dynpfields = dynpro_values.

* Esta linea puede omitirse si se desea.
READ TABLE dynpro_values INDEX 1.

*BREAK-POINT.
ENDFORM. "get_portfolios

Explicación: ---------------------------------------------------------------------------------------------------------------------------------
dynpro_values: es una estructura/tabla que tiene los campos a "Leer". Previamente debe ser "llenada" con tales campos.

Nota: --------------------------------------------------------------------------------------------------------------------------------------
Para visualizar el efecto, se debe habilitar el BREAK-POINT., o en su defecto presionar "Enter" despues de haber usado la ayuda de búsqueda para el campo 'S_SFLI'.

Bueno, espero y estos algoritmos le sirvan a alguien.

Salu2

MagnaF
27/08/12, 22:25:53
Muchísimas gracias por el tema... me ha sido de muchísima utilidad tu ejemplo del tema 2. Había estado buscando y no había entendido bien como era que se tenía que hacer y ahora ya me funcionó mi programita. De casulidad tu sabes como puedo hacer que SAP lea los parámetros anteriores aunque el usuario no haya dado un Enter?.

:)

romyggar
24/09/13, 19:59:42
Muchísimas gracias por el tema... me ha sido de muchísima utilidad tu ejemplo del tema 2. Había estado buscando y no había entendido bien como era que se tenía que hacer y ahora ya me funcionó mi programita. De casulidad tu sabes como puedo hacer que SAP lea los parámetros anteriores aunque el usuario no haya dado un Enter?.

:)

Amigo MagnaF,

Mira la respuesta en el primer mensaje que publiqué:
- Modificar los valores de los campos de una dynpro sin pasar por el Process After Input (Antes de presionar "enter" o algún botón), y consecuentemente, antes del siguiente Process Before Output. Si puedes modificarlos, también puedes leerlos!. :)

PD: estoy respondiendo 1 año después de que el colega hizo su pregunta, pero quizá alguien más tenga esa duda. :D

Salu2!.