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