Una ayuda búsqueda para un campo de una dynpro, no tiene porque mostrar toda la información al usuario. Podemos filtrar la información que aparece en un ayuda búsqueda basándonos en los datos introducidos por el usuario en otros campos de la dynpro.
Por ejemplo, imaginemos dos campos SOCIEDAD y CLIENTE.
Si el usuario rellena primero el campo SOCIEDAD y después activa la ayuda búsqueda del campo PROVEEDOR, queda mucho mejor que aparezcan solamente los clientes de la sociedad que ha indicado que todos los clientes de todas las sociedades del sistema.
![]() |
| Ayuda búsqueda filtrada |
Vamos con el programa de ejemplo, seria sencillo, un modulpool con una dynpro y dos campos.
![]() |
El proceso, cuando el usuario active la ayuda búsqueda del campo Proveedores, sera :
- Leer los campos que necesitamos para filtrar la ayuda búsqueda
- Crear y lanzar la ayuda búsqueda
- Completar los campos con los datos seleccionados de la ayuda búsqueda por el usuario.
![]() |
| PROCCES ON VALUE-REQUEST |
Y dentro del modulo, llamamos a nuestra subrutina.
![]() |
| Modulo y subrutina para la ayuda búsqueda |
La subrutina, esta completa al final de la entrada.
Y aquí tenéis el resultado, dos capturas de la misma ayuda búsqueda, pero en una hemos rellenado el campo SOCIEDAD y la ayuda búsqueda queda filtrada por ese campo.
Y aquí tenéis el resultado, dos capturas de la misma ayuda búsqueda, pero en una hemos rellenado el campo SOCIEDAD y la ayuda búsqueda queda filtrada por ese campo.
![]() |
| Ayuda búsqueda sin filtrar , el campo SOCIEDAD esta vació |
![]() |
| Ayuda búsqueda filtrada por el contenido del campo SOCIEDAD |
Hay que tener en cuenta que si el usuario , introduce la sociedad, no pulsa intro o provoca otro evento e inmediatamente activa la ayuda búsqueda, el campo SOCIEDAD nos llegara vació a a la ayuda búsqueda.
Para evitarlo, utilizaremos la bapi DYNP_VALUES_READ para leer el contenido ACTUAL de los campos de la dynpro.
Y esta sera la subrutina encargada de filtrar y generar la ayuda búsqueda:
*&---------------------------------------------------------------------*
*& Form F4_LIFNR_HELP_F01
*&---------------------------------------------------------------------*
FORM f4_lifnr_help_f01 .
TYPES: BEGIN OF type_f4_help_lifnr,
bukrs TYPE lfb1-bukrs,
butxt TYPE t001-butxt,
lifnr TYPE lfa1-lifnr,
name1 TYPE lfa1-name1,
END OF type_f4_help_lifnr.
DATA: tl_map TYPE TABLE OF dselc.
DATA: tl_help_lifnr TYPE TABLE OF type_f4_help_lifnr.
DATA: tl_ddshretval TYPE TABLE OF ddshretval.
DATA: tl_dynpread TYPE TABLE OF dynpread.
RANGES: r_bukrs FOR lfb1-bukrs.
FIELD-SYMBOLS: <fs_ddshretval> TYPE ddshretval,
<fs_dynpread> TYPE dynpread,
<fs_dselc> TYPE dselc.
APPEND INITIAL LINE TO tl_dynpread ASSIGNING <fs_dynpread>.
<fs_dynpread>-fieldname = 'WL_BUKRS'. "Campo de la dynpro
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
TABLES
dynpfields = tl_dynpread
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
CHECK sy-subrc EQ 0.
* Si todo ha ido bien, ya podemos crear el rango para el filtro
READ TABLE tl_dynpread INDEX 1 ASSIGNING <fs_dynpread>.
IF <fs_dynpread>-fieldvalue IS NOT INITIAL.
r_bukrs-sign = 'I'.
r_bukrs-option = 'EQ'.
r_bukrs-low = <fs_dynpread>-fieldvalue.
APPEND r_bukrs.
ENDIF.
SELECT b~bukrs t~butxt a~lifnr a~name1
INTO CORRESPONDING FIELDS OF TABLE tl_help_lifnr
FROM lfa1 AS a
INNER JOIN lfb1 AS b
ON a~lifnr EQ b~lifnr
INNER JOIN t001 AS t
ON b~bukrs EQ t~bukrs
WHERE b~bukrs IN r_bukrs.
CHECK ( sy-subrc EQ 0 ).
SORT tl_help_lifnr ASCENDING BY BUKRS lifnr.
* Mapeamos los campos de la ayuda busqueda con los de la dynpro
APPEND INITIAL LINE TO tl_map ASSIGNING <fs_dselc>.
<fs_dselc>-fldname = 'F0001'. "1º columna de la tabla interna tl_help_lifnr
<fs_dselc>-dyfldname = 'WL_BUKRS'. "Campo de la dynpro correspondiente
APPEND INITIAL LINE TO tl_map ASSIGNING <fs_dselc>.
<fs_dselc>-fldname = 'F0003'. "3º columna de la tabla interna tl_help_lifnr
<fs_dselc>-dyfldname = 'WL_LIFNR'. "Campo de la dynpro correspondiente
* Lanzamosla ayuda busqueda
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'LIFNR'
dynprofield = 'WL_LIFNR'
value_org = 'S'
dynpprog = sy-repid
dynpnr = sy-dynnr
callback_program = sy-repid
TABLES
value_tab = tl_help_lifnr
return_tab = tl_ddshretval
dynpfld_mapping = tl_map.
ENDFORM. " F4_LIFNR_HELP_F01
Entradas relacionadas:
Recuperar varios campos con una ayuda busqueda






No hay comentarios:
Publicar un comentario