validation - 使用 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.
也许你们中的一个人有方法或想法。谢谢大家的回答!
解决方案
考虑到公司代码表不应该太长(在任何配置合理的系统中),我会将其加载到应用程序服务器中,并在 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 数据库。
推荐阅读
- node.js - TypeError:无法读取未定义的属性“findOne”(使用猫鼬)
- redhat - httpd24 RHSCL 的多个实例
- vba - 如果在特定列中发现重复项,则用于更改值的 Excel VBA 代码
- python - 每次在 sublime 文本上运行时运行一个 python 片段
- python - 在 Python Panda 数据框中,如何使用其他列基于多个 if else 条件创建一个新列(输出 True / False)?
- sql - REDSHIFT:根据另一列中的某个值将列中的值分配给所有行
- tensorflow - Matterport MaskRCNN 到 TensorFlow Lite
- angular - 无法在 Angular 11 中使用 angular-calendar-year-view
- django - MariaDB:ALTER TABLE 命令适用于一张表,但不适用于另一张表
- pandas - groupby 并计算多列数据框