将内联声明的 table/variable 传递给 ABAP 中的子例程

Pass inline declared table/variable to subroutine in ABAP

我知道当我需要将内部 table 传递给子例程时,我需要声明一个类型以便在 FORM 语句中使用它。 如果内部 table 是来自 SELECT 语句的内联声明 table 会发生什么:

SELECT * FROM KNA1 INTO TABLE @DATA(LT_KNA1)

有什么方法可以将此 table 传递给子程序吗? 谢谢。

您不需要为执行变量指明结构类型table。但是如果执行中使用的任何字段名称更改,您可能会在运行时出错。下面是两个工作示例。

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.

自 ABAP 7.02 (2009) 以来,子例程已过时,因此我在示例中使用了一个方法。

内联声明是一种隐式声明类型的简单方法,但此解决方案的局限性在于您只能一般地键入方法的参数(类型 STANDARD TABLEINDEX TABLEANY 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.

现在,手动声明 table 类型,用它来键入方法的参数(这里是新的):

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.

对参数使用 TYPE ANY 或通用 table 类型,TABLE 参数已过时:

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

是的,子程序本身已经过时,只有在绝对必须这样做时才使用它们,例如在遗留环境中。