将内联声明的表/变量传递给ABAP中的子例程

将内联声明的表/变量传递给ABAP中的子例程,abap,subroutine,Abap,Subroutine,我知道当我需要将一个内部表传递给一个子例程时,我需要声明一个类型,以便在FORM语句中使用它。 如果内部表是SELECT语句中的内联声明表,会发生什么情况,如下所示: 选择*从KNA1进入表格@DATA(LT\u KNA1) 有没有办法把这个表传递给子程序? 谢谢。您不需要为执行变量表指明结构类型。但若在执行中使用的任何字段名发生更改,则在运行时可能会出现错误。下面是两个工作示例 SELECT * FROM kna1 INTO TABLE @DATA(lt_kna1). PERFORM tes

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

选择*从KNA1进入表格@DATA(LT\u KNA1)

有没有办法把这个表传递给子程序?
谢谢。

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

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.

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

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.

自ABAP7.02(2009)以来,子例程已经过时,因此我在示例中使用了一种方法

内联声明是隐式声明类型的一种简单方法,但此解决方案的限制是,您只能一般地键入方法的参数(类型
标准表
索引表
任何表
任何
),这会阻止您在代码中静态声明组件名称

但是类型
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.
报告。
类lcl_应用程序定义。
公共部分。
类方法。
末级。
类lcl_应用程序实现。
方法main。

类型:helper_类型的BEGIN,“子例程自ABAP 7.02(2009)以来已过时,因此我在示例中使用了一种方法

内联声明是隐式声明类型的一种简单方法,但此解决方案的限制是,您只能一般地键入方法的参数(类型
标准表
索引表
任何表
任何
),这会阻止您在代码中静态声明组件名称

但是类型
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.
报告。
类lcl_应用程序定义。
公共部分。
类方法。
末级。
类lcl_应用程序实现。
方法main。

类型:helper_type的开头,“使用
为参数键入任何
或通用表类型,
参数已过时:

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

是的,子例程本身是过时的,仅当您必须这样做时才使用它们,例如在传统环境中。

使用
键入任何
或通用表格类型作为参数,
表格
参数是过时的:

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

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

子程序自ABAP 7.02(2009)以来就过时了。你应该使用方法(或者最终使用功能模块)。你的意思是“可选功能模块”,对吗?@Jagger我想我用“最终”的时候不正确,理解为“偶尔”。应主要使用方法,如果无法使用方法,则应使用功能模块作为最后手段(“”),例如,如果应用程序需要RFC、更新任务、Dynpro等。自ABAP 7.02(2009)以来,子例程已过时。你应该使用方法(或者最终使用功能模块)。你的意思是“可选功能模块”,对吗?@Jagger我想我用“最终”的时候不正确,理解为“偶尔”。如果方法不能使用,例如如果应用程序需要RFC、更新任务、Dynpro等,则应主要使用方法,并且功能模块应作为最后手段(“”)。表参数已过时,
STRUCTURE
表参数的添加已过时,和
结构
表格参数的添加已过时