在另外 一文中在BOPF的Determination中设置按钮的可用性。在这里主要说明在使用中设置CDS中字段在在ODATA中的一些属性,
主要属性为:
- Enabled ,可用性,FLASE时在FIORI APP中不可以
- Read-only,只读性,TRUE时,当编辑状态时也不可编辑
- Mandatory,必输入,TRUE时,当TRUE时,字段必须输入值,
以下分别说明设置方法
1.固定给值
可以在CDS,或者是SEGW中设置字段的属性,比如SEGW中设置字段的只读、使能属性。
2.动态给值
在使用中,我们可能需要依据数据记录中的值来设置字段的属性,比如当状态为审批完成后,一些字段的值就不能再被修改,也就是字段的属性的使能属性为FALSE
一些文档中说要使用“EXTERNAL_CALCULATION”,更多细节可参考这里。
1.CDS中设置。
2.在BOPF的Determination中依据数据的值来设置属性。
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
CLASS ZCL_ACC_APPLY_D_ACTION_FIELD_C DEFINITION PUBLIC INHERITING FROM /BOBF/CL_LIB_D_SUPERCL_SIMPLE FINAL CREATE PUBLIC . PUBLIC SECTION. METHODS /BOBF/IF_FRW_DETERMINATION~EXECUTE REDEFINITION . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS ZCL_ACC_APPLY_D_ACTION_FIELD_C IMPLEMENTATION. METHOD /BOBF/IF_FRW_DETERMINATION~EXECUTE. DATA: LS_NODE_CONF TYPE /BOBF/S_CONFRO_NODE. FIELD-SYMBOLS <LT_DATA> TYPE INDEX TABLE. " The invoice's data is typed with BO node's combined table type DATA: LV_ACTION_LY_ENABLED TYPE ABAP_BOOL, LV_ACTION_FI_ENABLED TYPE ABAP_BOOL. FIELD-SYMBOLS: <LINE> TYPE ANY, <FIELD> TYPE ANY, <ZDJZT> TYPE ZTR_DJZT_YHZH. DATA: TP_DATA TYPE REF TO DATA. * BREAK YANGSENG. * RETURN. /BOBF/CL_FRW_FACTORY=>GET_CONFIGURATION( IS_CTX-BO_KEY )->GET_NODE( EXPORTING IV_NODE_KEY = IS_CTX-NODE_KEY IMPORTING ES_NODE = LS_NODE_CONF ). CREATE DATA TP_DATA TYPE (LS_NODE_CONF-DATA_TABLE_TYPE). ASSIGN TP_DATA->* TO <LT_DATA>. " (1) Retrieve the data of the invoice's node instance IO_READ->RETRIEVE( EXPORTING IV_NODE = IS_CTX-NODE_KEY IT_KEY = IT_KEY IMPORTING ET_DATA = <LT_DATA> ). " (2) Create a property helper object DATA LO_PROPERTY_HELPER TYPE REF TO /BOBF/CL_LIB_H_SET_PROPERTY. CREATE OBJECT LO_PROPERTY_HELPER EXPORTING IO_MODIFY = IO_MODIFY IS_CONTEXT = IS_CTX. " (3) Action not enabled when invoice is set to PAID LOOP AT <LT_DATA> ASSIGNING FIELD-SYMBOL(<LS_DATA>). ASSIGN COMPONENT |KEY| OF STRUCTURE <LS_DATA> TO FIELD-SYMBOL(<KEY>). ASSIGN COMPONENT |ROOT_KEY| OF STRUCTURE <LS_DATA> TO FIELD-SYMBOL(<ROOT_KEY>). ASSIGN COMPONENT |ZDJZT| OF STRUCTURE <LS_DATA> TO <ZDJZT>. ********************************************************************** IF <ZDJZT> < '20'. LV_ACTION_LY_ENABLED = ABAP_TRUE. ELSE. LV_ACTION_LY_ENABLED = ABAP_FALSE. ENDIF. LO_PROPERTY_HELPER->SET_ACTION_ENABLED( IV_ACTION_KEY = ZIF_D_I_ACC_APPLY3_C=>SC_ACTION-ZD_I_ACC_APPLY-SET_ACCNO_APPROVAL IV_KEY = <KEY> IV_VALUE = LV_ACTION_LY_ENABLED ). ********************************************************************** IF <ZDJZT> >= '20' AND <ZDJZT> < '45'. LV_ACTION_FI_ENABLED = ABAP_TRUE. ELSE. LV_ACTION_FI_ENABLED = ABAP_FALSE. ENDIF. LO_PROPERTY_HELPER->SET_ACTION_ENABLED( IV_ACTION_KEY = ZIF_D_I_ACC_APPLY3_C=>SC_ACTION-ZD_I_ACC_APPLY-SET_ACCNO_FIOK IV_KEY = <KEY> IV_VALUE = LV_ACTION_FI_ENABLED ). ********************************************************************** IF <ZDJZT> >= '45'. LV_ACTION_FI_ENABLED = ABAP_FALSE. * LO_PROPERTY_HELPER->SET_ATTRIBUTE_ENABLED( * IV_ATTRIBUTE_NAME = ZIF_D_I_ACC_APPLY3_C=>SC_NODE_ATTRIBUTE-ZD_I_ACC_APPLY-YHZH * IV_KEY = <KEY> * IV_VALUE = ABAP_FALSE )." * LO_PROPERTY_HELPER->SET_ATTRIBUTE_MANDATORY( * IV_ATTRIBUTE_NAME = ZIF_D_I_ACC_APPLY3_C=>SC_NODE_ATTRIBUTE-ZD_I_ACC_APPLY-YHZH * IV_KEY = <KEY> * IV_VALUE = ABAP_TRUE ). LO_PROPERTY_HELPER->SET_ATTRIBUTE_READ_ONLY( IV_ATTRIBUTE_NAME = ZIF_D_I_ACC_APPLY3_C=>SC_NODE_ATTRIBUTE-ZD_I_ACC_APPLY-YHZH IV_KEY = <KEY> IV_VALUE = ABAP_TRUE )." ENDIF. ENDLOOP. ENDMETHOD. ENDCLASS. |
上面的实现会在FIORI APP中’YHZH‘字段在编辑时为不可编辑(不可输入),
但在使用中发现CDS中如不设置@ObjectModel.readOnly: ‘EXTERNAL_CALCULATION’,只在代码中写上面的SET_ATTRIBUTE_READ_ONLY,发现,如设置的是主键时不可编辑,其它字段可编辑,但保存提示不能被改变。
3.依据字段值直接设置,
我记得在网上见过,应该是可以直接使用一个CDS来判断各字段 的可用性,然后在需要的消费的CDS中association那CDS,再使用他的可能性来设置。这个现没找到例子,
此总价参考。