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