Добрый день!
Тема не новая, но мне очень нужна помощь. Пытаюсь создать виртуальный куб, который использует ФМ. Нашла кучу хаутушек (в том числе и How To…Implement a virtual InfoProvider with Services), но что-то они не очень помогли.
По идее ФМ должен выбирать данные из ОДС ZOST_GP. Результирующая таблица e_t_data странная, ей как будто не передается нужный формат. При формировании отчета в BEX появляется ошибка An exception with the type: CX_SY_DYN_CALL_PARAM_MISSING occurred, but wa Function call of ZCUB_VRT_FM failed; the: obligatory parameter E_T_DATA: Системная ошибка в программе SAPLRRK0 и FORM RSRDR;SRRK0F30-01- И еще при отладке заметила, что таблицы i_th_sfc, i_th_sfk, l_t_component пустые.
В чем может быть проблема и как её решить? BW 3.5 Заранее спасибо отзывчивым!
Глобальные переменные TYPE-POOLS: rsaot, rsazt, rs, rsd, rsdd, rsdpm, rsdpr, rsdu, RSDRC, abap, slis. TYPES: BEGIN OF oid_tab_wa, PSTNG_DATE TYPE /BI0/OIPSTNG_DATE, MATERIAL TYPE /BI0/OIMATERIAL, PLANT TYPE /BI0/OIPLANT, OI_MENGE TYPE /BI0/OIOI_MENGE, BASE_UOM TYPE /BI0/OIBASE_UOM, LOC_CURRCY TYPE /BI0/OILOC_CURRCY, /BIC/ZSUM_N TYPE /BIC/OIZSUM_N, COMP_CODE TYPE /BI0/OICOMP_CODE, GL_ACCOUNT TYPE /BI0/OIGL_ACCOUNT , CHRT_ACCTS TYPE /BI0/OICHRT_ACCTS, END OF oid_tab_wa. FUNCTION ZCUB_VRT_FM. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" VALUE(I_INFOPROV) TYPE RSINFOPROV *" REFERENCE(I_TH_SFC) TYPE RSDRI_TH_SFC *" REFERENCE(I_TH_SFK) TYPE RSDRI_TH_SFK *" REFERENCE(I_T_RANGE) TYPE RSDRI_T_RANGE *" REFERENCE(I_TX_RANGETAB) TYPE RSDRI_TX_RANGETAB *" VALUE(I_FIRST_CALL) TYPE RS_BOOL *" VALUE(I_PACKAGESIZE) TYPE I DEFAULT 1000 *" EXPORTING *" REFERENCE(E_END_OF_DATA) TYPE RS_BOOL *" REFERENCE(E_T_MSG) TYPE RS_T_MSG *" TABLES *" E_T_DATA *" EXCEPTIONS *" WRONG_INPUT *" READ_ACCESS_ERROR *"---------------------------------------------------------------------- * initialize * TYPES: * BEGIN OF abap_compdescr, * length TYPE i, * decimals TYPE i, * type_kind TYPE char1, * name TYPE char30, * END OF abap_compdescr, * * BEGIN OF oid_tab_wa, * PSTNG_DATE TYPE /BI0/OIPSTNG_DATE, * MATERIAL TYPE /BI0/OIMATERIAL, * PLANT TYPE /BI0/OIPLANT, * /BIC/ZKALNR TYPE /BIC/OIZKALNR, * OI_MENGE TYPE /BI0/OIOI_MENGE, * BASE_UOM TYPE /BI0/OIBASE_UOM, * LOC_CURRCY TYPE /BI0/OILOC_CURRCY, * /BIC/ZSUM_N TYPE /BIC/OIZSUM_N, * COMP_CODE TYPE /BI0/OICOMP_CODE, * VAL_CLASS TYPE /BI0/OIVAL_CLASS, * GL_ACCOUNT TYPE /BI0/OIGL_ACCOUNT , * CHRT_ACCTS TYPE /BI0/OICHRT_ACCTS, * END OF oid_tab_wa.
FIELD-SYMBOLS: <l_s_data> TYPE ANY, <l_s_tab> TYPE oid_tab_wa.
DATA: oid_tab TYPE TABLE OF oid_tab_wa, wa_oid_tab TYPE oid_tab_wa, l_t_component TYPE abap_compdescr_tab.
DATA: L_SELALIAS TYPE RSALIAS.
CLEAR: e_t_data, e_t_msg, oid_tab. * this is specific to infoprovider VIRTCUBE1 CHECK i_infoprov = 'ZCUB_VIRT'.
select PSTNG_DATE MATERIAL PLANT OI_MENGE BASE_UOM LOC_CURRCY /BIC/ZSUM_N COMP_CODE GL_ACCOUNT CHRT_ACCTS * /BIC/ZKALNR BATCH VAL_CLASS FROM /BIC/AZOST_GP00 INTO CORRESPONDING FIELDS OF TABLE oid_tab.
IF sy-subrc EQ 0. *create a working area ASSIGN LOCAL COPY OF INITIAL LINE OF e_t_data TO <l_s_data>.
* get description of components of <L_S_DATA> PERFORM get_type_components(saplrsdrc) USING <l_s_data> CHANGING l_t_component. LOOP AT oid_tab ASSIGNING <l_s_tab>. PERFORM move_oid_tab_to_data USING <l_s_tab> i_th_sfc i_th_sfk l_t_component CHANGING <l_s_data>. * append to output data APPEND <l_s_data> TO e_t_data. ENDLOOP. *all data are selected e_end_of_data = 'X'. ENDIF.
ENDFUNCTION. *********************************************************************** FORM move_oid_tab_to_data USING i_s_tab TYPE oid_tab_wa i_th_sfc TYPE rsdri_th_sfc i_th_sfk TYPE rsdri_th_sfk i_t_component TYPE abap_compdescr_tab CHANGING e_s_data TYPE any.
* define FIELD-SYMBOLS FIELD-SYMBOLS: <l_s_component> TYPE abap_compdescr, <l_comp_data> TYPE ANY, <l_s_sfc> TYPE rsdri_s_sfc, <l_s_sfk> TYPE rsdri_s_sfk.
* Datadeclaration DATA: l_compno TYPE i, l_t_component TYPE abap_compdescr_tab, l_s_tab TYPE oid_tab_wa.
* initialize CLEAR e_s_data.
l_s_tab = i_s_tab.
* 0CALDAY IF NOT i_s_tab-PSTNG_DATE IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0CALDAY'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-PSTNG_DATE TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0COMP_CODE IF NOT i_s_tab-COMP_CODE IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0COMP_CODE'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-COMP_CODE TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0GL_ACCOUNT IF NOT i_s_tab-GL_ACCOUNT IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0GL_ACCOUNT'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-GL_ACCOUNT TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0MATERIAL IF NOT i_s_tab-MATERIAL IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0MATERIAL'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-MATERIAL TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0CHRT_ACCTS IF NOT i_s_tab-CHRT_ACCTS IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0CHRT_ACCTS'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-CHRT_ACCTS TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0PLANT IF NOT i_s_tab-PLANT IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0PLANT'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-PLANT TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0OI_MENGE IF NOT i_s_tab-OI_MENGE IS INITIAL. * get alias name from SFC READ TABLE i_th_sfk ASSIGNING <l_s_sfk> WITH TABLE KEY kyfnm = '0OI_MENGE'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfk>-kyfalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-OI_MENGE TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* ZSUM_N IF NOT i_s_tab-/BIC/ZSUM_N IS INITIAL. * get alias name from SFC READ TABLE i_th_sfk ASSIGNING <l_s_sfk> WITH TABLE KEY kyfnm = 'ZSUM_N'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfk>-kyfalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-/BIC/ZSUM_N TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0BASE_UOM IF NOT i_s_tab-BASE_UOM IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0BASE_UOM'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-BASE_UOM TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
* 0LOC_CURRCY IF NOT i_s_tab-LOC_CURRCY IS INITIAL. READ TABLE i_th_sfc ASSIGNING <l_s_sfc> WITH TABLE KEY chanm = '0LOC_CURRCY'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING <l_s_component> WITH KEY name = <l_s_sfc>-chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO <l_comp_data>. MOVE i_s_tab-LOC_CURRCY TO <l_comp_data>. ENDIF. ENDIF. ENDIF.
endform.
|
|