2016-01-17 1 views
0

START-OF-SELECTION ne se déclenche pas dans mon programme. J'essaie d'extraire les détails du livre en fonction du nom du livre et de l'auteur du livre en utilisant plusieurs écrans de sélection dans ABAP. Il y a deux boutons-poussoirs et en fonction de ces écrans de sélection sont ouverts. Lorsque je clique sur l'un des boutons, les écrans de sélection sont ouverts. Mais après avoir sélectionné les entrées dans la liste déroulante et cliqué sur le bouton Exécuter, la transaction passe à l'écran initial avec les boutons. Les détails du livre ne sont pas affichés du tout. START-OF-SELECTION n'est pas déclenché. S'il vous plaît aider, je suis un débutant dans ABAP. Voici mon programmeProblèmes avec plusieurs écrans de sélection

REPORT y_multiple_screen. 

    TABLES: sscrfields. 
    TYPE-POOLS: vrm. 
    DATA: param TYPE vrm_id, 
      values TYPE vrm_values, 
      wa_value LIKE LINE OF values. 



    DATA: it_ybook TYPE TABLE OF ybook, 
      wa_ybook TYPE ybook. 


    FIELD-SYMBOLS: <fs_book> TYPE ybook. 


    SELECTION-SCREEN BEGIN OF BLOCK blocker WITH FRAME TITLE text-001 NO INTERVALS. 
    SELECTION-SCREEN SKIP. 
    SELECTION-SCREEN BEGIN OF LINE. 
    SELECTION-SCREEN PUSHBUTTON (30) w_butn1 USER-COMMAND but1. 
    SELECTION-SCREEN END OF LINE. 
    SELECTION-SCREEN SKIP. 
    SELECTION-SCREEN BEGIN OF LINE. 
    SELECTION-SCREEN PUSHBUTTON (30) w_butn2 USER-COMMAND but2. 
    SELECTION-SCREEN END OF LINE. 
    SELECTION-SCREEN SKIP. 

    SELECTION-SCREEN END OF BLOCK blocker. 

    SELECTION-SCREEN BEGIN OF SCREEN 1100. 
    PARAMETERS: p_author TYPE char255 AS LISTBOX VISIBLE LENGTH 20. 


    SELECTION-SCREEN END OF SCREEN 1100. 

    SELECTION-SCREEN BEGIN OF SCREEN 1200. 

    PARAMETERS: p_bname TYPE char255 AS LISTBOX VISIBLE LENGTH 20. 


    SELECTION-SCREEN END OF SCREEN 1200. 

    INITIALIZATION. 

     w_butn1 = 'Search by author name'. 
     w_butn2 = 'Search by book name'. 

     "At selection-screen output. 

    AT SELECTION-SCREEN. 
     IF sscrfields-ucomm EQ 'BUT1'. 

     CALL SELECTION-SCREEN 1100. 


     ELSEIF sscrfields-ucomm EQ 'BUT2'. 

     CALL SELECTION-SCREEN 1200. 
     ENDIF. 

    AT SELECTION-SCREEN OUTPUT. 

     CLEAR it_ybook. 
     SELECT * 
     FROM ybook 
     INTO TABLE it_ybook. 
     CLEAR values. 
     CLEAR wa_ybook. 
     CLEAR wa_value. 
     LOOP AT it_ybook INTO wa_ybook. 


     wa_value-key = wa_ybook-book_author. 
     wa_value-text = wa_ybook-book_author. 

     APPEND wa_value TO values. 
     CLEAR wa_ybook. 
     CLEAR wa_value. 
     ENDLOOP. 



     CLEAR it_ybook. 



     CALL FUNCTION 'VRM_SET_VALUES' 
     EXPORTING 
      id    = 'P_AUTHOR' 
      values   = values 
     EXCEPTIONS 
      id_illegal_name = 1 
      OTHERS   = 2. 


     CLEAR it_ybook. 
     SELECT * 
     FROM ybook 
     INTO TABLE it_ybook. 

     "CLEAR values. 
     CLEAR wa_ybook. 
     CLEAR wa_value. 

     LOOP AT it_ybook INTO wa_ybook. 


     wa_value-key = wa_ybook-book_name. 
     wa_value-text = wa_ybook-book_name. 

     APPEND wa_value TO values. 
     CLEAR wa_ybook. 
     CLEAR wa_value. 
     ENDLOOP. 



     CLEAR it_ybook. 



     CALL FUNCTION 'VRM_SET_VALUES' 
     EXPORTING 
      id    = 'P_BNAME' 
      values   = values 
     EXCEPTIONS 
      id_illegal_name = 1 
      OTHERS   = 2. 


    START-OF-SELECTION. 
     WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'. 

     CLEAR it_ybook. 
     CLEAR wa_ybook. 
     SELECT * 
     FROM ybook 
     INTO TABLE it_ybook 
     WHERE book_name = p_bname. 
     LOOP AT it_ybook INTO wa_ybook. 
      WRITE:/10 wa_ybook-book_id,40 wa_ybook-book_name,70 wa_ybook-book_author,100 wa_ybook-book_price. 
      CLEAR wa_ybook. 
     ENDLOOP. 


     WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'. 

     CLEAR it_ybook. 
     CLEAR wa_ybook. 
     SELECT * 
     FROM ybook 
     INTO TABLE it_ybook 
     WHERE book_author = p_author. 
     LOOP AT it_ybook INTO wa_ybook. 
      WRITE:/10 wa_ybook-book_id,40 wa_ybook-book_name,70 wa_ybook-book_author,100 wa_ybook-book_price. 
      CLEAR wa_ybook. 
     ENDLOOP. 
+0

Je veux faire ce programme en utilisant uniquement des écrans de sélection. Je pense que ce scénario peut être résolu en utilisant d'autres techniques. Mais s'il vous plaît aidez-moi à faire ce programme en utilisant des écrans de sélection. – user3621835

+0

Que se passe-t-il lorsque vous appuyez sur démarrer après le retour au premier écran de sélection? – knut

Répondre

2

START-OF-SELECTION ne fera que déclencher votre écran principal (lorsque vous appuyez sur exécuter sur le premier écran).

Vous pouvez forcer l'événement en changeant le bloc AT SELECTION-SCREEN:

AT SELECTION-SCREEN. 
    IF sscrfields-ucomm EQ 'BUT1'. 

    CALL SELECTION-SCREEN 1100. 
    if sy-subrc = 0. "the user clicked the execute button 
     sscrfields-ucomm = 'ONLI'. "set the system command for the next screen to execute 
    endif. 

    ELSEIF sscrfields-ucomm EQ 'BUT2'. 

    CALL SELECTION-SCREEN 1200. 
    if sy-subrc = 0. "the user clicked the execute button 
     sscrfields-ucomm = 'ONLI'. "set the system command for the next screen to execute 
    endif. 

    ENDIF. 
+0

Qu'est-ce que 'ONLI'? – user3621835

+0

Pouvez-vous me donner une brève idée sur les événements de sélection d'écran? Très confus quoi écrire sur quels événements – user3621835

+0

ONLI dans ce cas est la commande utilisateur qui est liée au bouton d'exécution. En forçant la valeur sscrfields-ucomm = 'ONLI', au prochain PBO de l'écran de sélection, il s'exécutera automatiquement et ne s'arrêtera pas sur le premier écran de sélection comme auparavant. Essayez ce lien pour une explication des événements (il est également bien documenté dans l'Aide SAP) http://wiki.scn.sap.com/wiki/display/ABAP/Selection+Screen+Events+in+ABAP I n'ont jamais utilisé les écrans de sélection de cette manière; Je ne peux pas vraiment penser à une situation réelle où ce serait une bonne solution. Je suppose que vous êtes en train d'expérimenter. – Esti

0

Vous pouvez y parvenir sans START-OF-SELECTION bloc du tout.
Tout d'abord, ajouter des commandes utilisateur à vos paramètres:

PARAMETERS: p_author TYPE char255 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND auth. 
PARAMETERS: p_bname TYPE char255 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND name. 

déplacer ensuite votre code de menu déroulant à INITIALIZATION bloc:

INITIALIZATION. 

    w_butn1 = 'Search by author name'. 
    w_butn2 = 'Search by book name'. 

    CLEAR it_ybook. 
    SELECT * 
    FROM ybook 
    ... 
    ... 
    CALL FUNCTION 'VRM_SET_VALUES' 
    EXPORTING 
     id    = 'P_BNAME' 
     values   = values 
    EXCEPTIONS 
     id_illegal_name = 1 
     OTHERS   = 2. 

événement AT-SELECTION-SCREEN corrigez comme ceci:

AT SELECTION-SCREEN. 
CASE sscrfields-ucomm. 
    WHEN 'BUT1'. 
     CALL SELECTION-SCREEN 1100. 
    WHEN 'BUT2'. 
     CALL SELECTION-SCREEN 1200. 
    WHEN 'AUTH'. 
     LEAVE TO LIST-PROCESSING. 
     SET PF-STATUS space. 
     SUPPRESS DIALOG. 
    WHEN 'NAME'. 
     LEAVE TO LIST-PROCESSING. 
     SET PF-STATUS space. 
     SUPPRESS DIALOG. 
    WHEN OTHERS. 
    ENDCASE. 

et lieu votre codage de sortie ici aussi. Vos listes seront sorties directement à la sélection de la valeur dans la liste déroulante. Rappelez-vous que les paramètres de l'écran de sélection sont convertis en majuscules par défaut, par conséquent vos sélections de sortie ne renverront aucune ligne dans le formulaire ci-dessus. Donc, pour une bonne utilisation, vous devez les convertir en minuscules comme ceci:

TRANSLATE p_author TO LOWER CASE. 

MISE À JOUR:
LEAVE-TO-LIST-PROCESSINGstatement interrompt le traitement de séquence Dynpro en cours (mais termine le Dynpro courant!) Et les commutateurs aux listes qui ont été mises en mémoire tampon sur AS jusqu'à ce moment. Vous devriez en apprendre plus sur list processing ici. Cette technique est considérée comme obsolète, mais, comme vous l'avez choisi, vous devez absolument le savoir :) SET PF-STATUS space définit l'état de la boîte de dialogue par défaut pour les listes. Vous pouvez en apprendre davantage sur les statuts des dialogues à partir du documentation.
En ce qui concerne votre code, vous pouvez fusionner 2 instructions en une seule. Une autre suggestion consiste à éliminer les sélections DB lors de la sortie: vous n'effectuez aucune modification de données ici, donc les données ne changeront pas après le bloc INITIALIZATION. Et enfin, vous pouvez intensifier l'utilisation des symboles de champ car ils consomment moins de ressources comparant aux zones de travail. Donc, votre code devrait ressembler à:

INITIALISATION.

TYPE-POOLS: vrm. 
DATA: it_ybook TYPE TABLE OF ybook. 
DATA: param TYPE vrm_id, 
     values_auth TYPE vrm_values, 
     values_name TYPE vrm_values, 
     wa_value_auth TYPE LINE OF vrm_values, 
     wa_value_name TYPE LINE OF vrm_values. 

FIELD-SYMBOLS: <fs_ybook> TYPE ybook. 

    w_butn1 = 'Search by author name'. 
    w_butn2 = 'Search by book name'. 

    CLEAR: it_ybook, wa_value_auth, wa_value_name. 

    SELECT * 
    FROM ybook 
    INTO TABLE it_ybook. 

    LOOP AT it_ybook ASSIGNING <fs_ybook>. 

    wa_value_auth-key = <fs_ybook>-book_author. 
    wa_value_auth-text = <fs_ybook>-book_author. 

    wa_value_name-key = <fs_ybook>-book_name. 
    wa_value_name-text = <fs_ybook>-book_name. 

    APPEND wa_value_auth TO values_auth. 
    APPEND wa_value_name TO values_name. 

    ENDLOOP. 

    CALL FUNCTION 'VRM_SET_VALUES' "for authors 

    CALL FUNCTION 'VRM_SET_VALUES' "for names 

AT SELECTION-SCREEN.

CASE sscrfields-ucomm. 
    ... 
    ENDCASE. 

    TRANSLATE P_BNAME TO LOWER CASE. 
    LOOP AT it_ybook ASSIGNING <fs_ybook> WHERE book_name = P_BNAME. 
     WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'. 
     WRITE:/10 <fs_ybook>-book_id,40 <fs_ybook>-book_name,70 <fs_ybook>-book_author,100 <fs_ybook>-book_price. 
    ENDLOOP. 

    TRANSLATE P_AUTHOR TO LOWER CASE. 
    LOOP AT it_ybook ASSIGNING <fs_ybook> WHERE book_author = P_AUTHOR. 
     WRITE:/10 'Book ID',40 'Book Name',70 'Book Author',100 'Book Price'. 
     WRITE:/10 <fs_ybook>-book_id,40 <fs_ybook>-book_name,70 <fs_ybook>-book_author,100 <fs_ybook>-book_price. 
    ENDLOOP. 
+0

Pourquoi à la sortie de l'écran de sélection n'est pas nécessaire?. Puis-je écrire le même code dans l'initialisation que j'ai écrit dans la sortie de l'écran de sélection? – user3621835

+0

Pouvez-vous me donner l'ordre dans lequel les initialisations, à l'écran de sélection, à la sortie de l'écran de sélection sont appelées? – user3621835

+0

En fait, je suis un débutant dans ABAP.Je suis peu confus au sujet de ces événements.Quelles choses dois-je écrire dans ces événements? – user3621835