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.
获取BWquery数据
最新推荐文章于 2023-11-17 14:27:03 发布