Вы ошибаетесь в поведении события «Process On Value-Request» (POV, в случае экрана выбора оно соответствует блоку событий AT SELECTION-SCREEN ON VALUE-REQUEST FOR ...
, в dynpros это блок событий PROCESS ON VALUE-REQUEST
) , который очень специфичен c при использовании с полями выпадающего списка.
В этом случае, и только в этом случае, POV вызывается во время «Обработки перед выводом» (PBO, перед отображением экрана). ), а не при нажатии кнопки выпадающего меню, как это обычно происходит с другими типами полей.
Это означает, что ваш код инициализирует возможные значения поля Articulo
дважды когда экран отображается впервые.
Существует несколько решений, чтобы предложить список возможных значений в списке, одно из них - определить их во время PBO, вызвав функциональный модуль VRM_SET_VALUES
, Нет необходимости в POV. Вот решение, которое работает (может работать в любой системе на основе ABAP):
TABLES sscrfields.
PARAMETERS country TYPE land1 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND country_changed.
PARAMETERS carrid TYPE s_carr_id AS LISTBOX VISIBLE LENGTH 20.
AT SELECTION-SCREEN OUTPUT.
DATA(lt_value) = VALUE vrm_values(
( key = 'FR' text = 'France' )
( key = 'DE' text = 'Allemagne' ) ).
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'COUNTRY'
values = lt_value
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
lt_value = switch #( COUNTRY
when '' then VALUE #( )
when 'FR' then VALUE #(
( key = 'AF' text = 'Air France' )
( key = 'TO' text = 'Transavia' ) )
when 'DE' then value #(
( key = 'EW' text = 'Eurowings' )
( key = 'LH' text = 'Lufthansa' ) ) ).
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'CARRID'
values = lt_value
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
AT SELECTION-SCREEN.
IF sscrfields-ucomm = 'COUNTRY_CHANGED'.
carrid = ''.
ENDIF.