Вопрос в том, есть ли какие-либо другие проверки, запускаемые для динамических предложений order-by, а не для жестко закодированных предложений order-by в abap.
Я написал в abap выражение sql.Это утверждение суммирует количество записей за определенные годы.Затем он группирует количество в зависимости от типа записи.После этого я попытался сделать динамическую сортировку.По какой-то причине это приводит к ошибке: «Синтаксический анализатор выдал ошибку: выражение, содержащее IN_YEAR, не является выражением GROUP-BY».
Дело в том, что предложение order-by работает при жестком кодированиикритерии сортировки.Когда я пытаюсь сделать это динамически, это не так.
Но я должен выполнить сортировку динамически, потому что позже критерии сортировки будут поступать из внешнего интерфейса через oData (it_order).
DATA: lv_cYear TYPE NUMC4,
lv_lYear TYPE NUMC4,
lv_2YearsAgo TYPE NUMC4,
lv_order_by TYPE string.
GET TIME.
lv_cYear = sy-datum+0(4).
LV_LYEAR = LV_CYEAR - 1.
LV_2YEARSAGO = LV_CYEAR - 2.
*later lv_order_by should be filled dynamically
lv_order_by = 'RRC2019 DESCENDING, RRC2018 DESCENDING'.
SELECT
type_name AS type,
SUM( CASE WHEN in_year eq @lv_cYear THEN record_count END ) AS RRC2019,
SUM( CASE WHEN in_year eq @lv_lyear THEN record_count END ) AS RRC2018,
SUM( CASE WHEN in_year eq @LV_2YEARSAGO THEN record_count END ) AS RRC2017
FROM entryTable
GROUP BY type_name
HAVING SUM( CASE WHEN in_year eq @lv_cYear THEN record_count END ) IN @ls_in_2019_range-select_options
AND SUM( CASE WHEN in_year eq @lv_lyear THEN record_count END ) IN @ls_in_2018_range-select_options
AND SUM( CASE WHEN in_year eq @LV_2YEARSAGO THEN record_count END ) IN @ls_in_2017_range-select_options
ORDER BY (lv_order_by)
INTO CORRESPONDING FIELDS OF TABLE @et_entityset.
Если вы попытаетесь запустить это сообщение об ошибке, «синтаксический анализатор сгенерировал ошибку: выражение, которое содержит IN_YEAR, не является выражением GROUP-BY».
Если вы замените «ORDER BY (lv_order_by)» на «ORDER BYRRC2019 DESCENDING, RRC2018 DESCENDING "это работает.