Abap 在AT选择屏幕中设置从属列表框的值
我使用ABAP屏幕列表框创建了一个带有一些选择的报告Abap 在AT选择屏幕中设置从属列表框的值,abap,dynpro,Abap,Dynpro,我使用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_materia
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.
当grupo的值为空时,我需要更改articulo的值
当我为grupo和articulo设置了一个值,然后将grupo设置为空白时,articulo不会改变
如果您只想在清空“grupo”后清空“articulo”,则可以在at选择屏幕输出事件块中实现If块
AT SELECTION-SCREEN OUTPUT.
IF grupo IS INITIAL.
CLEAR articulo.
ENDIF.
阅读此内容。如果您只想在清空“grupo”后清空“articulo”,则可以在at选择屏幕输出事件块中实现If块
AT SELECTION-SCREEN OUTPUT.
IF grupo IS INITIAL.
CLEAR articulo.
ENDIF.
阅读此文。对于值请求POV上的事件进程的行为,您弄错了,在选择屏幕的情况下,它对应于…的值请求上的选择屏幕上的事件块,在dynpros中,它是值请求上的事件块进程,与下拉列表框字段一起使用时非常具体 在这种情况下,并且仅在这种情况下,在输出PBO之前的过程中,在屏幕显示之前调用POV,而不是在按下下拉按钮时调用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.
对于值请求POV上的事件进程的行为,您弄错了。在选择屏幕的情况下,它对应于…的值请求上的选择屏幕上的事件块,在dynpros中,它是值请求上的事件块进程,这在与下拉列表框字段一起使用时非常具体 在这种情况下,并且仅在这种情况下,在输出PBO之前的过程中,在屏幕显示之前调用POV,而不是在按下下拉按钮时调用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.
关于您的代码的几点信念: 许多变量是冗余的,比如value、aux等,所有的连接都可以动态完成。VRM类型声明也是冗余的。不需要在单独的变量中定义listbox名称,因为这会降低代码的可读性。 Sandra说得绝对正确,这里的POV事件将不起作用,您需要简单的选择屏幕输出 所有的DB选择都可以删除到初始化事件中,并且只能执行一次,不会滥用性能。所以,在内部表上进行所有操作时,不必清除每个输出的主itab,而是使用i_aux var填充列表框。 下面是您的代码的简化版本,它将ztart_mtoXX类型模拟为本地类型
TYPES: BEGIN OF ztart_mto_1,
grupo TYPE char100,
denom TYPE char100,
END OF ztart_mto_1,
BEGIN OF ztart_mto_2,
refn TYPE char100,
descr TYPE char100,
grupo TYPE char100,
END OF ztart_mto_2.
DATA: i_grupo TYPE TABLE OF ztart_mto_1 WITH EMPTY KEY,
i_material TYPE TABLE OF ztart_mto_2 WITH EMPTY KEY,
i_aux TYPE TABLE OF ztart_mto_2 WITH EMPTY KEY,
list TYPE vrm_values.
PARAMETERS: grupo TYPE char100 AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND gr,
articulo TYPE char100 AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND art.
INITIALIZATION.
i_grupo = VALUE #( ( grupo = '' denom = '' ) ( grupo = 'AGROUP' denom = 'AGROUP_DENOM' ) ( grupo = 'BGROUP' denom = 'BGROUP_DENOM' ) ( grupo = 'CGROUP' denom = 'CGROUP_DENOM' ) ).
i_material = VALUE #( ( refn = 'A119' descr = 'A material' grupo = 'AGROUP' ) ( refn = 'B119' descr = 'B material' grupo = 'BGROUP' ) ( refn = 'C119' descr = 'C material' grupo = 'CGROUP' ) ).
LOOP AT i_grupo INTO DATA(wa_grupo).
APPEND VALUE vrm_value( key = wa_grupo-grupo text = wa_grupo-grupo && ` - ` && wa_grupo-denom ) TO list.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'grupo'
values = list.
CLEAR list.
AT SELECTION-SCREEN.
CHECK sy-ucomm = 'GR'.
CLEAR articulo.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'articulo'
values = list.
CLEAR list.
AT SELECTION-SCREEN ON grupo.
CHECK sy-ucomm = 'GR' AND grupo IS NOT INITIAL.
i_aux = VALUE #( FOR ls_mat IN i_material WHERE ( grupo = grupo ) ( ls_mat ) ).
LOOP AT i_aux INTO DATA(wa_material).
APPEND VALUE vrm_value( key = wa_material-refn text = wa_material-refn && ` - ` && wa_material-descr ) TO list.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'articulo'
values = list.
尽管Sandra的解决方案更为优雅,但这只是一个与您的逻辑更为相似的选项。关于您的代码的几个信念: 许多变量是冗余的,比如value、aux等,所有的连接都可以动态完成。VRM类型声明也是冗余的。不需要在单独的变量中定义listbox名称,因为这会降低代码的可读性。 Sandra说得绝对正确,这里的POV事件将不起作用,您需要简单的选择屏幕输出 所有的DB选择都可以删除到初始化事件中,并且只能执行一次,不会滥用性能。所以,在内部表上进行所有操作时,不必清除每个输出的主itab,而是使用i_aux var填充列表框。 下面是您的代码的简化版本,它将ztart_mtoXX类型模拟为本地类型
TYPES: BEGIN OF ztart_mto_1,
grupo TYPE char100,
denom TYPE char100,
END OF ztart_mto_1,
BEGIN OF ztart_mto_2,
refn TYPE char100,
descr TYPE char100,
grupo TYPE char100,
END OF ztart_mto_2.
DATA: i_grupo TYPE TABLE OF ztart_mto_1 WITH EMPTY KEY,
i_material TYPE TABLE OF ztart_mto_2 WITH EMPTY KEY,
i_aux TYPE TABLE OF ztart_mto_2 WITH EMPTY KEY,
list TYPE vrm_values.
PARAMETERS: grupo TYPE char100 AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND gr,
articulo TYPE char100 AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND art.
INITIALIZATION.
i_grupo = VALUE #( ( grupo = '' denom = '' ) ( grupo = 'AGROUP' denom = 'AGROUP_DENOM' ) ( grupo = 'BGROUP' denom = 'BGROUP_DENOM' ) ( grupo = 'CGROUP' denom = 'CGROUP_DENOM' ) ).
i_material = VALUE #( ( refn = 'A119' descr = 'A material' grupo = 'AGROUP' ) ( refn = 'B119' descr = 'B material' grupo = 'BGROUP' ) ( refn = 'C119' descr = 'C material' grupo = 'CGROUP' ) ).
LOOP AT i_grupo INTO DATA(wa_grupo).
APPEND VALUE vrm_value( key = wa_grupo-grupo text = wa_grupo-grupo && ` - ` && wa_grupo-denom ) TO list.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'grupo'
values = list.
CLEAR list.
AT SELECTION-SCREEN.
CHECK sy-ucomm = 'GR'.
CLEAR articulo.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'articulo'
values = list.
CLEAR list.
AT SELECTION-SCREEN ON grupo.
CHECK sy-ucomm = 'GR' AND grupo IS NOT INITIAL.
i_aux = VALUE #( FOR ls_mat IN i_material WHERE ( grupo = grupo ) ( ls_mat ) ).
LOOP AT i_aux INTO DATA(wa_material).
APPEND VALUE vrm_value( key = wa_material-refn text = wa_material-refn && ` - ` && wa_material-descr ) TO list.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'articulo'
values = list.
虽然Sandra的解决方案更为优雅,但这只是一个与您的逻辑更为相似的选项。很好!但是现在,当articulo设置了一个值,并且我更改了grupo时,我想清除articulo列表框的内容,然后根据grupo值再次收费Good!但是现在当articulo设置了一个值,我改变了grupo,我想清除articulo列表框的内容,然后根据grupo值再次收费