#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
дополнение для параметров таблицы устарело из устаревших