原理:先根据模型和查询条件取出数据,然后把金额设置为0,再写回CUBE.
1.获取数据并清空金额
*&---------------------------------------------------------------------* *& Form CLEAR_BPC_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> S_ENTITY 公司代码 *& --> P_YEAR 年度 *& --> P_MONTH 月份 *& --> P_CAT *&---------------------------------------------------------------------* FORM frm_clear_bpc_data USING p_gt_input_entity LIKE gt_input_entity p_p_year LIKE p_year p_p_month LIKE p_month p_p_cat LIKE p_cat CHANGING p_t_bpc_data TYPE ANY TABLE . DATA: lt_axis_base TYPE ujo_t_query_dim, "每行是一个维度上的一组成员 lt_axis TYPE ujo_t_query_dim, "每行是一个维度上的一组成员 ls_axis_t TYPE ujo_t_members, "成员表 lt_cv_base TYPE TABLE OF ujk_s_cv, "BPC Script Logic Current View lt_cv_final TYPE TABLE OF ujk_s_cv, "BPC Script Logic Current View lt_cv_pkg LIKE TABLE OF lt_cv_base, ls_cv LIKE LINE OF lt_cv_base, lr_bpc_data TYPE REF TO data. FIELD-SYMBOLS <ft_pkg_data> TYPE ANY TABLE. CREATE DATA lr_bpc_data LIKE p_t_bpc_data. ASSIGN lr_bpc_data->* TO <ft_pkg_data>. * 准备不变的条件 CLEAR ls_cv. LOOP AT p_gt_input_entity INTO DATA(lv_entity). ls_cv-dimension = 'ENTITY'. APPEND lv_entity TO ls_cv-member. ENDLOOP. APPEND ls_cv TO lt_cv_base. * 准备不变的条件 CLEAR ls_cv. ls_cv-dimension = 'CATEGORY'. APPEND s_veson-low TO ls_cv-member. APPEND ls_cv TO lt_cv_base. * 准备不变的条件 CLEAR ls_cv. ls_cv-dimension = 'TIME'. APPEND s_erdat-low TO ls_cv-member. APPEND ls_cv TO lt_cv_base. * 准备不变的条件 CLEAR ls_cv. ls_cv-dimension = 'AUDITTRAIL'. APPEND 'INPUTM' TO ls_cv-member. APPEND ls_cv TO lt_cv_base. * 准备不变的条件 CLEAR ls_cv. ls_cv-dimension = 'SCOPE'. APPEND 'S_NONE' TO ls_cv-member. APPEND ls_cv TO lt_cv_base. * 准备变化的条件 lt_cv_final = lt_cv_base. CLEAR ls_cv. ls_cv-dimension = 'CATEGORY'. APPEND p_p_cat TO ls_cv-member. APPEND ls_cv TO lt_cv_final. APPEND lt_cv_final TO lt_cv_pkg. "执行查询 TRY. cl_ujk_model=>get_dim_list( EXPORTING i_appset_id = gco_appset_id i_appl_id = gco_appl_id i_with_measures = abap_false IMPORTING et_admin_dim_list = DATA(lt_dim_list) ). DATA: lt_range TYPE uj0_t_sel, ls_range LIKE LINE OF lt_range. DATA(lo_query) = cl_ujo_query_factory=>get_query_adapter( i_appset_id = gco_appset_id i_appl_id = gco_appl_id ). LOOP AT lt_cv_pkg INTO DATA(lt_cv). "转换查询条件 CLEAR:ls_range, lt_range[]. LOOP AT lt_cv INTO ls_cv. ls_range-sign = 'I'. ls_range-option = 'EQ'. ls_range-dimension = ls_cv-dimension. LOOP AT ls_cv-member INTO DATA(lv_member). ls_range-low = lv_member. APPEND ls_range TO lt_range. ENDLOOP. ENDLOOP. lo_query->run_rsdri_query( EXPORTING it_dim_name = lt_dim_list " BPC: Dimension List it_range = lt_range " BPC: Selection condition if_check_security = abap_true " BPC: Generic indicator IMPORTING et_data = <ft_pkg_data> ). INSERT LINES OF <ft_pkg_data> INTO TABLE p_t_bpc_data. SORT p_t_bpc_data. DELETE ADJACENT DUPLICATES FROM p_t_bpc_data. LOOP AT p_t_bpc_data ASSIGNING FIELD-SYMBOL(<fs_bpc_data>). ASSIGN COMPONENT 'SIGNEDDATA' OF STRUCTURE <fs_bpc_data> TO FIELD-SYMBOL(<fv_signeddata>). CHECK sy-subrc = 0. <fv_signeddata> = 0. ENDLOOP. ENDLOOP. CATCH cx_root INTO DATA(lr_exception). MESSAGE |查询需要覆盖的BPC数据时报错{ lr_exception->get_longtext( ) },请联系管理员| TYPE 'E'. ENDTRY. ENDFORM.
2. 写回CUBE
*&---------------------------------------------------------------------*
*& Form frm_write_into_bpc
*&---------------------------------------------------------------------*
*& text 写入BPC
*&---------------------------------------------------------------------*
*& -->
*&---------------------------------------------------------------------*
FORM frm_write_into_bpc USING it_tab TYPE ANY TABLE
i_proc TYPE char1.
CLEAR: gt_message.
DATA: lo_ujo TYPE REF TO if_ujo_write_back,
l_str TYPE string,
ls_wb_param TYPE if_ujo_write_back=>gs_wb_param,
ls_wb_status TYPE ujo_s_wb_status,
ls_work_status TYPE ujr_s_work_status,
ls_audit TYPE ujr_s_update_audit,
lt_message TYPE uj0_t_message,
lr_data TYPE REF TO data.
FIELD-SYMBOLS: <lt_error_records> TYPE ANY TABLE.
CREATE DATA lr_data LIKE it_tab.
ASSIGN lr_data->* TO <lt_error_records>.
CALL METHOD cl_ujo_wb_factory=>create_write_back
RECEIVING
ro_write_back = lo_ujo.
ls_wb_param = cl_ujo_wb_factory=>default_wb_param( ).
ls_wb_param-bypass_security = abap_true.
TRY.
CALL METHOD lo_ujo->write_back
EXPORTING
i_appset_id = gco_appset_id
i_appl_id = gco_appl_id
is_wb_param = ls_wb_param
* it_records = <fs_t_data>
it_records = it_tab
IMPORTING
es_wb_status = ls_wb_status
et_error_records = <lt_error_records>
et_message = gt_message.
cl_ujk_logger=>log( '提交记录: ' && ls_wb_status-nr_submit && '条, ' && '成功记录: ' && ls_wb_status-nr_success && '条' ).
IF gt_message IS NOT INITIAL.
CALL SCREEN 400 STARTING AT 2 2 ENDING AT 120 30.
ELSE.
IF i_proc = gco_update.
MESSAGE s008.
ENDIF.
ENDIF.
CATCH cx_ujo_write_back cx_uj_static_check INTO DATA(lo_write).
l_str = lo_write->get_text( ).
MESSAGE l_str TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
ENDFORM.