
在发票管理页面里,同一个「设为已付款」按钮不应该永远可用。未付款发票需要这个动作,已经付款的发票再次执行同一个动作既没有业务价值,也可能造成重复记账、重复触发工作流或者留下难以解释的变更日志。比较自然的界面行为是,发票尚未付款时,SET_PAID动作处于启用状态。发票的Paid字段变为ABAP_TRUE后,页面上的动作随即变成禁用状态。整个过程不要求业务人员切换到编辑模式,也不需要前端代码手工判断每一行数据。这正是 BOPF Dynamic Action Control 要解决的问题。在基于 CDS 的经典 BOPF 编程模型中,字段属性和动作属性并不是两套完全独立的机制。它们都通过名为ACTION_AND_FIELD_CONTROL的属性确定来计算,并借助/BOBF/CL_LIB_H_SET_PROPERTY设置运行时属性。SAP 官方文档也将字段控制、实体控制和动作控制放在同一套属性计算模型中,因为这些属性最终都取决于当前业务对象节点实例的状态。动态动作控制并不是前端按钮技巧看到动作被禁用时,很容易把它理解成 SAPUI5 层面的按钮处理。实际上,真正作出决定的是 BOPF 业务对象运行时。前端只负责消费业务对象暴露出来的能力信息。某张发票能否执行SET_PAID,由后端根据这张发票当前的数据状态计算。另一张发票即使出现在同一个表格里,也可以得到完全不同的结果。假设列表中有三张发票。发票INV001/