Sam Stone написал(а):
Хочется избежать промежуточного объявления переменных

К сожалению, OPEN SQL так не умеет, как и использование строковых шаблонов, цепочек методов и т.п. удобных штук.
Можно написать свою обёртку для OPEN SQL на классах. Тогда можно будет это всё использовать, но потеряется проверка синтаксиса.
ВНИМАНИЕ РЕКЛАМА!
Я пользуюсь своим велосипедом на классе, который расширяет возможности OPEN SQL и облегчает труд программиста.
Если интересно, могу скинуть в личку, но там много лишних действий делается для Вашей задачи и система у Вас новее, сам жду, когда у нас до 7.4 SP08 обновят, чтобы ещё удобнее всё сделать и быстрее...
Code:
zcldev_dyndatbuf=>select(
EXPORTING
iv_table = 'BSEG' " Название таблицы для выборки
i_key = lt_income " Ключ для выборки (первич.ключ/поле=<>значен/структура/таблица)
iv_comp = " Компоненты структуры/таблицы I_KEY для выборки из таблицы + доп. фильтры
`BELNR=BELNR_MM ` &&
`GJAHR=ZGETDATE(4) ` &&
`WERKS ` &&
`XREF3=NLIST+6(10) ` &&
`AUGDT=&SY-DATUM& ` &&
`DMBTR>'0' ` &&
`WRBTR<=&I_VAR1& ` &&
`KOART=&I_VAR2& ` &&
`SHKZG=&I_VAR3& `
" Формат: фильтры, разделённые пробелом
" (поле таблицы)[знак[['константа'](компонент ключа[+смещение[(длина)]])['константа']]
" |[('константа')]
" |[(&переменная&)]
" ]
i_var1 = '100' " Значение 1-ой переменной в фильтре (WRBTR<=&I_VAR1&)
i_var2 = ls_bseg-koart " Значение 2-ой переменной в фильтре (KOART=&I_VAR2&)
i_var3 = lr_shkzg " 1-ый RANGE (SHKZG=&I_VAR3&)
iv_append = 'X' " Флаг добавления строк к возвращаемым данным (не очищ.E_DATA)
iv_empty = 'X' " Флаг необходимости выборки из IV_TABLE по пустым ключам
" (с пустым BELNR_MM, ZGETDATE(4), WERKS, NLIST+6(10) в lt_income)
IMPORTING
e_data = lt_bseg " Таблица с выбранными данными (+ старые данные, т.к. iv_append = 'X')
ev_subrc = lv_subrc " Флаг наличия выбранных данных
CHANGING
ct_buf = gst_bseg " Все когда-либо выбираемые данные из БД по этой таблице
" дублировать в буферную переменную gst_bseg
).
" Делает примерно это
DATA:
lt_bseg_buf LIKE lt_bseg[],
lt_income_buf LIKE lt_income[],
ls_bseg_buf LIKE LINE OF lt_bseg_buf,
ls_income LIKE LINE OF lt_income_buf.
lv_subrc = zcldev_dyndatbuf=>c_subrc_no_data. " = 4
" Формирование уникальных ключей
lt_income_buf[] = lt_income[].
SORT lt_income_buf BY belnr_mm zgetdate werks nlist.
DELETE ADJACENT DUPLICATES FROM lt_income_buf COMPARING belnr_mm zgetdate werks nlist.
LOOP AT lt_income_buf INTO ls_income.
ls_income-zgetdate = ls_income-zgetdate(4).
ls_income-werks = ls_income-werks(4).
ls_income-nlist = ls_income-nlist+6(10).
MODIFY lt_income_buf FROM ls_income TRANSPORTING zgetdate werks nlist.
" Выборка из буферной таблицы
LOOP AT gst_bseg INTO ls_bseg_buf USING KEY werks_key
WHERE belnr = ls_income-belnr_mm
AND gjahr = ls_income-zgetdate(4)
AND werks = ls_income-werks(4)
AND xref3 = ls_income-nlist+6(10)
AND augdt = sy-datum
AND dmbtr > '0'
AND wrbtr <= '100'
AND koart = ls_bseg-koart
AND shkzg IN lr_shkzg.
INSERT ls_bseg_buf INTO TABLE lt_bseg.
DELETE lt_income_buf.
lv_subrc = zcldev_dyndatbuf=>c_subrc_data_found. " = 0
ENDLOOP.
ENDLOOP.
IF NOT lt_income_buf[] IS INITIAL.
" Выборка новых данных
SELECT bukrs belnr gjahr buzei augdt koart shkzg mwskz dmbtr wrbtr werks xref3
INTO TABLE lt_bseg_buf
FROM bseg
FOR ALL ENTRIES IN lt_income_buf
WHERE belnr = lt_income_buf-belnr_mm
"AND gjahr = lt_income_buf-zgetdate
"AND werks = lt_income_buf-werks
"AND xref3 = lt_income_buf-nlist
AND augdt = sy-datum
AND dmbtr > '0'
AND wrbtr <= '100'
AND koart = ls_bseg-koart
AND shkzg IN lr_shkzg.
IF sy-subrc <> 0.
lv_subrc = zcldev_dyndatbuf=>c_subrc_no_new_data. " = 8
ENDIF.
INSERT LINES OF lt_bseg_buf INTO TABLE: gst_bseg, lt_bseg.
ENDIF.