sábado, 16 de abril de 2011

Consuming Service with ABAP SOAP

1.- Creamos el servicio como se muestra en la ventana, este debe  ser creado desde el paquete para que pueda aparecer la opción (Enterprise Service- desde la versión Sap Netweaver 7.0) 


2.- Seleccionamos Service Consumer


3.- En este paso seleccionamos la ubicación de nuestro servicio, para nuestro caso seleccionamos URL Http Destination.


4.- Introducimos el WSDL (Web Service Description Language) de nuestro servicio.
      http://www.webservicex.net/globalweather.asmx?WSDL


5.- Seleccionamos el Paquete y prefijo que usaremos.


6.- Finalizamos


7.- Seleccionamos el tipo de puerto que usaremos.


8-. Importante que luego del paso 7 se presione SALVAR y luego ACTIVAR. Para asi luego poder navegar y curiosear sobre las características de nuestro servicio.


9.- Características desde el punto de vista externo.


10.- Características desde el punto de vista interno.


11.- El servicio creado de manera automatica es ZCO_GLOBAL_WEATHER_SOAP


12.- Soamanager. es la transacción por la cual configuramos el puerto lógico de comunicación con el servicio, es una herramienta poderosa que nos permite enlazar nuestra aplicación. De esta manera una vez transportado nuestra aplicación a otro ambiente, solo bastara con crear el puerto lógico, sea Calidad o Producción.


13.- Seleccionaremos la pestaña de Service Administration, luego el link Single Service Configuration.

 

14.- Haremos una búsqueda de nuestro servicio para así crear el puerto lógico relacionado con el.


15.- Con nuestro servicio seleccionado, presionamos aplicar selección, con esto se nos mostrara una ventana mas abajo para la creación del puerto lógico.


16.- Click en el puerto logico y pasamos a llenar los valores que nos solicitan.


NO PASAR POR ALTO el valor Default y las demás características para el puerto. Nuevamente en este paso usaremos la WSDL de nuestro servicio. De necesitar crear varios puertos para la misma aplicación dejaremos el ckeck field de DEFAULT vacio. para que así luego sea ingresado por código.




17.- Importante una vez seleccionado la configuración presionar el botón SAVE para salvar. nuestro puerto se activara automáticamente una vez salvado.


18.- Luego crearemos nuestra aplicación ABAP para asi consumirlo.



DROP & DRAG: seleccionamos nuestro servicio y lo arrastraremos hasta nuestro programa. Este nos generara el siguiente codigo.


Aparecerá nuestro servicio y escogeremos el method que querremos implementar.



DATAXXXXXXXX TYPE REF TO ZCO_GLOBAL_WEATHER_SOAP .
TRY.
    CREATE OBJECT XXXXXXXX
*  EXPORTING
*    LOGICAL_PORT_NAME  =
        .
  CATCH CX_AI_SYSTEM_FAULT .
ENDTRY.
*   data: OUTPUT type ZGET_WEATHER_SOAP_OUT .
*   data: INPUT type ZGET_WEATHER_SOAP_IN .
*TRY.
CALL METHOD XXXXXXXX->GET_WEATHER
  EXPORTING
    INPUT  =
*  IMPORTING
*    OUTPUT =
    .
* CATCH CX_AI_SYSTEM_FAULT .
* CATCH CX_AI_APPLICATION_FAULT .
*ENDTRY.



Luego de algunos cambios al codigo adecuandolo a nuestro requerimiento tendriamos algo como esto.

*&---------------------------------------------------------------------*
*& Report  ZTEST_SERVICES_TEMP
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZTEST_SERVICES_TEMP.

DATA err_fault  TYPE  REF TO CX_AI_SYSTEM_FAULT.
DATA app_fault  TYPE  REF TO CX_AI_APPLICATION_FAULT.

DATAr_weather TYPE REF TO ZCO_GLOBAL_WEATHER_SOAP .

TRY.
    CREATE OBJECT r_weather
*  EXPORTING
*    LOGICAL_PORT_NAME  =
        .
  CATCH CX_AI_SYSTEM_FAULT into err_fault.
    MESSAGE err_fault TYPE 'E'.
ENDTRY.

   dataOUTPUT type ZGET_WEATHER_SOAP_OUT .
   dataINPUT  type ZGET_WEATHER_SOAP_IN .

input-CITY_NAME       'Caracas'.
input-COUNTRY_NAME    'Venezuela'.

TRY.
CALL METHOD r_weather->GET_WEATHER
  EXPORTING
    INPUT  input
  IMPORTING
    OUTPUT output
    .

datantotaltable TYPE sy-tabix,
      nindextable type sy-index.

datai_result type table of string,
      wa_result TYPE string.

split output-GET_WEATHER_RESULT at ' / '
                       into table i_result.

describe table i_result lines ntotaltable.

 loop at i_result into wa_result.
      nindextable sy-tabix.
      if nindextable ntotaltable.
         delete i_result index nindextable.
         continue.
      endif.
      write:/ wa_result.
 endloop.

*write: output-GET_WEATHER_RESULT.

 CATCH CX_AI_SYSTEM_FAULT      into err_fault.
   MESSAGE err_fault TYPE 'E'.
 CATCH CX_AI_APPLICATION_FAULT into app_fault.
   MESSAGE app_fault type 'E'.
ENDTRY.

FINALMENTE:



MUY PRONTO CONSUMIÉNDOLO DESDE WEB DYNPRO ABAP

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-..