Charla Objetos Persistentes
-
Upload
biz-partner -
Category
Technology
-
view
2.151 -
download
1
description
Transcript of Charla Objetos Persistentes
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?