Anda di halaman 1dari 50

Manual de ODATA

Qu es ODATA?
El protocolo Open Data (OData) le permite tener acceso a un origen de datos, como una
base de datos a travs de una direccin URL construida especialmente. Esto permite un
enfoque simplificado para conectarse y trabajar con orgenes de datos hospedados en una
organizacin.
OData es un protocolo que usa HTTP, Atom y Notacin de objetos de JavaScript (JSON)
que permiten a los desarrolladores escribir aplicaciones que se comunican con un nmero
creciente de orgenes de datos. Microsoft admite la creacin de este estndar como una
forma de habilitar el intercambio de datos entre las aplicaciones y los almacenes de datos
accesibles desde la web.

Cmo crear un proyecto ODATA en SAP?


Pasos:
1. Ingresar a la transaccin SEGW y presionar el botn Create Project

Elaborado por: Ruddy Enzo Retegui Macedo

2. Ingresamos los datos necesarios para crear nuestro proyecto como objeto local y
aceptamos

El proyecto ZSFLIGHT_PROYECTO se visualiza de la siguiente manera:

Elaborado por: Ruddy Enzo Retegui Macedo

3. Para hacer completo este ejemplo vamos a crear un Entity Type llamado Carrier que
tendr como referencia la tabla SCARR, con la finalidad de servir de estructura para
mostrar los registros de las Aerolneas.
Clic derecho en Data Model, y seleccionar Import>DDIC Structure

Ingresar el nombre del tipo de entidad y de la estructura del diccionario ABAP que
vamos a usar, para este caso es la tabla SCARR. Dejar marcado la opcin Create
Default Entity Set que luego lo usaremos y presionar el botn Next.

Elaborado por: Ruddy Enzo Retegui Macedo

Seleccionamos los campos de la estructura SCARR que necesitamos, a modo de


ejemplo seleccionaremos todos los campos a excepcin de Mandt y presionamos el
botn Next.

Elaborado por: Ruddy Enzo Retegui Macedo

Marcamos el campo CARRID como campo clave y presionamos el botn Finish.

As se visualiza nuestro Entity Type Carrier

Tener en cuenta que se puede cambiar los nombres de cualquiera de las propiedades

Elaborado por: Ruddy Enzo Retegui Macedo

4. Modificar nombre de Entity Sets CarrierSet creado por defecto a Carrier


Nos vamos a Entity Sets y hacemos doble click en CarrierSet

Modificamos el nombre del Entity Set CarrierSet por Carriers, para luego acceder
desde el navegador y obtener los registros de las aerolneas.

Elaborado por: Ruddy Enzo Retegui Macedo

5. Generamos el servicio ODATA.


Nos posicionamos el nombre del proyecto y presionamos el botn Generate Runtime
Objects.

Elaborado por: Ruddy Enzo Retegui Macedo

Presionamos el botn Aceptar y lo guardamos como objeto local. Tener en cuenta que
necesitaremos el nombre del servicio ZSFLIGHT_PROYECTO_SRV para acceder desde la
web.

Elaborado por: Ruddy Enzo Retegui Macedo

As se visualiza el log despus de haber generado el servicio.

Elaborado por: Ruddy Enzo Retegui Macedo

6. Activando el servicio ODATA


Nos dirigimos a la transaccin /IWFND/MAINT_SERVICE y hacemos clic en Add
Service

Buscamos nuestro servicio con valor System Alias = LOCAL porque el proyecto fue
grabado como objeto local y presionamos el botn Get Services.

Elaborado por: Ruddy Enzo Retegui Macedo

Buscamos nuestro servicio en el listado mostrado y presionamos el botn Add


Selected Services

Elaborado por: Ruddy Enzo Retegui Macedo

En la siguiente ventana presionamos el botn Aceptar

Elaborado por: Ruddy Enzo Retegui Macedo

7. Ahora vamos a modificar el GetEntitySet (Query) del Service Implentation Carriers


para obtener los registros de la tabla SCARR
Nos dirigimos al GetEntitySet (Query) de Carriers

Elaborado por: Ruddy Enzo Retegui Macedo

Ahora hacemos clic derecho en GetEntitySet (Query) de Carriers y no dirigimos a Go


to ABAP Workbench

Se mostrar un mensaje popup indicando que el mtodo an no ha sido


implementado, presionamos el botn Aceptar

Elaborado por: Ruddy Enzo Retegui Macedo

Se muestra la siguiente visualizacin.

Nos posicionamos en CARRIERS_GET_ENTITYSET, le damos clic derecho y hacemos


clic en Redefine

Elaborado por: Ruddy Enzo Retegui Macedo

Agregamos el siguiente cdigo para obtener los registros de las aerolneas de la tabla
SCARR
SELECT * from scarr into CORRESPONDING FIELDS OF TABLE ET_ENTITY
SET.

8. Ahora vamos a testear el mtodo CARRIERS_GET_ENTITYSET desde la Web.


Nos dirigimos a la transaccin /IWFND/MAINT_SERVICE y ubicamos nuestro servicio
ODATA registrado. Presionamos el botn Call Browser

Se muestra la siguiente pantalla en el navegador Web

Elaborado por: Ruddy Enzo Retegui Macedo

Cambiamos el enlace:
http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/?$f
ormat=xml
Por
http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/Car
riers para poder obtener los registros de la tabla SCARR, ya que al llamar a Carriers
har que ingres al mtodo CARRIERS_GET_ENTITYSET que hemos implementado.

Elaborado por: Ruddy Enzo Retegui Macedo

Para poder tener una mejor vista de los registros vamos a utilizar la terminacin
?$format=json&sap-ds-debug=true en el enlace, de la siguiente manera:
http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/Car
riers?$format=json&sap-ds-debug=true

Elaborado por: Ruddy Enzo Retegui Macedo

9. Ahora vamos a modifica el el GetEntity (Read) del Service Implentation Carriers para
obtener un solo registro en base a la llave Carrid
Nos dirigimos al GetEntity (Read) de Carriers. Ahora hacemos clic derecho en
GetEntity (Read) de Carriers y no dirigimos a Go to ABAP Workbench

Se mostrar un mensaje popup indicando que el mtodo an no ha sido


implementado, presionamos el botn Aceptar

Elaborado por: Ruddy Enzo Retegui Macedo

Se muestra la siguiente visualizacin.

Nos posicionamos en CARRIERS_GET_ENTITY, le damos clic derecho y hacemos clic


en Redefine

Elaborado por: Ruddy Enzo Retegui Macedo

Agregamos el siguiente cdigo para obtener el registro de la aerolnea de la tabla


SCARR en base al cdigo Carrid
data: ls_key like line of it_key_tab,
ldt_scarr TYPE STANDARD TABLE OF scarr,
lwa_scarr like LINE OF ldt_scarr.
read table it_key_tab into ls_key with key name = 'Carrid'.
* If there is a carrier ID specified, use it to select only tho
se for the specific carrier
if sy-subrc eq 0.
SELECT * from scarr
into CORRESPONDING FIELDS OF TABLE ldt_scarr
WHERE carrid EQ ls_key-VALUE.
IF LDT_SCARR is NOT INITIAL.
READ TABLE LDT_SCARR into LWA_SCARR INDEX 1.
MOVE-CORRESPONDING LWA_SCARR to ER_ENTITY.
ENDIF.
endif.

10. Ahora vamos a testear el mtodo CARRIERS_GET_ENTITY desde la Web.


Nos dirigimos a la transaccin /IWFND/MAINT_SERVICE y ubicamos nuestro servicio
ODATA registrado. Presionamos el botn Call Browser

Elaborado por: Ruddy Enzo Retegui Macedo

Se muestra la siguiente pantalla en el navegador Web

Cambiamos el enlace:
http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/?$f
ormat=xml
Por
http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/Car
riers(AA)?$format=json&sap-ds-debug=true para poder obtener el registro de la
tabla SCARR que tenga el cdigo Carrid = AA, ya que al llamar a Carriers(AA) har
que ingres al mtodo CARRIERS_GET_ENTITY que hemos implementado y no al
mtodo CARRIERS_GET_ENTITYSET.

Elaborado por: Ruddy Enzo Retegui Macedo

Cmo crear asociaciones ODATA?


Para este ejemplo vamos a usar todo lo desarrollado anteriormente, el propsito de este
ejercicio es crear asociaciones entre dos entidades e implementar el mtodo Get
EntitySet(Query). Para este ejercicio vamos a usar todo lo desarrollado anteriormente,
vamos a crear un Entity Type ms denominado Sflight para crear una relacin con Carrier
(Aerolneas), el propsito de este ejercicio es enviar los vuelos (Sflight) de una
determinada aerolnea (Carrier).
Pasos:
1. Vamos a crear un Entity Type llamado Sflight, clic derecho en Data Model, y
seleccionar Import>DDIC Structure.

Elaborado por: Ruddy Enzo Retegui Macedo

Ingresar el nombre del tipo de entidad y de la estructura del diccionario ABAP que
vamos a usar, para este caso es la tabla SFLIGHT. Dejar marcado la opcin Create
Default Entity Set que luego lo usaremos y presionar el botn Next.

Elaborado por: Ruddy Enzo Retegui Macedo

Seleccionamos los campos de la estructura SFLIGHT que necesitamos, a modo de


ejemplo seleccionaremos todos los campos a excepcin de Mandt y presionamos el
botn Next.

Marcamos el campo CARRID como campo clave y presionamos el botn Finish.

Elaborado por: Ruddy Enzo Retegui Macedo

As se visualiza nuestro Entity Type Sflight

Tener en cuenta que se puede cambiar los nombres de cualquiera de las propiedades
2. Modificar nombre de Entity Sets FlightSet ,creado por defecto, a Flights
Nos vamos a Entity Sets y hacemos doble click en FlightSet

Elaborado por: Ruddy Enzo Retegui Macedo

Modificamos el nombre del Entity Set FlightSet por Flights, para luego acceder
desde el navegador.

Elaborado por: Ruddy Enzo Retegui Macedo

3. Vamos a crear la navegacin de Carriers a Flights denominado FlightsToCarriersAsoc


para relacionar la entidad (1)Carrier con (N)Flight . Nos dirigimos a Associations, clic
derecho en Create.

Elaborado por: Ruddy Enzo Retegui Macedo

Procedemos a ingresar los detalles de nuestra asociacin de Flights a Carriers. Tener


en cuenta que la entidad principal es Carrier (Aerolnea), luego presionamos el botn
Next.

Elaborado por: Ruddy Enzo Retegui Macedo

Luego relacionamos los campos claves de ambas entidades, para este caso es el
campo Carrid. Clic en Next

Elaborado por: Ruddy Enzo Retegui Macedo

Por ltimo clic en Finalizar para terminar con el paso de crear la asociacin de las
entidades.

As se visualiza la asociacin creada

Elaborado por: Ruddy Enzo Retegui Macedo

Adems se cre la Navigation Properties FlightsToCarriers del Entity Type Carrier

Elaborado por: Ruddy Enzo Retegui Macedo

4. Ahora vamos implementar el mtodos Get EntitySet(Query) de la entidad Flight que


est vinculado con la entidad Carrier para obtener sus registros relacionados.
No dirigimos a Service Implementation>Carriers>Get EntitySet (Query), click derecho
en Get EntitySet (Query) y elegimos la opcin Go to ABAP Workbench

Elaborado por: Ruddy Enzo Retegui Macedo

En la siguiente pantalla nos posicionamos en Methods>Inherited


Methods>Flights_Get_EntitySet, hacemos clic derecho y elegimos la opcin Redefine

Elaborado por: Ruddy Enzo Retegui Macedo

Implementamos el siguiente cdigo para obtener un registro de la entidad Flight


(Vuelo) que est relacionado con la entidad Carrier (Aerolnea) en base a una
determinada aerolnea (Carrid).
data: ls_key like line of it_key_tab.
read table it_key_tab into ls_key with key name = 'Carrid'.
* If there is a carrier ID specified, use it to select only tho
se for the specific carrier
if sy-subrc eq 0.
select * from sflight into corresponding fields of table et_
entityset
where carrid = ls_key-value.
*
If there is no carrier specified, read all the flights
else.
select * from sflight into corresponding fields of table et_
entityset.
endif.

Elaborado por: Ruddy Enzo Retegui Macedo

5. Para testear la conexin ingresemos al siguiente link:


http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/Car
riers('AA')/FlightsToCarriers?$format=xml
Dnde FlightsToCarriers es la propiedad de navegacin de la entidad Carrier. La
siguiente imagen muestra los registros para la entidad Flight en base al cdigo de
aerolnea (Carrier).

Elaborado por: Ruddy Enzo Retegui Macedo

Cmo implementar Expand Entity/Entity Set?


Para este ejercicio vamos a usar todo lo desarrollado anteriormente, vamos a crear un
Entity Type ms denominado Sflight para crear una relacin con Carrier (Aerolneas), el
propsito de este ejercicio es enviar datos de dos tablas relacionadas.
Pasos:
1. Vamos a crear la navegacin de Carriers a Flights denominado
VuelosDeAerolineaAsocpara obtener de una aerolnea especfica todos sus vuelos.
Nos dirigimos a Associations, clic derecho en Create

Elaborado por: Ruddy Enzo Retegui Macedo

Procedemos a ingresar los detalles de nuestra asociacin de Flights a Carriers. Tener


en cuenta que la entidad principal es Carrier (Aerolnea), luego presionamos el botn
Next.

Elaborado por: Ruddy Enzo Retegui Macedo

Luego relacionamos los campos claves de ambas entidades, para este caso es el
campo Carrid. Clic en Next

Elaborado por: Ruddy Enzo Retegui Macedo

Por ltimo clic en Finalizar para terminar con el paso de crear la asociacin de las
entidades.

As se visualiza la asociacin creada

Elaborado por: Ruddy Enzo Retegui Macedo

Adems se cre la Navigation Properties VuelosDeAerolinea del Entity Type Carrier

Elaborado por: Ruddy Enzo Retegui Macedo

2. Ahora vamos a implementar el mtodo GET_EXPANDED_ENTITY para obtener los


vuelos de una determinada aerolnea.
Nos dirigimos a Runtime Artifacts, nos posicionamos en
ZCL_ZSFLIGHT_PROYECTO_DPC_EXT. Clic derecho en la clase y elegimos la opcin Go
to ABAP Workbench

Elaborado por: Ruddy Enzo Retegui Macedo

Se muestra la siguiente visualizacin.

Necesitamos redefinir el mtodo


/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITY, para ello nos
dirigimos a Methods>Inherited Methods>
/IWBEP/IF_MGW_APPL_SRV_RUNTIME/GET_EXPANDED_ENTITY. Clic derecho y elegir
la opcin Redefine.

Elaborado por: Ruddy Enzo Retegui Macedo

Agregamos el siguiente cdigo para obtener los vuelos de una determinada aerolnea.
TYPES: ty_flight TYPE STANDARD TABLE OF ZCL_ZSFLIGHT_PROYECTO
_MPC=>TS_FLIGHT WITH DEFAULT KEY.
TYPES: BEGIN OF ty_carrier.
INCLUDE
TYPE ZCL_ZSFLIGHT_PROYECTO_MPC=>TS_C
ARRIER.
types: vuelosdeaerolinea type ty_flight,
END OF ty_carrier.
DATA:

ls_key_tab
lv_carrid

TYPE /iwbep/s_mgw_name_value_pair,
TYPE scarr-carrid.

DATA: ltd_flight TYPE ZCL_ZSFLIGHT_PROYECTO_MPC=>TT_FLIGHT,


lwa_flight like LINE OF ltd_flight,
lwa_carrier TYPE ty_carrier.
DATA: lwa_carrier2 TYPE scarr,
ltd_flight2 TYPE STANDARD TABLE OF sflight.

CONSTANTS: lc_expand_tech_clause
EROLINEA'.

TYPE string VALUE 'VUELOSDEA

*Get the key property values and Read Sales Order and Item data
READ TABLE it_key_tab WITH KEY name = 'Carrid' INTO ls_key_tab
.
IF sy-subrc = 0.
lv_carrid = ls_key_tab-value.
SELECT SINGLE * from scarr
into lwa_carrier2
WHERE carrid EQ lv_carrid.
IF lwa_carrier2 is NOT INITIAL.
SELECT * from sflight
into CORRESPONDING FIELDS OF TABLE ltd_flight
WHERE carrid EQ lv_carrid.
IF ltd_flight[] is not INITIAL.
MOVE-CORRESPONDING lwa_carrier2 to lwa_carrier.
lwa_carrier-VUELOSDEAEROLINEA = ltd_flight[].
ENDIF.
ENDIF.
ENDIF.
* Fill ER_ENTITY

Elaborado por: Ruddy Enzo Retegui Macedo

copy_data_to_ref(
EXPORTING
is_data = lwa_carrier
CHANGING
cr_data = er_entity ).
* Insert Navigation property into ET_EXPANDED_TECH_CLAUSES
INSERT lc_expand_tech_clause INTO TABLE et_expanded_tech_claus
es.

Con este paso estaramos finalizando la implementacin del mtodo


/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITY.
3. Testearemos el Expand Entity implementado con el siguiente enlace:
http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/Car
riers('AA')?$expand=VuelosDeAerolinea&$format=json&sap-ds-debug=true
Notemos que se est mostrando la aerolnea AA con sus respectivos vuelos. Esta
sera la forma de obtener tabla cabecera con su detalle en base a un parmetro.

Elaborado por: Ruddy Enzo Retegui Macedo

4. Ahora vamos a implementar el mtodo GET_EXPANDED_ENTITYSET para obtener las


aerolneas con sus vuelos.
Nos dirigimos a Runtime Artifacts, nos posicionamos en
ZCL_ZSFLIGHT_PROYECTO_DPC_EXT. Clic derecho en la clase y elegimos la opcin Go
to ABAP Workbench

Elaborado por: Ruddy Enzo Retegui Macedo

Se muestra la siguiente visualizacin

Necesitamos redefinir el mtodo


/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITYSET, para ello nos
dirigimos a Methods>Inherited Methods>
/IWBEP/IF_MGW_APPL_SRV_RUNTIME/GET_EXPANDED_ENTITYSET. Clic derecho y
elegir la opcin Redefine.

Elaborado por: Ruddy Enzo Retegui Macedo

Agregamos el siguiente cdigo para obtener las aerolneas con sus respectivos vuelos
TYPES: ty_flight TYPE STANDARD TABLE OF ZCL_ZSFLIGHT_PROYECT
O_MPC=>TS_FLIGHT WITH DEFAULT KEY.
TYPES: BEGIN OF ty_carrier.
INCLUDE
TYPE ZCL_ZSFLIGHT_PROYECTO_MPC=>TS_C
ARRIER.
types: vuelosdeaerolinea type ty_flight,
END OF ty_carrier.
DATA:

ls_key_tab
lv_carrid

DATA: ltd_flight
lwa_flight
ltd_carrier
lwa_carrier
DATA: ltd_carrier2
lwa_carrier2
ltd_flight2
lwa_flight2

TYPE /iwbep/s_mgw_name_value_pair,
TYPE scarr-carrid.
TYPE
like
TYPE
TYPE
TYPE
TYPE
TYPE
like

ZCL_ZSFLIGHT_PROYECTO_MPC=>TT_FLIGHT,
LINE OF ltd_flight,
STANDARD TABLE OF ty_carrier,
ty_carrier.
STANDARD TABLE OF scarr,
scarr,
STANDARD TABLE OF sflight,
LINE OF ltd_flight2.

CONSTANTS: lc_expand_tech_clause
EROLINEA'.

TYPE string VALUE 'VUELOSDEA

SELECT * from scarr


into TABLE ltd_carrier2.
IF ltd_carrier2 is NOT INITIAL.
SELECT * from sflight
into CORRESPONDING FIELDS OF TABLE ltd_flight2
FOR ALL ENTRIES IN ltd_carrier2
WHERE carrid EQ ltd_carrier2-carrid.
delete ltd_carrier2 WHERE carrid eq space.
delete ltd_flight2 WHERE carrid eq space.
IF ltd_flight2[] is not INITIAL.
LOOP AT LTD_CARRIER2 into lwa_carrier2.
REFRESH: LTD_FLIGHT.
MOVE-CORRESPONDING LWA_CARRIER2 to LWA_CARRIER.
LOOP AT LTD_FLIGHT2 into lwa_flight2 WHERE carrid EQ
lwa_carrier2-carrid.
MOVE-CORRESPONDING lwa_flight2 to lwa_flight.
append lwa_flight to LTD_FLIGHT.
ENDLOOP.

Elaborado por: Ruddy Enzo Retegui Macedo

lwa_carrier-VUELOSDEAEROLINEA[] = LTD_FLIGHT.
ENDLOOP.
MOVE-CORRESPONDING lwa_carrier2 to lwa_carrier.
lwa_carrier-VUELOSDEAEROLINEA = ltd_flight[].
append lwa_carrier to LTD_CARRIER.
ENDIF.
ENDIF.

* Fill ER_ENTITY
copy_data_to_ref(
EXPORTING
is_data = ltd_carrier
CHANGING
cr_data = ER_ENTITYSET ).
* Insert Navigation property into ET_EXPANDED_TECH_CLAUSES
INSERT lc_expand_tech_clause INTO TABLE et_expanded_tech_claus
es.

Con este paso estaramos finalizando la implementacin del mtodo


/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITYSET.

Elaborado por: Ruddy Enzo Retegui Macedo

5. Testearemos el Expand Entity implementado con el siguiente enlace:


http://psaperp02.xternal.biz:8000/sap/opu/odata/sap/ZSFLIGHT_PROYECTO_SRV/Car
riers?$expand=VuelosDeAerolinea&$format=json&sap-ds-debug=true
Notemos que se estn mostrando las aerolneas con sus respectivos vuelos, se cumple
la relacin 1 Aerolnea tiene N Vuelos.

Elaborado por: Ruddy Enzo Retegui Macedo

Anda mungkin juga menyukai