在创建表时,我们通常会有一些默认值,比如创建人,创建时间,更改人,更改时间等,通常的们会有创建表维护时使用“事件”,来在创建、更改时实现这功能,但当我们的数据是在FIORI中使用或者其它接口中使用时,这种方法就不行了,当然我们也可以用提供的ODATA的数据中直接填入默认值,但这样就做不到统一了,也不是很方便,
为了实现这功能,我们可以创建一个CDS,并生成BOPF来实现,最后使用这人CDS替换到真实表中。
1.创建表
表中INCLUDE结构:/BOBF/S_LIB_ADMIN_DATA,主要是需要引用以下四个字段名,测试时发现默认情况下字段名不能改变,否则后面默认不能成功。
CREA_DATE_TIME
CREA_UNAME
LCHG_DATE_TIME
LCHG_UNAME
2.创建CDS,并生成BOPF
在ECLIPSE中创建CDS,其中的@Semantics.systemDateTime.createdAt就会在BOPF创建数据时使用系统用户填写,其它的类似功能。
注:字段名不用AS 重定义,发现用AS重定义后BOPF的字段会多出AS的字段,默认值只会写到结构的AS名字下,而不能保存表真实表中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
@AbapCatalog.sqlViewName: 'ZCDS_I_ZTESTH' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'ZTEST HEAD' @ObjectModel:{ semanticKey: ['EBELN'], modelCategory: #BUSINESS_OBJECT, compositionRoot: true, transactionalProcessingEnabled: true, writeActivePersistence: 'ztest01_h', createEnabled: true, deleteEnabled: true, updateEnabled: true } define view ZDDL_I_ZTESTH as select from ztest01_h as _ROOT { key _ROOT.ebeln as Ebeln, _ROOT.lifnr as Lifnr, @ObjectModel.readOnly: true @Semantics.systemDateTime.createdAt: true _ROOT.crea_date_time, @ObjectModel.readOnly: true @Semantics.user.createdBy: true _ROOT.crea_uname, @ObjectModel.readOnly: true @Semantics.systemDateTime.lastChangedAt: true _ROOT.lchg_date_time, @ObjectModel.readOnly: true @Semantics.user.lastChangedBy: true _ROOT.lchg_uname } |
3.检查BOPF
在前一步的CDS中会生成 BOPF:ZDDL_I_ZTESTH,打开BOPF,会发现默认生成了一个名为“ADMINISTRATIVE_DATA”的Determinations,有前一步中参数引用的默认值,就是在这表Determinations的类中写入的,代码是自动生成的,引用了类:/BOBF/CL_LIB_D_ADMIN_DATA_AI,可以打开此类查看更多细节。
4.测试
事务码:BOBT,打开ZDDL_I_ZTESTH,创建一行数据,点击保存后,就会填入默认的用户时间了。