{"id":15148528,"url":"https://github.com/mindsquare-custom-solutions/cds_samples","last_synced_at":"2026-02-19T01:03:19.432Z","repository":{"id":163008328,"uuid":"637398886","full_name":"mindsquare-Custom-Solutions/CDS_Samples","owner":"mindsquare-Custom-Solutions","description":"Codebeispiele für die mindsquare Core Data Services Schulung","archived":false,"fork":false,"pushed_at":"2024-12-02T07:19:45.000Z","size":191,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-09T07:31:35.418Z","etag":null,"topics":["abap","cds","core-data-services","fiori","fiori-elements","sap"],"latest_commit_sha":null,"homepage":"https://mindsquare.de/schulungen/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mindsquare-Custom-Solutions.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-07T12:48:24.000Z","updated_at":"2024-12-02T07:19:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"1330e887-21be-4058-8e12-4ebb4bb82536","html_url":"https://github.com/mindsquare-Custom-Solutions/CDS_Samples","commit_stats":{"total_commits":24,"total_committers":5,"mean_commits":4.8,"dds":"0.45833333333333337","last_synced_commit":"d1c2f9a4dbaacce9a13dab8fb14ad8fe6957156d"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mindsquare-Custom-Solutions/CDS_Samples","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mindsquare-Custom-Solutions%2FCDS_Samples","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mindsquare-Custom-Solutions%2FCDS_Samples/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mindsquare-Custom-Solutions%2FCDS_Samples/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mindsquare-Custom-Solutions%2FCDS_Samples/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mindsquare-Custom-Solutions","download_url":"https://codeload.github.com/mindsquare-Custom-Solutions/CDS_Samples/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mindsquare-Custom-Solutions%2FCDS_Samples/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268696936,"owners_count":24292386,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-04T02:00:09.867Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abap","cds","core-data-services","fiori","fiori-elements","sap"],"created_at":"2024-09-26T13:20:19.464Z","updated_at":"2025-10-12T15:09:56.255Z","avatar_url":"https://github.com/mindsquare-Custom-Solutions.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://mindsquare.de/files/logo-mindsquare-176x781.png\" alt=\"mindsquare Logo\" title=\"mindsquare AG\" align=\"right\"\u003e\n\n# Begleitmaterialien zur Core Data Services (CDS) Schulung\n\nCodebeispiele für die [mindsquare Core Data Services Schulung](https://mindsquare.de/schulungen/)\n\n## Datenmodell\n\nTODO\n\n## Core Data Services - Grundlagen\n\n[Feature Availability Matrix](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abencds_language_elements.htm)\n\n### Syntax DDIC-based CDS View\n\n```cds\n@AbapCatalog.sqlViewName: 'ZMS2IAIRPORT'\n@AbapCatalog.compiler.compareFilter: true\n@AbapCatalog.preserveKey: true\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n@EndUserText.label: 'Airport View - CDS Data Model'\n\n@VDM.viewType: #BASIC\n\n@ObjectModel.representativeKey: 'AirportID'\n\ndefine view ZMIND2_I_AIRPORT\n  as select from zmind2_airport as Airport\n{\n  key Airport.airport_id as AirportID,\n      Airport.name       as Name,\n      Airport.city       as City,\n      Airport.country    as CountryCode\n}\n\n```\n\n### Syntax CDS View Entity\n\n\u003e [!NOTE]  \n\u003e ab S/4HANA 2020\n\n```cds\n@AbapCatalog.viewEnhancementCategory: [#NONE]\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n@EndUserText.label: 'Airport Basic View Entity'\n@ObjectModel.usageType:{\n    serviceQuality: #X,\n    sizeCategory: #S,\n    dataClass: #MIXED\n}\n@VDM.viewType: #BASIC\n\n@ObjectModel.representativeKey: 'AirportId'\n\ndefine view entity ZMIND2E_I_Airport\n  as select from zmind2_airport\n{\n  key airport_id as AirportId,\n      name       as Name,\n      city       as City,\n      country    as CountryCode\n}\n```\n\n### Cast Operator\n\n```cds\ndefine view entity ZI_CAST \n  as data source from TABLE\n  {\n    key key_field               as KeyField,\n        cast(\u003cfield\u003e as \u003ctype\u003e) as FieldName\n  }\n```\n\n### Literale\n\n\u003e [!NOTE]\n\u003e Typisierte Literale ab S/4HANA 2020 und nur in CDS View Entities unterstützt\n\n```cds\ndefine view entity ZMIND2EG_I_Literals\n  as select from zmind2_airport\n  {\n    // Untypisierte Literale\n    '123'               as TypeNumc,\n    'ABC123'            as TypeChar,\n    123                 as TypeInt,\n    12.34               as TypeFltp,\n\n    // Typisierte Literale\n    abap.datn'20200101' as TypeDatn,\n    abap.string'Text'   as TypeString\n  }\n```\n\n### Case Operator\n\n#### Einfach Fallunterscheidung\n\n```cds\ndefine view entity ZI_CASE \n  as data source from TABLE\n{\n  key keyField,\n      case name\n        when 'Anna' then 'X'\n        when 'Lisa' then 'Y'\n        else '-'\n      end as first_name\n}\n```\n\n#### Komplexe Fallunterscheidung\n\n```cds\ndefine view entity ZI_CASE \n  as data source from TABLE\n{\n  key keyField,\n      case\n        when distance \u003e= 2000 \n          then 'long-haul flight'\n        when distance \u003e= 1000 and distance \u003c  2000 \n          then 'medium-haul flight'\n        when distance \u003c  1000 \n          then 'short-haul flight'\n        else 'error'\n      end as flight_type\n}\n```\n\n### Session Variablen\n\n```cds\ndefine view entity demo_cds_session_variables_ve\n  as select from demo_expressions\n{\n  key id,\n      $session.user            as system_user,\n      $session.client          as system_client,\n      $session.system_language as system_language,\n      $session.system_date     as system_date,\n      $session.user_timezone   as user_timezone,\n      $session.user_date       as user_date\n}\n```\n\n### Build-In Functions\n\n[SAP Help Dokumentation](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abencds_builtin_functions_v2.htm)\n\n### Wiederverwendung von Feldern\n\n\u003e [!NOTE]\n\u003eAb S/4HANA 2022\n\n```cds\ndefine view entity DEMO_CDS_EXPRESSION_REUSE\n  as select from demo_expressions\n{\n  key id as field1,\n      concat($projection.field1, 'x') as field_reuse,\n\n      //literal\n      abap.char'hallo‘ as lit1,\n      concat($projection.lit1, 'x')   as lit_reuse,\n\n      //arithmetic expression\n      abap.decfloat34'123.45E6‘ as arith,\n      $projection.arith * 2 as arith_reuse,\n\n      //cast expression\n      cast(char1 as abap.numc(10)) as cast1,\n      coalesce($projection.cast1, numc2)as cast_reuse\n}\n```\n\n### Filterung\n\n```cds\ndefine view entity DEMO_SALES_ORDER_WHERE\n  as select from demo_sales_order\n  association to demo_sales_bupa as _partner on $projection.id = _partner.id\n{\n  key so_key,\n      id,\n      company_code,\n      _partner.family_name\n}\nwhere\n      _partner.family_name like 'S%'\n  and length( _partner.family_name ) = abap.int1'4'\n  and created_on between abap.dats'20200101' and abap.dats'20200401'\n  and cast( _partner.birth_name as demo_sales_birth_name preserving type ) = abap.char'Meier'\n```\n\n### Aggregation\n\n```cds\ndefine view entity DEMO_CDS_VIEW_ENTITY_HAVING\n  as select from sflight\n{\n  concat_with_space(carrid, connid, 1) as ID,\n  count(*)                             as col_count,\n  seatsmax\n}\ngroup by\n  carrid,\n  connid,\n  seatsmax\nhaving\n  seatsmax \u003e abap.int2'500'\n```\n\n### Parameter\n\n```cds\ndefine view entity ZIMIND2_EX_Parameter1\n  with parameters\n    P_Parameter1 :abap.char( 1 ),\n    P_Parameter2 :abap.char( 1 )\n  as select from zmind2_airport\n{\n  key airport_id as AirportId,\n      $parameters.P_Parameter1 as Parameter1,\n      $parameters.P_Parameter2 as Parameter2\n}\n```\n\n```cds\ndefine view entity ZIMIND2_EX_Parameter2\n  with parameters\n    P_Parameter1 :abap.char( 1 ),\n    P_Parameter2 :abap.char( 1 )\n  as select from ZIMIND2_EX_Parameter1(P_Parameter1:$parameters.P_Parameter1, P_Parameter2: 'E')\n  association [1..1] to ZIMIND2_EX_Parameter1 as _Association on $projection.AirportId = _Association.AirportId\n{\n  key AirportId,\n      Parameter1,\n      Parameter2,\n\n      _Association(P_Parameter1:$parameters.P_Parameter1, P_Parameter2:$parameters.P_Parameter2).Parameter2 as ParameterAssoc,\n\n      _Association\n}\n```\n\n## CDS in ABAP\n\n### OpenSQL Select\n\n```abap\nREPORT zmind2_select.\n\nSELECT FROM zmind2e_c_carrier\n    FIELDS airlineid, name\n    WHERE currencycode = 'EUR'\n    INTO TABLE @DATA(carriers).\n\ncl_demo_output=\u003edisplay( carriers ).\n```\n\n```cds\n@AbapCatalog.viewEnhancementCategory: [#NONE]\n@EndUserText.label: 'Carrier Consumption View'\n@Metadata.ignorePropagatedAnnotations: true\n@ObjectModel.usageType:{\n    serviceQuality: #X,\n    sizeCategory: #S,\n    dataClass: #MIXED\n}\n\n@AccessControl.authorizationCheck: #CHECK\ndefine view entity zmind2e_C_Carrier\n  as select from ZMIND2E_I_Carrier\n{\n  key AirlineId,\n      Name,\n      CurrencyCode,\n      /* Associations */\n      _Currency\n}\n```\n\n#### OpenSQL Select mit Parameter\n\n```abap\nSELECT * FROM cdsfrwk_open_so_items_by_taxr( pCuCo: 'EUR' ) INTO TABLE @DATA(result).\n```\n\n#### OpenSQL Select mit Assoziation\n\n```abap\nREPORT zmind2_select_association.\n\nSELECT FROM zmind2e_c_carrier\n    FIELDS\n        airlineid,\n        name,\n        \\_currency-currency\n    INTO TABLE @DATA(carriers).\n\ncl_demo_output=\u003edisplay( carriers ).\n\n\nSELECT FROM zmind2e_c_booking\n    FIELDS\n        bookingid,\n        \\_bookingsupplement[ (1) LEFT OUTER ]-supplementid,\n        \\_customer\\_country\\_text[ language = @sy-langu ]-countryname\n    INTO TABLE @DATA(bookings).\n\ncl_demo_output=\u003edisplay( bookings ).\n```\n\n### ALV Integrated Data Access\n\n```abap\nREPORT zmind2_alv_ida.\n\nDATA: carrier TYPE zmind2_carrier_id.\nSELECT-OPTIONS so_carr FOR carrier.\n\nEND-OF-SELECTION.\n\n  DATA(alv) = cl_salv_gui_table_ida=\u003ecreate_for_cds_view(\n      iv_cds_view_name = 'zmind2e_c_carrier' ).\n\n  DATA(colletor) = NEW cl_salv_range_tab_collector( ).\n  colletor-\u003eadd_ranges_for_name(\n      iv_name = 'AIRLINEID'\n      it_ranges = so_carr[] ).\n  colletor-\u003eget_collected_ranges(\n      IMPORTING et_named_ranges = DATA(named_ranges) ).\n  alv-\u003eset_select_options(\n      it_ranges = named_ranges ).\n\n  alv-\u003efullscreen( )-\u003edisplay( ).\n```\n\n#### ALV IDA mit Parameter\n\n```cds\nREPORT zmind2_alv_ida_parameter.\n\nDATA(alv) = cl_salv_gui_table_ida=\u003ecreate_for_cds_view(\n    iv_cds_view_name = 'zmind2e_c_parameter' ).\n\nalv-\u003eset_view_parameters(\n  it_parameters = VALUE #(\n      ( name = 'P_Parameter' value = 'X' )\n  ) ).\n\nalv-\u003efullscreen( )-\u003edisplay( ).\n```\n\n## Annotationen\n\n### Annotationen Syntax\n\nDDIC-based CDS View:\n\n```cds\n@AbapCatalog.sqlViewName: 'ZMS2IBOOKSUPPL'\n@AbapCatalog.compiler.compareFilter: true\n@AbapCatalog.preserveKey: true\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n\n@EndUserText.label: 'Booking Supplement View - CDS data model'\n\n@Search.searchable: true\n@VDM.viewType: #BASIC\n\n@ObjectModel.representativeKey: 'BookingSupplementID'\n@Analytics.dataCategory: #DIMENSION\n```\n\nCDS View Entity:\n\n```cds\n@AbapCatalog.viewEnhancementCategory: [#NONE]\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n@EndUserText.label: 'Booking Supplement View Entity'\n@Metadata.ignorePropagatedAnnotations: true\n@ObjectModel.usageType:{\n    serviceQuality: #A,\n    sizeCategory: #XXL,\n    dataClass: #TRANSACTIONAL\n}\n\n@Search.searchable: true\n@VDM.viewType: #BASIC\n\n@ObjectModel.representativeKey: 'BookingSupplementID'\n@Analytics.dataCategory: #DIMENSION\n\n@AbapCatalog.entityBuffer.definitionAllowed: true\n```\n\n### Bezeichnertexte\n\n```cds\n...\n  @EndUserText.label: 'Flugziel'\n  @EndUserText.quickInfo: 'Zielland und -stadt des Fluges'\n  concat_with_space(_DestinationAirport.CountryCode, _DestinationAirport.City, 1) as Destination,\n\n  ...\n```\n\n### Einheitenreferenzen\n\n```cds\n...\n  @Semantics.quantity.unitOfMeasure: 'DistanceUnit'\n  cast(distance as abap.quan( 11, 0 )) as Distance,\n\n  distance_unit                        as DistanceUnit,\n...\n```\n\n### Währungsreferenzen\n\n```cds\ndefine view entity ZMIND2E_I_Flight\n  as select from zmind2_flight\n  association [0..1] to I_Currency as _Currency on $projection.CurrencyCode = _Currency.Currency\n{\n  key carrier_id            as AirlineID,\n  key connection_id         as ConnectionID,\n  key flight_date           as FlightDate,\n\n      @Semantics.amount.currencyCode: 'CurrencyCode'\n      price                 as Price,\n\n      @ObjectModel.foreignKey.association: '_Currency'\n      currency_code         as CurrencyCode,\n\n      // Weitere Felder\n\n      // Assoziation für Fremdschlüsselbeziehung\n      _Currency\n}\n```\n\n### Kontrakt für Key-User-Felderweiterung \n\n```cds\n@EndUserText.label: 'Demo for C0 released API'\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n@Metadata.ignorePropagatedAnnotations: true\n\n@AbapCatalog.extensibility: {\n  extensible: true,\n  elementSuffix: 'EMO',\n  allowNewDatasources: false,\n  dataSources: ['Persistence'],\n  quota: {\n    maximumFields: 250,\n    maximumBytes: 2500\n  }\n}\ndefine view entity DEMO_CDS_PRODUCTTP_E\n  as select from demo_product as Persistence\n{\n  key product_id\n}\n```\n\n### Deprecation\n\n```cds\n...\n  @VDM.lifecycle.status: #DEPRECATED\n  @VDM.lifecycle.successor: 'Product'\n  @API.element.releaseState: #DEPRECATED\n  @API.element.successor: 'Product'\n  Material,\n...\n```\n\n### Access Control Annotation\n\n```cds\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n```\n\n### Fremdschlüsselbeziehung\n\nCDS View mit Fremdschlüssel:\n\n```cds\n@ObjectModel.representativeKey: 'FlightDate'\n\ndefine view entity ZMIND2E_I_Flight\n  as select from zmind2_flight\n\n  association [1]    to ZMIND2E_I_Carrier    as _Airline    on  $projection.AirlineID = _Airline.AirlineId\n{\n      @ObjectModel.foreignKey.association: '_Airline'\n  key carrier_id            as AirlineID,\n...\n      _Airline,\n...\n}\n```\n\nCDS View mit repräsentativem Schlüssel:\n\n```cds\n@ObjectModel.representativeKey: 'AirlineId'\n\ndefine view entity ZMIND2E_I_Carrier\n  as select from zmind2_carrier\n{\n      @ObjectModel.text.element: ['Name']\n  key carrier_id            as AirlineId,\n\n      @Semantics.text: true\n      name                  as Name,\n...\n}\n```\n\n### Textbeziehungen\n\n#### Textbeziehung innerhalb einer View\n\n```cds\ndefine view entity ZMIND2E_I_Carrier\n  as select from zmind2_carrier\n{\n      @ObjectModel.text.element: ['Name']\n  key carrier_id            as AirlineId,\n\n      @Semantics.text: true\n      name                  as Name,\n...\n}\n```\n\n#### Textbeziehung mit Text View\n\n```cds\ndefine view entity ZMIND2E_I_TravelStatus\n  as select from zmind2_trvl_stat\n  association [0..*] to ZMIND2E_I_TravelStatusText as _Text on $projection.TravelStatus = _Text.TravelStatus\n{\n      @ObjectModel.text.association: '_Text'\n  key travel_status as TravelStatus,\n\n      _Text\n}\n```\n\n```cds\n@ObjectModel.dataCategory: #TEXT\ndefine view entity ZMIND2E_I_TravelStatusText\n  as select from zmind2_trvl_stxt\n{\n      @ObjectModel.text.element: ['Text']\n  key travel_status as TravelStatus,\n      @Semantics.language: true\n  key language      as Language,\n      @Semantics.text: true\n      text          as Text\n}\n```\n\n### Metadatenerweiterungen\n\nErweiterte CDS View Entity:\n\n```cds\n@Metadata.allowExtensions: true\ndefine view entity ZREX_C_Flight\n  as projection on ZREX_I_Flight\n{\n  ...\n```\n\nMetadatenwerweiterung:\n\n```cds\n@Metadata.layer: #PARTNER\nannotate entity ZREX_C_Flight with\n{\n  @UI.facet: [{\n      type: #COLLECTION,\n      id: 'DetailsCollection',\n      purpose: #STANDARD,\n      label: 'Details',\n      position: 10\n    },{\n      type: #FIELDGROUP_REFERENCE,\n      id: 'FlightFieldGroup',\n      targetQualifier: 'Flight',\n      parentId: 'DetailsCollection',\n      label: 'Flight',\n      position: 10\n    },{\n      type: #FIELDGROUP_REFERENCE,\n      id: 'AirplaneFieldGroup',\n      targetQualifier: 'Airplane',\n      parentId: 'DetailsCollection',\n      label: 'Airplane',\n      position: 20\n    }]\n\n  @UI.fieldGroup: [{ qualifier: 'Flight', position: 10 }]\n  CarrierId;\n\n  @UI.fieldGroup: [{ qualifier: 'Flight', position: 20 }]\n  ConnectionID;\n\n  @UI.fieldGroup: [{ qualifier: 'Flight', position: 30 }]\n  @UI.lineItem: [{ qualifier: 'Flight', position: 10 }]\n  FlightDate;\n\n  @UI.fieldGroup: [{ qualifier: 'Flight', position: 40 }]\n  Price;\n\n  @UI.fieldGroup: [{ qualifier: 'Airplane', position: 10 }]\n  @UI.lineItem: [{ qualifier: 'Flight', position: 20 }]\n  PlaneType;\n  \n  @UI.fieldGroup: [{ qualifier: 'Airplane', position: 20 }]\n  @UI.lineItem: [{ qualifier: 'Flight', position: 30 }]\n  MaximumSeats;\n  \n  @UI.fieldGroup: [{ qualifier: 'Airplane', position: 30 }]\n  @UI.lineItem: [{ qualifier: 'Flight', position: 40 }]\n  OccupiedSeats;\n}\n```\n\n## CDS View Erweiterung\n\n```cds\n@AbapCatalog.extensibility: {\n  extensible: true,\n  elementSuffix: 'ZAG',\n  allowNewDatasources: false,\n  dataSources: ['Agency'],\n  quota: {\n    maximumFields: 500,\n    maximumBytes: 5000\n  }\n}\n\ndefine view entity /DMO/E_Agency\n  as select from /dmo/agency as Agency\n{\n  key agency_id as AgencyId\n}\n```\n\n```cds\nextend view entity /DMO/E_Agency with\n{\n  Agency./dmo/zzsloganzag as /DMO/ZZSloganZAG\n}\n```\n## Entity Buffer\n\n### Entity Buffer Annotation\n\n```cds\n@AbapCatalog.entityBuffer.definitionAllowed: true\n```\n\n### Entity Buffer Syntax\n\n```cds\ndefine view entity buffer on ZI_Flight\n  layer customer\n  type full\n```\n\n## Komposition\n\n### Join\n\n```cds\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n@EndUserText.label: 'CDS View entity_client handling'\ndefine view entity DEMO_CDS_CLIENT_HANDLING\n  as select from t000 as client_independent\n      left outer join demo_sales_order as _LeftOuter\n        on _LeftOuter.id = client_independent.cccategory\n      inner join demo_sales_order as _Inner\n        on _Inner.id = client_independent.cccategory\n      right outer join demo_sales_order as _RightOuter\n        on _RightOuter.id = client_independent.cccategory\n    association [0..1] to demo_sales_order as _Assoc\n      on _Assoc.id = client_independent.cccategory\n    {\n      key _Assoc.so_key,\n          _Assoc.id,\n          _Inner.id      as id_inner,\n          _LeftOuter.id  as id_LeftOuter,\n          _RightOuter.id as id_RightOuter,\n          client_independent.cccategory\n    }\n    where client_independent.mtext = abap.char'SAP AG Konzern'\n\n```\n\n### Assoziationen\n\n#### Syntax\n\n```cds\ndefine view entity ZMIND2E_I_Booking\n  as select from zmind2_booking\n\n  association [1..1] to ZMIND2E_I_Travel            as _Travel            on  $projection.TravelID = _Travel.TravelID\n  association [0..*] to ZMIND2E_I_BookingSupplement as _BookingSupplement on  $projection.BookingID = _BookingSupplement.BookingID\n                                                                          and $projection.TravelID  = _BookingSupplement.TravelID\n  association [1..1] to ZMIND2E_I_Customer          as _Customer          on  $projection.CustomerID = _Customer.CustomerId\n  association [1..1] to ZMIND2E_I_Carrier           as _Carrier           on  $projection.AirlineID = _Carrier.AirlineId\n  association [1..1] to ZMIND2E_I_Connection        as _Connection        on  $projection.AirlineID    = _Connection.AirlineId\n                                                                          and $projection.ConnectionID = _Connection.ConnectionId\n  association [1..1] to I_Currency                  as _Currency          on  $projection.CurrencyCode = _Currency.Currency\n\n{\n      @ObjectModel.foreignKey.association: '_Travel'\n      @Search.defaultSearchElement: true\n  key travel_id     as TravelID,\n\n      @Search.defaultSearchElement: true\n  key booking_id    as BookingID,\n      booking_date  as BookingDate,\n\n      @Consumption.valueHelpDefinition: [{entity: {name: 'ZMIND2E_I_Customer', element: 'CustomerId' }}]\n      @Search.defaultSearchElement: true\n      @ObjectModel.foreignKey.association: '_Customer'\n      customer_id   as CustomerID,\n\n      @ObjectModel.foreignKey.association: '_Carrier'\n      carrier_id    as AirlineID,\n\n      @ObjectModel.foreignKey.association: '_Connection'\n      connection_id as ConnectionID,\n\n      flight_date   as FlightDate,\n\n      @Semantics.amount.currencyCode: 'CurrencyCode'\n      flight_price  as FlightPrice,\n\n      @ObjectModel.foreignKey.association: '_Currency'\n      currency_code as CurrencyCode,\n\n      /* Associations */\n      _Travel,\n      _BookingSupplement,\n      _Customer,\n      _Carrier,\n      _Connection,\n      _Currency\n}\n```\n\n#### Neue Kardinalitätssyntax\n\n\u003e [!NOTE]\n\u003e ab S/4HANA 2023 verwendbar\n\u003e\n\u003e SAP empfiehlt die Verwendung der Wortsyntax statt der Klammersyntax, da Performanceoptimierungen iun manchen Konstellationen möglich sind\n\n```cds\ndefine view entity DEMO_CDS_CARDINALITY_IN_WORDS\n  as select from demo_sales_mat\n\n  association of exact one to one DEMO_SALES_CDS_MAT_TEXT as _Text  \n    on  $projection.material = _Text.material\n    and _Text.language       = $session.system_language\n{\n  key matnr as material,\n      mtart as material_type,\n      mtgrp as material_group,\n      _Text,\n      _Text.material_name\n}\n```\n\n#### Komplexe Komposition\n\n```cds\n...\n_Currency._Text[ inner where Language = 'D' ].CurrencyName      as CurrencyNameGerman,\n_Currency._Text[ left outer where Language = 'I' ].CurrencyName as CurrencyNameItalian,\n...\n```\n\n### Union\n\n```cds\n@AccessControl.authorizationCheck: #NOT_REQUIRED\n@Metadata.ignorePropagatedAnnotations: true\n@AbapCatalog.viewEnhancementCategory: [#PROJECTION_LIST,#UNION]\ndefine view entity DEMO_CDS_UNION_VE\n  as select from\n    demo_join1\n    {\n      a as c1,\n      b as c2\n    }\nunion select from\n  demo_join2\n    {\n      d as c1,\n      e as c2\n    }\nunion all select from\n  demo_join3\n    {\n      i as c1,\n      j as c2\n    }\n```\n\n## Access Control\n\n### Access Control Syntax\n\n```cds\n@EndUserText.label: 'Carrier'\n@MappingRole: true\ndefine role ZMIND2E_C_CARRIER {\n  grant select on ZMIND2E_C_CARRIER\n    where (AirlineId) = aspect pfcg_auth(S_CARRID, CARRID, ACTVT = '03' );\n}\n```\n\n### Access Control Vererbung\n\n```cds\n@MappingRole: true\ndefine role ZC_SalesOrder {\n  grant select on ZC_SalesOrder\n    where inheriting conditions from entity ZI_SalesOrder;\n}\n```\n\n### Access Control Redefinition\n\n```cds\nTODO\n```\n\n### Access Control Umbenennung\n\n```cds\nTODO\n```\n\n### Access Control Optionale Elemente\n\n```cds\nTODO\n```\n\n### Access Control Assoziationen\n\n```cds\nTODO\n```\n\n### Access Control Parameter\n\n```cds\nTODO\n```\n\n### Access Control Anpassung von Standardzugriffskontrollen\n\nCombination Mode or:\n\n```cds\nTODO\n```\n\nCombination Mode and:\n\n```cds\nTODO\n```\n\nRedefinition:\n\n```cds\nTODO\n```\n\n```cds\nTODO\n```\n\n### Access Control Nutzername\n\n```cds\nTODO\n```\n\n### Weitere Arten von Zugriffskontrollen\n\n```cds\nTODO\n```\n\n```cds\nTODO\n```\n\n```cds\nTODO\n```\n\n```cds\nTODO\n```\n\n## Service Definition\n\n```cds\n@EndUserText.label: 'Service definition for FuncLoc Odata'\ndefine service API_FUNCTIONALLOCATION {\n  expose A_FunctionalLocation as FunctionalLocation;\n  expose A_FunctionalLocationLongText as FunctionalLocationLongText;\n  expose A_FunctionalLocationPartner as FunctionalLocationPartner;\n  expose A_FuncnlLocClfnClass as FunctionalLocationClass;\n  expose A_FuncnlLocClfnClassChar as Characteristic;\n  expose A_FuncnlLocClfnCharValue as Value;\n  expose A_FuncnlLocWarrantyAssgmt as FunctionalLocationWarranty;\n}\n```\n\n## Fiori Elements\n\n### Line Item\n\n```cds\n@AbapCatalog.sqlViewName: 'ZMS2EXCBOOKSUPPL'\n@AbapCatalog.compiler.compareFilter: true\n@AbapCatalog.preserveKey: true\n@AccessControl.authorizationCheck: #CHECK\n@EndUserText.label: 'Booking Supplement Consumption View'\n\ndefine view ZMIND2EX_C_BookingSupplement\n  as select from ZMind2Ex_I_BookingSupplement\n{\n  key TravelID,\n  key BookingID,\n  key BookingSupplementID,\n      @UI.lineItem: [{ position: 20 }]\n      SupplementID,\n      @UI.lineItem: [{ position: 10 }]\n      SupplementType,\n      @UI.lineItem: [{ position: 30 }]\n      Price,\n      CurrencyCode,\n      /* Associations */\n      _Booking,\n      _SupplementText\n}\n```\n\n### Freitextsuche\n\n```cds\n@Search.searchable: true\n\ndefine view entity ZMIND2E_I_Flight\n  as select from zmind2_flight\n{\n      @Search.defaultSearchElement: true\n      @Search.fuzzinessThreshold: 0.8\n      @ObjectModel.foreignKey.association: '_Airline'\n  key carrier_id            as AirlineID,\n\n      @Search.defaultSearchElement: true\n      @Search.fuzzinessThreshold: 0.8\n      @ObjectModel.foreignKey.association: '_Connection'\n  key connection_id         as ConnectionID,\n\n  key flight_date           as FlightDate,\n...\n}\n```\n\n### Filter\n\n```cds\n...\n  @UI.selectionField: [{ position: 10 }]\n  @Consumption.filter: {\n    selectionType: #INTERVAL,\n    mandatory: true\n  }\n  EndDate,\n...\n```\n\n### Suchhilfen\n\nEinfache Suchhilfe:\n\n```cds\n@Consumption.valueHelpDefinition: [{ entity.name: 'I_CurrencyStdVH', entity.element: 'Currency' }]\nCurrencyCode\n```\n\nSuchhilfe mit erweiterten Abhängigkeiten:\n\n```cds\n...\n@Consumption.valueHelpDefinition: [{\n  entity: { name: 'ZMIND2E_I_FlightVH', element: 'AirlineID' },\n  additionalBinding: [\n    { element: 'ConnectionID', localElement: 'ConnectionId', usage: #RESULT },\n    { element: 'FlightDate', localElement: 'FlightDate', usage: #RESULT }\n  ]\n}]\nCarrierId,\n\n@Consumption.valueHelpDefinition: [{\n  entity: { name: 'ZMIND2E_I_FlightVH', element: 'ConnectionID' },\n  additionalBinding: [\n    { element: 'AirlineID', localElement: 'CarrierId', usage: #FILTER_AND_RESULT },\n    { element: 'FlightDate', localElement: 'FlightDate', usage: #RESULT }\n  ]\n}]\nConnectionId,\n\n@Consumption.valueHelpDefinition: [{\n  entity: { name: 'ZMIND2E_I_FlightVH', element: 'FlightDate' },\n  additionalBinding: [\n    { element: 'AirlineID', localElement: 'CarrierId', usage: #FILTER_AND_RESULT },\n    { element: 'ConnectionID', localElement: 'ConnectionId', usage: #FILTER_AND_RESULT }\n  ]\n}]\nFlightDate,\n...\n```\n\n### Tabellenbezeichnung\n\n```cds\n@UI.headerInfo: {\n  typeName: 'Booking',\n  typeNamePlural: 'Bookings'\n}\n```\n\n### Semantische Hervorhebung\n\n```cds\n@Metadata.layer: #CUSTOMER\n@UI.headerInfo.title.criticality: 'StatusCriticality'\nannotate view ZMIND2RAP_C_Travel with\n{\n  @UI.lineItem: [\n    { exclude: true },\n    { position: 50, criticality: 'StatusCriticality' }\n  ]\n  @UI.fieldGroup: [{ qualifier: 'Details', position: 40, criticality: 'StatusCriticality' }]\n  @UI.textArrangement: #TEXT_ONLY\n  Status;\n\n  @UI.hidden: true\n  StatusCriticality;\n}\n```\n\n### Gruppieren \u0026 Sortieren\n\n```cds\n@UI.presentationVariant: [{ \n    sortOrder: [{ by: 'FlightDate', direction: #ASC }],\n    groupBy: ['CarrierId']\n}]\n\nannotate view ZMIND2RAP_C_Booking with\n{\n...\n```\n\n### Seitentitel\n\n```cds\n@UI.headerInfo: {\n    typeName: 'Travel',\n    typeNamePlural: 'Travels',\n    title.value: 'Description',\n    description.value: 'CustomerId'\n}\n```\n\n### Facetten\n\n```cds\n @UI.facet: [{\n    type: #COLLECTION,\n    id: 'TravelCollection',\n    label: 'Travel',\n    purpose: #STANDARD,\n    position: 10\n  },{\n    type: #FIELDGROUP_REFERENCE,\n    id: 'DetailsFieldGroup',\n    targetQualifier: 'Details',\n    parentId: 'TravelCollection',\n    label: 'Details',\n    position: 10\n  },{\n    type: #COLLECTION,\n    id: 'CustomerCollection',\n    label: 'Customer',\n    purpose: #STANDARD,\n    position: 20\n  },{\n    type: #FIELDGROUP_REFERENCE,\n    id: 'CustomerFieldGroup',\n    parentId: 'CustomerCollection',\n    targetQualifier: 'Customer',\n    label: 'Customer',\n    position: 10\n  },{\n    type: #LINEITEM_REFERENCE,\n    id: 'BookingLineItem',\n    purpose: #STANDARD,\n    targetElement: '_Booking',\n    targetQualifier: 'Booking',\n    position: 30,\n    label: 'Bookings'\n  },{\n    type: #FIELDGROUP_REFERENCE,\n    id: 'TraceFieldGroup',\n    targetQualifier: 'Trace',\n    purpose: #STANDARD,\n    label: 'Trace',\n    position: 40\n  },{\n    type: #FIELDGROUP_REFERENCE,\n    id: 'DatesFieldGroup',\n    targetQualifier: 'Dates',\n    parentId: 'TravelCollection',\n    label: 'Date',\n    position: 20\n  },{\n    type: #FIELDGROUP_REFERENCE,\n    id: 'PricesFieldGroup',\n    targetQualifier: 'Prices',\n    parentId: 'TravelCollection',\n    label: 'Price',\n    position: 40\n  }]\n```\n\n## Virtuelle Elemente\n\n### Annotationen für virtuelle Elemente\n\n```cds\ndefine view entity /DMO/C_Booking_VE\n  as projection on /DMO/I_Booking_U\n{ ...\n          @ObjectModel.virtualElementCalculatedBy: 'ABAP:/DMO/CL_DAYS_TO_FLIGHT'\n          @EndUserText.label: 'Days to Flight'\n  virtual DaysToFlight : abap.int2,\n  …}\n```\n\n### Virtuelle Elemente: Datenberechnung\n\n```abap\nCLASS /dmo/cl_days_to_flight DEFINITION\n  PUBLIC\n  FINAL\n  CREATE PUBLIC .\n\n  PUBLIC SECTION.\n    INTERFACES if_sadl_exit_calc_element_read.\n  PROTECTED SECTION.\n  PRIVATE SECTION.\nENDCLASS.\n\nCLASS /dmo/cl_days_to_flight IMPLEMENTATION.\n  METHOD if_sadl_exit_calc_element_read~get_calculation_info.\n    IF iv_entity \u003c\u003e '/DMO/C_BOOKING_VE'.\n      RAISE EXCEPTION TYPE /dmo/cx_virtual_elements\n        EXPORTING\n          textid = /dmo/cx_virtual_elements=\u003eentity_not_known\n          entity = iv_entity.\n    ENDIF.\n\n    LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(\u003cfs_calc_element\u003e).\n      CASE \u003cfs_calc_element\u003e.\n        WHEN 'DAYSTOFLIGHT'.\n          APPEND 'FLIGHTDATE' TO et_requested_orig_elements.\n\n*        WHEN 'ANOTHERELEMENT'.\n*          APPEND '' ...\n\n        WHEN OTHERS.\n          RAISE EXCEPTION TYPE /dmo/cx_virtual_elements\n            EXPORTING\n              textid  = /dmo/cx_virtual_elements=\u003evirtual_element_not_known\n              element = \u003cfs_calc_element\u003e\n              entity  = iv_entity.\n      ENDCASE.\n    ENDLOOP.\n  ENDMETHOD.\n\n  METHOD if_sadl_exit_calc_element_read~calculate.\n    DATA(lv_today) = cl_abap_context_info=\u003eget_system_date( ).\n\n    DATA lt_original_data TYPE STANDARD TABLE OF /dmo/c_booking_proc_ve WITH DEFAULT KEY.\n    lt_original_data = CORRESPONDING #( it_original_data ).\n\n    LOOP AT lt_original_data ASSIGNING FIELD-SYMBOL(\u003cfs_original_data\u003e).\n      \u003cfs_original_data\u003e-DaysToFlight =  \u003cfs_original_data\u003e-FlightDate - lv_today.\n    ENDLOOP.\n\n    ct_calculated_data = CORRESPONDING #(  lt_original_data ).\n  ENDMETHOD.\nENDCLASS.\n```\n\n### Virtuelle Elemente: Filterung\n\n```cds\ndefine view \u003cCdsConsumptionView\u003e \n\t\tas select from \u003cdata_source\u003e\n{\n\t\t...    \n\t\t@ObjectModel.filter.transformedBy: 'ABAP:\u003ccode_exit_class\u003e'\n\t\tcast( '' as \u003cdtype\u003e preserving type) as \u003cview.element\u003e\n\t\t...\n} \n```\n\n```abap\nCLASS zcl_filter_discount DEFINITION\n  PUBLIC\n  FINAL\n  CREATE PUBLIC .\n\n  PUBLIC SECTION.\n    INTERFACES:\n      if_sadl_exit_filter_transform.\n  PROTECTED SECTION.\n  PRIVATE SECTION.\nENDCLASS.\n\n\n\nCLASS zcl_filter_discount IMPLEMENTATION.\n\n  METHOD if_sadl_exit_filter_transform~map_atom.\n    IF iv_element \u003c\u003e 'GROSSAMOUNTWITHDISCOUNT'.\n      RAISE EXCEPTION TYPE zcx_filter_exit EXPORTING textid = zcx_filter_exit=\u003eelement_not_expected.\n    ENDIF.\n\n    DATA(lo_cfac) = cl_sadl_cond_prov_factory_pub=\u003ecreate_simple_cond_factory( ).\n    DATA(amount) = lo_cfac-\u003eelement( 'CONVERTEDGROSSAMOUNT' ).\n    DATA(lv_originalvalue) = 1000 + ( iv_value - 1000 ) / '0.9'.\n\n    CASE iv_operator.\n\n      WHEN if_sadl_exit_filter_transform~co_operator-equals.\n\n        ro_condition = amount-\u003eless_than(    1000 )-\u003eand( amount-\u003eequals( iv_value )\n                )-\u003eor( amount-\u003egreater_than( 1000 )-\u003eand( amount-\u003eequals( lv_originalvalue ) ) ).\n\n      WHEN if_sadl_exit_filter_transform~co_operator-less_than.\n\n        ro_condition = amount-\u003eless_than(    1000 )-\u003eand( amount-\u003eless_than( iv_value ) \n                )-\u003eor( amount-\u003egreater_than( 1000 )-\u003eand( amount-\u003eless_than( lv_originalvalue ) ) ).\n\n      WHEN if_sadl_exit_filter_transform~co_operator-greater_than.\n        ro_condition = amount-\u003eless_than(    1000 )-\u003eand( amount-\u003egreater_than( iv_value ) \n                )-\u003eor( amount-\u003egreater_than( 1000 )-\u003eand( amount-\u003egreater_than( lv_originalvalue ) ) ).\n\n      WHEN if_sadl_exit_filter_transform~co_operator-is_null.\n        ro_condition = amount-\u003eis_null( ).\n\n      WHEN if_sadl_exit_filter_transform~co_operator-covers_pattern.\n        RAISE EXCEPTION TYPE zcx_filter_exit.\n\n    ENDCASE.\n  ENDMETHOD.\n```\n\n### Virtuelle Elemente: Sortierung\n\n```cds\ndefine view \u003cCdsConsumptionView\u003e \n\t\tas select from \u003cdata_source\u003e\n{\n\t\t...    \n\t\t@ObjectModel.sort.transformedBy: 'ABAP:\u003ccode_exit_class\u003e'\n\t\tcast( '' as \u003cdtype\u003e preserving type) as \u003cview.element\u003e\n\t\t...\n}\n```\n\n```abap\nCLASS zcl_sort_discount DEFINITION\n  PUBLIC\n  FINAL\n  CREATE PUBLIC .\n\n  PUBLIC SECTION.\n      INTERFACES:\n      if_sadl_exit_sort_transform.\n  PROTECTED SECTION.\n  PRIVATE SECTION.\nENDCLASS.\n\n\n\nCLASS zcl_sort_discount IMPLEMENTATION.\n\n\n  METHOD if_sadl_exit_sort_transform~map_element.\n    IF iv_element \u003c\u003e 'GROSSAMOUNTWITHDISCOUNT'.\n      RAISE EXCEPTION TYPE zcx_sorting_exit EXPORTING textid = zcx_sorting_exit=\u003eelement_not_expected.\n    ENDIF.\n      APPEND value #( name = `CONVERTEDGROSSAMOUNT` ) TO et_sort_elements.\n  ENDMETHOD.\n\nENDCLASS.\n```\n\n## Analytics\n\n### Cube View\n\n```cds\nTODO\n```\n\n### Dimension View\n\n```cds\nTODO\n```\n\n### Analytische Query\n\n```cds\nTODO\n```\n\n## Hierarchien\n\n### Analytische Hierarchien\n\n```cds\nTODO\n```\n\n### CDS Hierarchien\n\n```cds\ndefine view entity ZMIND2_I_FuncLocRel\n  as select from I_FunctionalLocation\n  association [0..1] to ZMIND2_I_FuncLocRel as _Parent on $projection.SuperiorFunctionalLocation = _Parent.FunctionalLocation\n{\n  key FunctionalLocation,\n      SuperiorFunctionalLocation,\n      _FunctionalLocationText[1:Language=$session.system_language].FunctionalLocationName,\n\n      _Parent\n}\n```\n\n```cds\ndefine hierarchy ZMIND2_I_FuncLocationHierarchy\n  as parent child hierarchy(\n    source ZMIND2_I_FuncLocRel\n    child to parent association _Parent\n    siblings order by\n      FunctionalLocation ascending\n    orphans root\n  )\n{\n  key FunctionalLocation,\n      FunctionalLocationName,\n      SuperiorFunctionalLocation,\n      $node.parent_id             as ParentNode,\n      $node.node_id               as NodeId,\n      $node.hierarchy_is_cycle    as IsCycle,\n      $node.hierarchy_is_orphan   as IsOrphan,\n      $node.hierarchy_level       as HierarchyLevel,\n      $node.hierarchy_rank        as HierarchyRank,\n      $node.hierarchy_parent_rank as HierarchyParentRank,\n      $node.hierarchy_tree_size   as HierarchyTreeSize\n}\n```\n\n## Code Pushdown\n\n### AMDP\n\n```abap\nTODO\n```\n\n### Table Function\n\n```cds\nTODO\n```\n\n#### AMDP für Table Function\n\n```abap\nTODO\n```\n\n#### Konsumierung von Table Function\n\n```cds\nTODO\n```\n\n## Test Double Framework\n\n### Testklasse\n\nGlobale Klasse:\n\n```abap\nTODO\n```\n\nLokale Testklasse:\n\n```abap\nTODO\n```\n\n#### Testdaten\n\n```abap\nTODO\n```\n\n#### Testmethode\n\n```abap\nTODO\n```\n\n#### Prüfen von Assoziationen\n\n```abap\nTODO\n```\n\n#### Prüfen von Joins\n\n```abap\nTODO\n```\n\n#### Unit Test für mehrere Entitäten\n\n```abap\nTODO\n```\n\n### Annotationen auslesen\n\n```abap\nTODO\n```\n\n### Test Double mit Parameter\n\n```abap\nTODO\n```\n\n### Test Double mit Konvertierungsfunktionen\n\n```abap\nTODO\n```\n\n### Test Relations\n\n```abap\nTODO\n```\n\n### Berechtigungen testen\n\n#### Berechtigungsprüfung deaktivieren\n\n```abap\nenvironment-\u003eget_access_control_double( )-\u003edisable_access_control( ).\n```\n\n#### Test unberechtigter Nutzer\n\n```abap\ndata(acm_data_no_authorization) = cl_cds_test_data=\u003ecreate_access_control_data( i_role_authorizations = VALUE #( ) ).\nenvironment-\u003eget_access_control_double( )-\u003eenable_access_control( i_access_control_data = acm_data_no_authorization ).\n```\n\n#### Test: Berechtigungen mocken\n\n```abap\nFINAL(acm_data_with_authorization) = cl_cds_test_data=\u003ecreate_access_control_data(\n                                        i_role_authorizations = VALUE #(\n                                            ( object         = 'ZX_CARRIER'\n                                              authorizations = VALUE #( ( VALUE #( ( fieldname   = 'ZX_CARRIER'\n                                                                                    fieldvalues = VALUE #(\n                                                                                        ( lower_value = 'LH' ) ) )\n                                                                                  ( fieldname   = 'ACTVT'\n                                                                                    fieldvalues = VALUE #(\n                                                                                        ( lower_value = '03' ) ) ) ) ) ) ) ) ).\nenvironment-\u003eget_access_control_double( )-\u003eenable_access_control(  i_access_control_data = acm_data_with_authorization ).\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmindsquare-custom-solutions%2Fcds_samples","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmindsquare-custom-solutions%2Fcds_samples","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmindsquare-custom-solutions%2Fcds_samples/lists"}