miércoles, 9 de octubre de 2013

Establecer filtro por defecto en búsquedas


Es muy habitual que en cualquier búsqueda se nos solicite que uno de los filtros tenga un valor por defecto y que además este filtro sea modificable por el usuario. Vamos a ver como hacerlo.

Vamos a tratar el ejemplo concreto de la búsqueda de clientes. El filtro que nos solicitan es que la marca de borrado esté como "No marcado".
Las modificaciones las debemos hacer en la carga de la pantalla así que trataremos el método DO_INIT_CONTEXT. Obviamente si el componenete no está ampliado tendremos que ampliarlo, podéis ver en este post como hacerlo. El componente a tratar en este caso es BP_HEAD_SEARCH.
Para modificar el valor estándar debemos obtener la query con la que estamos trabajando:


lv_cnode get_dquery_cnode( ).
lr_qs ?= lv_cnode
->collection_wrapper->get_first( ).

Si la query no existiese obtenemos la instancia de query con la que está trabajando el sistema:

IF lr_qs IS NOT BOUND.
    lr_qs 
cl_crm_bol_dquery_service=>get_instance'BuilHeaderAdvancedSearch).
    lv_cnode
->collection_wrapper->addlr_qs ).
ENDIF.

 A continuación obtenemos los parámetros de la query y los recorremos para buscar el que nos interesa. En este caso el parámetro que nos interesa es XDELE. A continuación borramos el parámetro y lo volvemos a crear con el valor que nos interesa. Aunque no es la forma más elegante de hacerlo es efectiva:

lv_params ?= lr_qs->get_selection_params( ).
  lv_property ?= lv_params
->get_first( ).
  
IF lv_property IS BOUND.
    
WHILE lv_property IS BOUND.

      lv_name ?= lv_property->get_property'ATTR_NAME).
      
IF lv_name->'XDELE'.
        lv_params
->removelv_property ).
        new_selection_parameter 
=
                  lr_qs
->insert_selection_paramiv_attr_name 'XDELE'
                  iv_sign 
'I'
                  iv_option 
'EQ'
                  iv_low 
'N'
                  iv_index 
).

        
EXIT.
      
ELSE.
        lv_property ?= lv_params
->get_next( ).
      
ENDIF.
    
ENDWHILE.
ENDIF.

Obviamente como siempre llamámos al método superior. En este caso nos interesa llamarlo al final de la ejecución del método.


CALL METHOD super->do_init_context.

Por último, el detalle desquiciante, es que esto no funciona si no redefinimos el método DO_PREPARE_OUTPUT. En este método es necesario llamar al método superior pero sin indicar el parámetro iv_fiirst_time. De esta forma funcionará bien en todas las ejecuciones.

Y con esto conseguimos un filtro por defecto en las búsquedas, pero que puede ser eliminado en caso necesario.

Os incluyo la definición de variables para que todo sea más sencillo


    DATA lv_cnode TYPE REF TO cl_bsp_wd_context_node_asp.
  
DATA lr_qs TYPE REF TO cl_crm_bol_dquery_service.
  
DATA new_selection_parameter TYPE REF TO if_bol_selection_param.
  
DATA lv_params TYPE REF TO if_bol_bo_col.
  
DATA lv_property TYPE REF TO if_bol_bo_property_access.
  
DATA lv_name TYPE REF TO name_komp.
  
DATAlv_profile TYPE REF TO if_crm_ui_profile,
       lv_profile_name 
TYPE bsp_dlc_object_type.



No hay comentarios:

Publicar un comentario