charla objetos persistentes

Post on 06-Jul-2015

2.148 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Charla sobre Objetos Persistentes en las Oficinas de BizPartner por Alvaro Tejada el 12/11/2009

TRANSCRIPT

Charla sobre Objetos Persistentes

Alvaro Tejada Galindo

Project Manager – SAP Mentor

Biz Partner

Que son los Objetos Persistentes?

Son objetos que continúan existiendo y manteniendo su data más allá de la duración del proceso que los creo.

Es decir, podemos encapsular su funcionalidad y utilizarlos cuando queramos y donde queramos.

Es un concepto avanzado de la programación orientada a objetos.

Como crear un Objeto Persistente?

Simplemente, debemos ir a la transacción SE24 y crear una clase de tipo persistente o Persistent Class.

Llamamos a nuestra clase ZCL_SPFLI_PERS.

El sistema nos define la clase como Protected a pesar de que nosotros queríamos Public. Esto es porque se crean dos clases adicionales, llamadas:

ZCB_SPFLI_PERS ZCA_SPFLI_PERS

En la orientación a objetos, nuestra clase ZCL_SPFLI_PERS es un objeto “Manejado”, por lo tanto su tiempo de vida no puede ser controlado directamente.

Para eso se utiliza la clase ZCA_SPFLI_PERS.

Pero como hay una relación directa, se utiliza una tercera clase como nexo.

Esta clase es conocida como “Friend”.

Una vez que tenemos creado nuestro Objeto Persistente...deberíamos enlazarlo a alguna tabla, puesto que sino, no nos sirve de nada.

Debemos hacer doble clic en cada campo y subirlos con el botón de flecha.

Cuando grabamos y salimos, notaremos que todos los SETs y los GETs han sido creado para cada uno de los campos que seleccionamos.

Esto nos permite encapsular las acciones realizadas a la tabla.

Ahora solo debemos generar la clase Actor, para poder manipular la tabla. (Se crean nuevos métodos).

Business Object Class

Si bien tenemos lista nuestra clase persistente, y podemos utilizarla en cualquier programa, lo mejor es crear una clase llama Business Object Class o Clase de Objeto de Negocio, para poder agregar una capa más de abstracción a la Base de Datos, es decir, protegemos más el acceso.

Creamos una clase llamada ZCL_SPFLI_BOC.

Dentro de nuestra clase creamos 4 métodos públicos, llamados CREAR_SPFLI, MODIFICAR_SPFLI, LEER_SPFLI y BORRAR_SPFLI.

CREAR_SPFLI recibe solo un parámetro de tipo IMPORTING llamado I_SPFLI.

METHOD crear_spfli.

  DATA: l_agent TYPE REF TO zca_spfli_pers,        l_pers_obj TYPE REF TO zcl_spfli_pers.

  TRY.      l_agent = zca_spfli_pers=>agent.      l_pers_obj = l_agent->create_persistent(      i_carrid = i_spfli-carrid      i_connid = i_spfli-connid      i_airpfrom = i_spfli-airpfrom      i_airpto = i_spfli-airpto      i_arrtime = i_spfli-arrtime      i_cityfrom = i_spfli-cityfrom      i_cityto = i_spfli-cityto      i_countryfr = i_spfli-countryfr      i_countryto = i_spfli-countryto      i_deptime = i_spfli-deptime      i_distance = i_spfli-distance      i_distid = i_spfli-distid      i_fltime = i_spfli-fltime      i_fltype = i_spfli-fltype      i_period = i_spfli-period ).      COMMIT WORK.    CATCH cx_os_object_existing.      ROLLBACK WORK.  ENDTRY.

ENDMETHOD.

MODIFICAR_SPFLI recibe 3 parámetros de tipo IMPORTING llamados I_CARRID, I_CONNID y I_SPFLI.

METHOD modificar_spfli.

  DATA: l_agent TYPE REF TO zca_spfli_pers,        l_pers_obj TYPE REF TO zcl_spfli_pers.

  TRY.      l_agent = zca_spfli_pers=>agent.      l_pers_obj = l_agent->get_persistent(      i_carrid = i_carrid      i_connid = i_connid ).      l_pers_obj->set_airpfrom( i_spfli-airpfrom ).      l_pers_obj->set_airpto( i_spfli-airpto ).      l_pers_obj->set_arrtime( i_spfli-arrtime ).      l_pers_obj->set_cityfrom( i_spfli-cityfrom ).      l_pers_obj->set_cityto( i_spfli-cityto ).      l_pers_obj->set_countryfr( i_spfli-countryfr ).      l_pers_obj->set_countryto( i_spfli-countryto ).      l_pers_obj->set_deptime( i_spfli-deptime ).      l_pers_obj->set_distance( i_spfli-distance ).      l_pers_obj->set_distid( i_spfli-distid ).      l_pers_obj->set_fltime( i_spfli-fltime ).      l_pers_obj->set_fltype( i_spfli-fltype ).      l_pers_obj->set_period( i_spfli-period ).      COMMIT WORK.    CATCH cx_os_object_not_found.      ROLLBACK WORK.  ENDTRY.

ENDMETHOD.

LEER_SPFLI recibe 2 parámetros de tipo IMPORTING llamados I_CARRID, I_CONNID y un parámetro de tipo RETURNING llamado I_SPFLI.

method LEER_SPFLI.

  DATA: l_agent TYPE REF TO zca_spfli_pers,        l_pers_obj TYPE REF TO zcl_spfli_pers.

  TRY.      l_agent = zca_spfli_pers=>agent.      l_pers_obj = l_agent->get_persistent(      i_carrid = i_carrid      i_connid = i_connid ).      i_spfli-carrid = l_pers_obj->get_carrid( ).      i_spfli-connid = l_pers_obj->get_connid( ).      i_spfli-airpfrom = l_pers_obj->get_airpfrom( ).      i_spfli-airpto = l_pers_obj->get_airpto( ).      i_spfli-arrtime = l_pers_obj->get_arrtime( ).      i_spfli-cityfrom = l_pers_obj->get_cityfrom( ).      i_spfli-cityto = l_pers_obj->get_cityto( ).      i_spfli-countryfr = l_pers_obj->get_countryfr( ).      i_spfli-countryto = l_pers_obj->get_countryto( ).      i_spfli-deptime = l_pers_obj->get_deptime( ).      i_spfli-distance = l_pers_obj->get_distance( ).      i_spfli-distid = l_pers_obj->get_distid( ).      i_spfli-fltime = l_pers_obj->get_fltime( ).      i_spfli-fltype = l_pers_obj->get_fltype( ).      i_spfli-period = l_pers_obj->get_period( ).      COMMIT WORK.    CATCH cx_os_object_not_found.      ROLLBACK WORK.  ENDTRY.

endmethod.

BORRAR_SPFLI recibe 2 parámetros de tipo IMPORTING llamados I_CARRID, I_CONNID.

METHOD borrar_spfli.

  DATA: l_agent TYPE REF TO zca_spfli_pers.

  TRY.      l_agent = zca_spfli_pers=>agent.      l_agent->delete_persistent(      i_carrid = i_carrid      i_connid = i_connid ).      COMMIT WORK.    CATCH cx_os_object_not_existing.      ROLLBACK WORK.  ENDTRY.

ENDMETHOD.

Una vez que tenemos listos nuestros métodos, podemos crear un pequeño programa para probar como funciona nuestra clase.

El programa lo llamaremos Z_SPFLI_PERSISTENTE.

REPORT  z_spfli_persistente.

DATA: spfli_boc TYPE REF TO zcl_spfli_boc,      t_spfli TYPE STANDARD TABLE OF spfli.

FIELD-SYMBOLS: <fs_spfli> LIKE LINE OF t_spfli.

CREATE OBJECT spfli_boc.

APPEND INITIAL LINE TO t_spfliASSIGNING <fs_spfli>.

*Crear nuevo registro<fs_spfli>-carrid = 'AA'.<fs_spfli>-connid = '0065'.<fs_spfli>-countryfr = 'US'.<fs_spfli>-cityfrom = 'MIAMI'.

spfli_boc->crear_spfli(EXPORTING  i_spfli = <fs_spfli> ).

*Modificar registro<fs_spfli>-carrid = 'AA'.<fs_spfli>-connid = '0065'.<fs_spfli>-countryfr = 'US'.<fs_spfli>-cityfrom = 'LAS VEGAS'.

spfli_boc->modificar_spfli(  i_carrid = <fs_spfli>-carrid  i_connid = <fs_spfli>-connid  i_spfli = <fs_spfli> ).

*Leer registro<fs_spfli>-carrid = 'AA'.<fs_spfli>-connid = '0065'.

<fs_spfli> = spfli_boc->leer_spfli(             i_carrid = <fs_spfli>-carrid             i_connid = <fs_spfli>-connid ).

WRITE:/ <fs_spfli>-carrid, <fs_spfli>-connid,        <fs_spfli>-countryfr, <fs_spfli>-cityfrom.

 *Eliminar registro<fs_spfli>-carrid = 'AA'.<fs_spfli>-connid = '0065'.

spfli_boc->borrar_spfli(  i_carrid = <fs_spfli>-carrid  i_connid = <fs_spfli>-connid ).

Para probarlo, nos vamos a la tabla SPFLI y seleccionamos los registros con CARRID igual a “AA”.

Es importante que ejecutemos el código, comentando las partes que no vamos a utilizar. Recuerden que este es un programa de prueba.

Ejecutamos la creación del nuevo registro.

Ejecutamos la modificación del nuevo registro.

Ejecutamos la lectura del nuevo registro.

Ejecutamos la eliminación del nuevo registro.

Ya vimos como podemos manejar las cosas para un simple registro, siempre utilizando las llaves. Veamos como debemos hacer si queremos leer toda la tabla. Y esto en realidad es lo que más nos conviene, puesto que los Objetos Persistentes tiene un manejo muy pobre del WHERE. Lo mejor es manejarlo externamente.

Creamos una estructura llamada ZCS_SPFLI_OBJ.

Como se darán cuenta, estamos usando una clase como tipo de dato. Es por eso que marcamos el check de Rty.

Con la estructura que hemos creado, debemos crear ahora un Tipo de Tabla llamado ZCL_SPFLI_TBL.

En nuestra clase ZCL_SPFLI_BOC creamos un nuevo método llamado LEER_TODO_SPFLI.

Utilizamos un parámetro llamado R_SPFLI de tipo RETURNING haciendo referencia al Tipo de Tabla ZCL_SPFLI_TBL.

Creamos un método CONSTRUCTOR, y otro método llamado MAPEAR_CAMPOS, además declaramos los atributos PERSISTENT_OBJECT y SPFLI_TAB.

El método CONTRUCTOR recibe solo un parámetro.

METHOD constructor.

  me->persistent_object = i_persistent_object.  me->mapear_campos( ).

ENDMETHOD. 

El método MAPEAR_CAMPOS no recibe parámetros.

• METHOD mapear_campos.

  spfli_tab-carrid = persistent_object->get_carrid( ).  spfli_tab-connid = persistent_object->get_connid( ).  spfli_tab-airpfrom = persistent_object->get_airpfrom( ).  spfli_tab-airpto = persistent_object->get_airpto( ).  spfli_tab-arrtime = persistent_object->get_arrtime( ).  spfli_tab-cityfrom = persistent_object->get_cityfrom( ).  spfli_tab-cityto = persistent_object->get_cityto( ).  spfli_tab-countryfr = persistent_object->get_countryfr( ).  spfli_tab-countryto = persistent_object->get_countryto( ).  spfli_tab-deptime = persistent_object->get_deptime( ).  spfli_tab-distance = persistent_object->get_distance( ).  spfli_tab-distid = persistent_object->get_distid( ).  spfli_tab-fltime = persistent_object->get_fltime( ).  spfli_tab-fltype = persistent_object->get_fltype( ).  spfli_tab-period = persistent_object->get_period( ).

ENDMETHOD. 

METHOD leer_todo_spfli.

  DATA: l_agent TYPE REF TO zca_spfli_pers,        l_pers_obj TYPE REF TO zcl_spfli_pers,        l_objects TYPE osreftab.

  FIELD-SYMBOLS: <wa_object> LIKE LINE OF l_objects,                 <wa_spfli> LIKE LINE OF r_spfli.

  DATA: query_manager TYPE REF TO if_os_query_manager,        query TYPE REF TO if_os_query.

  TRY.    l_agent = zca_spfli_pers=>agent.    query_manager = cl_os_system=>get_query_manager( ).    query = query_manager->create_query( ).

    l_objects = l_agent->if_os_ca_persistency~get_persistent_by_query       ( i_query = query ).

    LOOP AT l_objects ASSIGNING <wa_object>.      l_pers_obj ?= <wa_object>.      APPEND INITIAL LINE TO r_spfli ASSIGNING <wa_spfli>.      <wa_spfli>-carrid = l_pers_obj->get_carrid( ).      <wa_spfli>-connid = l_pers_obj->get_connid( ).      CREATE OBJECT <wa_spfli>-spfli EXPORTING

                                         i_persistent_object = l_pers_obj.    ENDLOOP.  ENDTRY.

ENDMETHOD.

Regresamos a nuestro programa Z_SPFLI_PERSISTENTE para poder probar el método LEER_TODO_SPFLI.

DATA: t_spfli_tbl TYPE zcs_spfli_tbl,      ispfli TYPE STANDARD TABLE OF spfli.

FIELD-SYMBOLS: <wa_spfli_obj> LIKE LINE OF t_spfli_tbl,               <wa_spfli> LIKE LINE OF ispfli.

t_spfli_tbl = zcl_spfli_boc=>leer_todo_spfli( ).

LOOP AT t_spfli_tbl ASSIGNING <wa_spfli_obj>.  APPEND INITIAL LINE TO ispfli ASSIGNING <wa_spfli>.  MOVE-CORRESPONDING <wa_spfli_obj>-spfli->spfli_tab TO <wa_spfli>.ENDLOOP.

LOOP AT ispfli ASSIGNING <wa_spfli>.  WRITE:/ <wa_spfli>-carrid, <wa_spfli>-connid, 

             <wa_spfli>-countryfr.ENDLOOP.

Fin

Preguntas?

Comentarios?

top related