选择连接表 VBFA 和 VBRK
Selection to join the tables VBFA and VBRK
我已经完成了 table VBFA
的 selection,其中 select 根据下面的代码编辑了各种 SD 文档,另一个 select离子 table VBRK
已经 select 编辑了没有 NETWR = 0
的文档。我想要实现的是 select 只有那些 NETWR NE 0
的 SD 文件。
tableVBFA
的selection的代码如下:
SELECT * FROM vbfa AS v INTO TABLE gt_vbfa_inv
FOR ALL ENTRIES IN gt_vbak
WHERE vbelv = gt_vbak-vbeln
AND vbtyp_n IN ('M', 'O', 'P', '5', '6')
AND stufe = '00'
AND NOT EXISTS ( SELECT * FROM vbfa
WHERE vbelv = v~vbeln
AND posnv = v~posnn
AND vbtyp_n IN ('N', 'S')
AND stufe = '00' ) .
而select离子的VBRK
table的代码如下:
IF sy-subrc = 0.
SELECT DISTINCT * FROM vbrk
INTO TABLE gt_vbrk
FOR ALL ENTRIES IN gt_vbfa_inv
WHERE vbeln EQ gt_vbfa_inv-vbeln
AND netwr NE 0.
ENDIF.
有没有办法通过新的 Select 或循环条件将它们合并为两个 selection,这将 select table VBFA
,其中文件不会有NETWR = 0
(或NETWR NE 0
)?
提前谢谢大家!
我将使用 FOR ALL ENTRIES
的代码转换为 JOIN
的标准方法是这样的。
将其转换为新的 SQL 语法,在每个变量前面加上 @
。
将SELECT *
替换为我实际需要的字段。这很重要,因为两个 table 之间的 JOIN 总是有重复字段。所以 SELECT *
不起作用。无论如何,这是一个不好的做法。您几乎不需要 所有 个字段,因此 SELECT *
几乎总是浪费内存和 CPU 个周期。
同时使用 SELECT 并在每个列名前加上 table。例如 AND stufe = '00'
变成 AND vbfa~stufe = '00'
将第二个中的 FOR ALL ENTRIES 转换为第一个 select 中的 JOIN 条件。所以
FROM vbrk
FOR ALL ENTRIES IN @gt_vbfa_inv
WHERE vbrk~vbeln = @gt_vbfa_inv-vbeln
AND vbrk~netwr <> 0.
变成
JOIN vbrk
ON vbrk~vbeln = vbfa~vbeln AND
vbrk~netwr <> 0.
- 对结果集使用内联数据声明。这样您就不需要手动创建 table- 和结构类型来保存结果。因此,最终结果看起来像这样(未经测试的代码):
SELECT vbfa~somefield1
vbfa~somefield2
vbfa~somefield3
vbrk~somefield1
vbrk~somefield2
FROM vbfa
JOIN vbrk ON
vbrk~vbeln = vbfa~vbeln AND
vbrk~netwr NE 0.
INTO TABLE @DATA(gt_results)
FOR ALL ENTRIES IN @gt_vbak
WHERE vbfa~vbelv = gt_vbak-vbeln
AND vbfa~vbtyp_n IN ('M', 'O', 'P', '5', '6')
AND vbfa~stufe = '00'
AND NOT EXISTS ( SELECT * FROM vbfa AS vbfa2
WHERE vbfa2~vbelv = vbfa~vbeln
AND vbfa2~posnv = vbfa~posnn
AND vbfa2~vbtyp_n IN ('N', 'S')
AND vbfa2~stufe = '00' ) .
顺便说一下:如果 gt_vbak
也来自 SELECT,那么您也可以将其作为另一个连接集成到此处。
我已经完成了 table VBFA
的 selection,其中 select 根据下面的代码编辑了各种 SD 文档,另一个 select离子 table VBRK
已经 select 编辑了没有 NETWR = 0
的文档。我想要实现的是 select 只有那些 NETWR NE 0
的 SD 文件。
tableVBFA
的selection的代码如下:
SELECT * FROM vbfa AS v INTO TABLE gt_vbfa_inv
FOR ALL ENTRIES IN gt_vbak
WHERE vbelv = gt_vbak-vbeln
AND vbtyp_n IN ('M', 'O', 'P', '5', '6')
AND stufe = '00'
AND NOT EXISTS ( SELECT * FROM vbfa
WHERE vbelv = v~vbeln
AND posnv = v~posnn
AND vbtyp_n IN ('N', 'S')
AND stufe = '00' ) .
而select离子的VBRK
table的代码如下:
IF sy-subrc = 0.
SELECT DISTINCT * FROM vbrk
INTO TABLE gt_vbrk
FOR ALL ENTRIES IN gt_vbfa_inv
WHERE vbeln EQ gt_vbfa_inv-vbeln
AND netwr NE 0.
ENDIF.
有没有办法通过新的 Select 或循环条件将它们合并为两个 selection,这将 select table VBFA
,其中文件不会有NETWR = 0
(或NETWR NE 0
)?
提前谢谢大家!
我将使用 FOR ALL ENTRIES
的代码转换为 JOIN
的标准方法是这样的。
将其转换为新的 SQL 语法,在每个变量前面加上
@
。将
SELECT *
替换为我实际需要的字段。这很重要,因为两个 table 之间的 JOIN 总是有重复字段。所以SELECT *
不起作用。无论如何,这是一个不好的做法。您几乎不需要 所有 个字段,因此SELECT *
几乎总是浪费内存和 CPU 个周期。同时使用 SELECT 并在每个列名前加上 table。例如
AND stufe = '00'
变成AND vbfa~stufe = '00'
将第二个中的 FOR ALL ENTRIES 转换为第一个 select 中的 JOIN 条件。所以
FROM vbrk
FOR ALL ENTRIES IN @gt_vbfa_inv
WHERE vbrk~vbeln = @gt_vbfa_inv-vbeln
AND vbrk~netwr <> 0.
变成
JOIN vbrk
ON vbrk~vbeln = vbfa~vbeln AND
vbrk~netwr <> 0.
- 对结果集使用内联数据声明。这样您就不需要手动创建 table- 和结构类型来保存结果。因此,最终结果看起来像这样(未经测试的代码):
SELECT vbfa~somefield1
vbfa~somefield2
vbfa~somefield3
vbrk~somefield1
vbrk~somefield2
FROM vbfa
JOIN vbrk ON
vbrk~vbeln = vbfa~vbeln AND
vbrk~netwr NE 0.
INTO TABLE @DATA(gt_results)
FOR ALL ENTRIES IN @gt_vbak
WHERE vbfa~vbelv = gt_vbak-vbeln
AND vbfa~vbtyp_n IN ('M', 'O', 'P', '5', '6')
AND vbfa~stufe = '00'
AND NOT EXISTS ( SELECT * FROM vbfa AS vbfa2
WHERE vbfa2~vbelv = vbfa~vbeln
AND vbfa2~posnv = vbfa~posnn
AND vbfa2~vbtyp_n IN ('N', 'S')
AND vbfa2~stufe = '00' ) .
顺便说一下:如果 gt_vbak
也来自 SELECT,那么您也可以将其作为另一个连接集成到此处。