SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Как передать в функцию таблицу произвольной структуры



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
vetal
Участник
Участник



Joined: 18 Jan 2008
Posts: 44

PostPosted: Fri Mar 26, 2010 11:15 am    Post subject: Как передать в функцию таблицу произвольной структуры Reply with quote

Коллеги, привет!
Проблема с функцией G_TABLE_SELECT_WITH_CURSOR, вылетает из-за нехватки памяти. Дело в том, что внутри она заполняет таблицу типа GUSL_T_GLU1, содержащую много полей, из которым мне нужно только несколько. Поскольку внутри она работает с курсором, можно ее модифицировать (создать Z копию), чтобы она считывала данные порциями и заполняла выходную таблицу только нужными полями. Но как передать в нее таблицу произвольной структуры и заполнить
MOVE-CORRESPONDING GUSL_T_GLU1 TO Z_MY_TABLE?
Back to top
View user's profile Send private message
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Fri Mar 26, 2010 4:46 pm    Post subject: Reply with quote

А прямой SELECT прочему не подходит? Shocked
_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
vetal
Участник
Участник



Joined: 18 Jan 2008
Posts: 44

PostPosted: Fri Mar 26, 2010 6:00 pm    Post subject: Reply with quote

Удав wrote:
А прямой SELECT прочему не подходит? Shocked


Программы выборки из спецрегистров динамически строятся и код внутри функции сильно навороченный, поэтому не хотелось бы ломать существующий функционал.

Пока удалсь придумать, только передавая внутрь функции название структуры с словаре данных, описывающуу выходную таблицу.

Вопрос собственно сводится к тому, можно ли по параметру 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.

  CALL FUNCTION 'G_TABLE_OPEN_CURSOR'
    EXPORTING
      i_tabname            = i_tabname
      i_selection          = i_selection
      i_fieldlist          = i_fieldlist
      i_sortlist           = i_sortlist
      i_aggregation        = i_aggregation
      i_period_aggregation = i_period_aggregation
      i_cumulated          = i_cumulated
      i_sorted             = i_sorted
      i_with_hold          = gusl_c_false
      i_client_specified   = i_client_specified
      i_zero_records       = i_zero_records
      i_db_commit          = i_db_commit             "note 182527
    IMPORTING
      e_cursor             = l_cursor
    EXCEPTIONS
      invalid_selection    = 1
      invalid_table        = 2
      internal_error       = 3
      foreign_lock         = 4.
  CASE sy-subrc.
    WHEN 1.       RAISE invalid_selection.
    WHEN 2.       RAISE invalid_table.
    WHEN 3.       RAISE internal_error.
    WHEN 4.       RAISE foreign_lock.
  ENDCASE.

  l_appending_table = i_appending_table.

  FIELD-SYMBOLS: <dyn_wa>.
  DATA: dy_line  TYPE REF TO data.
  CREATE DATA dy_line TYPE (i_output_type).
  ASSIGN dy_line->* TO <dyn_wa>.

  WHILE sy-subrc EQ 0.

    REFRESH lt_glu1.

    CALL FUNCTION 'G_TABLE_FETCH'
         EXPORTING
              i_package_size    = 200
              i_cursor          = l_cursor
*              I_APPENDING_TABLE = I_APPENDING_TABLE
              i_appending_table = gusl_c_false
         CHANGING
              c_t_data          = c_t_data
*              C_T_GLU1          = C_T_GLU1
              c_t_glu1          = lt_glu1
         EXCEPTIONS
              no_more_data      = 1.

    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.

    l_appending_table = gusl_c_true.
  ENDWHILE.

ENDFUNCTION.
Back to top
View user's profile Send private message
broker_chelny
Участник
Участник



Joined: 23 Jan 2010
Posts: 26
Location: Naberezhnye Chelny

PostPosted: Tue Apr 13, 2010 11:59 am    Post subject: Reply with quote

Попробуй передавать параметр с типом 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>.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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.