在做银行支付单审批时的FIORI功能时,当用户选择一行时,用户点击“审批”来作审批操作,并且在选择需审批的行时,“审批”按钮使能可依据行的审批状态设置,不能操作,或者不能操作。
标准文档,可参考这里。
1.创建BOPF
先需要用CDS创建一人BOPF,可参看这里。这里可依据需要生成对应的BOPF对象,
2.创建一个Actions
打开BOPF后,增加一人动作,比如我这里的SET_APPROVE,我在创建时在HANA STUDIO,及ECLIPS中发现都不能创建成功,我是在SAP GUI中创建的,可能是与我SAP的版本有关,可能是需要ECC752及以上版本才成,
3.创建Determinations
我同样在Eclips里不能创建,我是在SAP GUI里使用事务码BOBX创建的,并且发现ECLIPS里的功能好像没有SAP GUI里的全,所以当发现有不一样时,还是使用SAP GUI查看一下。
创建完成后,有两点要特别注意,不然可能不会触发定义的Determinations.以一是我测试成功的设置以供参考。
- Determinations Cat 需要选择为:T Transient
- Trigger Conditions 需要选择Request Nodes for Determination,下的带根节点一的****_PROPERTY这项目的Determine这项,
- Evaluation Timepoints,需要选择Before Retrieve .
4.代码
实现Actions的代码,代码在类ZCL_PAYMENT_A_SET_APPROVE-》/BOBF/IF_FRW_ACTION~EXECUTE中实现
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 |
METHOD /BOBF/IF_FRW_ACTION~EXECUTE. " Typed with node's combined table type "DATA(LT_PAYMENT) = VALUE ZSPAYMENT_I_HEAD3( ). DATA: LT_PAYMENT TYPE TABLE OF ZSPAYMENT_I_HEAD. " READING BO data ---------------------------------------------- " Retrieve the data of the requested node instance IO_READ->RETRIEVE( EXPORTING IV_NODE = IS_CTX-NODE_KEY IT_KEY = IT_KEY IMPORTING ET_DATA = LT_PAYMENT ). " WRITING BO data --------------------------------------------- BREAK YANGSEN. LOOP AT LT_PAYMENT ASSIGNING FIELD-SYMBOL(<S_PAYMENT>). " Set the attribue overall_status to new value IF <S_PAYMENT>-ZZFSTATUS >= '13' . EO_MESSAGE = /BOBF/CL_FRW_FACTORY=>GET_MESSAGE( ). EO_MESSAGE->ADD_MESSAGE( EXPORTING IS_MSG = VALUE #( MSGID = 'ZTR05' " example MSGNO = 136 MSGV1 = <S_PAYMENT>-DOCNO "支付单&1的状态不可审批. MSGTY = /BOBF/CM_FRW=>CO_SEVERITY_ERROR ) IV_NODE = IS_CTX-NODE_KEY IV_KEY = <S_PAYMENT>-KEY IV_ATTRIBUTE = ZIF_PAYMENT_I_HEAD4_C=>SC_NODE_ATTRIBUTE-ZPAYMENT_I_HEAD-ZZFSTATUS IV_LIFETIME = /bobf/cm_frw=>co_lifetime_transition ). APPEND VALUE #( KEY = <S_PAYMENT>-KEY ) TO ET_FAILED_KEY. ELSE. <S_PAYMENT>-ZZFSTATUS = '13'. " PAID ENDIF. " Update the changed data (billig_status) of the node instance IO_MODIFY->UPDATE( EXPORTING IV_NODE = IS_CTX-NODE_KEY IV_KEY = <S_PAYMENT>-KEY IV_ROOT_KEY = <S_PAYMENT>-ROOT_KEY IS_DATA = REF #( <S_PAYMENT>-NODE_DATA ) IT_CHANGED_FIELDS = VALUE #( ( ZIF_PAYMENT_I_HEAD_C=>SC_NODE_ATTRIBUTE-ZPAYMENT_I_HEAD-ZZFSTATUS ) ) ). ENDLOOP. ENDMETHOD. |
实现 Determination 代码 ,在ZCL_PAYMENT_D_ACTION_FIELD_CON-》/BOBF/IF_FRW_DETERMINATION~EXECUTE
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 |
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_enabled TYPE abap_bool. FIELD-SYMBOLS: <line> TYPE any, <field> TYPE any. DATA: tp_data TYPE REF TO data. BREAK YANGSEN. /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 |ZZFSTATUS| OF STRUCTURE <ls_data> TO <field>. IF <field> >= '13'. lv_action_enabled = abap_false. ELSE. lv_action_enabled = abap_true. ENDIF. lo_property_helper->set_action_enabled( iv_action_key = zif_payment_i_head4_c=>sc_action-zpayment_i_head-set_approve iv_key = <key> iv_value = lv_action_enabled ). ENDLOOP. ENDMETHOD. |
5.最后
到这,用这人BOPF对应的CDS创建一个新的消费CDS后,并用之生成FIORI后,就能自动控制审批按钮的可能性,并进行审批了。