Abap 带有列间比较的OpenSQL

Abap 带有列间比较的OpenSQL,abap,opensql,Abap,Opensql,我可以在OpenSQL中比较表的列吗 当前代码如下所示: SELECT SINGLE menge wemng ebeln ebelp INTO (eket-menge, eket-wemng, eket-ebeln, eket-ebelp) FROM eket WHERE ebeln = ekpo-ebeln AND ebelp = ekpo-ebelp. IF eket-menge NE

我可以在OpenSQL中比较表的列吗

当前代码如下所示:

  SELECT SINGLE menge wemng ebeln ebelp
    INTO (eket-menge,
          eket-wemng,
          eket-ebeln,
          eket-ebelp)
    FROM eket
    WHERE ebeln = ekpo-ebeln
      AND ebelp = ekpo-ebelp.

  IF eket-menge NE eket-wemng.
我希望避免检索
menge=wemng
的行,但这不起作用:

  SELECT menge wemng ebeln ebelp
    INTO (eket-menge,
          eket-wemng,
          eket-ebeln,
          eket-ebelp)
    FROM eket
    WHERE ebeln = ekpo-ebeln
      AND ebelp = ekpo-ebelp
      AND menge <> wemng.
选择menge wemng ebeln ebelp
进入(eket menge,
埃克特·韦姆格,
埃克特·埃本,
eket ebelp)
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·韦蒙。
ABAP认为
wemng
应该是一个变量


我怎么做?

请检查以下查询:

  SELECT menge wemng ebeln ebelp
  INTO (eket-menge,
        eket-wemng,
        eket-ebeln,
        eket-ebelp)
  FROM eket
  WHERE ebeln = ekpo-ebeln
    AND ebelp = ekpo-ebelp
    AND menge <> eket~wemng.
选择menge wemng ebeln ebelp
进入(eket menge,
埃克特·韦姆格,
埃克特·埃本,
eket ebelp)
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。
但在这一刻,你得到了一个错误:

嵌套错误:在语句“ENDIF”之前,“SELECT”引入的控件结构必须以“ENDSELECT”结尾

所以您应该创建一些内部表来处理这个问题

  SELECT menge wemng ebeln ebelp
  INTO TABLE lt_eket
  FROM eket
  WHERE ebeln = ekpo-ebeln
    AND ebelp = ekpo-ebelp
    AND menge <> eket~wemng.
选择menge wemng ebeln ebelp
放进桌子里
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。
或者使用SELECT SINGLE

  SELECT SINGLE menge wemng ebeln ebelp
  INTO (eket-menge,
        eket-wemng,
        eket-ebeln,
        eket-ebelp)
  FROM eket
  WHERE ebeln = ekpo-ebeln
    AND ebelp = ekpo-ebelp
    AND menge <> eket~wemng.
选择单个menge wemng ebeln ebelp
进入(eket menge,
埃克特·韦姆格,
埃克特·埃本,
eket ebelp)
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。

请检查以下查询:

  SELECT menge wemng ebeln ebelp
  INTO (eket-menge,
        eket-wemng,
        eket-ebeln,
        eket-ebelp)
  FROM eket
  WHERE ebeln = ekpo-ebeln
    AND ebelp = ekpo-ebelp
    AND menge <> eket~wemng.
选择menge wemng ebeln ebelp
进入(eket menge,
埃克特·韦姆格,
埃克特·埃本,
eket ebelp)
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。
但在这一刻,你得到了一个错误:

嵌套错误:在语句“ENDIF”之前,“SELECT”引入的控件结构必须以“ENDSELECT”结尾

所以您应该创建一些内部表来处理这个问题

  SELECT menge wemng ebeln ebelp
  INTO TABLE lt_eket
  FROM eket
  WHERE ebeln = ekpo-ebeln
    AND ebelp = ekpo-ebelp
    AND menge <> eket~wemng.
选择menge wemng ebeln ebelp
放进桌子里
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。
或者使用SELECT SINGLE

  SELECT SINGLE menge wemng ebeln ebelp
  INTO (eket-menge,
        eket-wemng,
        eket-ebeln,
        eket-ebelp)
  FROM eket
  WHERE ebeln = ekpo-ebeln
    AND ebelp = ekpo-ebelp
    AND menge <> eket~wemng.
选择单个menge wemng ebeln ebelp
进入(eket menge,
埃克特·韦姆格,
埃克特·埃本,
eket ebelp)
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。

在WHERE条件下比较两列时,应使用列选择器(~)。这是故意的

阿巴普多库说:

列选择器

字符~。数据库表(dbtab)的列(col)可以是 通过dbtab~col在SELECT语句中寻址。这种类型的 在以下情况下访问多个数据库表时需要寻址: 列的名称出现在许多不同的数据库表中 或如果在 其中条件

因此,在你的情况下:

SELECT menge wemng ebeln ebelp
    INTO (eket-menge,
          eket-wemng,
          eket-ebeln,
          eket-ebelp)
    FROM eket
    WHERE ebeln = ekpo-ebeln
      AND ebelp = ekpo-ebelp
      AND menge <> eket~wemng.
...
选择menge wemng ebeln ebelp
进入(eket menge,
埃克特·韦姆格,
埃克特·埃本,
eket ebelp)
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。
...

在WHERE条件下比较两列时,应使用列选择器(~)。这是故意的

阿巴普多库说:

列选择器

字符~。数据库表(dbtab)的列(col)可以是 通过dbtab~col在SELECT语句中寻址。这种类型的 在以下情况下访问多个数据库表时需要寻址: 列的名称出现在许多不同的数据库表中 或如果在 其中条件

因此,在你的情况下:

SELECT menge wemng ebeln ebelp
    INTO (eket-menge,
          eket-wemng,
          eket-ebeln,
          eket-ebelp)
    FROM eket
    WHERE ebeln = ekpo-ebeln
      AND ebelp = ekpo-ebelp
      AND menge <> eket~wemng.
...
选择menge wemng ebeln ebelp
进入(eket menge,
埃克特·韦姆格,
埃克特·埃本,
eket ebelp)
来自eket
其中ebeln=ekpo-ebeln
和ebelp=ekpo-ebelp
还有蒙格·埃克特~wemng。
...

实际上,如果您放置一个ENDSELECT,您的第一个示例也会起作用。是的,没错,但SELECT ENDSELECT已经过时,SAP建议不要使用这种方式。我知道,我在那里工作。但是,如果内存有限,它仍然是最佳选择。此外,发生错误的原因只是您忘记使用ENDSELECT关闭,而不是因为它已过时。实际上,如果您使用ENDSELECT,您的第一个示例也可以使用。是的,没错,但SELECT ENDSELECT已经过时,SAP建议不要使用这种方式。我知道,我在那里工作。但是,如果内存有限,它仍然是最佳选择。此外,发生此错误的唯一原因是您忘记使用ENDSELECT关闭,而不是因为它已过时。请注意,现代替代方法是使用,其目标之一是解决此类命名问题,即变量需要以@作为前缀,所有其他名称都是列或表:
SELECT menge FROM eket,其中ebeln=@ekpo-ebeln和menge wemng进入@eket-menge
注意,现代的替代方法是使用,其目标之一是解决此类命名问题,即变量需要前缀@,所有其他名称都是列或表:
从eket中选择menge,其中ebeln=@ekpo-ebeln和menge-wemng进入@eket-menge