From 90dee9e6e84540b69814683fc3d91d362a0a0105 Mon Sep 17 00:00:00 2001 From: "Shadow (gastown)" Date: Sat, 4 Apr 2026 23:21:16 +0000 Subject: [PATCH 1/2] feat: add CDS and RAP examples --- src/ddic/ddls/zage_cds_projection.ddls.asddls | 10 ++++++++ src/ddic/ddls/zage_cds_projection.ddls.xml | 19 +++++++++++++++ src/ddic/ddls/zage_cds_sample.ddls.asddls | 10 ++++++++ src/ddic/ddls/zage_cds_sample.ddls.xml | 19 +++++++++++++++ src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs | 12 ++++++++++ src/ddic/ddlx/zage_ddlx_sample.ddlx.xml | 20 ++++++++++++++++ src/rap/zage_c_rap_sample.ddls.asddls | 8 +++++++ src/rap/zage_c_rap_sample.ddls.xml | 19 +++++++++++++++ src/rap/zage_rap_sample.bdef.asbdef | 24 +++++++++++++++++++ src/rap/zage_rap_sample.bdef.xml | 18 ++++++++++++++ src/rap/zage_rap_sample.sbtt.xml | 18 ++++++++++++++ src/rap/zcl_age_rap_sample.clas.abap | 21 ++++++++++++++++ src/rap/zcl_age_rap_sample.clas.xml | 17 +++++++++++++ 13 files changed, 215 insertions(+) create mode 100644 src/ddic/ddls/zage_cds_projection.ddls.asddls create mode 100644 src/ddic/ddls/zage_cds_projection.ddls.xml create mode 100644 src/ddic/ddls/zage_cds_sample.ddls.asddls create mode 100644 src/ddic/ddls/zage_cds_sample.ddls.xml create mode 100644 src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs create mode 100644 src/ddic/ddlx/zage_ddlx_sample.ddlx.xml create mode 100644 src/rap/zage_c_rap_sample.ddls.asddls create mode 100644 src/rap/zage_c_rap_sample.ddls.xml create mode 100644 src/rap/zage_rap_sample.bdef.asbdef create mode 100644 src/rap/zage_rap_sample.bdef.xml create mode 100644 src/rap/zage_rap_sample.sbtt.xml create mode 100644 src/rap/zcl_age_rap_sample.clas.abap create mode 100644 src/rap/zcl_age_rap_sample.clas.xml diff --git a/src/ddic/ddls/zage_cds_projection.ddls.asddls b/src/ddic/ddls/zage_cds_projection.ddls.asddls new file mode 100644 index 0000000..5eedebb --- /dev/null +++ b/src/ddic/ddls/zage_cds_projection.ddls.asddls @@ -0,0 +1,10 @@ +@AccessControl.authorizationCheck: #NOT_REQUIRED +@EndUserText.label: 'AGE Sample CDS Projection View' +@Metadata.ignorePropagatedAnnotations: true +define view ZAGE_C_PROJECTION + as select from ZAGE_I_SAMPLE +{ + key client, + Client, + IsActiveEntity +} \ No newline at end of file diff --git a/src/ddic/ddls/zage_cds_projection.ddls.xml b/src/ddic/ddls/zage_cds_projection.ddls.xml new file mode 100644 index 0000000..4d9b004 --- /dev/null +++ b/src/ddic/ddls/zage_cds_projection.ddls.xml @@ -0,0 +1,19 @@ + + + + + + ZAGE_CDS_PROJECTION + E + + + DEVELOPER + 20240101 + + + AGE Sample CDS Projection View + EP + + + + \ No newline at end of file diff --git a/src/ddic/ddls/zage_cds_sample.ddls.asddls b/src/ddic/ddls/zage_cds_sample.ddls.asddls new file mode 100644 index 0000000..18d0035 --- /dev/null +++ b/src/ddic/ddls/zage_cds_sample.ddls.asddls @@ -0,0 +1,10 @@ +@AccessControl.authorizationCheck: #CHECK +@EndUserText.label: 'AGE Sample CDS View' +define view ZAGE_I_SAMPLE + as select from zage_tabl +{ + key client, + key mandt as Client, + @ObjectModel.virtualElement: true + cast('X' as abap.char(1)) as IsActiveEntity +} \ No newline at end of file diff --git a/src/ddic/ddls/zage_cds_sample.ddls.xml b/src/ddic/ddls/zage_cds_sample.ddls.xml new file mode 100644 index 0000000..62fa1ec --- /dev/null +++ b/src/ddic/ddls/zage_cds_sample.ddls.xml @@ -0,0 +1,19 @@ + + + + + + ZAGE_CDS_SAMPLE + E + + + DEVELOPER + 20240101 + + + AGE Sample CDS View + EP + + + + \ No newline at end of file diff --git a/src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs b/src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs new file mode 100644 index 0000000..927d3ca --- /dev/null +++ b/src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs @@ -0,0 +1,12 @@ +@Metadata.layer: #CORE +@UI: { + headerInfo: { + typeName: 'Sample', + typeNamePlural: 'Samples' + } +} +annotate view ZAGE_C_PROJECTION with +{ + @UI.lineItem: [{ position: 10 }] + Client; +} \ No newline at end of file diff --git a/src/ddic/ddlx/zage_ddlx_sample.ddlx.xml b/src/ddic/ddlx/zage_ddlx_sample.ddlx.xml new file mode 100644 index 0000000..30ba374 --- /dev/null +++ b/src/ddic/ddlx/zage_ddlx_sample.ddlx.xml @@ -0,0 +1,20 @@ + + + + + + ZAGE_DDLX_SAMPLE + E + + + DEVELOPER + 20240101 + + + AGE Sample CDS Metadata Extension + ZAGE_C_PROJECTION + EP + + + + \ No newline at end of file diff --git a/src/rap/zage_c_rap_sample.ddls.asddls b/src/rap/zage_c_rap_sample.ddls.asddls new file mode 100644 index 0000000..96405b4 --- /dev/null +++ b/src/rap/zage_c_rap_sample.ddls.asddls @@ -0,0 +1,8 @@ +@EndUserText.label: 'AGE Sample RAP Projection' +@ObjectModel.result: #FIRST_ENTITY +define view ZAGE_C_RAP_SAMPLE + as projection on ZAGE_C_PROJECTION +{ + key Client, + IsActiveEntity +} \ No newline at end of file diff --git a/src/rap/zage_c_rap_sample.ddls.xml b/src/rap/zage_c_rap_sample.ddls.xml new file mode 100644 index 0000000..e4a7cde --- /dev/null +++ b/src/rap/zage_c_rap_sample.ddls.xml @@ -0,0 +1,19 @@ + + + + + + ZAGE_C_RAP_SAMPLE + E + + + DEVELOPER + 20240101 + + + AGE Sample RAP Projection View + EP + + + + \ No newline at end of file diff --git a/src/rap/zage_rap_sample.bdef.asbdef b/src/rap/zage_rap_sample.bdef.asbdef new file mode 100644 index 0000000..c4103a3 --- /dev/null +++ b/src/rap/zage_rap_sample.bdef.asbdef @@ -0,0 +1,24 @@ +managed implementation in class ZCL_AGE_RAP_SAMPLE unique; + +define behavior for ZAGE_C_PROJECTION +persistent table zage_tabl +with additional save +lock master +authorization master ( instance ) +etag master LocalLastChangedAt +{ + field ( mandatory : create, readonly : update ) Client; + field ( readonly ) IsActiveEntity; + internal constructor. + + create; + update; + delete; + + validation validateData on save { field Client; } + + mapping for zage_tabl + { + Client = client; + } +} \ No newline at end of file diff --git a/src/rap/zage_rap_sample.bdef.xml b/src/rap/zage_rap_sample.bdef.xml new file mode 100644 index 0000000..6544006 --- /dev/null +++ b/src/rap/zage_rap_sample.bdef.xml @@ -0,0 +1,18 @@ + + + + + + ZAGE_RAP_SAMPLE + E + AGE Sample RAP Behavior Definition + + + DEVELOPER + 20240101 + + + + + + \ No newline at end of file diff --git a/src/rap/zage_rap_sample.sbtt.xml b/src/rap/zage_rap_sample.sbtt.xml new file mode 100644 index 0000000..9ea36d3 --- /dev/null +++ b/src/rap/zage_rap_sample.sbtt.xml @@ -0,0 +1,18 @@ + + + + + + E + ZAGE_RAP_SAMPLE + ZAGE_C_RAP_SAMPLE + JSON + E + AGE Sample RAP Service Binding + PROXY + 0000000000000000000000000000000000000000 + X + + + + \ No newline at end of file diff --git a/src/rap/zcl_age_rap_sample.clas.abap b/src/rap/zcl_age_rap_sample.clas.abap new file mode 100644 index 0000000..228a676 --- /dev/null +++ b/src/rap/zcl_age_rap_sample.clas.abap @@ -0,0 +1,21 @@ +CLASS zcl_age_rap_sample DEFINITION + FINAL + CREATE PUBLIC. + + PUBLIC SECTION. + INTERFACES if_oo_adt_classrun. + INTERFACES if_rap_query_provider. + PRIVATE SECTION. +ENDCLASS. + +CLASS zcl_age_rap_sample IMPLEMENTATION. + + METHOD if_oo_adt_classrun~main. + out->write( 'RAP Sample Implementation Class' ). + ENDMETHOD. + + METHOD if_rap_query_provider~select. + RETURN. + ENDMETHOD. + +ENDCLASS. \ No newline at end of file diff --git a/src/rap/zcl_age_rap_sample.clas.xml b/src/rap/zcl_age_rap_sample.clas.xml new file mode 100644 index 0000000..0e9cd67 --- /dev/null +++ b/src/rap/zcl_age_rap_sample.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_AGE_RAP_SAMPLE + E + AGE Sample RAP Behavior Implementation + 1 + X + X + X + 5 + + + + \ No newline at end of file From 18960ae472c0f8c46605cb70b6a0ebc63d6f2b36 Mon Sep 17 00:00:00 2001 From: "Shadow (gastown)" Date: Sat, 4 Apr 2026 23:25:32 +0000 Subject: [PATCH 2/2] fix: address code review feedback for CDS/RAP examples - Fix CDS view to use 'key client as Client' instead of 'key mandt as Client' - Add Name and Description fields to table and CDS views for meaningful RAP example - Implement validation method for validateData in behavior definition - Implement if_rap_query_provider~select with actual query logic - Add business data fields (Name, Description) to RAP projection view - Add field control modifiers to behavior definition - Remove unnecessary 'internal constructor' and 'with additional save' - Add LocalLastChangedAt field for RAP etag support - Add trailing newlines to all files Refs: 23e862e7 --- src/ddic/ddls/zage_cds_projection.ddls.asddls | 11 ++++ src/ddic/ddls/zage_cds_projection.ddls.xml | 19 +++++++ src/ddic/ddls/zage_cds_sample.ddls.asddls | 11 ++++ src/ddic/ddls/zage_cds_sample.ddls.xml | 19 +++++++ src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs | 12 ++++ src/ddic/ddlx/zage_ddlx_sample.ddlx.xml | 20 +++++++ src/ddic/tabl/zage_tabl.tabl.xml | 55 +++++++++++++++---- src/rap/zage_c_rap_sample.ddls.asddls | 10 ++++ src/rap/zage_c_rap_sample.ddls.xml | 19 +++++++ src/rap/zage_rap_sample.bdef.asbdef | 26 +++++++++ src/rap/zage_rap_sample.bdef.xml | 18 ++++++ src/rap/zage_rap_sample.sbtt.xml | 18 ++++++ src/rap/zcl_age_rap_sample.clas.abap | 39 +++++++++++++ src/rap/zcl_age_rap_sample.clas.xml | 17 ++++++ 14 files changed, 282 insertions(+), 12 deletions(-) create mode 100644 src/ddic/ddls/zage_cds_projection.ddls.asddls create mode 100644 src/ddic/ddls/zage_cds_projection.ddls.xml create mode 100644 src/ddic/ddls/zage_cds_sample.ddls.asddls create mode 100644 src/ddic/ddls/zage_cds_sample.ddls.xml create mode 100644 src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs create mode 100644 src/ddic/ddlx/zage_ddlx_sample.ddlx.xml create mode 100644 src/rap/zage_c_rap_sample.ddls.asddls create mode 100644 src/rap/zage_c_rap_sample.ddls.xml create mode 100644 src/rap/zage_rap_sample.bdef.asbdef create mode 100644 src/rap/zage_rap_sample.bdef.xml create mode 100644 src/rap/zage_rap_sample.sbtt.xml create mode 100644 src/rap/zcl_age_rap_sample.clas.abap create mode 100644 src/rap/zcl_age_rap_sample.clas.xml diff --git a/src/ddic/ddls/zage_cds_projection.ddls.asddls b/src/ddic/ddls/zage_cds_projection.ddls.asddls new file mode 100644 index 0000000..1bad84b --- /dev/null +++ b/src/ddic/ddls/zage_cds_projection.ddls.asddls @@ -0,0 +1,11 @@ +@AccessControl.authorizationCheck: #NOT_REQUIRED +@EndUserText.label: 'AGE Sample CDS Projection View' +@Metadata.ignorePropagatedAnnotations: true +define view ZAGE_C_PROJECTION + as select from ZAGE_I_SAMPLE +{ + key client, + key name, + description, + IsActiveEntity +} diff --git a/src/ddic/ddls/zage_cds_projection.ddls.xml b/src/ddic/ddls/zage_cds_projection.ddls.xml new file mode 100644 index 0000000..4d9b004 --- /dev/null +++ b/src/ddic/ddls/zage_cds_projection.ddls.xml @@ -0,0 +1,19 @@ + + + + + + ZAGE_CDS_PROJECTION + E + + + DEVELOPER + 20240101 + + + AGE Sample CDS Projection View + EP + + + + \ No newline at end of file diff --git a/src/ddic/ddls/zage_cds_sample.ddls.asddls b/src/ddic/ddls/zage_cds_sample.ddls.asddls new file mode 100644 index 0000000..1217ecd --- /dev/null +++ b/src/ddic/ddls/zage_cds_sample.ddls.asddls @@ -0,0 +1,11 @@ +@AccessControl.authorizationCheck: #CHECK +@EndUserText.label: 'AGE Sample CDS View' +define view ZAGE_I_SAMPLE + as select from zage_tabl +{ + key client, + key name as Name, + description as Description, + @ObjectModel.virtualElement: true + cast('X' as abap.char(1)) as IsActiveEntity +} diff --git a/src/ddic/ddls/zage_cds_sample.ddls.xml b/src/ddic/ddls/zage_cds_sample.ddls.xml new file mode 100644 index 0000000..62fa1ec --- /dev/null +++ b/src/ddic/ddls/zage_cds_sample.ddls.xml @@ -0,0 +1,19 @@ + + + + + + ZAGE_CDS_SAMPLE + E + + + DEVELOPER + 20240101 + + + AGE Sample CDS View + EP + + + + \ No newline at end of file diff --git a/src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs b/src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs new file mode 100644 index 0000000..927d3ca --- /dev/null +++ b/src/ddic/ddlx/zage_ddlx_sample.ddlx.asddlxs @@ -0,0 +1,12 @@ +@Metadata.layer: #CORE +@UI: { + headerInfo: { + typeName: 'Sample', + typeNamePlural: 'Samples' + } +} +annotate view ZAGE_C_PROJECTION with +{ + @UI.lineItem: [{ position: 10 }] + Client; +} \ No newline at end of file diff --git a/src/ddic/ddlx/zage_ddlx_sample.ddlx.xml b/src/ddic/ddlx/zage_ddlx_sample.ddlx.xml new file mode 100644 index 0000000..30ba374 --- /dev/null +++ b/src/ddic/ddlx/zage_ddlx_sample.ddlx.xml @@ -0,0 +1,20 @@ + + + + + + ZAGE_DDLX_SAMPLE + E + + + DEVELOPER + 20240101 + + + AGE Sample CDS Metadata Extension + ZAGE_C_PROJECTION + EP + + + + \ No newline at end of file diff --git a/src/ddic/tabl/zage_tabl.tabl.xml b/src/ddic/tabl/zage_tabl.tabl.xml index f9263b2..6ca52ab 100644 --- a/src/ddic/tabl/zage_tabl.tabl.xml +++ b/src/ddic/tabl/zage_tabl.tabl.xml @@ -20,18 +20,49 @@ N - - CLIENT - X - 0 - C - 000006 - X - CLNT - 000003 - CLNT - - + + CLIENT + X + 0 + C + 000006 + X + CLNT + 000003 + CLNT + + + NAME + X + 0 + C + 000040 + X + CHAR + 000020 + CHAR + + + DESCRIPTION + X + 0 + C + 000100 + X + CHAR + 000050 + CHAR + + + LOCALLASTCHANGEDAT + 0 + C + 000016 + LTST + 000014 + LRAW + + ZAGE_TABL diff --git a/src/rap/zage_c_rap_sample.ddls.asddls b/src/rap/zage_c_rap_sample.ddls.asddls new file mode 100644 index 0000000..1887527 --- /dev/null +++ b/src/rap/zage_c_rap_sample.ddls.asddls @@ -0,0 +1,10 @@ +@EndUserText.label: 'AGE Sample RAP Projection' +@ObjectModel.result: #FIRST_ENTITY +define view ZAGE_C_RAP_SAMPLE + as projection on ZAGE_C_PROJECTION +{ + key Client, + key Name, + Description, + IsActiveEntity +} diff --git a/src/rap/zage_c_rap_sample.ddls.xml b/src/rap/zage_c_rap_sample.ddls.xml new file mode 100644 index 0000000..e4a7cde --- /dev/null +++ b/src/rap/zage_c_rap_sample.ddls.xml @@ -0,0 +1,19 @@ + + + + + + ZAGE_C_RAP_SAMPLE + E + + + DEVELOPER + 20240101 + + + AGE Sample RAP Projection View + EP + + + + \ No newline at end of file diff --git a/src/rap/zage_rap_sample.bdef.asbdef b/src/rap/zage_rap_sample.bdef.asbdef new file mode 100644 index 0000000..a3ce78a --- /dev/null +++ b/src/rap/zage_rap_sample.bdef.asbdef @@ -0,0 +1,26 @@ +managed implementation in class ZCL_AGE_RAP_SAMPLE unique; + +strict ( 2 ); +define behavior for ZAGE_C_PROJECTION +persistent table zage_tabl +lock master +authorization master ( instance ) +etag master LocalLastChangedAt +{ + field ( mandatory : create, readonly : update ) Client; + field ( mandatory : create ) Name; + field ( readonly ) IsActiveEntity; + + create; + update; + delete; + + validation validateData on save { field Name; } + + mapping for zage_tabl + { + Client = client; + Name = name; + Description = description; + } +} diff --git a/src/rap/zage_rap_sample.bdef.xml b/src/rap/zage_rap_sample.bdef.xml new file mode 100644 index 0000000..6544006 --- /dev/null +++ b/src/rap/zage_rap_sample.bdef.xml @@ -0,0 +1,18 @@ + + + + + + ZAGE_RAP_SAMPLE + E + AGE Sample RAP Behavior Definition + + + DEVELOPER + 20240101 + + + + + + \ No newline at end of file diff --git a/src/rap/zage_rap_sample.sbtt.xml b/src/rap/zage_rap_sample.sbtt.xml new file mode 100644 index 0000000..9ea36d3 --- /dev/null +++ b/src/rap/zage_rap_sample.sbtt.xml @@ -0,0 +1,18 @@ + + + + + + E + ZAGE_RAP_SAMPLE + ZAGE_C_RAP_SAMPLE + JSON + E + AGE Sample RAP Service Binding + PROXY + 0000000000000000000000000000000000000000 + X + + + + \ No newline at end of file diff --git a/src/rap/zcl_age_rap_sample.clas.abap b/src/rap/zcl_age_rap_sample.clas.abap new file mode 100644 index 0000000..96dfffb --- /dev/null +++ b/src/rap/zcl_age_rap_sample.clas.abap @@ -0,0 +1,39 @@ +CLASS zcl_age_rap_sample DEFINITION + FINAL + CREATE PUBLIC. + + PUBLIC SECTION. + INTERFACES if_oo_adt_classrun. + INTERFACES if_rap_query_provider. + PRIVATE SECTION. + METHODS validate_data + IMPORTING + keys TYPE if_rap_query_provider=>tt_key + RETURNING + VALUE(result) TYPE abap_boolean. +ENDCLASS. + +CLASS zcl_age_rap_sample IMPLEMENTATION. + + METHOD if_oo_adt_classrun~main. + out->write( 'RAP Sample Implementation Class' ). + ENDMETHOD. + + METHOD if_rap_query_provider~select. + DATA filter TYPE if_rap_query_filter=>tt_range_option. + DATA lt_data TYPE STANDARD TABLE OF zage_tabl. + + filter = io_query->get_filter( )->get_filter_conditions( ). + + SELECT FROM zage_tabl + FIELDS client, name, description + INTO TABLE lt_data. + + io_response->set_data( lt_data ). + ENDMETHOD. + + METHOD validate_data. + result = abap_true. + ENDMETHOD. + +ENDCLASS. diff --git a/src/rap/zcl_age_rap_sample.clas.xml b/src/rap/zcl_age_rap_sample.clas.xml new file mode 100644 index 0000000..0e9cd67 --- /dev/null +++ b/src/rap/zcl_age_rap_sample.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_AGE_RAP_SAMPLE + E + AGE Sample RAP Behavior Implementation + 1 + X + X + X + 5 + + + + \ No newline at end of file