Saltar al contenido

Implementar una clase de implementación personalizada y consultas de CDS

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.

  1. En ADT, abra su paquete Z_A4C_TO_A4C_XX2 y seleccione Nuevo> Clase.

  2. Ingrese nombre y descripción:

    • ZCL_TRAVELS_XXX
    • Obtenga detalles de viaje del sistema A4C
  3. 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.

  1. Aplique la interfaz agregando esta declaración a la sección pública:

    INTERFACES if_rap_query_provider.

  2. Escoger Arreglo rapido (Ctrl+1), luego seleccione Implementar para SELECT….

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

  1. Abra su entidad CDS personalizada ZCE_TRAVEL_DATA_XXX, creado en Crear modelo de consumo de servicios.

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

  1. Agregue las variables que desee al DATA declaración.

    • lt_travel la tabla interna de la entidad abstracta generada, ZTRAVEL o ZTRAVEL+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.
  2. 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 ).
    
    
  3. 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.
    
    
  4. Establecer detalles de devolución.

    """Set return data
    io_response->set_data( lt_travel_ce ).
    ENDIF.
    
    
  5. 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

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

    step2a-crear-servicio-enlace

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

    asistente step2b-create-sb-draoi

  3. Acepte la solicitud de transporte y seleccione Finalizar.

    La carpeta de servicios se abre en un nuevo editor.

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

  5. Seleccionar el conjunto de entidades Viajar y seleccione Avance.

    step7b-service-binding-editor

    Aparece una vista previa de Fiori Elements para su servicio remoto de OData en el navegador, pero sin datos.

  6. Escoger Configuración> Seleccionar todo> Aceptar, luego seleccione Vamos.

    Su vista previa de Fiori Elements debería verse así:

    ceum7c-fiori

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.

  1. 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;
    
    
  2. 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.

grado9-fiori-mejorado

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:

paso 11-error

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.

  1. Por ejemplo, establezca un destino en esta declaración:

    lt_travel_ce = CORRESPONDING #( lt_travel MAPPING description = memo calculatedetag = lastchangedat ).

  2. Luego verá si ambas tablas internas están llenas.

    paso12-depurador-lt_travel

Hecho

Inicie sesión para responder la pregunta

más información