获取BWquery数据

FUNCTION ZTAX_RFC_FKZB_QUERY_GET.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_RSINFOPROV) TYPE  RSINFOPROV OPTIONAL
*"     VALUE(I_RSZCOMPID) TYPE  RSZCOMPID OPTIONAL
*"     VALUE(I_NSDW) TYPE  /BIC/OIG0NSDW
*"     VALUE(I_FISCYEAR) TYPE  /BI0/OIFISCYEAR
*"     VALUE(I_FISCPER3) TYPE  /BI0/OIFISCPER3
*"  EXPORTING
*"     VALUE(E_SUBRC) TYPE  SYSUBRC
*"     VALUE(ET_MSG) TYPE  BAPIRET2_T
*"     VALUE(E_TAB) TYPE  ZTAX_RFC_FKZB_TAB
*"----------------------------------------------------------------------

TYPE-POOLS: rrx1 .
DATA: r_dataset TYPE REF TO cl_rsr_data_set.
DATA: lcount TYPE i .
DATA: xcount TYPE i .

DATA: i_var TYPE rrx1_t_var.
DATA: i_var_final TYPE rrx1_t_var.
DATA: wf_variant TYPE variant .
DATA: wa_axis LIKE LINE OF r_dataset->n_sx_version_20a_1-axis_data .
DATA: wa_axis_info LIKE LINE OF r_dataset->n_sx_version_20a_1-axis_info .
DATA: wa_chars LIKE LINE OF wa_axis_info-chars .
DATA: tmp_char TYPE rrws_thx_axis_chars.
DATA: wa_tmp_char TYPE rrws_sx_axis_chars .
DATA: wa_attrinm TYPE rrws_s_attrinm.

DATA: wa_cell LIKE LINE OF r_dataset->n_sx_version_20a_1-cell_data .
DATA: wa_textsymbols LIKE LINE OF r_dataset->n_sx_version_20a_1-txt_symbols .
DATA: wa_textsymbols1 LIKE LINE OF r_dataset->n_sx_version_20a_1-txt_symbols .
DATA: wa_set LIKE LINE OF wa_axis-set.
DATA: tmp_set TYPE rrws_tx_set.
DATA: wa_tmp_set TYPE rrws_sx_tuple .
DATA: wa_dattrinm TYPE rrws_s_attributes .
DATA: i_iset_iobjnm TYPE  rsd_iobjnm ,
      e_iobjnm TYPE  rsd_iobjnm .
DATA: error_message TYPE string ,
      xml_out TYPE string .
DATA: q_variables TYPE rrxw3tquery .

DATA: error_string TYPE string.
DATA: no_of_chars TYPE  i ,
      no_of_keyf TYPE i .
DATA: var_nam(10) .
DATA: iobj_detail TYPE bapi6108 .
DATA: iobj_details TYPE bapi6108_t .
DATA: it_fieldcat TYPE lvc_t_fcat,
      is_fieldcat LIKE LINE OF it_fieldcat.

DATA: return TYPE bapiret2_tab .

  DATA:  t_tabparam TYPE rrxw3tquery ,
         wa_tabparam LIKE LINE OF t_tabparam .

FIELD-SYMBOLS: <ltable> TYPE ANY TABLE,
               <l_line>  TYPE ANY,
               <l_field> TYPE ANY,
               <kf>      type any.
TYPES: BEGIN OF metatype ,
       fieldname(30),
       outputlen(6) TYPE n,
       datatype(4) ,
       scrtext_l(40),
       END OF metatype .
DATA: meta_data TYPE STANDARD TABLE OF metatype ,
      wa_meta_data TYPE metatype .

DATA: off  TYPE i,
    moff TYPE i,
    mlen TYPE i.
DATA: iobj_return TYPE bapiret2_tab .
DATA: wf_ip TYPE rsinfoprov ,
      wf_query TYPE rszcompid ,
      wf_view TYPE rszviewid .

DATA: i_axis_info TYPE  rrws_thx_axis_info ,
      i_cell_data TYPE  rrws_t_cell ,
    i_axis_data TYPE  rrws_thx_axis_data ,
    i_txt_symbols TYPE  rrws_t_text_symbols .

DATA: n_counter(3) TYPE n .
DATA: char_count TYPE i .
DATA: wf_fldnm(40) .

DATA: struct_type TYPE REF TO cl_abap_structdescr,
tab_type TYPE REF TO cl_abap_tabledescr ,
    comp_tab TYPE cl_abap_structdescr=>component_table,
    comp LIKE LINE OF comp_tab,
    dref TYPE REF TO data ,
    dref1 TYPE REF TO data ,
    op_len TYPE i .
DATA: fields TYPE tihttpnvp .
DATA: wa_fields TYPE ihttpnvp ,
      wa_var TYPE w3query .

DATA: L_TAB LIKE LINE OF E_TAB.


CLEAR :fields, q_variables ,i_axis_info,i_cell_data,i_axis_data,i_txt_symbols.
REFRESH: fields, q_variables,i_axis_info,i_cell_data,i_axis_data,i_txt_symbols .

***  纳税单位
  CLEAR wa_fields .
  wa_fields-name = 'VAR_NAME_01'.
  wa_fields-value = 'G1NSDW_WB_MIS'.
  APPEND wa_fields TO fields.

  CLEAR wa_fields .
  wa_fields-name = 'VAR_VALUE_EXT_01'.
  wa_fields-value = I_NSDW.
  APPEND wa_fields TO fields.

*** 年度参数
  CLEAR wa_fields .
  wa_fields-name = 'VAR_NAME_02'.
  wa_fields-value = '0P_GJAHR'.
  APPEND wa_fields TO fields.

  CLEAR wa_fields .
  wa_fields-name = 'VAR_VALUE_EXT_02'.
  wa_fields-value = I_FISCYEAR.
  APPEND wa_fields TO fields.

*** 月度参数
  CLEAR wa_fields .
  wa_fields-name = 'VAR_NAME_03'.
  wa_fields-value = '0P_PER3'.
  APPEND wa_fields TO fields.

  CLEAR wa_fields .
  wa_fields-name = 'VAR_VALUE_EXT_03'.
  wa_fields-value = I_FISCPER3.
  APPEND wa_fields TO fields.

  IF NOT fields[] IS INITIAL .
  CLEAR wa_fields .
  LOOP AT fields INTO wa_fields ."WHERE name CS 'VAR_'.
    CLEAR wa_var .
    MOVE-CORRESPONDING wa_fields TO wa_var .
    TRANSLATE wa_var-name TO UPPER CASE .
    APPEND wa_var TO q_variables .
    CLEAR wa_fields .
  ENDLOOP .

ENDIF .
CLEAR: wf_ip , wf_query , wf_view  .
MOVE: "'F3MRM02' TO wf_ip,
      I_RSZCOMPID TO wf_query.
"      view TO wf_view .

IF NOT wf_query IS INITIAL." OR NOT wf_view IS INITIAL .
  CLEAR : xml_out , return .
  REFRESH return .

*取Wuery数据
  CALL FUNCTION 'RRW3_GET_QUERY_VIEW_DATA'
    EXPORTING
"      i_infoprovider          = wf_ip
      i_query                 = wf_query
"      i_view_id               = wf_view
      i_t_parameter           = q_variables
    IMPORTING
      e_axis_info             = i_axis_info
      e_cell_data             = i_cell_data
      e_axis_data             = i_axis_data
      e_txt_symbols           = i_txt_symbols
    EXCEPTIONS
      no_applicable_data      = 1
      invalid_variable_values = 2
      no_authority            = 3
      abort                   = 4
      invalid_input           = 5
      invalid_view            = 6
      OTHERS                  = 7.

  CASE sy-subrc .

    WHEN 0 .
** Key figure的个数
      CLEAR: lcount ,wa_axis , wa_axis_info .
      READ TABLE i_axis_data  INTO wa_axis WITH KEY axis = '000'  .
      IF sy-subrc EQ 0 .
        CLEAR no_of_keyf .
        LOOP AT wa_axis-set INTO wa_set .
          AT NEW tuple_ordinal .

            no_of_keyf = no_of_keyf + 1 .
          ENDAT .
        ENDLOOP .
        CLEAR wa_set .
      ENDIF .

** characteristics的个数
      READ TABLE i_axis_info  INTO wa_axis_info WITH KEY axis = '001'  .
      IF sy-subrc EQ 0 .
        CLEAR no_of_chars .
        DESCRIBE TABLE wa_axis_info-chars LINES no_of_chars .
      ENDIF .

      CLEAR : iobj_detail , iobj_details .
      REFRESH iobj_details .
      CLEAR wa_axis_info .
* 取回character的详细信息
      READ TABLE i_axis_info  INTO wa_axis_info WITH KEY axis = '001'  .
      IF sy-subrc EQ 0 .
        CLEAR wa_chars .
        REFRESH tmp_char .

        LOOP AT wa_axis_info-chars INTO wa_chars .
          CLEAR wa_tmp_char .
          MOVE-CORRESPONDING wa_chars TO wa_tmp_char .
          INSERT wa_tmp_char INTO TABLE tmp_char.
          IF NOT wa_chars-attrinm[] IS INITIAL .
            LOOP AT wa_chars-attrinm INTO wa_attrinm .
              CLEAR :wa_tmp_char-chanm , wa_tmp_char-caption .
              MOVE: wa_attrinm-attrinm TO wa_tmp_char-chanm ,
                    wa_attrinm-caption TO wa_tmp_char-caption .
              INSERT wa_tmp_char INTO TABLE tmp_char.
            ENDLOOP .
          ENDIF .
        ENDLOOP .


        LOOP AT tmp_char INTO wa_chars .
          CLEAR off .
          CLEAR :off, moff, mlen .
          FIND '___' IN SECTION OFFSET off OF
                 wa_chars-chanm .
          IF sy-subrc EQ 0 .
            CLEAR : i_iset_iobjnm , e_iobjnm .
            MOVE: wa_chars-chanm TO i_iset_iobjnm .
            CALL FUNCTION 'RSD_IOBJNM_GET_FROM_INFOSET'
              EXPORTING
                i_iset_iobjnm = i_iset_iobjnm
              IMPORTING
                e_iobjnm      = e_iobjnm
              EXCEPTIONS
                name_error    = 1
                no_field      = 2
                OTHERS        = 3.

            CLEAR wa_chars-chanm  .
            MOVE: e_iobjnm TO wa_chars-chanm .

          ELSE.

            FIND '__' IN SECTION OFFSET off OF
                   wa_chars-chanm
                   MATCH OFFSET moff
                   MATCH LENGTH mlen.
            IF sy-subrc EQ 0 .
              off = moff + mlen .
              SHIFT wa_chars-chanm LEFT BY off PLACES .
            ENDIF .
          ENDIF . " two __ or three _
          CLEAR: iobj_return .
          REFRESH : iobj_return .

          CALL FUNCTION 'BAPI_IOBJ_GETDETAIL'
            EXPORTING
              version    = rs_c_objvers-active
              infoobject = wa_chars-chanm
            IMPORTING
              details    = iobj_detail.


          IF  NOT iobj_detail IS INITIAL .
            APPEND iobj_detail TO iobj_details .
            CLEAR iobj_detail .
          ELSE .

            MOVE: wa_chars-chanm TO iobj_detail-infoobject ,
                  wa_chars-caption TO iobj_detail-textlong .

            APPEND iobj_detail TO iobj_details .
            CLEAR iobj_detail .

          ENDIF .
          CLEAR : iobj_detail .
        ENDLOOP .
      ENDIF .

* 创建cat,为进一步创建内表准备
      CLEAR: is_fieldcat, iobj_detail, it_fieldcat .
      REFRESH : it_fieldcat .
      LOOP AT iobj_details INTO iobj_detail .
        is_fieldcat-fieldname = iobj_detail-infoobject .
        IF is_fieldcat-fieldname+0(1) EQ '0' .
          SHIFT is_fieldcat-fieldname LEFT BY 1 PLACES .
        ENDIF .
*        IF iobj_details-datatp = 'CHAR' .
*          is_fieldcat-datatype = iobj_details-datatp.
        is_fieldcat-outputlen = '130' .
*        ELSE .
        is_fieldcat-datatype = 'CHAR' . "iobj_details-datatp.
*          is_fieldcat-outputlen = iobj_details-outputlen .
*        ENDIF .

        is_fieldcat-scrtext_l = iobj_detail-textlong.
        APPEND is_fieldcat TO it_fieldcat.
        CLEAR : is_fieldcat , iobj_detail .
      ENDLOOP .


      CLEAR :n_counter, wa_axis .
      READ TABLE i_axis_data  INTO wa_axis WITH KEY axis = '000'  .
      IF sy-subrc EQ 0 .
        LOOP AT wa_axis-set INTO wa_set .
          AT NEW tuple_ordinal .

            n_counter = n_counter + 1 .

            CONCATENATE 'VALUE' n_counter INTO is_fieldcat-fieldname .
            is_fieldcat-outputlen = '30'.
            is_fieldcat-datatype = 'CHAR'.
          ENDAT .
          CONCATENATE is_fieldcat-scrtext_l wa_set-caption INTO is_fieldcat-scrtext_l SEPARATED BY  ` ` .

*        is_fieldcat-scrtext_l = wa_set-caption.
          AT END OF tuple_ordinal .
            SHIFT is_fieldcat-scrtext_l LEFT DELETING LEADING ' ' .
            APPEND is_fieldcat TO it_fieldcat.
            CLEAR : is_fieldcat .
          ENDAT .

        ENDLOOP .
      ENDIF .

      CLEAR: meta_data, wa_meta_data .
      REFRESH meta_data .
      LOOP AT it_fieldcat INTO is_fieldcat .

        MOVE-CORRESPONDING is_fieldcat TO wa_meta_data .
        APPEND wa_meta_data TO meta_data .
        CLEAR: wa_meta_data, is_fieldcat .
      ENDLOOP .

* create itab
      SORT it_fieldcat BY fieldname.
      DELETE ADJACENT DUPLICATES FROM it_fieldcat COMPARING fieldname .
      CLEAR: comp , comp_tab ,is_fieldcat .
      REFRESH comp_tab .

      LOOP AT it_fieldcat INTO is_fieldcat .
        CLEAR op_len .
        op_len = is_fieldcat-outputlen .
        comp-name = is_fieldcat-fieldname.
        comp-type = cl_abap_elemdescr=>get_c( op_len ).
        APPEND comp TO comp_tab.
        CLEAR : is_fieldcat , comp .
      ENDLOOP .

      CLEAR struct_type .

      CALL METHOD cl_abap_structdescr=>create
        EXPORTING
          p_components = comp_tab
          p_strict     = cl_abap_structdescr=>false
        RECEIVING
          p_result     = struct_type.

      CLEAR tab_type .
      CALL METHOD cl_abap_tabledescr=>create
        EXPORTING
          p_line_type  = struct_type
          p_table_kind = cl_abap_tabledescr=>tablekind_std
        RECEIVING
          p_result     = tab_type.

      CREATE DATA dref1 TYPE HANDLE tab_type.

      ASSIGN dref1->* TO <ltable>.

      CREATE DATA dref TYPE HANDLE struct_type.

      ASSIGN dref->* TO <l_line>.

      CLEAR :wa_axis , char_count , lcount, xcount.
      REFRESH tmp_set .
      LOOP AT i_axis_data INTO wa_axis WHERE axis = '001' .
        LOOP AT wa_axis-set INTO wa_set .
          CLEAR wa_tmp_set .
          MOVE-CORRESPONDING wa_set TO wa_tmp_set .
          INSERT wa_tmp_set INTO TABLE tmp_set.
          IF NOT wa_set-attributes[] IS INITIAL .
            LOOP AT wa_set-attributes INTO wa_dattrinm .
              CLEAR: wa_tmp_set-chanm , wa_tmp_set-chavl , wa_tmp_set-chavl_ext , wa_tmp_set-caption .
              MOVE: wa_dattrinm-attrinm TO wa_tmp_set-chanm ,
                    wa_dattrinm-attrivl TO wa_tmp_set-chavl ,
                    wa_dattrinm-attrivl TO wa_tmp_set-chavl_ext ,
                    wa_dattrinm-caption TO wa_tmp_set-caption .

              INSERT wa_tmp_set INTO TABLE tmp_set.
            ENDLOOP .
          ENDIF .
        ENDLOOP .
      ENDLOOP .

      LOOP AT tmp_set INTO wa_set .
        AT NEW tuple_ordinal .
          IF lcount GT 0 .
            lcount = lcount - 1 .
          ENDIF .
          CLEAR <l_line> .
        ENDAT .
        CLEAR off .

        CLEAR :off, moff, mlen .
        FIND '___' IN SECTION OFFSET off OF
               wa_set-chanm .
        IF sy-subrc EQ 0 .
          CLEAR : i_iset_iobjnm , e_iobjnm .
          MOVE: wa_set-chanm TO i_iset_iobjnm .
          CALL FUNCTION 'RSD_IOBJNM_GET_FROM_INFOSET'
            EXPORTING
              i_iset_iobjnm = i_iset_iobjnm
            IMPORTING
              e_iobjnm      = e_iobjnm
            EXCEPTIONS
              name_error    = 1
              no_field      = 2
              OTHERS        = 3.

          CLEAR wa_set-chanm  .
          MOVE: e_iobjnm TO wa_set-chanm .
        ELSE.

          FIND '__' IN SECTION OFFSET off OF
                 wa_set-chanm
                 MATCH OFFSET moff
                 MATCH LENGTH mlen.
          IF sy-subrc EQ 0 .
            off = moff + mlen .
            SHIFT wa_set-chanm LEFT BY off PLACES .
          ENDIF .
        ENDIF . " check three _ or two _

        IF wa_set-chanm+0(1) EQ '0' .
          SHIFT wa_set-chanm LEFT BY 1 PLACES .
        ENDIF .
        ASSIGN COMPONENT wa_set-chanm OF STRUCTURE <l_line> TO <l_field>.
        IF wa_set-chavl = '#' .
*            <l_field> =  wa_set-chavl_ext .
        ELSE .
          CONCATENATE wa_set-chavl_ext wa_set-caption INTO <l_field> SEPARATED BY ' ' .
        ENDIF .

        AT END OF tuple_ordinal .
          CLEAR: xcount , char_count , n_counter .

          lcount = lcount + 1 .

          LOOP AT i_cell_data INTO wa_cell FROM lcount .

            n_counter = n_counter + 1 .
            IF n_counter GT no_of_keyf .
              EXIT .
            ENDIF .

            CONCATENATE 'VALUE' n_counter INTO wf_fldnm .
            ASSIGN COMPONENT wf_fldnm OF STRUCTURE <l_line> TO <l_field>.

            <l_field> = wa_cell-value .


          ENDLOOP .

          lcount = lcount + no_of_keyf .
          INSERT <l_line> INTO TABLE <ltable>.
          move-CORRESPONDING <l_line> to l_tab.
          assign component 'VALUE001' of structure <l_line> to <kf>.
          l_tab-K0SWJEWGL = <kf>.
          append l_tab to e_tab.

        ENDAT .


      ENDLOOP .

*把输入导入

    WHEN 1 .
      E_SUBRC = 1.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '无有效数据' '' '' ''.
      RETURN.
    WHEN 2 .
      E_SUBRC = 2.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '输入变量无效' '' '' ''.
      RETURN.
    WHEN 3 .
      E_SUBRC = 3.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '无权限运行报表' '' '' ''.
      RETURN.
    WHEN 4 .
      E_SUBRC = 4.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '当次运行取消' '' '' ''.
      RETURN.
    WHEN 5 .
      E_SUBRC = 5.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '无效输入' '' '' ''.
      RETURN.
    WHEN 6 .
      E_SUBRC = 6.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '输入的视图无效' '' '' ''.
      RETURN.
    WHEN OTHERS .
      E_SUBRC = 7.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '报表运行错误,请联系管理员' '' '' ''.
      RETURN.
  ENDCASE .
ELSE .
  E_SUBRC = 8.
      PERFORM FILL_MSG TABLES ET_MSG USING 'ZTAX01' '000' 'E' '输入的Query ID无效' '' '' ''.
      RETURN.

ENDIF .



ENDFUNCTION.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值