jueves, 6 de noviembre de 2014

Filtrar los datos para las ayudas busquedas

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 :
  1. Leer los campos que necesitamos para filtrar la ayuda búsqueda
  2. Crear y lanzar la ayuda búsqueda
  3. Completar los campos con los datos seleccionados de la ayuda búsqueda por el usuario.
PROCESS ON VALUE-REQUEST  es el proceso de la dynpro que se lanza cuando el usuario activa la ayuda búsqueda de un campo.  Si el campo , tiene asociado en esta sección un modulo, este sera lanzado cuando el usuario active la ayuda búsqueda del campo. No viene por defecto en la pestaña log. de proceso cuando creamos la dynpro, tenemos que añadirlo nosotros.


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.


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