首页 > 解决方案 > 使用 FOR ALL ENTRIES 验证多行

问题描述

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

就我而言,我想为表输入编写验证。由于您可以输入多行,因此我必须检查每一行。 带选择的循环不是一个选项。另一种选择是For all Entries。遗憾的是,如果需要验证相同的公司代码,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.

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

标签: validationabap

解决方案


考虑到公司代码表不应该太长(在任何配置合理的系统中),我会将其加载到应用程序服务器中,并在 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.

在另一种情况下这是不可行的,因为您要与之比较的表太大会导致 a TSV_TNEW_PAGE_ALLOC_FAILED,然后我将返回您获取原始数据的位置并使用比较表执行 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.

结果表应为公司代码无效的所有财务单据编号。


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


推荐阅读