ABAP 7.4的基础

2020-08-22 11:56发布

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

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


专家您好,

我正在尝试在以下情况下实现MOVE-CORRESPONDING。

内部表#1:lt_plant

werks fabkl国家

1000 01

内部表2:lt_name

ident ltext

01 <国家名称>

我试图使用FOR和以下代码将国家/地区名称从内部表#2移至内部表#1,但是这导致从内部表#2追加新行。

lt_plant =值#(lt_name
的基本lt_plant
其中lt_plant
的基础lt_plant
-ltext
))。

请帮助我使用BASE/CORRESPONDING,FOR和WHERE解决此问题。

谢谢。

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

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


专家您好,

我正在尝试在以下情况下实现MOVE-CORRESPONDING。

内部表#1:lt_plant

werks fabkl国家

1000 01

内部表2:lt_name

ident ltext

01 <国家名称>

我试图使用FOR和以下代码将国家/地区名称从内部表#2移至内部表#1,但是这导致从内部表#2追加新行。

lt_plant =值#(lt_name
的基本lt_plant
其中lt_plant
的基础lt_plant
-ltext
))。

请帮助我使用BASE/CORRESPONDING,FOR和WHERE解决此问题。

谢谢。

付费偷看设置
发送
8条回答
wang628962
1楼 · 2020-08-22 12:26.采纳回答

>>但是,这导致从内部表#2追加新行。

是的,由于存在BASE,因此使用lt_plant = VALUE#(BASE lt_plant ...)构造 它与目标引用相同的表,它在不初始化的情况下追加新行。 请注意,使用与目标数据对象BASE和FOR相同的内部表是非常危险的,因为它可能会导致无限循环(当前,您的代码不会循环,仅因为您没有初始化lt_plant的fabkl且WHERE基于 在fabkl上,您只需初始化ltext。)

如果只想使代码不追加,而无需太多更改代码,则可以简单地放弃BASE并使用LET lt_plant_temp = lt_plant进行临时复制 因为LET总是在目标数据对象(lt_plant)初始化之前执行:

 lt_plant = value#(
         LET lt_plant_temp = lt_plant IN" <==代替BASE
         对于lt_name中的
         对于lt_plant_temp中的
             其中(fabkl =  -ident)
         (
           werks =  -werks" <==添加此
           fabkl =  -ident" <==添加此
           ltext = <文件名> -ltext
         ))。

但是我建议您选择Michael给出的与CORRESPONDING ... FROM ... USING对应的解决方案,它对应于左外部联接,因为我认为它比您的对应于一个外部联接更好。 内部联接。 如果要坚持内部联接,还可以使用FILTER ... IN构造函数。

d56caomao
2楼-- · 2020-08-22 12:16

请使用CODE按钮设置代码格式,以便在更多用户中显示 友好的格式(彩色)。

蓋茨
3楼-- · 2020-08-22 12:08

>>,但是会导致从内部表#2追加新行。

是,为操作符VALUE选择了BASE, BASE表的值用作目标表的初始值,下一个值基于您的两个FOR循环。

这是它与CORRESPONDING一起工作的方式,请注意lt_plant不会初始化,但是 基于匹配键的第二张表中的值将从table2移到table1。 另外,table2还需要根据您的映射值进行排序或散列:

 lt_plant =对应的#(lt_plant FROM lt_name使用ident = fabkl)。
 

这是它与VALUE和FOR一起使用的方式,而内部表将被初始化并插入行:

 lt_plant = VALUE#(FOR  IN lt_plant
  (werks =  -werks
    fabkl =  -fabkl
  country =值#(lt_name [ident =  -fabkl] -ltext可选)))。
 
土豆飞人
4楼-- · 2020-08-22 12:24

有关信息,请使用CODE按钮更好地格式化数据。

内部表#1:lt_plant

 werks fabkl ltext
 ----- ----- -------
 1000 01 

内部表2:lt_name

 ident ltext
 ----- --------------
 01 <国家名称> 
Alawn_Xu
5楼-- · 2020-08-22 12:26

创建一个具有lt_plant结构的故事类型" LTT_PLANT"。

 lt_plant = VALUE ltt_plant(FOR ls_name IN lt_name FOR ls_plant IN lt_plant WHERE(fabkl = ls_name-ident)(werks = ls_plant-werks

                          fabkl = ls_plant-fabkl

                          country = ls_name-itext))。
灬番茄
6楼-- · 2020-08-22 12:25
Sandra Rossi ,我没有收到有关 您提到的内容,可能是社区中的错误。 我在浏览您的答案时发现了此回复(由于使用" LINES OF"来删除您的另一个答案中的空行,我的想法被震撼了,但仍然不明白,必须再次查看: D)。再次感谢您的解释,我花了一些时间才能理解您的意思,但我现在很清楚。 我一直以为,这是在内部创建一些临时内部表并将其分配给itab:D ..我想这就是为什么我们使用VALUE来清除LHS itab的原因,以避免无穷循环的情况(我 希望我在这里是正确的)...
jovirus
7楼-- · 2020-08-22 12:05

嗨, Sandra

一天的问候!

非常感谢您的支持。 在返回确切的记录数方面,您的代码正常运行,因为我在源表lt_plant中有114条记录。 但是,werks字段正在初始化。 也许我还必须在值分配中添加一些怪癖。我附上了屏幕截图,请提出建议。

预先感谢。

一周热门 更多>