使用 FOR ALL ENTRIES 验证多行

Using FOR ALL ENTRIES for validation multiple lines

我对 ABAP 中的 For all Entries 语句有疑问。 我知道它的功能类似于 Select Distinct 并删除重复条目。

就我而言,我想为 table 输入编写验证。由于您可以输入多行,因此我必须检查每一行。 循环 Select 不是选项。备选方案是 For all Entries。可悲的是 f.e。同样的公司代码需要验证,FoE 只返回一个条目。所以我没有机会确定错误在哪里(如果有的话)。

验证代码如下:

  LOOP AT extract.
    IF <xact> NE empty.
      READ TABLE total WITH KEY <vim_xextract_key>.
      IF sy-subcs EQ 0.
        MOVE <vim_total_struc> TO ls_y.
        APPEND ls_y TO lt_y.
      ENDIF.
    ENDIF.
  ENDLOOP.


  SELECT bukrs
  FROM t001
  FOR ALL ENTRIES IN @lt_y 
  WHERE bukrs = @lt_y-bukrs
  INTO TABLE @DATA(lt_check_bukrs).

IF lt_check_bukrs IS INITIAL.
    MESSAGE 'Error in company code' TYPE 'S' DISPLAY LIKE 'E'.
    vim_abort_saving = abap_true.
  ENDIF.

也许你们中有人有方法或想法。 谢谢大家的回答!

考虑到公司代码table不应该太长(在任何配置合理的系统中),我会把它加载到应用服务器上,而不是数据库层,而是在ABAP层进行比较。

SELECT bukrs
  FROM t001
  INTO TABLE @DATA(lt_all_bukrs).

LOOP AT lt_check_bukrs REFERENCE INTO DATA #(lr_check_bukrs).
  IF NOT line_exists( lt_all_bukrs[ lr_check_burks->bukrs ] )
    MESSAGE |Document { lv_check_bukrs->belnr } has invalid company code { lr_check_burks->bukrs }| TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
ENLOOP.

在另一种情况下,这是不可行的,因为您要与之比较的 table 太大,会导致 TSV_TNEW_PAGE_ALLOC_FAILED,那么我会回到您获取原始文件的地方数据并使用比较 table:

执行 OUTER JOIN
SELECT bkpf~opbel,
       bkpf~bukrs
   FROM bseg
   LEFT OUTER JOIN t001 ON bkpf-burks = t001~bukrs
   INTO TABLE 
   WHERE t001~bukrs IS NULL.

结果table应该是公司代码无效的所有财务单据编号。


这个是不可能的,因为源数据不是来自数据库(手动输入,从文件读取,从网络服务接收,等等...)那么最后一个选项是将该数据传递给 ABAP-Managed 数据库过程。因为 SQLScript 可以在数据库 tables 和内存中的 tables 之间进行 JOIN。但这确实需要您使用 SAP HANA 数据库。