To speed up the creation of new basic CDS views, based on existing tables, I came up with this little report which I would like to share.

You start it with a table name, e.g. vttk (table from SAP standard for which currently no CDS view is delivered by SAP, as far as I found out), and then the report yields something like:

@AbapCatalog.sqlViewName: 'Z?IShipmentHeade'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Shipment Header'
@VDM.viewType: #BASIC
define view Z?_I_ShipmentHeader as select from VTTK {
    key tknum            as ShipmentNumber,                  // Shipment Number
    vbtyp                as SDDocumentCateg,                 // SD document category
    shtyp                as ShipmentType,                    // Shipment type
    tplst                as TransportPlanningPt,             // Transportation planning point
    ernam                as CreatedBy,                       // Name of Person Who Created the Object
    erdat                as CreatedOn,                       // Date on Which Record Was Created

...

    pkstk                as HandlingUnits,                   // Shipment Contains Handling Units
    @Semantics.unitOfMeasure: true
    dtmeg                as WeightUnit,                      // Unit of Weight for Transportation Planning
    @Semantics.unitOfMeasure: true
    dtmev                as VolumeUnit,                      // Volume Unit for Transportation Planning
    @Semantics.quantity.unitOfMeasure: 'UoMDistance'
    distz                as Distance,                        // Distance

...

Update 26.04.2022:

I improved the code

  • bugfixes (e.g. comma was missing after field names)
  • header (you might have to adapt this for the conventions in your company; we replace the “?” with a “module character” like “V”)
  • annotations for currency and unit fields

Here is the improved code:

REPORT zs_create_cds_from_table.

PARAMETERS: p_tabl TYPE tabname.

CLASS lcl_app DEFINITION FINAL.
  PUBLIC SECTION.
    CLASS-METHODS:
      main.
    TYPES: BEGIN OF tp,
             fieldname TYPE dd03l-fieldname,
             keyflag   TYPE dd03l-keyflag,
             datatype  TYPE dd03l-datatype,
             reftable  TYPE dd03l-reftable,
             reffield  TYPE dd03l-reffield,
             ddtext    TYPE dd04t-ddtext,
             reptext   TYPE dd04t-reptext,
             scrtext_s TYPE dd04t-scrtext_s,
             scrtext_m TYPE dd04t-scrtext_m,
             scrtext_l TYPE dd04t-scrtext_l,
           END OF tp,
           ttp TYPE STANDARD TABLE OF tp WITH EMPTY KEY.
  PRIVATE SECTION.
    CLASS-METHODS get_fieldname
      IMPORTING
                i_wa     TYPE REF TO lcl_app=>tp
      RETURNING VALUE(r) TYPE string.
ENDCLASS.

CLASS lcl_app IMPLEMENTATION.

  METHOD main.
    DATA it TYPE ttp.
    SELECT
      FROM dd03l AS fields
    INNER JOIN dd04t AS texts
          ON     texts~ddlanguage = 'E'
             AND texts~rollname   = fields~rollname
      FIELDS * " fieldname, keyflag, ddtext, reptext, scrtext_s, scrtext_m, scrtext_l
      WHERE tabname = @p_tabl
        AND fields~rollname <> 'MANDT'
         AND fields~as4local = 'A'
         AND fields~as4vers = '0000'
         AND texts~as4local = 'A'
         AND texts~as4vers = '0000'
      ORDER BY position
      INTO CORRESPONDING FIELDS OF TABLE @it.
    ASSERT sy-subrc = 0.

    SELECT SINGLE ddtext
      FROM dd02t
        WHERE tabname = @p_tabl
          AND ddlanguage = 'E'
          AND as4local = 'A'
          AND as4vers = '0000'
       INTO @DATA(description).
    ASSERT sy-subrc = 0.

    DATA(cds_name) = |Z?_I_{ replace( val = description sub = ` ` with = '' occ = 0 ) }|.
    DATA(view_name) = CONV viewname16( |Z?I{ replace( val = description sub = ` ` with = '' occ = 0 ) }| ).

    WRITE / |@AbapCatalog.sqlViewName: '{ view_name }'|.
    WRITE / |@AccessControl.authorizationCheck: #CHECK|.
    WRITE / |@EndUserText.label: 'Shipment Header'|.
    WRITE / |@VDM.viewType: #BASIC|.
    WRITE / |define view { cds_name } as select from { p_tabl } {|.

    LOOP AT it REFERENCE INTO DATA(wa).
      CASE wa->datatype.
        WHEN 'CUKY'.
          WRITE / |    @Semantics.currencyCode: true|.
        WHEN 'UNIT'.
          WRITE / |    @Semantics.unitOfMeasure: true|.
        WHEN 'QUAN' OR 'CURR'.
          IF wa->reftable = p_tabl AND line_exists( it[ fieldname = wa->reffield ] ).
            DATA(unit_field) = REF #( it[ fieldname = wa->reffield ] ).
            DATA(cds_unit_field) = get_fieldname( unit_field ).
          ELSE.
            cds_unit_field = '???'.
          ENDIF.
          WRITE / |    @Semantics.{ COND #( WHEN wa->datatype = 'QUAN' THEN 'quantity.unitOfMeasure'
                                                                       ELSE 'amount.currencyCode' ) }: '{ cds_unit_field }'|.
      ENDCASE.
      DATA(tab_fieldname_with_key) = COND #( WHEN wa->keyflag = abap_true THEN `key ` ELSE '' ) && to_lower( wa->fieldname ).
      DATA(cds_fieldname_with_comma) = get_fieldname( wa ) && COND #( WHEN sy-tabix = lines( it ) THEN '' ELSE ',' ).
      WRITE / |    { tab_fieldname_with_key WIDTH = 20 } as { cds_fieldname_with_comma WIDTH = 32 } // { wa->ddtext }|.
    ENDLOOP.

    WRITE / |}|.
  ENDMETHOD.


  METHOD get_fieldname.
    DATA t TYPE string.
    IF i_wa->scrtext_l IS NOT INITIAL.
      t = i_wa->scrtext_l.
    ELSEIF i_wa->scrtext_m IS NOT INITIAL.
      t = i_wa->scrtext_m.
    ELSEIF i_wa->reptext IS NOT INITIAL.
      t = i_wa->reptext.
    ELSEIF i_wa->scrtext_s IS NOT INITIAL.
      t = i_wa->scrtext_s.
    ELSE.
      r = |TODO: find name! // { i_wa->ddtext }|.
      RETURN.
    ENDIF.
    DATA(new_word) = abap_true.
    DO strlen( t ) TIMES.
      DATA(offset) = sy-index - 1.
      DATA(c) = t+offset(1).
      IF c CA | .-,_/()'"|.
        new_word = abap_true.
        CONTINUE.
      ENDIF.
      IF c >= 'A' AND c <= 'Z'.
        new_word = abap_true.
      ENDIF.
      IF new_word = abap_true.
        r = r && to_upper( c ).
        new_word = abap_false.
      ELSE.
        r = r && to_lower( c ).
      ENDIF.
    ENDDO.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  lcl_app=>main( ).

 

Sara Sampaio

Sara Sampaio

Author Since: March 10, 2022

0 0 votes
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x