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 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.

ABAP считает, что wemng должна быть переменной.

Как мне это сделать?


person András    schedule 08.09.2018    source источник


Ответы (2)


Вы должны использовать селектор столбцов (~) при сравнении двух столбцов в условии WHERE. Это сделано намеренно.

ABAPDOCU говорит:

Селектор столбца

Персонаж ~. Столбец (col) таблицы базы данных (dbtab) может быть адресован в операторе SELECT с помощью dbtab ~ col. Этот тип адресации необходим, когда осуществляется доступ к нескольким таблицам базы данных, если имя столбца встречается в нескольких разных таблицах базы данных или если два столбца сравниваются друг с другом при сравнении в ГДЕ условие.

Итак, в вашем случае:

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.
...
person st4hoo    schedule 10.09.2018
comment
Обратите внимание, что современная альтернатива - использовать строгий SQL, одной из целей которого было решение такого рода проблем с именованием, т.е. переменные должны иметь префикс @, все остальные имена являются столбцами или таблицами: SELECT menge FROM eket WHERE ebeln = @ekpo-ebeln AND menge <> wemng INTO @eket-menge - person Sandra Rossi; 10.09.2018

Пожалуйста, проверьте запрос ниже:

  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.

Но в этот момент вы получаете ошибку:

Неправильное размещение: перед оператором «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.

или используйте ВЫБРАТЬ ОДИН

  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.
person Gustawson    schedule 09.09.2018
comment
На самом деле ваш первый пример тоже работает, если вы поставите ENDSELECT. за этим - person András; 09.09.2018
comment
Да, верно, но SELECT ENDSELECT устарел, и SAP рекомендует не использовать этот способ. - person Gustawson; 14.09.2018
comment
Я знаю, я там работаю. Однако, если у вас ограниченный объем памяти, это по-прежнему лучший вариант. Также ошибка произошла только потому, что вы забыли закрыть с помощью ENDSELECT, а не потому, что она устарела. - person András; 14.09.2018