Установите значение зависимого списка в AT SELECTION-SCREEN - PullRequest
1 голос
/ 05 марта 2020

Я создал отчет с некоторыми вариантами выбора, используя окно списка 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 не меняется

enter image description here

Ответы [ 3 ]

2 голосов
/ 05 марта 2020

Вы ошибаетесь в поведении события «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.
1 голос
/ 05 марта 2020

Если вы хотите очистить 'articulo' только после опустошения 'grupo', тогда вы можете реализовать блок if в блоке событий AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN OUTPUT.
  IF grupo IS INITIAL.
    CLEAR articulo.
  ENDIF.

Читать это Вики-запись SAP для получения дополнительной информации об обработке события экрана выбора отчета .

0 голосов
/ 11 марта 2020

Несколько убеждений по поводу вашего кода:

  1. Многие переменные являются избыточными, например value, aux и c. Все объединения могут выполняться на лету. Объявление типов VRM также является избыточным. Нет необходимости определять имена списков в отдельной переменной, потому что это ухудшает читабельность кода.
  2. Сандра абсолютно права заявляя, что событие POV здесь не будет работать, вам нужно просто AT SELECTION-SCREEN OUTPUT
  3. Все выборки БД могут быть уничтожены в событии ИНИЦИАЛИЗАЦИИ и может быть сделано только один раз, чтобы не злоупотреблять производительностью. Таким образом, вы выполняете все операции с внутренними таблицами, вам не нужно очищать master itab для каждого OUTPUT, но используйте 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.

Хотя решение Сандры более элегантное, оно просто больше похоже на вашу логику c.

...