0
votes

Les enregistrements mis à jour ne sont pas affichés dans Subscreen ALV

J'essaie d'afficher des enregistrements mis à jour dans ALV, mais d'anciens enregistrements sont en cours d'affichage.

Voici le code écrit à l'écran de la commande de travail. P>

  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container    = lo_cust_container
        IMPORTING
          r_salv_table   = lo_alv_table
        CHANGING
          t_table        = gt_wflog ).

**// Functions
      DATA(lo_alv_functions) = lo_alv_table->get_functions( ).
      lo_alv_functions->set_all( abap_true ).

**// Display Settings
      DATA(lo_alv_display) = lo_alv_table->get_display_settings( ).
      lo_alv_display->set_striped_pattern( abap_true ).

**// Layout Settings
      DATA: ls_layout_key TYPE salv_s_layout_key.
      DATA(lo_alv_layout) = lo_alv_table->get_layout( ).
      ls_layout_key-report = sy-repid.
      lo_alv_layout->set_key( ls_layout_key ).
      lo_alv_layout->set_save_restriction( cl_salv_layout=>restrict_user_independant ).

      lo_alv_columns->set_optimize( abap_true ).
      lo_alv_table->set_data( CHANGING t_table = gt_wflog[] ).
      lo_alv_table->display( ).

    CATCH cx_salv_msg cx_salv_error INTO DATA(lx_salv_msg).
      MESSAGE lx_salv_msg->get_text( ) TYPE 'I'.
  ENDTRY.


0 commentaires

3 Réponses :


0
votes

C'est un problème bien connu avec les contrôles. Si vous instaniez tout contrôle de l'interface graphique (dans votre cas, c'est la grille ALV) à l'intérieur d'un conteneur dans lequel il y avait déjà un contrôle qui n'a pas été libéré (dans votre cas, la grille ALV d'abord instanciée à l'aide de cl_salv_table => usine ), puis l'ancien contrôle apparaît toujours, le nouveau n'est pas affiché.

Deux solutions:

  • Soit vous continuez à instantirez le contrôle, mais vous devez alors libérer le contrôle précédent. Pour cela, vous devez appeler Control-> Gratuit (Free (Free (Free (Free (Free (Free> suivi de l'instruction Contrôle libre . Cette méthode est disponible pour tous les commandes (même le conteneur lui-même peut être libéré, toutes ses commandes internes sont ensuite libérées).

  • ou vous modifiez la logique en instanciant uniquement sur le contrôle une seule fois et vous rafraîchissez son contenu.

    cas spéciale: Certaines commandes peuvent être enveloppées par des classes d'emballage qui ne donnent pas accès à la commande (classes Salv par exemple), de sorte que le moyen facile est de libérer le conteneur auquel la commande est attachée.


0 commentaires

2
votes

Plus que probablement, vous avez CX_SALV_NO_NEW_DATA_LAVED CODE> Exception par Essayez la clause CODE> Pendant le deuxième appel de votre instanciation. C'est pourquoi Affichage () Code> La méthode n'est pas exécutée.

Il y a une note dans Set_Data ​​Strong> Documentation méthode: P>

Vous ne pouvez pas appeler ces méthodes dans un gestionnaire d'événements. Si vous
Avez-vous une erreur. P> blockQuote>

... p> blockQuote>

Exceptions
CX_SALV_NO_NEW_DATA_ALLOWED
Vous avez appelé Set_Data dans un gestionnaire d'événements. P> blockQquote>

Dans votre sortie d'écran de contexte est identique au gestionnaire d'événements tel qu'il est appelé par le même événement. p>

solution est confirmé par OP: "Cela fonctionne parfaitement" Strong> p>

ajouté aux déclarations dans le haut comprend. p> xxx pré>

ajouté dans le code p> xxx pré>

Ajouté après l'appel de méthode SET_DATA P>

go_alv_table->refresh( refresh_mode = if_salv_c_refresh=>soft ).


0 commentaires

0
votes

Juste un ajout à la réponse de @ Suncatcher. Premièrement, vérifie si une variable de référence contient une référence valide: "Si go_alv_grid est liée".

Exemple: P>

Sélectionnez * à partir de zemployés contourner la mémoire tampon dans la table IT_Zemployés. P>

IF go_alv_grid IS BOUND. 
  go_alv_grid->refresh( ).

ELSE.
  cl_salv_table=>factory(
EXPORTING
  r_container    = NEW cl_gui_custom_container( 'CONTAINER_NAME' ) 
  container_name = 'CONTAINER_NAME'
IMPORTING
  r_salv_table   = go_alv_grid
CHANGING
  t_table        = it_zemployees
  ).

  "Style the table
  go_alv_grid->get_functions( )->set_all( ).
  go_alv_grid->get_columns( )->set_optimize( ).
  go_alv_grid->get_display_settings( )->set_striped_pattern( abap_true ).


  go_alv_grid->display( ).
ENDIF.


0 commentaires