Validation 用于验证多行的所有条目

Validation 用于验证多行的所有条目,validation,abap,Validation,Abap,我有一个关于ABAP中所有条目的语句的问题。 我知道它的功能类似于选择不同的,并删除重复的条目 在我的例子中,我想为表输入编写一个验证。因为您可以输入多行,所以我必须检查每一行。 选择循环不是一个选项。对于所有条目,可选择。不幸的是,如果f.e.需要验证相同的公司代码,FoE只会返回一个条目。因此,我没有机会确定错误在哪里(如果有) 以下是验证代码: LOOP AT extract. IF <xact> NE empty. READ TABLE total W

我有一个关于ABAP中所有条目的语句的问题。 我知道它的功能类似于选择不同的,并删除重复的条目

在我的例子中,我想为表输入编写一个验证。因为您可以输入多行,所以我必须检查每一行。 选择循环不是一个选项。对于所有条目,可选择。不幸的是,如果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.
提取时循环。
如果NE为空。
用键读取表总计。
如果sy子方程为0。
移动到ls_y。
将ls_y附加到lt_y。
恩迪夫。
恩迪夫。
结束循环。
选择bukrs
从t001开始
对于@lt_y中的所有条目
其中bukrs=@lt_y-bukrs
进入表@DATA(lt\u check\u bukrs)。
如果lt_check_bukrs是首字母。
消息“公司代码错误”类型“S”显示为“E”。
vim_abort_saving=abap_true。
恩迪夫。
也许你们中有人有办法或想法。
谢谢你的回答

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

在另一种情况下,如果这是不可行的,因为要与之进行比较的表太大,会导致
TSV\u TNEW\u PAGE\u ALLOC\u失败
,那么我将返回到获取原始数据的位置,并与比较表执行外部联接:

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可以在数据库表和内存中的表之间进行连接。但这确实需要您使用SAP HANA数据库。

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

在另一种情况下,如果这是不可行的,因为要与之进行比较的表太大,会导致
TSV\u TNEW\u PAGE\u ALLOC\u失败
,那么我将返回到获取原始数据的位置,并与比较表执行外部联接:

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可以在数据库表和内存中的表之间进行连接。但这确实需要您使用SAP HANA数据库。

不清楚您要检查什么,请提供代码。如果在问题中添加了代码:)好的,但我仍然不知道问题出在哪里。T001只包含每个公司代码一次(因为它是表的唯一键字段(除MANDT外)),因此即使lt_y表多次具有相同的公司代码,它也只会被选择一次。您在lt_y上循环并读取表T001(>lt_check_bukrs),如果sy.subrc为0,则公司代码有效,否则无效。不管您在lt_y中有多少行具有相同的公司代码。另一方面,如果它是客户表的维护视图(看起来是),只需在SE11的表中为公司代码字段创建“外键”(标记字段,单击“外键”)我猜它会自动建议表T001,如果该字段被称为BUKRS),并且您的大多数问题都已解决。不清楚,您要检查什么,请提供代码。如果将代码添加到问题中:)好的,但我仍然不知道问题出在哪里。T001只包含每个公司代码一次(因为它是表的唯一键字段(除MANDT外)),因此即使lt_y表多次具有相同的公司代码,它也只会被选择一次。您在lt_y上循环并读取表T001(>lt_check_bukrs),如果sy.subrc为0,则公司代码有效,否则无效。不管您在lt_y中有多少行具有相同的公司代码。另一方面,如果它是客户表的维护视图(看起来是),只需在SE11的表中为公司代码字段创建“外键”(标记字段,单击“外键”)我猜它会自动建议表T001,如果该字段被称为BUKRS),那么您的大多数问题都会得到解决。