Передать встроенную объявленную таблицу / переменную подпрограмме в ABAP

#abap #subroutine

#abap #подпрограмма

Вопрос:

Я знаю, что когда мне нужно передать внутреннюю таблицу подпрограмме, мне нужно объявить тип, чтобы я мог использовать его в инструкции FORM. Что произойдет, если внутренняя таблица является встроенной таблицей объявления из оператора SELECT, подобного этому:

SELECT * FROM KNA1 INTO TABLE @DATA(LT_KNA1)

Есть ли какой-либо способ передать эту таблицу подпрограмме? Спасибо.

Комментарии:

1. Подпрограммы устарели с ABAP 7.02 (2009). Вы должны использовать методы (или, в конечном счете, функциональные модули).

2. Вы имели в виду «альтернативные функциональные модули», верно?

3. @Jagger Я думаю, что я неправильно использовал «в конечном итоге», понимаю «иногда». В основном следует использовать методы, а функциональные модули следует использовать в качестве последнего средства (» являются технологией-предшественницей общедоступных методов «), если методы не могут быть использованы, например, если приложению требуется RFC, Update task, Dynpro и т.д.

Ответ №1:

Подпрограммы устарели со времен ABAP 7.02 (2009), поэтому я использую метод в моем примере.

Встроенные объявления — это простой способ неявного объявления типов, но ограничением этого решения является то, что вы можете вводить параметр метода только в общем виде (типы STANDARD TABLE , INDEX TABLE , ANY TABLE , ANY ), что не позволяет статически указывать имена компонентов в вашем коде.

Но встроенные объявления типа DATA(...) всегда основаны на полном «связанном» типе данных, поэтому вы можете явно объявить тип с помощью TYPES и использовать его для ввода как вашего параметра, так и вашего объекта данных.

Если вы используете средства разработки ABAP (Eclipse), вы можете использовать быстрое исправление «Объявить локальную переменную… явно » для упрощения задачи: введите описание изображения здесь

что дает этот код:

 REPORT.
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
  METHOD main.
    TYPES: BEGIN OF helper_type,                       " <=== automatically generated
             carrid TYPE scarr-carrid,
             carrname TYPE scarr-carrname,
           END OF helper_type.
    DATA: lt_scarr TYPE STANDARD TABLE OF helper_type. " <=== automatically generated
    SELECT carrid, carrname FROM scarr 
        INTO TABLE @lt_scarr.                          " <=== automatically changed
  ENDMETHOD.
ENDCLASS.
  

Теперь вручную объявите тип таблицы, используйте его для ввода параметра метода (нового здесь):

 REPORT.
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF helper_type,
             carrid TYPE scarr-carrid,
             carrname TYPE scarr-carrname,
           END OF helper_type.
    TYPES: tt_scarr TYPE STANDARD TABLE OF helper_type.  " <=== declare the type
    CLASS-METHODS main.
    CLASS-METHODS process_table                          " <=== new method with this type
        IMPORTING table TYPE tt_scarr.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
  METHOD main.
    DATA: lt_scarr TYPE STANDARD TABLE OF helper_type.
    SELECT carrid, carrname FROM scarr 
        INTO TABLE @lt_scarr.
  ENDMETHOD.
  METHOD process_table.                                  " <=== new method
    LOOP AT table REFERENCE INTO DATA(line).
      DATA(carrid) = line->carrid.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.
  

Ответ №2:

Используйте TYPE ANY или общий тип таблицы для параметров, TABLE параметры устарели:

 FORM fill_table USING tab  TYPE any
             CHANGING ptab TYPE INDEX TABLE.
   APPEND LINES OF tab TO ptab.
ENDFORM.
  

И да, подпрограммы сами по себе устарели, используйте их, только если вам абсолютно необходимо это сделать, например, в устаревшей среде.

Ответ №3:

Вам не нужно указывать тип структуры для таблицы переменных выполнения. Но вы можете получить ошибку во время выполнения, если какое-либо имя поля изменится, которое используется при выполнении. Два рабочих примера ниже.

 SELECT * FROM kna1 INTO TABLE @DATA(lt_kna1).

PERFORM test TABLES lt_kna1.

FORM test  TABLES   pt_kna1 STRUCTURE kna1.
*
ENDFORM.
  

Рискованный:

 FORM test  TABLES   pt_kna1.
*
ENDFORM.
  

Комментарии:

1. параметры таблицы устарели, а STRUCTURE дополнение для параметров таблицы устарело из устаревших