Найти в Дзене
floridaString

Тройничок: ABAP-Компилятор и ABAP-Runtime и сортированная таблица

В большинстве случае ABAP-компилятор и ABAP-Runtime показывают один и тот же результат: рекомендации или ошибки. Однако не в 100% случаев. Сниппет ниже демонстрирует один из таких вариантов. (полный код). При активации (компиляции) программа не выдаст ошибки, однако в runtime (при запуске) система остановится и будет runtime error: MOVE_TO_LIT_NOTALLOWED_NODATA. Причина: changing параметр предполагает изменение переменной. А в качестве строки в сниппете указана сортированная таблица. В ней нельзя менять порядок строк; и RUNTIME плохо себя чувствует, когда строка передаётся на changing. При этом компилятор, как можно убедиться – не сообщит об ошибке. Кроме того, реального изменения ключа нет (но теоретически могло быть 😊 ). А вот код ниже (где мы changing поменяли на ссылку и также внесли изменения) уже будет выполнен без проблем 😊. Думаете это фича или баг?) Единственный способ вычислять подобные ситуации являются юнит и DD-тесты (data driven). О них мы также будет активно писать. А

В большинстве случае ABAP-компилятор и ABAP-Runtime показывают один и тот же результат: рекомендации или ошибки.

Однако не в 100% случаев. Сниппет ниже демонстрирует один из таких вариантов. (полный код).

Сниппет1: Компилятор ошибки не выдаст, Runtime остановится в ошибке.
Сниппет1: Компилятор ошибки не выдаст, Runtime остановится в ошибке.

При активации (компиляции) программа не выдаст ошибки, однако в runtime (при запуске) система остановится и будет runtime error: MOVE_TO_LIT_NOTALLOWED_NODATA.

Runtime Error при прогоне сниппета1
Runtime Error при прогоне сниппета1

Причина: changing параметр предполагает изменение переменной. А в качестве строки в сниппете указана сортированная таблица. В ней нельзя менять порядок строк; и RUNTIME плохо себя чувствует, когда строка передаётся на changing. При этом компилятор, как можно убедиться – не сообщит об ошибке. Кроме того, реального изменения ключа нет (но теоретически могло быть 😊 ).

А вот код ниже (где мы changing поменяли на ссылку и также внесли изменения) уже будет выполнен без проблем 😊.

Сниппет2. Передача по ссылки вместо changing с последующим изменением.
Сниппет2. Передача по ссылки вместо changing с последующим изменением.

Думаете это фича или баг?)

Единственный способ вычислять подобные ситуации являются юнит и DD-тесты (data driven). О них мы также будет активно писать. А возможно есть еще способы?)

QuarzBox / Кварцевая шкаТУЛка - содержимое
rustabapclub18 октября 2024

Вот такой ответ был обнаружен на sap.blogs

Here, two things come together:
For table expressions, that are internally represented as field symbols, the same restrictions hold as for field symbols specified after READ ASSIGNING: You cannot modify the primary key of sorted and hashed tables (see READ TABLE - result ).
Unfortunately, a partial check for modification operations, that guarantees that no key fields are changes is only done in table operations but not if a table line is accessed as a whole. In the latter case any write access is prohibited. As for field symbols, this is only checked at runtime in the moment.
Horst [Product and Topic Expert / horst_keller / SAP]

Исходный вопрос:

Исходный вопрос в дискуссии
Исходный вопрос в дискуссии

Финальный ответ
Финальный ответ

По результатам дискуссии в ABAPclub решили опубликовать blog на сайте официального sap-сообщества и так сказать дать возможность "всему миру" прояснить/прокомментировать вопрос. Ссылка на опубликованный sap-блог.

пока не получен обратный ответ, будем считать, что передача через type ref to - верное решения для наполнения сортированных таблиц при обработке в циклах.