1
votes

Définir la valeur de la listbox dépendante dans AT SELECTION-SCREEN

J'ai créé un rapport avec certaines sélections en utilisant la zone de liste d'écran 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.

Je dois changer la valeur de articulo lorsque la valeur de grupo est vide.

Lorsque j'ai défini une valeur pour grupo et articulo , puis que j'ai défini grupo sur articulo vide ne change pas

entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

Si vous ne voulez vider le 'articulo' qu'après que le 'grupo' a été vidé, alors vous pouvez implémenter un bloc if dans le bloc d'événement AT SELECTION-SCREEN OUTPUT .

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

Lisez ceci Entrée du wiki SAP pour plus d'informations sur le traitement des événements de l'écran de sélection de rapport .


1 commentaires

Bon! mais maintenant, quand articulo est réglé avec une valeur et que je change de groupe, je veux effacer le contenu de la listbox articulo et charger à nouveau en fonction de la valeur du groupe



2
votes

Vous vous trompez sur le comportement de l'événement "Process On Value-Request" (POV, dans le cas d'un écran de sélection il correspond au bloc événement AT SELECTION-SCREEN ON VALUE-REQUEST FOR .. . , dans dynpros, c'est le bloc d'événements PROCESS ON VALUE-REQUEST ), qui est très spécifique lorsqu'il est utilisé avec des champs de liste déroulante.

Dans ce cas, et seulement dans ce cas, le POV est appelé pendant le "Process Before Output" (PBO, avant l'affichage de l'écran), et non lorsque le bouton déroulant est enfoncé comme c'est généralement le cas avec d'autres types de champs.

Cela signifie que votre code initialise les valeurs possibles du champ Articulo deux fois lorsque l'écran est affiché pour la première fois.

Il existe plusieurs solutions pour proposer un liste des valeurs possibles dans la list box, l'une d'entre elles est de les définir lors du PBO en appelant le module fonction VRM_SET_VALUES . Pas besoin de POV. Voici une solution qui fonctionne (peut fonctionner dans n'importe quel système basé sur 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.


0 commentaires

0
votes

Plusieurs convictions concernant votre code:

  1. De nombreuses variables sont redondantes, comme value , aux etc., toutes les concaténations peuvent être effectuées à la volée. La déclaration des types VRM est également redondante. Inutile de définir les noms de listbox dans une variable distincte car cela détériore la lisibilité du code.
  2. Sandra a tout à fait raison de dire que l'événement POV ici ne fonctionnera pas, vous avez besoin d'un simple À LA SORTIE DE L'ÉCRAN DE SÉLECTION
  3. Toutes les sélections DB peuvent être effacées dans l'événement INITIALIZATION et ne peuvent être effectuées qu'une seule fois, pour ne pas abuser des performances. Donc, vous effectuez toutes les opérations sur les tables internes, vous n'avez pas à effacer le master itab chaque OUTPUT, mais utilisez i_aux var pour remplir la listbox.

Voici la version simplifiée de votre code avec la simulation des types ztart_mtoXX comme locaux

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.

Bien que la solution de Sandra soit plus élégante, c'est juste comme une option plus similaire à votre logique.


0 commentaires