内联声明的表,其中包含SQL查询的结果。 可以在子例程中使用它吗?

2020-08-18 01:27发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家您好,

在进行SQL查询时,我一直非常享受ABAP 7.40的功能,而不必担心耗时的类型声明。

能够做这样的事情真是太好了(Horst Keller关于主机表达式的博客文章中的示例):

选择carrid,connid,cityfrom,cityto
从spfli
在哪里carrid =
@(值spfli-carrid(carrier [键名
carrname =名称] -carrid
可选) )
插入表@DATA(结果)。

我的问题是,假设我做了这个SQL,然后我想使用新创建的内部表 result 作为子例程的参数。 问题是,该表是内联创建的,没有类型。 有没有一种方法可以将其传递给子例程,使我可以循环,直接访问字段等?

谢谢很多人

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家您好,

在进行SQL查询时,我一直非常享受ABAP 7.40的功能,而不必担心耗时的类型声明。

能够做这样的事情真是太好了(Horst Keller关于主机表达式的博客文章中的示例):

选择carrid,connid,cityfrom,cityto
从spfli
在哪里carrid =
@(值spfli-carrid(carrier [键名
carrname =名称] -carrid
可选) )
插入表@DATA(结果)。

我的问题是,假设我做了这个SQL,然后我想使用新创建的内部表 result 作为子例程的参数。 问题是,该表是内联创建的,没有类型。 有没有一种方法可以将其传递给子例程,使我可以循环,直接访问字段等?

谢谢很多人

付费偷看设置
发送
7条回答
四川大学会员
1楼-- · 2020-08-18 02:13

内联声明始终创建"本地"数据。 您不能在全局接口中引用本地数据类型。

您可以做的当然是在本地引用它们,但是通常您不想这么做...

 选择 *
   从恐怖
   到表@DATA(结果)。
 ...
 数据行类似于LINE OF结果。
 ...
 FORM dANG使用para LIKE结果。
 结束格式
 

这里有一个根据内联声明键入的参数。

闻人可可
2楼-- · 2020-08-18 02:10
Hello Horst,

我要对一些看起来与您在上面键入的代码非常相似的代码提出疑问:

在lt_eban INTO DATA(ls_eban)中循环
   GROUP BY(ekgrp = ls_eban-ekgrp)
   参考数据(ekgrp_groups)。
   DATA lt_members喜欢lt_eban。
   清除lt_members。
   在组ekgrp_groups分配字段符号()上循环。
     lt_members = VALUE#(基本lt_members())。
   结局。
 ENDLOOP。

其中lt_eban是我从eban中选择时声明的动态声明的内部表。

我不太喜欢的当然是这两行:

 DATA lt_members就像lt_eban。
   清除lt_members。

没有别的办法吗?

非常感谢,感谢您在社区和博客中的承诺:一切都非常好,对我们的工作有很大帮助!

CJones
3楼-- · 2020-08-18 02:04

您的意思是

"问题是,此表是内联创建的,没有类型。"

当然,该表具有类型。 检查文档, 类型派生。 编译器知道将使用DATA声明的类型。 实际上,内联声明是DATA的简短形式。

clever101
4楼-- · 2020-08-18 01:59

请参见下面给出的答案中的示例,"仅在本地工作 内联声明,您不能声明根据此声明键入的参数。 您必须使用旧方法。 但是,ABAP团队会在下一个内核中实现这种功能会很好:)

暮风yp
5楼-- · 2020-08-18 02:09

Hello Horst,

我阅读了文档,现在我看到目标内联声明是从结果集中派生的,这当然是有道理的。 感谢您指出子例程已过时! 我仍然经常在工作中看到它们,这就是为什么我仍然不喜欢它们的原因。

无论如何,如果我将SQL的内联结果表作为参数传递给方法,我仍然必须将其作为通用类型(如TYPE ANY TABLE等)传递,对吗? 如果类型是由编译器在内联声明中静态派生的,那么为什么涉及参数的泛型类型呢? 编译器不能像内联声明中那样推断类型吗?

我个人认为,将内联与新的构造函数表达式结合使用起来使ABAP的编程变得轻而易举,并且与声明类型和助手的"传统方式"相比,更加有趣。 我认为能够内联SQL结果表并避免费力地为4个表联接定义结构类型,以便将其传递给具有完全静态类型的方法的机械部分,将是很棒的。 动态键入几乎结束了使用内联的直接性,对吗? 如果我只是"手动"声明类型,则在可能进行完全键入的情况下使用泛型键入是完全错误的。

只是我的意见。 您可能会说,我认为类型的声明很无聊,呵呵

hongfeng1314
6楼-- · 2020-08-18 01:55

Hello Horst,祝贺您的博客,我喜欢它。

我实际上认为该表是动态创建的。 也许我应该重新表述这个问题:子例程是否可以访问内联创建的静态类型? 即使它是静态的,也隐藏在子例程中,对吗? 如果我错了,请纠正我,但是我不能在没有显式表类型的情况下将表传递给子例程,并且期望访问字段或循环内容。

一周热门 更多>