在Fiori Elements开发中,需要定义CDS生成ODATA给SAPUI使用,在进行SAP Fiori Elements开发时,需要在CDS中设置字段的隐藏、必输入等属性,我们可以使用@ObjectModel.readOnly: true,@ObjectModel.mandatory: true等来直接设置,但在实际的开发中,常用需要通过数据其它字段的值或者其它一些内容来做判断决定字段 的属性,这里可以使用以下下方法。
1.基于BOPF的方法
1.1.动态字段和实体字段控制
必须定义 BO 视图,为所需字段设置注释 @ObjectModel.readOnly: ‘EXTERNAL_CALCULATION’,并使用 SET_ATTRIBUTE_ENABLED 方法相应地显示/隐藏字段。这个解决方案是在各种答案中提出的,有一篇很棒的文档文章,这只能在自定义 CDS 视图中实现,因为无法使用 BOPF 增强扩展视图
2.虚拟元素
正如Daniel Ojados Conesa 所提到和解释的,虚拟元素是外部计算的另一种选择,以便为注释动态提供值,但不幸的是它也使用了 BOPF 框架。如果您的 CDS 视图是一个新的、自定义的视图,那么有很好的文档记录的虚拟元素可能会为您工作
这个解决方案,它基于属性 sap:field-control。我们使用了等效的词汇术语 Common.FieldControl,设法通过相关的 MPC_EXT 类从后端提供了注释。
2.1.Common.FieldControl 术语
该术语接受分配给不同 UI 实用程序的一系列整数值。通过将路径属性指向 edm.byte(整数)属性,可以动态提供这些值。
2.2.CDS 视图
我们的扩展视图部分,包含要隐藏的字段,看起来像:
1 2 |
source.field as FieldYouWantDynamicallyHidden, (case when source.ControlField = 'ValueToHide' then 0 else 1 end) as FieldToGetHideOrShowValue |
评估为:
1 2 |
<Property Name="FieldYouWantDynamicallyHidden" Type="Edm.String" MaxLength="122" sap:display-format="UpperCase"/> <Property Name="FieldToGetHideOrShowValue" Type="Edm.Byte"/> |
请注意,在我们的例子中,我们使用了值 0(隐藏)和 1(只读),因为我们想要隐藏/显示的字段仅用于显示原因。代替 1(只读),您可以添加任何其他可接受的值:
字段是隐藏的(值 = 0)、只读(值 = 1)、可选(值 = 3)或强制(值 = 7)。
2.3.MPC_EXT 类
在重新定义和修改相关网关项目的相应 MPC_EXT 类的 DEFINE 方法后(可能不是最好的方法,但仍然合法),我们添加以下代码:
1 2 3 |
lo_ann_target = vocab_anno_model->create_annotations_target( 'YourService.YourEntityType/FieldYouWantDynamicallyHidden' ). lo_annotation = lo_ann_target->create_annotation( iv_term = 'Common.FieldControl' ) ##NO_TEXT. lo_annotation->create_simple_value( )->set_path( 'FieldToGetHideOrShowValue' ). ##NO_TEXT. |
请注意,要使上述定义方法中的代码正常工作,应存在以下数据类型和别名。如果没有,那么您应该像这样添加它们:
1 2 3 4 5 6 7 8 9 10 |
data lo_ann_target type ref to /iwbep/if_mgw_vocan_ann_target. data lo_annotation type ref to /iwbep/if_mgw_vocan_annotation. vocab_anno_model->create_vocabulary_reference( iv_vocab_id = 'vocabularies.Common.v1' iv_vocab_version = '0001' )->create_include( iv_namespace = 'com.sap.vocabularies.Common.v1' iv_alias = 'Common' ) ##NO_TEXT. |
上面的代码计算为:
1 2 3 |
<Annotations xmlns="http://docs.oasis-open.org/odata/ns/edm" Target="YourService.YourEntityType/FieldYouWantDynamicallyHidden"> <Annotation Term="Common.FieldControl" Path="FieldToGetHideOrShowValue"/> </Annotations> |
可以清楚地看到,FieldControl 注解引用了 FieldToGetHideOrShowValue 字段,用于检索我们以动态方式提供的值,用于控制 FieldYouWantDynamicallyHidden 字段的 UI。
2.4.MPC_EXT 的另一种方法
我们可以在 MPC_EXT 类的 DEFINE 方法中实现这样的代码块,并将所需术语直接添加为生成的 oData 属性的属性:
后端代码看起来像:
1 2 3 4 5 6 7 |
DATA(lo_entity_type) = model->get_entity_type( 'YourEntityType' ). IF lo_entity_type IS BOUND. DATA(lo_entity_prop) = lo_entity_type->get_property( 'FieldYouWantDynamicallyHidden' ). IF lo_entity_prop IS BOUND. lo_entity_prop->set_field_control( 'FieldToGetHideOrShowValue' ). ENDIF. ENDIF. |
那么该属性将如下所示:
1 2 |
<Property Name="FieldYouWantDynamicallyHidden" Type="Edm.String" MaxLength="122" sap:display-format="UpperCase" sap:field-control="FieldToGetHideOrShowValue"/> <Property Name="FieldToGetHideOrShowValue" Type="Edm.Byte"/> |
2.5.结论
1.通过模型提供程序类 (mpc_ext) 实现基于代码的解决方案,以便为 CDS 扩展视图的字段启用字段控制功能,以便有条件地显示/隐藏它们。
因此,现在系统将“看到” FieldYouWantDynamicallyHidden 字段的字段控制注释,并通过对 FieldToGetHideOrShowValue 字段的路径引用来获取一个值,告诉它是否隐藏它。
此解决方案的另一个可能应用是基于用户交互(例如使用复选框或其他字段的值)动态更改字段状态(隐藏、只读、强制等)。但是对于静态隐藏,始终建议您应该像这样使用@UI.hidden 或@Consumption.hidden 。
2.而BOPF方式的’EXTERNAL_CALCULATION’方式,除了写BOPF代码外,还需要在CDS中为每个字段都要使用写入@ObjectModel.readOnly: ‘EXTERNAL_CALCULATION’定义,而事实上,当你在字段上定义了后,也是会生成如下的注释定义
1 |
<Property sap:label="公司代码" Name="Bukrs" sap:display-format="UpperCase" MaxLength="4" Type="Edm.String" sap:text="to_comp/CompanyCodeName" sap:value-list="standard" sap:field-control="Bukrs_fc"/> |
上面公司代码定义,就是我在CDS中写入了
1 2 |
@ObjectModel.readOnly: 'EXTERNAL_CALCULATION' Bukrs, |
的结果 ,在这里生动生成了一个”Bukrs_fc”的字段,
1 2 3 |
sap:field-control="Bukrs_fc" 最后总结起来,我还是觉得使用BOPF的这种方式更自由,但就是要每天一个需要控制 的字段都需要加入定义,如能在CDS抬头定义一个默认的就好了。 |