S4HANA For ABAP(7):CDS View拓展笔记

编程入门 行业动态 更新时间:2024-10-15 02:24:08

S4HANA For ABAP(7):CDS View拓展<a href=https://www.elefans.com/category/jswz/34/1770047.html style=笔记"/>

S4HANA For ABAP(7):CDS View拓展笔记

目录

1.CDS View SQL

2.Analyzing and Using CDS View

3.CDS Tools in ADT

4.CDS View Rules

5.Annotations in CDS View

6.Build-in SQL Functions in CDS View

7.Aggregations Function in CDS View

8. Additional Join Types and UNION (ALL) in CDS View

9.Parameter in CDS View

10.Building CDS Views with Associations

11. CDS View Extensions

12. Metadata Extensions

13. CDS View with Authorization Rules

14.CDS Table Function & AMDP Framework

15.CDS View for ALV IDA

16. OData Services from CDS Views


1.CDS View SQL

SQL:Structured Query Language;

DML:Data Manipulation Language,SELECT,INSERT,UPDATE,DELETE;

读取,修改数据库表数据;

DDL:Data Definition Language,CREATE,ALTER,DROP;

创建,删除,修改数据库表,视图;

DCL:Data Control Language,GRANT,REVOKE;

定义数据库,数据表访问权限;

ABAP OPEN SQL是标准SQL的子集,实现功能有限;

S4HANA提供最优的方式将处理逻辑下沉到数据库层,而不是查询大量数据到ABAP应用层进行逻辑处理;

2.Analyzing and Using CDS View

@添加注解;

@AbapCatalog.sqlViewName,表示创建在ABAP字典中View名称,需要和CDS View名称不一致;

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_SIM'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view'define view ZTOM_CDS_SIMPLE as select from scarr {carrid as carrid,carrname as carrname,url as url}

ABAP 7.55支持define view entity,直接cds view名称和ABAP View名称一致;

示例:

@AbapCatalog.viewEnhancementCategory: [#NONE]@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view entity'@Metadata.ignorePropagatedAnnotations: true@ObjectModel.usageType:{serviceQuality: #X,sizeCategory: #S,dataClass: #MIXED}define view entity ZTOM_CDS_SIMPLE as select from scarr {carrid as carrid,carrname as carrname,url as url}

3.CDS Tools in ADT

选择CDS文件,右键->Show SQL CREATE Statement;

显示CDS View创建时,数据库底层执行SQL语句;

2.选择CDS View定义文件,右键->Open With功能

Data Preview:预览数据;

Active Annotations:查看注解;

Dependency Analyzer:依赖表分析;

some new for s4/HANA

示例:

"new for ABAP S4/HANA
FORM f_test_new.TYPES:BEGIN OF s_flight,carrid TYPE sflight-carrid,connid TYPE sflight-connid,paymentsum TYPE sflight-paymentsum,END OF s_flight.DATA:lt_flight TYPE TABLE OF s_flight.DATA:ls_flight LIKE LINE OF lt_flight."oldSELECT carrid connid SUM( paymentsum )INTO TABLE lt_flight FROM sflightWHERE fldate = sy-datumGROUP BY carrid connid."new for 7.4"使用@标记参数;"使用,号分隔查询字段;SELECT carrid,connid,SUM( paymentsum )FROM sflightINTO TABLE @lt_flightWHERE fldate = @sy-datumGROUP BY carrid,connid."new for 7.5"FIELDS 标记查询字段"INTO 放在查询语句最后SELECTFROM sflightFIELDS carrid,connid,SUM( paymentsum )WHERE fldate = @sy-datumGROUP BY carrid,connidINTO TABLE @lt_flight.
ENDFORM.

4.CDS View Rules

CDS View语句只接受ASCII字符;

关键字可以是大写,小写或者首字母大写;

字符串使用单引号‘’,数字小数点支持0.2,不支持.2;

注释使用/**/,多行注释;

注释使用//,单行注释;

使用分号做分隔符;

5.Annotations in CDS View

根据Annotations功能不同分为ABAP Annotations,Framework-specific annotations;

根据Annotations使用范围不同分为:

Entity Annotations,CDS View,CDS View Entity中使用;

Element Annotations,在SELECT List字段上使用;

Parameter Annotations,在Parameter上使用;

Extension Annotations,在CDS View Extension中使用;

Function Annotations,在CDS Table Function中使用;

金额数量标记Annotations

@Semantics.amount.currencyCode:'CurrColumn'

@Semantics.currencyCode:true

@Semantics.quantity.unitOfMeasure:'MeasureColumn'

@Semantics.unitOfMeasure:true

6.Build-in SQL Functions in CDS View

div(arg1,arg2):输入整数,整除;

mod(arg1,arg2):输入整数,取余;

division(arg1,arg2,dec):输入整数或小数,除法;

abs(arg):取绝对值;

floor(arg):向下取整;

ceil(arg):向上取整;

round(arg,pos):四舍五入,pos保留小数位;

concat(arg1,arg2):字符拼接;

replace(arg1,arg2,arg3):使用arg3替换arg1中所有arg2;

substring(arg,pos,len):从pos开始,截取len长度;

concat_with_space(arg1,arg2,count):使用count个space连接arg1,arg2;

length(arg):返回长度;

left(arg,n):左边n个字符;

right(arg,n):右边n个字符;

lower(arg):转换小写,numc,dats,tims不允许输入;

upper(arg):转换大写,numc,dats,tims不允许输入;

unit_conversion():单位转换,

Tcode:CUNI维护单位;

currency_conversion():币别转换,

Tcode:OB08,维护币别;

示例:币别转换

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL9'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds currency convert'define view ZTOM_CDS_9 as select from sflight {carrid,connid,fldate,@Semantics.amount.currencyCode: 'currency'currency_conversion(amount => price,source_currency => currency,round => 'X',target_currency => cast('USD' as abap.cuky),exchange_rate_type => 'M',exchange_rate_date => fldate,//SET_TO_NULL:设置为空//FAIL_ON_ERROR:报错//KEEP_UNCONVERTED:保持原样error_handling => 'SET_TO_NULL') as price,@Semantics.currencyCode:truecast('USD' as abap.cuky) as currency}

7.5版本新增functions:

dats_in_valid(date):是否是日期,1:是,0否;

dats_days_between(date1,date2):返回日期之差;

dats_add_days(date,count,on_error):date日期加上count;

dats_add_months(date,count,on_error):date日期加上count个月;

on_error值:‘FAIL’,'NULL','INITIAL','UNCHANGED';

7.Aggregations Function in CDS View

聚合function

MIN(operand):最小值;

MAX(operand):最大值;

SUM(operand):加总;

AVG(operand):均值;

COUNT(*):计数;

COUNT(DISTINCT operand):计数去重

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL10'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds avg(),sum()'define view ZTOM_CDS_10 as select from sflight {carrid,connid,//返回fltp类型avg(paymentsum) as avg_paymentsum,//返回指定类型,报错//avg(paymentsum as abap.dec(16,2)) as avg_paymentsum_deccount(*) as count_lines,count(distinct carrid) as count_carr,//返回和count(*)一样cast(sum(1) as abap.int4) as count_lines_sum,//sum加casesum(case when seatsocc > 200 then  cast(1 as abap.int4)else 0end) as sum_case}group by carrid,connid

8. Additional Join Types and UNION (ALL) in CDS View

CDS View中目前支持Join类型:

Inner Join,内联接;

Left Outer Join,左外联;

Right Outer Join,右外联;

Full Outer Join,目前CDS View不支持,可以使用Left Outer Join结果和Right Outer Join结果Union实现;

Cross Join,全连接,会读取整个左表记录和右表所有记录做连接,一般不用,会返回一个巨大的结果集;

Union,聚合连接,将多个结果集合并,合并的结果集栏位应该一致,Union会将结果去重;

Union All,全角聚合连接,功能与Union一致,不会将结果去重;

9.Parameter in CDS View

创建一个可以接收参数的CDS View;

Parameter类型可以是abap字典类型,也可以是abap.<类型>(dec,len);

不能使用structure,table,引用类型;

使用$parameters.<参数名称>可以访问到参数;

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL11'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view with parameter'define view ZTOM_CDS_11with parameters p_carrid : s_carr_idas select from sflight {$parameters.p_carrid as inp_carrid,carrid,avg(case when carrid = $parameters.p_carrid then paymentsumelse 0end) as avg_paymentsum}group by carrid

示例:返回输入carrid,对应聚合信息;

define view ZTOM_CDS_11with parameters p_carrid : s_carr_id,p_connid : s_conn_idas select from sflight {$parameters.p_carrid as inp_carrid,carrid,avg(paymentsum) as avg_paymentsum,count(*) as count_lines,sum(paymentsum) as sum_paymentsum}where carrid = $parameters.p_carridgroup by carrid

示例:使用参数CDS View

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL12'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view using parameter cds'define view ZTOM_CDS_12with parameters p_carrid : s_carr_idas select from ZTOM_CDS_11(p_carrid : $parameters.p_carrid,p_connid : '0017') {carrid,avg_paymentsum,sum_paymentsum}

ABAP Program中查询带参数CDS View:

示例:

"查询输入参数cds view
FORM f_test_parameter_cds."多个参数用,分隔;"顺序可以不一致;"输入参数可以是:@( 变量表达式 );DATA:lv_carrid TYPE s_carr_id.lv_carrid = 'AA'.SELECT FROM ztom_cds_11( p_carrid = @lv_carrid,p_connid = '0017' )FIELDS *INTO TABLE @DATA(lt_data).
ENDFORM.

目前,只要定义了参数,那么使用CDS View时,参数必须赋值;

可以通过@Environment定义一些系统参数,这种参数可以不赋值,默认带系统值;

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL13'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view using parameter system fields'define view ZTOM_CDS_13with parameters@Environment.systemField: #CLIENTp_client : syst_mandt,@Environment.systemField: #SYSTEM_DATEp_date : syst_datum,@Environment.systemField: #SYSTEM_TIMEp_time : syst_uzeit,@Environment.systemField: #SYSTEM_LANGUAGEp_lang : syst_langu,@Environment.systemField: #USERp_user : syst_uname//@Environment.systemField: #USER_DATE//p_user_date : syst_datlo,//@Environment.systemField: #USER_TIMEZONE//p_user_time : syst_zonloas select from spfli {$parameters.p_client as inp_client,$parameters.p_date as inp_date,$parameters.p_time as inp_time,$parameters.p_lang as inp_lang,$parameters.p_user as inp_user,//系统session varivle$session.client as session_client,$session.system_date as session_date,$session.system_language as session_lang,$session.user as session_user}

10.Building CDS Views with Associations

可以使用$projection访问到计算栏位,或者别名栏位;

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL14'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view association $projection'define view ZTOM_CDS_14 as select from spfliassociation [0..1] to scarr as _Scarron $projection.id = _Scarr.carrid//这样使用$projection使用,作为筛选条件不支持//and $projection.sum_distance > 200{spfli.carrid as id,spfli.connid,spfli.countryfr,sum(spfli.distance) as sum_distance,_Scarr.carrname}//不支持//where $projection.sum_distance > 500group by spfli.carrid,spfli.connid,spfli.countryfr,_Scarr.carrname

Exposed Association:

可以整个将Association关联表放到CDS View中,当没有访问Association关联表栏位时,不会执行连接查询操作。只有需要访问Association关联表中栏位时,才会执行连接操作;

示例:Association关联关系,可以作为CDS View字段,但是不会展开

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL15'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view association expose'define view ZTOM_CDS_15 as select from sflight as aassociation[1] to scarr as _Scarron a.carrid = _Scarr.carridassociation[0..*] to spfli as _Spflion a.carrid = _Spfli.carridand a.connid = _Spfli.connid{a.carrid,a.connid,a.fldate,a.paymentsum,a.price,_Scarr,_Spfli}

使用时,才会去join Association外键关联表;

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL16'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view  use association expose'define view ZTOM_CDS_16 as select from ZTOM_CDS_15 {carrid,connid,fldate,_Scarr.carrname as carrname,_Scarr.url as url}

使用ABAP Program访问Exposed CDS View

示例:

"Use Exposed Associations in ABAP SQ
FORM f_test_exposed_association."使用\访问association关联表字段"当使用时使用<别名>~\_Scarr-<字段名>SELECT FROM ztom_cds_15FIELDS carrid,connid,fldate,\_Scarr-carrname as carrnameINTO TABLE @DATA(lt_data).SELECT FROM ztom_cds_15 AS aFIELDS carrid,connid,fldate,a~\_Scarr-carrname as carrnameINTO TABLE @DATA(lt_data2).
ENDFORM.

Association对应连接表访问前可以使用Filter;

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL17'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view association filter'define view ZTOM_CDS_17 as select from ZTOM_CDS_15 {carrid,connid,fldate,//association filter效果,只有coutryto = 'US',couryfr才有值//相当于sflight 左连接 spfli[countryto = 'US'],_Spfli[countryto = 'US'].countryfr}

示例:通过[*]定义Association为多对多

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL18'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view association filter 1'define view ZTOM_CDS_18 as select fromscarr as aassociation [*] to spfli as _Spflion a.carrid = _Spfli.carrid{a.carrid,a.carrname,a.url,_Spfli[cityfrom='NEW YORK'].airpfrom}

通过Filter,改变Association,修改为多对一

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL18'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view association filter 1'define view ZTOM_CDS_18 as select fromscarr as aassociation [*] to spfli as _Spflion a.carrid = _Spfli.carrid{a.carrid,a.carrname,a.url,_Spfli[1:cityfrom='NEW YORK'].airpfrom}

注解:AbapCatalogpilerpareFilter,如果为True,当访问同一个Association表不同栏位只会连接一次Association表;如果为False,当访问同一个Association表不同栏位会多次连接Association表;

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL18'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view association filter 1'define view ZTOM_CDS_18 as select fromscarr as aassociation [*] to spfli as _Spflion a.carrid = _Spfli.carrid{a.carrid,a.carrname,a.url,_Spfli[cityfrom='NEW YORK'].airpfrom,_Spfli[cityfrom='NEW YORK'].airpto}

只会Join一次,@AbapCatalogpilerpareFilter: true

会Join多次,@AbapCatalogpilerpareFilter: false

11. CDS View Extensions

定义Extend View,可以扩展原CDS View栏位;

示例:Extend Target View

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL19'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view extend target view'//Value:#NONE,不允许Extend//Value:#PROJECTION_LIST,允许Extend//默认Projection_list//@AbapCatalog.viewEnhancementCategory: #PROJECTION_LIST//VAlue:#UNION,#GROUP_BY,需要和PROJECTION_LIST一起设置,允许UNION,GROUP_BY//@AbapCatalog.viewEnhancementCategory: [#PROJECTION_LIST,#GROUP_BY]define view ZTOM_CDS_19 as select from sflight as aassociation [1] to scarr as _Scarron a.carrid = _Scarr.carrid{a.carrid,a.connid,a.fldate,a.seatsmax,_Scarr.carrname}

示例:Extend View,可以将额外栏位添加,不用修改原CDS View代码;

@AbapCatalog.sqlViewAppendName: 'ZTOM_CDS_CAL20'@EndUserText.label: 'test cds view extend view1'extend view ZTOM_CDS_19 with ZTOM_CDS_20 {a.paymentsum,a.price}

示例:Extend View可以额外添加Association外联表;

@AbapCatalog.sqlViewAppendName: 'ZTOM_CDS_CAL21'@EndUserText.label: 'test cds view extend view2'extend view ZTOM_CDS_19 with ZTOM_CDS_21association [*] to tcurt as _Tcurton $projection.currency = _Tcurt.waers{a.currency,_Tcurt[1:spras=$session.system_language].ltext as ltext}

12. Metadata Extensions

将Anonotate和View定义分离;

Metadata Extension,选择CDS View,右键->New Metadata Extension;

一个CDS View可以对应多个Metadata Extension;

CDS View需要有@Metadata.allowExtensions:true

示例:

@AbapCatalog.sqlViewName: 'ZTOM_CDS_CAL22'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view metadata extend'@Metadata.allowExtensions: truedefine view ZTOM_CDS_22 as select from spfli as aleft outer join scarr as bon a.carrid = b.carridleft outer join tcurt as con c.waers = b.currcodeand c.spras = $session.system_language{a.carrid,connid,countryfr,cityfrom,countryto,cityto,b.carrname,b.url,c.ktext,c.ltext}

示例:

@Metadata.layer,通过不同的值设置注解优先级;#CUSTOMER:最高优先级;#PARTNER,#INDUSTRY,#LOCALIZATION,#CORE:最低优先级;@Metadata.layer: #CUSTOMERannotate view ZTOM_CDS_22with{@EndUserText.label: '航班ID'carrid;@EndUserText.label: '航班班次'connid;}

13. CDS View with Authorization Rules

CDS View权限控制拥有两种类型:

1.根据字段限制权限;

2.根据pfcg条件限制权限;

通过@AccessControl.authorizationCheck定义是否检查权限;

#CHECK:检查Role权限, 如果Role没有使用到,会有警告;;

#NOT_REQUIRED:检查Role权限,如果Role没有使用到,不会有警告;

#NOT_ALLOWED:不检查Role权限;

示例:限制权限CDS View

//重命名view,删除Table:VRSD,objname = 'view name@AbapCatalog.sqlViewName: 'ZTOM_CDS_SPFLI1'@AbapCatalogpilerpareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'test cds view'define view ZTOM_CDS_SPFLI as select from spfli {key carrid,key connid,countryfr,cityfrom,airpfrom,countryto,cityto,airpto,fltime,deptime,arrtime,distance,distid,fltype,period}

创建Access Control,多个Access Control是OR关系,只要CDS View记录满足某一个Role时,就可以被查询到;

右键->New->Access Control

示例1:

@EndUserText.label: 'test cds view access control'@MappingRole: truedefine role ZTOM_ACC_1 {grant select onZTOM_CDS_SPFLIwhere carrid = 'AA';                       }

示例2:

@EndUserText.label: 'test cds view access control 2'@MappingRole: truedefine role ZTOM_ACC_2 {grant select onZTOM_CDS_SPFLIwhere connid = '0555';}

定义PFCG权限检查Role;

Tcode:SU21,创建Object Class,Authorization Object;

创建Authorization Object,Z_CARRID,单独carrid;

创建Authorization Object,Z_COUNTRY,单独country;

Tcode:PFCG

创建Role:ZTOM_ROLE,设置对应CARRID,COUNTRY权限;

User页签将自己SAP账号维护进去;

单独CARRID,COUNTRY卡控;

CARRID,COUNTRY一起卡控

示例:PFCG权限卡控

@EndUserText.label: 'test cds view access control 3'@MappingRole: truedefine role ZTOM_ACC_3 {grant select onZTOM_CDS_SPFLIwhere (carrid) = aspect pfcg_auth(Z_CARRID,CARRID,ACTVT='03')or(countryfr) = aspect pfcg_auth(Z_COUNTRY,COUNTRY,ACTVT='03')or(carrid,countryfr) = aspect pfcg_auth(Z_CARR_C,CARRID,COUNTRY,ACTVT='02');}

14.CDS Table Function & AMDP Framework

AMDP: ABAP-Managed Database Procedures;

创建AMDP Class,只能在Eclipse中使用ADT创建;

示例:

class ZTOM_TEST_AMDP1 definitionpublicfinalcreate public .public section.interfaces IF_AMDP_MARKER_HDB .types:begin of s_custom,id type scustom-id,name type scustom-name,country type scustom-country,city type scustom-city,postcode type scustom-postcode,end of s_custom.types:t_custom type standard table of s_custom with default key.methods:m_get_customimportingvalue(iv_name) type scustom-nameexportingvalue(et_normal) type t_customvalue(et_fuzzy) type t_custom."test amdp functions"只能被其他amdp function访问,不能被abap program调用class-methods:cm_get_customreturningvalue(et_customs) type t_custom."test amdp functions for cds functionsclass-methods:cm_get_custom_cdsfor table function ztom_cds_function.protected section.private section.ENDCLASS.CLASS ZTOM_TEST_AMDP1 IMPLEMENTATION.method:m_get_customby database procedurefor hdb language sqlscriptoptions read-onlyusing scustom.--search customet_normal = selectid,name,country,city,postcodefrom scustomwhere name = :iv_name;--search custom fuzzyet_fuzzy = selectid,name,country,city,postcodefrom scustomwhere contains(name,:iv_name,fuzzy)order by score(  ) desc;endmethod.method cm_get_customby database functionfor hdb language sqlscriptoptions read-onlyusing scustom.return  selectid,name,country,city,postcodefrom scustom;endmethod.method cm_get_custom_cdsby database functionfor hdb language sqlscriptoptions read-onlyusing scustom.return  selectmandt,id,name,country,city,postcodefrom scustomwhere name = :iv_name;endmethod.ENDCLASS.

创建CDS Function

示例:

@EndUserText.label: 'test cds functions'define table function ZTOM_CDS_FUNCTIONwith parameters iv_name : s_custnamereturns {mandt:mandt;id:s_customer;name:s_custname;country:s_country;city:city;postcode:postcode;}implemented by method ZTOM_TEST_AMDP1=>cm_get_custom_cds;

ABAP Program使用AMDP,CDS Function

示例:

"test amdp
FORM f_test_amdp.DATA:lo_amdp1 TYPE REF TO ztom_test_amdp1.TYPES:BEGIN OF s_custom,id TYPE scustom-id,name TYPE scustom-name,country TYPE scustom-country,city TYPE scustom-city,postcode TYPE scustom-postcode,END OF s_custom.TYPES:t_custom TYPE STANDARD TABLE OF s_custom WITH DEFAULT KEY.DATA:lv_name TYPE scustom-name.DATA:lt_normal TYPE t_custom.DATA:lt_fuzzy TYPE t_custom.DATA:lt_customs TYPE t_custom.lv_name = 'SAP'.lo_amdp1 = new #( ).lo_amdp1->m_get_custom(EXPORTINGiv_name = lv_nameIMPORTINGet_normal = lt_normalet_fuzzy = lt_fuzzy)."AMDP Function不能被ABAP Call"lt_customs = ztom_test_amdp1=>cm_get_custom( )."调用CDS Functionlv_name = 'King'.SELECT FROM ztom_cds_function( iv_name = @lv_name )FIELDS *INTO TABLE @DATA(lt_data).
ENDFORM.

15.CDS View for ALV IDA

ALV IDA可以直接显示CDS View数据;

Package: SALV_IDA_TEST,包含使用SALV_IDA的示例;

示例1:

"test alv ida1
FORM f_test_alv_ida1.DATA:lo_salv TYPE REF TO if_salv_gui_table_ida.DATA:lo_full TYPE REF TO if_salv_gui_fullscreen_ida."1.使用ALV idalo_salv = cl_salv_gui_table_ida=>create( iv_table_name = 'SPFLI' ).lo_full = lo_salv->fullscreen( ).lo_full->display( )."链式表达式"cl_salv_gui_table_ida=>create( iv_table_name = 'SPFLI')->fullscreen( )->display( ).
ENDFORM.

示例2:

"test alv ida2
FORM f_test_alv_ida2.DATA:lo_salv TYPE REF TO if_salv_gui_table_ida.DATA:lo_full TYPE REF TO if_salv_gui_fullscreen_ida."2.使用ALV ida显示cds viewlo_salv = cl_salv_gui_table_ida=>create_for_cds_view( iv_cds_view_name = 'ZTOM_CDS_SPFLI' ).lo_full = lo_salv->fullscreen( ).lo_full->display( ).
ENDFORM.

示例3:

"test alv ida3
FORM f_test_alv_ida3.DATA:lo_salv TYPE REF TO if_salv_gui_table_ida.DATA:lo_full TYPE REF TO if_salv_gui_fullscreen_ida.DATA:lo_range_collector TYPE REF TO cl_salv_range_tab_collector.DATA:lt_ranges TYPE if_salv_service_types=>yt_named_ranges.DATA:lt_carrid TYPE RANGE OF spfli-carrid.DATA:ls_carrid LIKE LINE OF lt_carrid."3.使用输入range,限制显示数据CLEAR ls_carrid.ls_carrid+0(3) = 'IEQ'.ls_carrid-low = 'AZ'.APPEND ls_carrid TO lt_carrid.lo_range_collector = NEW #( )."添加Rangeslo_range_collector->add_ranges_for_name(iv_name = 'CARRID'it_ranges = lt_carrid)."获取ranges 集合lo_range_collector->get_collected_ranges(IMPORTINGet_named_ranges = lt_ranges)."获取alvlo_salv = cl_salv_gui_table_ida=>create_for_cds_view( iv_cds_view_name = 'ZTOM_CDS_SPFLI' )."设置筛选rangeslo_salv->set_select_options(it_ranges = lt_ranges).lo_full = lo_salv->fullscreen( ).lo_full->display( ).ENDFORM.

示例4:

"test alv ida4
"使用带参数的CDS View
FORM f_test_alv_ida4.DATA:lo_salv TYPE REF TO if_salv_gui_table_ida.DATA:lo_full TYPE REF TO if_salv_gui_fullscreen_ida.DATA:lt_parameters TYPE if_salv_gui_types_ida=>yt_parameter.DATA:ls_parameters LIKE LINE OF lt_parameters."构造参数条件ls_parameters-name = 'P_CARRID'.ls_parameters-value = 'AA'.APPEND ls_parameters TO lt_parameters.ls_parameters-name = 'P_CONNID'.ls_parameters-value = '0017'.APPEND ls_parameters TO lt_parameters."获取alvlo_salv = cl_salv_gui_table_ida=>create_for_cds_view( iv_cds_view_name = 'ZTOM_CDS_11' )."设置输入参数lo_salv->set_view_parameters( it_parameters = lt_parameters ).lo_full = lo_salv->fullscreen( ).lo_full->display( ).
ENDFORM.

16. OData Services from CDS Views

Tcode:

SEGW:SAP Gateway Service Builder

/IWFND/MAINT_SERVICE : Activate and Maintain Service

注:

当出现User no longer logged on弹窗

需要新窗口打开/n/IWFND/MAINT_SERVICE

/IWFND/GW_CLIENT : SAP Gateway Client

/IWFND/ERROR_LOG : SAP Gateway Log

SICF : Edit HTTP Service Hierarchy

创建CDS View,使用注解@OData.publish: true

会自动创建Service:<CDS View Name>_CDS

Tcode: /IWFND/MAINT_SERVICE,

选择Add Service;

选择System Alias,LOCAL;

点击Get Service,找到自动生成的Service;

点击SAP Gateway Client,如果打不开,使用Goto->SAP GW Client;

点击Call Browser可以获取到URL路径地址;

通过点击Execute执行,测试是否能够访问到数据;

更多推荐

S4HANA For ABAP(7):CDS View拓展笔记

本文发布于:2024-03-05 07:21:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1711663.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔记   ABAP   S4HANA   View   CDS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!