Este tutorial se basa en:
Por lo tanto, este tutorial solo cubrirá en detalle las características que son diferentes. En este caso, no incluye datos locales ni remotos, solo recupera datos locales. Por lo tanto, no es necesario que incluya los campos de cálculo locales, DiscountPct
y DiscountAbs
.
Paso 1: crear una lógica de recuperación de datos de rendimiento de la clase
Primero, crea la clase que aplica la lógica de recuperación de datos.
En ADT, abra su paquete
Z_A4C_TO_A4C_XX2
y seleccione Nuevo> Clase.Ingrese nombre y descripción:
ZCL_TRAVELS_XXX
- Obtenga detalles de viaje del sistema A4C
Acepte la solicitud de transporte predeterminada, luego seleccione Finalizar.
Hecho
Inicie sesión para responder la pregunta
Paso 2: agregar una declaración INTERFACES
Firma del método IF_RAP_QUERY_PROVIDER~SELECT
existe el parámetro de importación io_request
. Este parámetro indica las opciones de consulta de OData delegadas desde la interfaz y utilizadas como entrada para el método SELECT.
Siempre que un cliente de OData solicita datos, la clase de implementación de la consulta debe devolver los datos correspondientes a la solicitud o emitir una excepción si no se puede cumplir con la solicitud.
Aplique la interfaz agregando esta declaración a la sección pública:
INTERFACES if_rap_query_provider.
Escoger Arreglo rapido (
Ctrl+1
), luego seleccione Implementar para SELECT….Guardar y activar ( Ctrl + S, Ctrl + F3 ) Tu clase.
Posteriormente, aplicará el modo SELECT de la interfaz.
Hecho
Inicie sesión para responder la pregunta
Paso 3: especifica una clase en tu entidad personalizada
Abra su entidad CDS personalizada
ZCE_TRAVEL_DATA_XXX
, creado en Crear modelo de consumo de servicios.Agregue la siguiente nota a la vista (inmediatamente después de la nota ‘@ EndUserText.label’), refiriéndose a la clase que acaba de crear – NOTA: ¡Use mayúsculas!
@ObjectModel.query.implementedBy: 'ABAP:ZCL_TRAVELS_XXX'
Hecho
Inicie sesión para responder la pregunta
Paso 4: copia el código
Copie el siguiente código en su clase de implementación de consulta, ZCL_TRAVELS_XXX
. Ignore las advertencias.
CLASS zcl_travels_xxx DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES if_rap_query_provider.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_travels_xxx IMPLEMENTATION.
METHOD if_rap_query_provider~select.
"""Instantiate Client Proxy
DATA(lo_client_proxy) = zcl_proxy_travels_xxx=>get_client_proxy( ).
TRY.
"""Instantiate Client Proxy
"""Create Read Request
DATA(lo_read_request) = lo_client_proxy->create_resource_for_entity_set( 'TRAVEL' )->create_request_for_read( ).
"""Request Inline Count
IF io_request->is_total_numb_of_rec_requested( ).
io_response->set_total_number_of_records( lo_response->get_count( ) ).
ENDIF.
"""Implement Paging
DATA(ls_paging) = io_request->get_paging( ).
IF ls_paging->get_offset( ) >= 0.
lo_read_request->set_skip( ls_paging->get_offset( ) ).
ENDIF.
IF ls_paging->get_page_size( ) <> if_rap_query_paging=>page_size_unlimited.
lo_read_request->set_top( ls_paging->get_page_size( ) ).
"""Execute the Request
DATA(lo_response) = lo_read_request->execute( ).
ENDIF.
CATCH /iwbep/cx_gateway INTO DATA(lx_gateway).
RAISE EXCEPTION TYPE ZCX_TRAVELS_CONS_XXX
EXPORTING
textid = ZCX_TRAVELS_CONS_XXX=>query_fail
previous = lx_gateway.
ENDTRY.
ENDMETHOD.
ENDCLASS.
Hecho
Inicie sesión para responder la pregunta
Paso 5: implementar el método SELECT en la clase de implementación de la consulta
Agregue las variables que desee al
DATA
declaración.lt_travel
la tabla interna de la entidad abstracta generada,ZTRAVEL
oZTRAVEL+10-digit-GUID
, creado en el tutorial Crear modelo de consumo de servicios. Los datos del servicio remoto se escribirán en esa tabla.lt_travel_ce
la tabla interna de la entidad personalizada,zce_travels_xxx
, creado en el paso 3 anterior. Esta tabla se utiliza para completar el parámetro de salida del método seleccionado.
"""Define variables IF io_request->is_data_requested( ). DATA: "abstract entity; receives data from remote servce lt_travel TYPE STANDARD TABLE OF ZTRAVEL, "custom entity; fills output param of SELECT lt_travel_ce TYPE STANDARD TABLE OF zce_travel_data_pmd. ENDIF.Obtenga los datos de un objeto de respuesta de servicio remoto y escriba en
lt_travel
."""Get data lo_response->get_business_data( IMPORTING et_business_data = lt_travel ).
Ambos
lt_travel
devolver entradas, proporcionar mapeo para aquellos elementos en la entidad personalizada que no coinciden con los nombres de los elementos abstractos de la entidad; en este caso, Suelte."""Check if lt_travel returns entries; map elements IF lt_travel IS NOT INITIAL. lt_travel_ce = CORRESPONDING #( lt_travel MAPPING description = memo calculatedetag = lastchangedat ). ENDIF.
Establecer detalles de devolución.
"""Set return data io_response->set_data( lt_travel_ce ). ENDIF.
Guardar y activar (
Ctrl+S, Ctrl+F3
) la clase.
Hecho
Inicie sesión para responder la pregunta
Paso 6: Verifique el código para la clase de ejecución de la consulta
CLASS zcl_travels_xxx DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES if_rap_query_provider.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_travels_xxx IMPLEMENTATION.
METHOD if_rap_query_provider~select.
"""Instantiate Client Proxy
DATA(lo_client_proxy) = zcl_proxy_travels_xxx=>get_client_proxy( ).
TRY.
""" Instantiate Client Proxy
""" Create Read Request
DATA(lo_read_request) = lo_client_proxy->create_resource_for_entity_set( 'TRAVEL' )->create_request_for_read( ).
""" Request Inline Count
IF io_request->is_total_numb_of_rec_requested( ).
io_response->set_total_number_of_records( lo_response->get_count( ) ).
ENDIF.
""" Implement Paging
DATA(ls_paging) = io_request->get_paging( ).
IF ls_paging->get_offset( ) >= 0.
lo_read_request->set_skip( ls_paging->get_offset( ) ).
ENDIF.
IF ls_paging->get_page_size( ) <> if_rap_query_paging=>page_size_unlimited.
lo_read_request->set_top( ls_paging->get_page_size( ) ).
""" Execute the Request
DATA(lo_response) = lo_read_request->execute( ).
ENDIF.
""" Define variables
IF io_request->is_data_requested( ).
DATA:
"abstract entity; receives data from remote service
lt_travel TYPE STANDARD TABLE OF ztravelf7fb77ae54,
"custom entity; fills output param of SELECT
lt_travel_ce TYPE STANDARD TABLE OF zce_travel_data_pmd,
"local db table
lt_traveladd TYPE STANDARD TABLE OF zttravels_pmd.
""" Get data from response object
lo_response->get_business_data( IMPORTING et_business_data = lt_travel ).
""" Check if lt_travel returns entries, then pass data to internal table for custom entity
IF lt_travel IS NOT INITIAL.
lt_travel_ce = CORRESPONDING #( lt_travel MAPPING description = memo calculatedetag = lastchangedat ).
ENDIF.
""" Set return data
io_response->set_data( lt_travel_ce ).
ENDIF.
CATCH /iwbep/cx_gateway INTO DATA(lx_gateway).
RAISE EXCEPTION TYPE ZCX_TRAVELS_CONS_XXX
EXPORTING
textid = ZCX_TRAVELS_CONS_XXX=>query_fail
previous = lx_gateway.
ENDTRY.
ENDMETHOD.
ENDCLASS.
Hecho
Inicie sesión para responder la pregunta
Paso 7: crea una carpeta de servicios
Elija su definición de servicio,
ZCE_TRAVEL_DATA_XXX
, creado en el tutorial Crear modelo de consumo de servicios y seleccione Nuevo> Crear conexión de servicio desde el menú contextual.En el asistente:
- Ingrese su nombre:
Z_BIND_TRAVELS_XXX
y descripción Servicio de viaje conectado - Ingrese el tipo de encuadernación:
ODATA V2 - Web API
- Escoger Hacia adelante
- Ingrese su nombre:
Acepte la solicitud de transporte y seleccione Finalizar.
La carpeta de servicios se abre en un nuevo editor.
Escoger Activar.
A la izquierda está la Definición de servicio,
ZCE_TRAVEL_DATA_XXX
.
En el lado derecho, el servicio está activo, incluida la Serie de entidades y la URL del servicio.Seleccionar el conjunto de entidades Viajar y seleccione Avance.
Aparece una vista previa de Fiori Elements para su servicio remoto de OData en el navegador, pero sin datos.
Escoger Configuración> Seleccionar todo> Aceptar, luego seleccione Vamos.
Su vista previa de Fiori Elements debería verse así:
Hecho
Inicie sesión para responder la pregunta
Paso 8: refina la interfaz de usuario
Si los detalles son visibles, ahora puede mejorar la apariencia de su vista previa.
Muestra automáticamente los encabezados de las cinco primeras columnas cuando aparece la aplicación (sin tener que seleccionarlos en la configuración), agregando las siguientes notas:
@UI.lineItem: [ { position: 10 } ] key TravelID : abap.numc( 8 ); @UI.lineItem: [ { position: 20 } ] AgencyID : abap.numc( 6 ); @UI.lineItem: [ { position: 30 } ] CustomerID : abap.numc( 6 ); @UI.lineItem: [ { position: 40, label: 'Start Date'} ] BeginDate : rap_cp_odata_v2_edm_datetime; @UI.lineItem: [ { position: 50, label: 'End Date'} ] EndDate : rap_cp_odata_v2_edm_datetime;
Ambos títulos
RESTful
Registro ABAP: Tipo de datos… que es feo. Cámbialos a Fecha de inicio y Fecha de cierre agregando etiquetas, de la siguiente manera:@UI.lineItem: [ { position: 40, label: 'Start Date'} ] BeginDate : rap_cp_odata_v2_edm_datetime; @UI.lineItem: [ { position: 50, label: 'End Date'} ] EndDate : rap_cp_odata_v2_edm_datetime;
Hecho
Inicie sesión para responder la pregunta
Paso 9: verifique el código de sus entidades personalizadas
Su código ahora debería verse así.
@EndUserText.label: 'Travel data custom entity in PMD'
@ObjectModel.query.implementedBy: 'ABAP:ZCL_TRAVELS_PMD'
define custom entity ZCE_TRAVEL_DATA_PMD
{
@UI.lineItem: [ { position: 10 } ]
key TravelID : abap.numc( 8 );
@UI.lineItem: [ { position: 20 } ]
AgencyID : abap.numc( 6 );
@UI.lineItem: [ { position: 30 } ]
CustomerID : abap.numc( 6 );
@UI.lineItem: [ { position: 40, label: 'Start Date'} ]
BeginDate : rap_cp_odata_v2_edm_datetime;
@UI.lineItem: [ { position: 50, label: 'End Date'} ]
EndDate : rap_cp_odata_v2_edm_datetime;
@Semantics.amount.currencyCode: 'CurrencyCode'
BookingFee : abap.dec( 17, 3 );
@Semantics.amount.currencyCode: 'CurrencyCode'
TotalPrice : abap.dec( 17, 3 );
@Semantics.currencyCode: true
CurrencyCode : abap.cuky( 5 );
Description : abap.char( 1024 ); //renamed element
Status : abap.char( 1 );
LastChangedAt : tzntstmpl;
CalculatedEtag : abap.string( 0 );
}
Se debería abrir una vista previa de los elementos de SAP Fiori con este aspecto.
Hecho
Inicie sesión para responder la pregunta
Paso 11: clase de mensaje de prueba (opcional)
Puede probar su clase de mensaje, por ejemplo, indicando el valor i_service_instance_name
en la clase zcl_proxy_travels_xx2
y convertirlo a un valor que no existe.
Cuando ejecuta la aplicación, seleccionando Vamos en la vista previa de Fiori Elements, debería recibir un mensaje de error como este:
Hecho
Inicie sesión para responder la pregunta
Paso 12: Desinfección
Si tiene problemas, puede realizar un seguimiento del flujo de sus aplicaciones en ABAP Debugger.
Por ejemplo, establezca un destino en esta declaración:
lt_travel_ce = CORRESPONDING #( lt_travel MAPPING description = memo calculatedetag = lastchangedat ).
Luego verá si ambas tablas internas están llenas.
Hecho
Inicie sesión para responder la pregunta