Сообщение об ошибке синтаксиса вводит в заблуждение, запятые не требуются, поскольку проблема не связана со строгим режимом OpenSQL .
Истинная ошибка заключается в том, что в левом внешнем соединении условие в правой таблице EKPO
не принимается в WHERE
, потому что если в результате объединения есть несколько строк только из левой таблицы RSEG
, столбцы из правой таблицы EKPO
будет иметь значение null
, поэтому условия, основанные на столбцах правой таблицы, будут ложными, а строки не будут выбраны, поэтому левое внешнее соединение будет вести себя как внутреннее соединение.
- Либо вы используете внутреннее соединение с условием в
WHERE
(что вам не нужно).
- Или оставьте внешнее левое соединение и переместите условие в состояние соединения
ON
, как показано ниже.
Код:
SELECT rseg~gjahr ekpo~ebelp FROM rseg
LEFT JOIN ekpo ON rseg~ebeln = ekpo~ebeln
AND rseg~ebelp = ekpo~ebelp
AND ekpo~ebeln = lv_ebeln " <=== move it here
INTO (wa_itab-gjahr, wa_itab-ebelp )
WHERE rseg~belnr = lv_belnr.
PS: Я не нахожу ссылку в документации ABAP, которая бы это официально объясняла, за исключением того, что есть пример закрытия :
SELECT s~carrid, s~carrname
FROM scarr AS s
LEFT OUTER JOIN spfli AS p ON s~carrid = p~carrid
AND p~cityfrom = @cityfr " <=== not in the WHERE
WHERE p~connid IS NULL
ORDER BY s~carrid, s~carrname
INTO TABLE @DATA(itab).