abap - 在 AT SELECTION-SCREEN 中设置依赖列表框的值
问题描述
我使用 ABAP 屏幕列表框创建了一个包含一些选择的报告。
REPORT z_prueba.
TYPE-POOLS: vrm.
DATA : name TYPE vrm_id,
list TYPE vrm_values,
value LIKE LINE OF list,
aux(85) TYPE c.
DATA: i_grupo TYPE STANDARD TABLE OF ztart_mto_1,
i_material TYPE STANDARD TABLE OF ztart_mto_2,
i_aux TYPE STANDARD TABLE OF ztart_mto_2,
wa_grupo TYPE ztart_mto_1,
wa_material TYPE ztart_mto_2,
wa_aux TYPE ztart_mto_2.
SELECTION-SCREEN BEGIN OF BLOCK cab WITH FRAME TITLE tcab.
PARAMETERS:
grupo TYPE ztart_mto_1-grupo AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND gr.
SELECTION-SCREEN END OF BLOCK cab.
SELECTION-SCREEN BEGIN OF BLOCK art WITH FRAME TITLE tart.
PARAMETERS:
articulo TYPE ztart_mto_2-refn AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND art.
SELECTION-SCREEN END OF BLOCK art.
INITIALIZATION.
tcab = 'Grupo de artículos'.
tart = 'Artículo del grupo'.
SELECT * INTO TABLE i_grupo FROM ztart_mto_1.
CLEAR list.
REFRESH list.
LOOP AT i_grupo INTO wa_grupo.
CLEAR value.
CLEAR aux.
CONCATENATE wa_grupo-grupo ` - ` wa_grupo-denom INTO aux.
value-key = wa_grupo-grupo.
value-text = aux.
APPEND value TO list.
ENDLOOP.
name = 'grupo'.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = name
values = list.
CLEAR name.
CLEAR list.
CLEAR i_grupo.
CLEAR wa_grupo.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR grupo.
IF grupo = ''.
"HERE I NEED TO PUT THE VALUE OF articulo IN BLANK
ELSE.
SELECT * FROM ztart_mto_2 WHERE grupo = @grupo INTO TABLE @i_material.
LOOP AT i_material INTO wa_material.
CLEAR value.
CLEAR aux.
CONCATENATE wa_material-refn ` - ` wa_material-descr INTO aux.
value-key = wa_material-refn.
value-text = aux.
APPEND value TO list.
ENDLOOP.
name = 'articulo'.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = name
values = list.
articulo = ''.
CLEAR grupo.
CLEAR aux.
CLEAR name.
CLEAR list.
CLEAR i_material.
CLEAR wa_material.
REFRESH i_material.
ENDIF.
articulo
当值为grupo
空白时,我需要更改值。
当我设置了一个值grupo
然后articulo
设置grupo
为空白时articulo
不会改变
解决方案
您对事件“处理值请求”的行为有误(POV,在选择屏幕的情况下,它对应于事件块AT SELECTION-SCREEN ON VALUE-REQUEST FOR ...
,在 dynpros 中它是事件块PROCESS ON VALUE-REQUEST
),这在与下拉列表一起使用时非常具体列表框字段。
在这种情况下,并且仅在这种情况下,在“输出前处理”(PBO,在屏幕显示之前)期间调用 POV,而不是在按下下拉按钮时调用,因为其他类型的字段通常是这种情况.
这意味着您的代码在第一次显示屏幕时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.
推荐阅读
- docker-networking - Docker 容器连接被拒绝
- google-apps-script - 如何将新条目与数据库中的现有数据结合起来?
- docker-compose - Yocto 共享 docker-compose NFS 服务时不允许操作
- r - 如何计算R中的空白和NA
- r - R data.table 按行条件从 .csv 或文本文件中读取特定单元格
- google-admin-sdk - 为 Google Directory API (Python) 添加多个用户 JSON
- java - 在 Spring Boot 中使用 Getter 获取值加入 2 表
- css - 为字体大小以外的元素计算 REM
- git - 仅 Git 名称和模式
- c - 插入排序的二分查找