将内联声明的 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 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.
现在,手动声明 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.
是的,子程序本身已经过时,只有在绝对必须这样做时才使用它们,例如在遗留环境中。
我知道当我需要将内部 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 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.
现在,手动声明 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.
是的,子程序本身已经过时,只有在绝对必须这样做时才使用它们,例如在遗留环境中。