选择连接表 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离子的VBRKtable的代码如下:

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 的标准方法是这样的。

  1. 将其转换为新的 SQL 语法,在每个变量前面加上 @

  2. SELECT *替换为我实际需要的字段。这很重要,因为两个 table 之间的 JOIN 总是有重复字段。所以 SELECT * 不起作用。无论如何,这是一个不好的做法。您几乎不需要 所有 个字段,因此 SELECT * 几乎总是浪费内存和 CPU 个周期。

  3. 同时使用 SELECT 并在每个列名前加上 table。例如 AND stufe = '00' 变成 AND vbfa~stufe = '00'

  4. 将第二个中的 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.
  1. 对结果集使用内联数据声明。这样您就不需要手动创建 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,那么您也可以将其作为另一个连接集成到此处。