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.
3 Réponses :
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é Deux solutions: P>
Soit vous continuez à instantirez le contrôle, mais vous devez alors libérer le contrôle précédent. Pour cela, vous devez appeler ou vous modifiez la logique en instanciant uniquement sur le contrôle une seule fois et vous rafraîchissez son contenu. P> LI>
ul>
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. P > cl_salv_table => usine code>), puis l'ancien contrôle apparaît toujours, le nouveau n'est pas affiché. P>
Control-> Gratuit (Free (Free (Free (Free (Free (Free> Strong> suivi de l'instruction
Contrôle libre CODE> STROND>. 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). P> LI>
Plus que probablement, vous avez 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 ... p>
blockQuote> Exceptions 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> ajouté dans le code p> Ajouté après l'appel de méthode SET_DATA P> 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.
Avez-vous une erreur. P>
blockQuote>
CX_SALV_NO_NEW_DATA_ALLOWED
Vous avez appelé Set_Data dans un gestionnaire d'événements. P>
blockQquote> go_alv_table->refresh( refresh_mode = if_salv_c_refresh=>soft ).
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.