原理:先根据模型和查询条件取出数据,然后把金额设置为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 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.

posted on 2020-11-05 09:16  姬如千泷  阅读(645)  评论(0编辑  收藏  举报