Posted: Fri Mar 26, 2010 11:15 am Post subject: Как передать в функцию таблицу произвольной структуры
Коллеги, привет!
Проблема с функцией G_TABLE_SELECT_WITH_CURSOR, вылетает из-за нехватки памяти. Дело в том, что внутри она заполняет таблицу типа GUSL_T_GLU1, содержащую много полей, из которым мне нужно только несколько. Поскольку внутри она работает с курсором, можно ее модифицировать (создать Z копию), чтобы она считывала данные порциями и заполняла выходную таблицу только нужными полями. Но как передать в нее таблицу произвольной структуры и заполнить
MOVE-CORRESPONDING GUSL_T_GLU1 TO Z_MY_TABLE?
Программы выборки из спецрегистров динамически строятся и код внутри функции сильно навороченный, поэтому не хотелось бы ломать существующий функционал.
Пока удалсь придумать, только передавая внутрь функции название структуры с словаре данных, описывающуу выходную таблицу.
Вопрос собственно сводится к тому, можно ли по параметру C_T_GLU1 узнать, что это за тип данных и по нему построить рабочую область?
В примере название структуры передается явно через I_OUTPUT_TYPE.
Code:
FUNCTION ze_g_table_select_with_cursor.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(I_TABNAME) LIKE T800A-TAB
*" VALUE(I_SELECTION) TYPE GUSL_T_SELECTION OPTIONAL
*" VALUE(I_FIELDLIST) TYPE GUSL_T_FIELDS OPTIONAL
*" VALUE(I_SORTLIST) TYPE GUSL_T_FIELDS OPTIONAL
*" VALUE(I_AGGREGATION) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE
*" VALUE(I_PERIOD_AGGREGATION) TYPE GUSL_PERAGGR DEFAULT
*" GUSL_C_PERAGGR_NONE
*" VALUE(I_CUMULATED) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE
*" VALUE(I_APPENDING_TABLE) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE
*" VALUE(I_ZERO_RECORDS) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE
*" VALUE(I_SORTED) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE
*" VALUE(I_CLIENT_SPECIFIED) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE
*" VALUE(I_DB_COMMIT) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE
*" VALUE(I_OUTPUT_TYPE) TYPE TYPENAME "добавленное поле
*" VALUE(I_COLLECT_OUTPUT) TYPE GUSL_BOOL DEFAULT GUSL_C_FALSE "добавленное поле
*" CHANGING
*" REFERENCE(C_T_DATA) TYPE TABLE OPTIONAL
**" REFERENCE(C_T_GLU1) TYPE GUSL_T_GLU1 OPTIONAL "так было в оригинале
*" REFERENCE(C_T_GLU1) TYPE TABLE OPTIONAL
*" EXCEPTIONS
*" INVALID_SELECTION
*" INVALID_TABLE
*" INTERNAL_ERROR
*" FOREIGN_LOCK
*"----------------------------------------------------------------------
* DATA: ls_GLU1 LIKE LINE OF C_T_GLU1.
DATA: lt_glu1 TYPE gusl_t_glu1.
FIELD-SYMBOLS: <fs_glu1> TYPE gusl_s_glu1.
DATA: l_cursor TYPE cursor,
l_appending_table LIKE i_appending_table.
LOOP AT lt_glu1 ASSIGNING <fs_glu1>.
MOVE-CORRESPONDING <fs_glu1> TO <dyn_wa>.
IF I_COLLECT_OUTPUT IS INITIAL.
APPEND <dyn_wa> TO C_T_GLU1.
ELSE.
COLLECT <dyn_wa> INTO C_T_GLU1.
ENDIF.
ENDLOOP.
Joined: 23 Jan 2010 Posts: 26 Location: Naberezhnye Chelny
Posted: Tue Apr 13, 2010 11:59 am Post subject:
Попробуй передавать параметр с типом ANY TABLE.
Quote:
Вопрос собственно сводится к тому, можно ли по параметру C_T_GLU1 узнать, что это за тип данных и по нему построить рабочую область?
А так чем не подходит?
Code:
DATA: ref_add_data TYPE REF TO data.
FIELD-SYMBOLS: <wa_add_data> TYPE ANY.
CREATE DATA ref_add_data LIKE LINE OF i_it_add_data.
ASSIGN ref_add_data->* TO <wa_add_data>.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.