1
votes

Problème d'activation / désactivation d'un bouton en plein écran SALV

Cher tout, j'ai désespérément besoin de votre aide sur ce qui suit.

J'ai créé un ALV à partir de SALV et j'ai copié un état GUI SALV_STANDARD à partir d'un programme standard. Tout d'abord, j'ai ajouté 2 boutons POSTNEW & POSTDIFF et après une journée j'ai ajouté le bouton SELECT .

En fonction de la sélection de l'utilisateur, je souhaite activer ou désactiver les boutons en fonction des besoins de l'entreprise.

J'ai ce code dans une procédure:

  r_alv type reference CL_SALV_TABLE.
  if status_name is not initial and report_name is not initial.
    set pf-status status_name.
    r_alv->set_screen_status(
      pfstatus      =  status_name
      report        =  report_name
      set_functions = r_alv->c_functions_all ).
  endif.

  data: lit_functions_list type salv_t_ui_func,
        lwa_functions_list like line of lit_functions_list.

  r_functions = r_alv->get_functions( ).  "Get Toolbar functions
  lit_functions_list = r_functions->get_functions( ).

  if i_button_name is not initial.
** Now hide the BUTTON
    loop at lit_functions_list into lwa_functions_list.
      if lwa_functions_list-r_function->get_name( ) = i_button_name.
        lwa_functions_list-r_function->set_visible( i_button_visable ).
      endif.
    endloop.
  endif.

Les variables status_name , report_name , i_button_name et i_button_visable sont des paramètres de la procédure et je pense que leurs noms montrent ce qu'ils transportent.

La table interne lit_functions_list a 60 enregistrements et les 2 derniers ont des données pour les 2 premiers boutons et c'est la raison pour laquelle je peux les activer / désactiver.
Mais il n'y a pas d'enregistrement avec mon troisième bouton SELECT . Au lieu de cela, il y a un enregistrement avec le bouton MYFUNCTION que j'ai déjà supprimé.

Quelqu'un peut-il me dire quoi faire pour que le troisième bouton soit disponible dans la lit_functions_list ?

Quelqu'un peut-il me dire pourquoi cet itab a tant de poubelles?

Merci d'avance
Elias


2 commentaires

Avez-vous activé l'interface CUA (contenant tous les statuts et titres de l'interface graphique) après l'avoir modifiée?


Ce que vous appelez " garbage " est la liste de tous les codes de fonction standard possibles. Notez que vous n'avez généralement pas besoin de boucler sur cette liste pour désactiver un code de fonction (éventuellement un bouton), car vous connaissez son "nom" (en fait son "code de fonction"), il est plus facile de le désactiver avec r_alv-> get_functions () -> set_function (name = 'ZZZ' boolean = abap_false). (où ZZZ est le code de la fonction)


3 Réponses :


0
votes

Pour ajouter un troisième bouton dans la lit_functions_list, vous pouvez utiliser le code ci-dessous.

try.
  r_functions->add_function(
    name     = 'BUT3'
    icon     = l_icon
    text     = l_text
    tooltip  = l_text
    position = if_salv_c_function_position=>right_of_salv_functions ).
  catch cx_salv_existing cx_salv_wrong_call.
endtry.

vous pouvez également utiliser add_function pour ajouter un nouveau bouton.

  r_functions->set_function( NAME = 'BUT3' BOOLEAN = 'X' ).  

itab n'a pas de déchets. Il contient toutes les données relatives à l'état comme la barre de menu, la barre d'outils d'application et les touches de fonction.


5 commentaires

Umar, j'ai créé le bouton (fonction) 'SELECT' dans l'état de l'interface graphique. J'ai ajouté votre code mais cela ne fonctionne pas et j'ai l'erreur suivante dans le code: abap enable_function (name = name boolean = if_salv_c_bool_sap => true). texte = texte-001. l_name = nom. lever le type d'exception CX_SALV_METHOD_NOT_SUPPORTED exporting class = 'CL_SALV_FUNCTIONS' method = 'ENABLE_FUNCTION' object = l_name key = text. TEXT-001 = Possible uniquement dans la vue Grille NAME = SELECT.


ERREUR: Classe CL_SALV_FUNCTIONS, méthode ENABLE_FUNCTION non prise en charge pour SELECT uniquement Possible en vue Grille


Mon code n'est qu'un exemple. Vous devez déclarer les variables et les appels de méthode en conséquence.


Pour plus de détails, vous pouvez le voir dans le programme SALV_DEMO_TABLE_FUNCTIONS.


La méthode ADD_FUNCTION ne peut pas être utilisée sur un ALV plein écran, car les boutons sont définis statiquement dans un état GUI (celui indiqué via la méthode SET_SCREEN_STATUS . Seule la méthode SET_FUNCTION permet d'activer ou de désactiver un code de fonction (un bouton dans le cadre de cette question).



0
votes

Enfin, j'ai trouvé la réponse au moins à mon problème. Permettez-moi de décrire à nouveau ce que j'ai fait:
Je copie le Statut GUI du programme standard SALV_DEMO_TABLE_FUNCTIONS dans mon programme via le Tcode SE41. J'ai ajouté 2 boutons POSTNEW et POSTDIF . Jusqu'à présent, tout fonctionne parfaitement et je peux activer / désactiver ces 2 boutons.
Le jour suivant, l'entreprise m'a demandé d'ajouter un bouton SELECT avec lequel l'utilisateur peut rendre modifiable la colonne SELECT correspondante de l'itab afin de choisir l'enregistrement à publier. Et ici a commencé mon problème où l'itab avec les fonctions ne contenait pas le dernier bouton créé SELECT. Ce que j'ai fait, c'est que j'ai créé un bouton lors du processus de conception de l'état de l'interface graphique, mais je n'ai pas pu l'obtenir via le code ci-dessous:

lit_functions_list = r_functions->get_functions( ).

Avec vos réponses, j'ai trouvé d'autres problèmes dans mon code mais je n'ai toujours pas pu obtenir le nouveau bouton dans l'onglet ci-dessus.
Enfin, hier soir, je me suis souvenu de ce que quelqu'un m'avait dit dans le passé. Dans les anciens systèmes (comme le nôtreSAP ECC 6.0 R701 SP007), le tampon ALV est parfois bloqué et nous devons le réinitialiser. Je lance donc le programme BALVBUFDEL et vuala le bouton SELECT est apparu dans l'itab et je peux maintenant activer ou désactiver.
Gardez donc à l'esprit que parfois le tampon ALV doit être réinitialisé.
Merci à tous pour votre aide.
Elias


0 commentaires

2
votes

Même moi, j'ai eu le même problème. Après avoir exécuté le rapport BALVBUFDEL, le problème a été résolu.
Les boutons nouvellement créés viennent maintenant dans la liste des fonctions ..

lit_functions_list = r_functions->get_functions( ).


0 commentaires