Skip to content

Latest commit

 

History

History
495 lines (489 loc) · 19.8 KB

File metadata and controls

495 lines (489 loc) · 19.8 KB

RAP BO Generation

The following code sample illustrates how a complete RAP business object, starting from domains for fixed values all the way up to a service binding, can be generated with the XCO Generation APIs:

Sample Code:

"! Code sample for executing PUT operations to generate a full RAP business object.
"!
"! IMPORTANT: The values of the constants CO_PACKAGE and CO_TRANSPORT must be replaced
"! with an existing package and a modifiable Workbench transport matching the transport
"! target of the package.
CLASS zcl_xco_doc_cp_cs_gen_put DEFINITION PUBLIC FINAL
    INHERITING FROM cl_xco_cp_adt_simple_classrun CREATE PUBLIC.
  PUBLIC SECTION.
    METHODS:
      constructor.

  PROTECTED SECTION.
    METHODS:
      main REDEFINITION.

  PRIVATE SECTION.
    CONSTANTS:
      co_package               TYPE sxco_package VALUE 'ZXCO_CP_PACKAGE',
      co_transport             TYPE sxco_transport VALUE 'X08K900164',

      co_doma_status           TYPE sxco_ad_object_name VALUE 'ZXCO_CP_VR_STATUS',
      co_dtel_status           TYPE sxco_ad_object_name VALUE 'ZXCO_CP_VR_STATUS',
      co_tabl_dbt_name         TYPE sxco_dbt_object_name VALUE 'ZXCO_CP_VAC_REQ',
      co_ddls_interface_name   TYPE sxco_cds_object_name VALUE 'ZXCO_CP_I_VACATION_REQUEST',
      co_ddls_consumption_name TYPE sxco_cds_object_name VALUE 'ZXCO_CP_C_VACATION_REQUEST',
      co_ddlx_name             TYPE sxco_cds_object_name VALUE 'ZXCO_CP_VACATION_REQUEST_EXT',
      co_dcls_name             TYPE sxco_cds_object_name VALUE 'ZXCO_CP_VACTION_REQUEST_AC',
      co_clas_name             TYPE sxco_ad_object_name VALUE 'ZXCO_CP_BP_VACATION_REQUEST',
      co_srvd_name             TYPE sxco_srvd_object_name VALUE 'ZXCO_CP_VAC_REQ_SRVD',
      co_srvb_name             TYPE sxco_srvb_object_name VALUE 'ZXCO_CP_VAC_REQ_SRVB'.

    DATA:
      mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system.

    METHODS:
      add_doma
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_dtel
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_tabl_dbt
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_ddls
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_ddlx
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_dcls
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_bdef
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_clas
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      add_srvd
        IMPORTING
          io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put,

      put_srvb.
ENDCLASS.

CLASS zcl_xco_doc_cp_cs_gen_put IMPLEMENTATION.
  METHOD constructor.
    super->constructor( ).

    mo_environment = xco_cp_generation=>environment->dev_system( co_transport ).
  ENDMETHOD.

  METHOD main.
    DATA(lo_put_operation) = mo_environment->create_put_operation( ).

    add_doma( lo_put_operation ).
    add_dtel( lo_put_operation ).
    add_tabl_dbt( lo_put_operation ).
    add_ddls( lo_put_operation ).
    add_ddlx( lo_put_operation ).
    add_dcls( lo_put_operation ).
    add_bdef( lo_put_operation ).
    add_clas( lo_put_operation ).
    add_srvd( lo_put_operation ).

    lo_put_operation->execute( ).

    put_srvb( ).

    out->write( |PUT operations executed successfully.| ).
  ENDMETHOD.

  METHOD add_doma.
    DATA(lo_specification) = io_put_operation->for-doma->add_object( co_doma_status
      )->set_package( co_package
      )->create_form_specification( ).
    lo_specification->set_short_description( 'Vacation request status' ).

    lo_specification->set_format( xco_cp_abap_dictionary=>built_in_type->char( 10 ) ).

    lo_specification->fixed_values->add_fixed_value( 'APPROVED'
      )->set_description( 'Approved' ).
    lo_specification->fixed_values->add_fixed_value( 'DECLINED'
      )->set_description( 'Declined' ).
  ENDMETHOD.

  METHOD add_dtel.
    DATA(lo_specification) = io_put_operation->for-dtel->add_object( co_dtel_status
      )->set_package( co_package
      )->create_form_specification( ).
    lo_specification->set_short_description( 'Vacation request status' ).

    lo_specification->set_data_type( xco_cp_abap_dictionary=>domain( co_doma_status ) ).
  ENDMETHOD.

  METHOD add_tabl_dbt.
    DATA(lo_specification) = io_put_operation->for-tabl-for-database_table->add_object( co_tabl_dbt_name
      )->set_package( co_package
      )->create_form_specification( ).
    lo_specification->set_short_description( 'Vacation request'
      )->set_delivery_class( xco_cp_database_table=>delivery_class->a
      )->set_data_maintenance( xco_cp_database_table=>data_maintenance->allowed ).

    lo_specification->add_field( 'CLIENT' )->set_type( xco_cp_abap_dictionary=>built_in_type->clnt
      )->set_key_indicator(
      )->set_not_null( ).
    lo_specification->add_field( 'IDENTIFIER' )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 30 )
      )->set_key_indicator(
      )->set_not_null( ).
    lo_specification->add_field( 'START_DATE' )->set_type( xco_cp_abap_dictionary=>built_in_type->dats ).
    lo_specification->add_field( 'END_DATE' )->set_type( xco_cp_abap_dictionary=>built_in_type->dats ).
    lo_specification->add_field( 'STATUS' )->set_type( xco_cp_abap_dictionary=>data_element( co_dtel_status ) ).
    lo_specification->add_field( 'IS_ACTIVE' )->set_type( xco_cp_abap_dictionary=>data_element( 'ABAP_BOOLEAN' ) ).
  ENDMETHOD.

  METHOD add_ddls.
    DATA(lo_interface_specification) = io_put_operation->for-ddls->add_object( co_ddls_interface_name
      )->set_package( co_package
      )->create_form_specification( ).

    DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Vacation request'
      )->add_view_entity( ).
    lo_view_entity->set_root( )->data_source->set_view_entity( CONV #( co_tabl_dbt_name ) ).
    lo_view_entity->set_where( xco_cp_ddl=>field( 'is_active' )->eq( xco_cp_ddl=>literal->character( 'X' ) ) ).

    " View annotations.
    lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ).
    lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Vacation request view entity' ).
    lo_view_entity->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ).

    " Add fields.
    DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'identifier' ) )->set_key( )->set_alias( 'Identifier' ).
    lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Identifier' ).

    lo_view_entity->add_field( xco_cp_ddl=>field( 'start_date' ) )->set_alias( 'StartDate' ).
    lo_view_entity->add_field( xco_cp_ddl=>field( 'end_date' ) )->set_alias( 'EndDate' ).
    lo_view_entity->add_field( xco_cp_ddl=>field( 'status' ) )->set_alias( 'Status' ).

    DATA(lo_consumption_specification) = io_put_operation->for-ddls->add_object( co_ddls_consumption_name
      )->set_package( co_package
      )->create_form_specification( ).

    DATA(lo_projection_view) = lo_consumption_specification->set_short_description( 'Vacation request projection'
      )->add_projection_view( ).
    lo_projection_view->set_root( ).
    lo_projection_view->data_source->set_view_entity( co_ddls_interface_name ).

    lo_projection_view->add_field( xco_cp_ddl=>field( 'Identifier' ) )->set_key( ).
    lo_projection_view->add_field( xco_cp_ddl=>field( 'StartDate' ) ).
    lo_projection_view->add_field( xco_cp_ddl=>field( 'EndDate' ) ).
    lo_projection_view->add_field( xco_cp_ddl=>field( 'Status' ) ).
  ENDMETHOD.

  METHOD add_ddlx.
    DATA(lo_specification) = io_put_operation->for-ddlx->add_object( co_ddlx_name
      )->set_package( co_package
      )->create_form_specification( ).

    lo_specification->set_short_description( 'Vacation request extension'
      )->set_layer( xco_cp_metadata_extension=>layer->customer
      )->set_view( co_ddls_interface_name ).

    " UI annotations.
    TYPES:
      BEGIN OF ts_field,
        name  TYPE sxco_cds_field_name,
        label TYPE string,
      END OF ts_field,

      tt_field TYPE STANDARD TABLE OF ts_field WITH EMPTY KEY.

    DATA(lt_fields) = VALUE tt_field(
      ( name = 'Identifier' label = 'Identifier' )
      ( name = 'StartDate' label = 'Start Date' )
      ( name = 'EndDate' label = 'End Date' )
      ( name = 'Status' label = 'Status' )
    ).

    LOOP AT lt_fields INTO DATA(ls_field).
      DATA(lv_position) = sy-tabix * 10.

      DATA(lo_field) = lo_specification->add_field( ls_field-name ).
      lo_field->add_annotation( 'UI.lineItem' )->value->build(
        )->begin_array(
          )->begin_record(
            )->add_member( 'position' )->add_number( lv_position
            )->add_member( 'label' )->add_string( ls_field-label
          )->end_record(
        )->end_array( ).

      lo_field->add_annotation( 'UI.identification' )->value->build(
        )->begin_array(
          )->begin_record(
            )->add_member( 'position' )->add_number( lv_position
            )->add_member( 'label' )->add_string( ls_field-label
          )->end_record(
        )->end_array( ).
    ENDLOOP.
  ENDMETHOD.

  METHOD add_dcls.
    DATA(lo_specification) = io_put_operation->for-dcls->add_object( co_dcls_name
      )->set_package( co_package
      )->create_form_specification( ).
    lo_specification->set_short_description( 'Vacation request access control' ).

    DATA(lo_role) = lo_specification->add_role( ).
    lo_role->add_annotation( 'MappingRole' )->value->build(
      )->add_boolean( abap_true ).
    lo_role->add_access_rule( co_ddls_interface_name
      )->set_where( xco_cp_dcl=>field( 'Identifier' )->is_not_initial( ) ).
  ENDMETHOD.

  METHOD add_bdef.
    DATA(lo_interface_specification) = io_put_operation->for-bdef->add_object( co_ddls_interface_name
      )->set_package( co_package
      )->create_form_specification( ).
    lo_interface_specification->set_short_description( 'Vacation request behavior'
      )->set_implementation_type( xco_cp_behavior_definition=>implementation_type->managed
      )->set_implementation_class( co_clas_name ).

    DATA(lo_interface_behavior) = lo_interface_specification->add_behavior( ).

    " Characteristics.
    lo_interface_behavior->characteristics->set_persistent_table( co_tabl_dbt_name
      )->lock->set_master( ).

    " Fields.
    lo_interface_behavior->add_mapping_for( co_tabl_dbt_name )->set_field_mapping( VALUE #(
      ( cds_view_field = 'Identifier' dbtable_field = 'identifier' )
      ( cds_view_field = 'StartDate' dbtable_field = 'start_date' )
      ( cds_view_field = 'EndDate' dbtable_field = 'end_date' )
      ( cds_view_field = 'Status' dbtable_field = 'status' )
    ) ).

    " Standard operations.
    lo_interface_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create ).
    lo_interface_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update ).
    lo_interface_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete ).

    " Action.
    DATA(lo_action) = lo_interface_behavior->add_action( 'approve' ).
    lo_action->set_external_name( 'Approve' ).
    lo_action->result->set_cardinality( xco_cp_cds=>cardinality->one )->set_self( ).

    DATA(lo_consumption_specification) = io_put_operation->for-bdef->add_object( co_ddls_consumption_name
      )->set_package( co_package
      )->create_form_specification( ).
    lo_consumption_specification->set_short_description( 'Vacation request behavior projection'
      )->set_implementation_type( xco_cp_behavior_definition=>implementation_type->projection ).

    DATA(lo_consumption_behavior) = lo_consumption_specification->add_behavior( ).
    lo_consumption_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create
      )->set_use( ).
    lo_consumption_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update
      )->set_use( ).
    lo_consumption_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete
      )->set_use( ).
  ENDMETHOD.

  METHOD add_clas.
    DATA(lo_specification) = io_put_operation->for-clas->add_object( co_clas_name
      )->set_package( co_package
      )->create_form_specification( ).
    lo_specification->set_short_description( 'Behavior implementation' ).

    lo_specification->definition->set_abstract(
      )->set_for_behavior_of( co_ddls_interface_name ).

    DATA(lo_handler) = lo_specification->add_local_class( 'LCL_HANDLER' ).
    lo_handler->definition->set_superclass( 'CL_ABAP_BEHAVIOR_HANDLER' ).

    " Action implementation.
    DATA(lo_publish) = lo_handler->definition->section-private->add_method( 'APPROVE' ).
    lo_publish->behavior_implementation->set_for_modify(
      )->set_result( co_ddls_interface_name ).
    lo_publish->add_importing_parameter( 'IT_VACATION_REQUESTS'
      )->behavior_implementation->set_for_action(
        iv_entity_name = co_ddls_interface_name
        iv_action_name = 'approve'
    ).

    lo_handler->implementation->add_method( 'APPROVE' ).
  ENDMETHOD.

  METHOD add_srvd.
    DATA(lo_specification) = io_put_operation->for-srvd->add_object( co_srvd_name
      )->set_package( co_package
      )->create_form_specification( ).
    lo_specification->set_short_description( 'Service definition' ).

    lo_specification->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Vacation request service definition' ).
    lo_specification->add_exposure( co_ddls_consumption_name )->set_alias( 'VacationRequest' ).
  ENDMETHOD.

  METHOD put_srvb.
    DATA(lo_put_operation) = mo_environment->for-srvb->create_put_operation( ).

    DATA(lo_specification) = lo_put_operation->add_object( co_srvb_name
      )->set_package( co_package
      )->create_form_specification( ).
    lo_specification->set_short_description( 'Service binding' ).

    lo_specification->set_binding_type( xco_cp_service_binding=>binding_type->odata_v2_ui ).
    lo_specification->add_service( )->add_version( '0001' )->set_service_definition( co_srvd_name ).

    lo_put_operation->execute( ).
  ENDMETHOD.
ENDCLASS.

All objects generated with the previous code sample can also be deleted again:

Sample Code:

"! Code sample for executing DELETE operations to delete all objects of a full RAP business
"! object.
"!
"! IMPORTANT: The value of the constant CO_TRANSPORT must be replaced with a modifiable Workbench
"! transport matching the transport target of the package containing the objects.
CLASS zcl_xco_doc_cp_cs_gen_delete DEFINITION PUBLIC FINAL
    INHERITING FROM cl_xco_cp_adt_simple_classrun CREATE PUBLIC.
  PUBLIC SECTION.
    METHODS:
      constructor.

  PROTECTED SECTION.
    METHODS:
      main REDEFINITION.

  PRIVATE SECTION.
    CONSTANTS:
      co_transport             TYPE sxco_transport VALUE 'X08K900164',

      co_doma_status           TYPE sxco_ad_object_name VALUE 'ZXCO_CP_VR_STATUS',
      co_dtel_status           TYPE sxco_ad_object_name VALUE 'ZXCO_CP_VR_STATUS',
      co_tabl_dbt_name         TYPE sxco_dbt_object_name VALUE 'ZXCO_CP_VAC_REQ',
      co_ddls_interface_name   TYPE sxco_cds_object_name VALUE 'ZXCO_CP_I_VACATION_REQUEST',
      co_ddls_consumption_name TYPE sxco_cds_object_name VALUE 'ZXCO_CP_C_VACATION_REQUEST',
      co_ddlx_name             TYPE sxco_cds_object_name VALUE 'ZXCO_CP_VACATION_REQUEST_EXT',
      co_dcls_name             TYPE sxco_cds_object_name VALUE 'ZXCO_CP_VACTION_REQUEST_AC',
      co_clas_name             TYPE sxco_ad_object_name VALUE 'ZXCO_CP_BP_VACATION_REQUEST',
      co_srvd_name             TYPE sxco_srvd_object_name VALUE 'ZXCO_CP_VAC_REQ_SRVD',
      co_srvb_name             TYPE sxco_srvb_object_name VALUE 'ZXCO_CP_VAC_REQ_SRVB'.

    DATA:
      mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system.

    METHODS:
      delete_srvb,

      delete_srvd,

      delete_clas,

      delete_bdef,

      delete_dcls,

      delete_ddlx,

      delete_ddls,

      delete_tabl_dbt,

      delete_dtel,

      delete_doma.
ENDCLASS.

CLASS zcl_xco_doc_cp_cs_gen_delete IMPLEMENTATION.
  METHOD constructor.
    super->constructor( ).

    mo_environment = xco_cp_generation=>environment->dev_system( co_transport ).
  ENDMETHOD.

  METHOD main.
    DATA(lo_put_operation) = mo_environment->create_put_operation( ).

    delete_srvb( ).
    delete_srvd( ).
    delete_clas( ).
    delete_bdef( ).
    delete_dcls( ).
    delete_ddlx( ).
    delete_ddls( ).
    delete_tabl_dbt( ).
    delete_dtel( ).
    delete_doma( ).

    out->write( |DELETE operations executed successfully.| ).
  ENDMETHOD.

  METHOD delete_srvb.
    DATA(lo_delete_operation) = mo_environment->for-srvb->create_delete_operation( ).
    lo_delete_operation->add_object( co_srvb_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_srvd.
    DATA(lo_delete_operation) = mo_environment->for-srvd->create_delete_operation( ).
    lo_delete_operation->add_object( co_srvd_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_clas.
    DATA(lo_delete_operation) = mo_environment->for-clas->create_delete_operation( ).
    lo_delete_operation->add_object( co_clas_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_bdef.
    DATA(lo_delete_operation) = mo_environment->for-bdef->create_delete_operation( ).
    lo_delete_operation->add_object( co_ddls_consumption_name ).
    lo_delete_operation->add_object( co_ddls_interface_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_dcls.
    DATA(lo_delete_operation) = mo_environment->for-dcls->create_delete_operation( ).
    lo_delete_operation->add_object( co_dcls_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_ddlx.
    DATA(lo_delete_operation) = mo_environment->for-ddlx->create_delete_operation( ).
    lo_delete_operation->add_object( co_ddlx_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_ddls.
    DATA(lo_delete_operation) = mo_environment->for-ddls->create_delete_operation( ).
    lo_delete_operation->add_object( co_ddls_consumption_name ).
    lo_delete_operation->add_object( co_ddls_interface_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_tabl_dbt.
    DATA(lo_delete_operation) = mo_environment->for-tabl-for-database_table->create_delete_operation( ).
    lo_delete_operation->add_object( co_tabl_dbt_name ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_dtel.
    DATA(lo_delete_operation) = mo_environment->for-dtel->create_delete_operation( ).
    lo_delete_operation->add_object( co_dtel_status ).
    lo_delete_operation->execute( ).
  ENDMETHOD.

  METHOD delete_doma.
    DATA(lo_delete_operation) = mo_environment->for-doma->create_delete_operation( ).
    lo_delete_operation->add_object( co_doma_status ).
    lo_delete_operation->execute( ).
  ENDMETHOD.
ENDCLASS.