Search code examples
abapcds

Can I create a GUID in an ABAP CDS view?


I'm joining a table to itself, in an ABAP CDS view, and would like to create a unique GUID per row. Is that possible?

Something like:

select from my_view as a
  inner join my_view as b
    on a.ContextKey = b.ContextKey and
       a.DbKey != b.DbKey
{
    key sysuuid as MAPPING_ID,
    a.SomeField AS A,
    b.SomeField AS B
}

Solution

  • I am not aware any UUID function in CDS. You need to use CDS Table Function and AMDP.

    Your Table Function view.

    define table function ZP_TF_TEST
    with parameters @Environment.systemField: #CLIENT mandt : mandt
    returns
    {
        mandt : mandt;
        ID    : uuid;
        A     : type_a; 
        B     : type_b;
    }
    implemented by method zcl_tf_test=>get_data;
    

    Your CDS view.

    define view ZZ_TF_TEST as select from ZP_TF_TEST( mandt : $session.client )
    {
       key ID,
           A,
           B,
    }
    

    Your AMDP class .

    CLASS zcl_tf_test DEFINITION PUBLIC FINAL CREATE PUBLIC .
    
    PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb .
    
    CLASS-METHODS get_data
        FOR TABLE FUNCTION ZP_TF_TEST.
    
    PROTECTED SECTION.
    PRIVATE SECTION.
    
    ENDCLASS.
    

    Implement method get_data and use SELECT sysuuid FROM dummy

    METHOD get_data BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING my_table.
    
        RETURN SELECT 
                     a.mandt,
                     ( SELECT sysuuid FROM dummy  ) as id,
                     a.SomeField AS A,
                     b.SomeField AS B
                   from my_table as a inner join my_table as b
                         on a.ContextKey = b.ContextKey and a.DbKey != b.DbKey
                   where a.mandt= :mandt;
    
    ENDMETHOD.