jueves, 25 de noviembre de 2010

Sort and fliter Table Control Webdynpro Abap

Uso del Sort and fliter en Table Control Webdynpro Abap:

1.- Primero creo un nodo para los datos que mostrare en el Table Control.



2.- En la vista MAIN, en la pestaña de atributos añado la interface IF_WD_TABLE_METHOD_HNDL para el control de los métodos de SORT y FILTER del Table Control.





3.- Hacemos el mapping correspondiente con el Context de la vista y a su vez vamos a crear otro nodo con los atributos para los que se desean crean un FILTER. Estos campos como se ven en la imagen son tipo string y están dentro de un nodo con cardinalidad 1-1 y selección 1-1-



4.- Crearemos en el Layout de la Vista MAIN el Table Control usando el Wizard. Lo primero es con el click derecho del mouse sobre el ROOTUIELEMTENCONTAINER la opción Create Container Form.




5.- En la ventana que nos muestra damos click en Context y luego escojemos el Nodo con los datos que se quieren mostrar en la tabla.



6.- Este es el resultado final del Table Control. Damos click en el check list y seguimos.

 

7.- Nuestra Table Control se mostrara de esta manera pero SIN la opción de SORT y FILTER. Una vez creemos los EVENT como se muestra en la figura aparecerá una fila de Filter en nuestro Table Control.


Para crear los eventos se le da click en la hoja perteneciente al evento correspondiente luego asignarle un nombre de Action y continuar.


Tambien navegaremos por la TABLE y escogeremos la TABLE que queremos que se habilite para FILTER. En este caso estoy mostrando TABLE_CARRID y en la propiedad ISFILTERED lo colocamos con el check list.! (he colocado dos campos más con el valor IsFiltered enable correspondientes a los campos creados en el nodo para el table control CONNID y PRICE pero no muestro la imagen, con este ejemplo de CARRID basta ;)


Metodos creados…

8.- Damos doble click sobre el envento en este caso ONACTIONFILTER y agregamos el código que muestro.! Sirve para aplicar la opción de FILTER al evento. De Igual manera lo haremos para el evento del SORT.


method ONACTIONFILTER .
     wd_this->table_control->APPLY_FILTER( ).
endmethod.


method ONACTIONON_ACTION_SORT .
     wd_this->table_control->apply_sorting( ).
endmethod.


9.- Por Ultimo agregamos en el evento standart WDDOMODIFYVIEW del MAIN el código que controlara los cambios que se harán en la tabla una vez se quiera usar el filter o el sort.



method WDDOMODIFYVIEW .
data wd_table type ref to cl_wd_table.
check first_time = abap_true.
* Name of the table UI element to be provided
wd_table ?= view->get_element( 'TABLE' ).
wd_this->table_control ?= wd_table->_method_handler.
*Name of the key attribute of the context node to which the table binding is done to be provided
wd_this->table_control->set_key_attribute_name( 'CARRID' ).
endmethod.


Usando el FILTER. 




lunes, 13 de septiembre de 2010

ZCL_SALV_TABLE_2

*&---------------------------------------------------------------------*
*& Report  ZCL_SALV_TABLE_2
*&
*&---------------------------------------------------------------------*
*&Manejo de ALV con la clase cl_salv_table
*&Mas Funciones de la clase para editar y colorear celdas
*&---------------------------------------------------------------------*

REPORT  ZCL_SALV_TABLE_2.

DATA: alv_table type REF TO cl_salv_table, "referencia a la clase table del alv
      it_sflight TYPE TABLE OF sflight, "Tabla Interna para el query
      g_color TYPE lvc_s_colo.  "Estructura para agregar color a las columnas


SELECT * INTO CORRESPONDING FIELDS OF TABLE it_sflight
                FROM sflight WHERE carrid = 'AA'.

*TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY
EXPORTING
  LIST_DISPLAY   = abap_true "Modo Lista
*    R_CONTAINER    =
*    CONTAINER_NAME =
  IMPORTING
    R_SALV_TABLE   = alv_table "importo el alv creado por la clase
  CHANGING
    T_TABLE        = it_sflight. "tabla interna de datos
.
* CATCH CX_SALV_MSG .
*ENDTRY.

DATA: lr_columns TYPE REF TO cl_salv_columns_table,
      lr_column  TYPE REF TO cl_salv_column_table. "Referencia para editar columnas

* edit ALV columns
lr_columns = alv_table->get_columns( ).
*----------------------------------------------------------------------*
*  Doy datos a la cabecera de las columnas
*----------------------------------------------------------------------*
TRY.
    lr_column ?= lr_columns->get_column( 'CARRID' ).
    lr_column->set_long_text( 'Vuelos' ).
    lr_column->set_medium_text( 'Vuelos' ).
    lr_column->set_short_text( 'Vuelos' ).
    lr_column ?= lr_columns->get_column( 'MANDT' ).
    lr_column->set_long_text( 'Cliente' ).
    lr_column->set_medium_text( 'Cliente' ).
    lr_column->set_short_text( 'Cliente' ).

    "Para poner color a una columna
    lr_column ?= lr_columns->get_column( 'CONNID' ).
    g_color-col = '6'.
    g_color-int = '1'.
    g_color-inv = '0'.
    lr_column->set_color( g_color ).
  CATCH cx_salv_not_found.
  CATCH cx_salv_existing.
  CATCH cx_salv_data_error.
ENDTRY.

* optimize output
lr_columns->set_optimize( 'X' ). "quito espacios en las celdas q muestran los datos

*----------------------------------------------------------------------*
* Establezco los botones default de un alv standart
*----------------------------------------------------------------------*
data: gr_functions type ref to cl_salv_functions_list.
gr_functions = alv_table->get_functions( ).
gr_functions->set_default( ).
* gr_functions->set_all( ).

CALL METHOD alv_table->DISPLAY( ). "Muestro ALV




la clase cl_salv_table

*&---------------------------------------------------------------------*
*& Report  ZCL_SALV_TABLE_1
*&
*&---------------------------------------------------------------------*
*&Manejo de ALV con la clase cl_salv_table
*&Uso simple
*&---------------------------------------------------------------------*

REPORT  ZCL_SALV_TABLE_1.

DATA: alv_table type REF TO cl_salv_table, "referencia a la clase table del alv
      it_sflight TYPE TABLE OF sflight.    "Tabla Interna para el query


  SELECT * INTO CORRESPONDING FIELDS OF TABLE it_sflight
                  FROM sflight WHERE carrid = 'AA'.

*TRY.
  CALL METHOD CL_SALV_TABLE=>FACTORY
  EXPORTING
    LIST_DISPLAY   = abap_true "Modo Lista
*    R_CONTAINER    =
*    CONTAINER_NAME =
    IMPORTING
      R_SALV_TABLE   = alv_table "importo el alv creado por la clase
    CHANGING
      T_TABLE        = it_sflight. "tabla interna de datos
  .
* CATCH CX_SALV_MSG .
*ENDTRY.

  DATA: lr_columns TYPE REF TO cl_salv_columns_table,
     lr_column  TYPE REF TO cl_salv_column.
* edit ALV columns
 lr_columns = alv_table->get_columns( ).
* optimize output
 lr_columns->set_optimize( 'X' ).

*----------------------------------------------------------------------*
*  Doy datos a la cabecera de las columnas
*----------------------------------------------------------------------*
 TRY.
     lr_column = lr_columns->get_column( 'CARRID' ).
     lr_column->set_long_text( 'Vuelos' ).
     lr_column->set_medium_text( 'Vuelos' ).
     lr_column->set_short_text( 'Vuelos' ).
     lr_column = lr_columns->get_column( 'MANDT' ).
     lr_column->set_long_text( 'Cliente' ).
     lr_column->set_medium_text( 'Cliente' ).
     lr_column->set_short_text( 'Cliente' ).
   CATCH cx_salv_not_found.
   CATCH cx_salv_existing.
   CATCH cx_salv_data_error.
 ENDTRY.

*----------------------------------------------------------------------*
* Establezco los botones default de un alv standart
*----------------------------------------------------------------------*
  data: gr_functions type ref to cl_salv_functions_list.
  gr_functions = alv_table->get_functions( ).
  gr_functions->set_default( ).
* gr_functions->set_all( ).

  CALL METHOD alv_table->DISPLAY( ). "Muestro ALV

miércoles, 8 de septiembre de 2010

Crear Select Option con alv usando Web Dynpro.


Crear Select Option con alv usando Web Dynpro.




      Agrego los componentes para el Alv y el Select Options.


     En el contexto del component controller creo dos nodos uno para scarr que servira para los datos del select option y uno tipo tabla caridnalidad 0-n para la tabla sflight que se relacionara con el componente del ALV.




En el layout de la vista principal creo dos ViewContainer para embeber los componentes usados. Uno para el select options  y otro para el ALV.





  Vista de los viewcontainer en el layout.


 En las propiedades del componet controller agrego los componentes que vamos a utilizar.


 Usando el Wizard Instantisio el componente de select option.
ç

Este es el codigo que genera el Wizard.

  "Instancio usage component Select Options


  data lo_cmp_usage type ref to if_wd_component_usage.

  lo_cmp_usage =   wd_this->wd_cpuse_my_select_option( ).
  if lo_cmp_usage->has_active_component( ) is initial.
    lo_cmp_usage->create_component( ).
  endif.

  

 Otra vez mediante el Wizard inicializo el selec option llamando al método INI_SELECTION_SCREEN



Código que genera el Wizard.



"inicializo el componente llamando al metodo del componente usado
DATA lo_INTERFACECONTROLLER TYPE REF TO IWCI_WDR_SELECT_OPTIONS .
lo_INTERFACECONTROLLER =   wd_this->wd_cpifc_my_select_option( ).

  DATA lv_r_helper_class TYPE ref to if_wd_select_options.
  lv_r_helper_class = lo_interfacecontroller->init_selection_screen( ).


CODIGO COMPLETO PARA EL METODO WDDOINIT DEL COMPONET CONTROLLER

method WDDOINIT .

  "Instancio usage component Select Options
  data lo_cmp_usage type ref to if_wd_component_usage.

  lo_cmp_usage =   wd_this->wd_cpuse_my_select_option( ).
  if lo_cmp_usage->has_active_component( ) is initial.
    lo_cmp_usage->create_component( ).
  endif.

  "inicializo el componente llamando al metodo del componente usado
DATA lo_INTERFACECONTROLLER TYPE REF TO IWCI_WDR_SELECT_OPTIONS .
lo_INTERFACECONTROLLER =   wd_this->wd_cpifc_my_select_option( ).

  DATA lv_r_helper_class TYPE ref to if_wd_select_options.
  lv_r_helper_class = lo_interfacecontroller->init_selection_screen( ).



"Rango del Select Option declaro la variable y creo el rango pasando el tipo de la variable.
  DATA: lt_range_idemp TYPE REF TO data.

  lt_range_idemp = lv_r_helper_class->create_range_table(
  i_typename = 'SCARR-CARRID' ).

*&---------------------------------------------------------------------*
*&Activar o desactivar los valores globlales de la WD
*&---------------------------------------------------------------------*
  lv_r_helper_class->set_global_options(
                               i_display_btn_cancel  = abap_false
                               i_display_btn_check   = abap_false
                               i_display_btn_reset   = abap_false
                               i_display_btn_execute = abap_false ).

*
*&---------------------------------------------------------------------*
*&Este metodo mostrara los campos en la WD
*&---------------------------------------------------------------------*
lv_r_helper_class->add_selection_field( i_id = 'SCARR'                
                                      it_result = lt_range_idemp
                                      i_no_extension = abap_true  
*                                     i_no_complex_restrictions = abap_true  
*                                     I_READ_ONLY = abap_true               
                                      ).
endmethod.


1.      Para hacer la búsqueda por el select option he creado un método que será llamado luego de ingresar los valores de selección. Este método de igual manera esta en componet controller y será llamado desde un botón en la pantalla principal.


method FILL_ALV_SCARR .

  "creo tabla tipo slfight y tabla interna donde almaceno el select option
  data: it_sflight TYPE TABLE OF sflight,
        it_select_op TYPE REF TO data.

  FIELD-SYMBOLS: <FS_CARRID> TYPE TABLE.

  "Vuelvo a inicializar el componente llamando al metodo initializacion para el select options
  DATA lo_INTERFACECONTROLLER TYPE REF TO IWCI_WDR_SELECT_OPTIONS .
  lo_INTERFACECONTROLLER =   wd_this->wd_cpifc_my_select_option( ).

    DATA lv_r_helper_class TYPE ref to if_wd_select_options.
    lv_r_helper_class = lo_interfacecontroller->init_selection_screen(
    ).

"Obtengo la tabla de rango del Select Option y lo asigno al FS para hacer la busqueda
  it_select_op = lv_r_helper_class->GET_RANGE_TABLE_OF_SEL_FIELD( I_ID = 'SCARR' ).
* Assign it to a field symbol
  ASSIGN it_select_op->* TO <FS_CARRID>.

  SELECT * into CORRESPONDING FIELDS OF TABLE it_sflight from sflight WHERE carrid IN <fs_carrid>.


2.      Luego de copiar el código de arriba mediante el wizard hacemos el binding a la tabla del contexto que esta mapeada con la table del ALV.





"bind a la tabla sflight que tengo en contexto.
  DATA lo_nd_sflight TYPE REF TO if_wd_context_node.
  DATA ls_sflight TYPE wd_this->Element_sflight.
  DATA lt_sflight TYPE wd_this->Elements_sflight.

* navigate from <CONTEXT> to <SFLIGHT> via lead selection
  lo_nd_sflight = wd_context->get_child_node( name = wd_this->wdctx_sflight ).

  IF lo_nd_sflight IS NOT INITIAL.
    lo_nd_sflight->bind_table( new_items = it_sflight set_initial_elements = abap_false ).
  ENDIF.
endmethod.


 Embebo en los contendores los componentes utilizados para ser mostrado en la pantalla.







1  Creo botón en el layout para una vez seleccionado los datos hacer las búsquedas. Lo creo con una action SEARCH la cual estará el código que llama a mi método y muestra los datos en el ALV.


  Dentro de la action del botón y mediante el wizard llamo al método FILL_ALV_SCARR





         En la interfaz del componente usado en la parte de contex, agrego el contexto del componet controler y arrastro la tabla SFLIGHT a el nodo DATA del contex de la interfaz.



  Luego de crear la aplicación para probar la web dynpro solo queda ejacutarla.




..-FINALMENTE-..