IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[Form6i]Affichage de caneva empilé


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut [Form6i]Affichage de caneva empilé
    Bonsoir à tous
    En fonction d'une valeur saisie dans l'item number PNUMSERIEE de mon bloc ENTREQPMT, j'effectue une requête qui me permet de changer la source de données d'interrogation de mon bloc de données ENTREQPMT_CTRL. Les items du bloc ENTREQPMT sont sur le caneva integral CV_APPROFRNS et ceux du bloc ENTREQPMT_CTRL sont sur le caneva empilé CV_CTRL_ENTRE. Pour se faire j'ai mis dans le declencheur when_validate-item de l'item PNUMSERIEE ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    begin
     
    	:entreqpmt.dnumseriee := (:entreqpmt.pnumseriee + :entreqpmt.qteent - 1 );
     
    	--On parcourt l''intervalle de numéro pour savoir si au moins un numero de série existe déjà 
    	while (:entreqpmt.pnumseriee + ln$cpt) <= :entreqpmt.dnumseriee loop
     
    		select count(*) into ln$nbre from entreqpmt where  pnumseriee <= (:entreqpmt.pnumseriee + ln$cpt) 
    		and (:entreqpmt.pnumseriee + ln$cpt) <= dnumseriee ;
     
    		--un numero de série de l''intervalle existe déjà 
    		if ln$nbre > 0 then
     
    				ln$requete := '	select * from entreqpmt where  pnumseriee <= (:entreqpmt.pnumseriee 
    											+ ln$cpt) and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'; 
     
    					set_block_property ('ENTREQPMT_CTRL', QUERY_DATA_SOURCE_NAME, ln$requete);
    					show_view('CV_CTRL_ENTRE');
    			  	raise form_trigger_failure;
     
    		end if;
    		ln$cpt := ln$cpt + 1;
    	end loop;
     
    end;
    Je rentre bien dans la boucle qui permet l'affichage de mon canevas empilé, pourtant il ne s'affiche pas. Que dois je corriger ou n'utilise je pas le bon déclencheur ? Merci d'avance.
    PS:

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Essaie de mettre un synchronize entre show_view et raise form_trigger_failure.

  3. #3
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Merci PlaineR.
    J'ai bien mis le synchronize
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    show_view('CV_CTRL_ENTRE');
    					synchronize;
    			  	raise form_trigger_failure;
    Mais cela n'a pas d'effet apparemment.

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Et si tu fais un go_item sur un des items de ton canvas stacké (à la place du show_view), est-ce qu'il apparaît ?

  5. #5
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Merci à toi PlaineR et à tous les intervenants pour votre soucis de partage et d'assistance. Un go_item sur l'un des items de mon canevas empilé me retourne l'erreur
    frm-40737 Procédure restreinte interdite GO_ITEM dans le déclencheur WHEN-VALIDATE-ITEM
    . Au fait je me demandais s'il était possible d'executer l'instruction SHOW_VIEW dans ce déclencheur.

  6. #6
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par serme
    Un go_item sur l'un des items de mon canevas empilé me retourne l'erreur
    frm-40737 Procédure restreinte interdite GO_ITEM dans le déclencheur WHEN-VALIDATE-ITEM
    J'avais oublié que ton code était dans le déclencheur WVI.

    Oui il est possible de faire un show_view dans un déclencheur WHEN-VALIDATE-ITEM.

    Que se passe-t-il si tu mets uniquement un show_view dans ton déclencheur (le reste du code en commentaire) ?

  7. #7
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Bonjour PlaineR

    Effectivement un show_view simple m'affiche bien mon canevas empilé. Mais il me faut afficher des données sur ce canevas sous une certaine condition. Je saisi un intervalle de numeros de serie et je dois m'assurer qu'aucun d'eux n'existent dans la base de données, si j'en trouve qui existe déjà, je veux afficher mon canevas avec ces enregistrements incriminés. C'est ce que j'éssaie de faire dans mon code. Il trouve bien les enregistrements. Mais leur affichage à travers mon canevas empilé ne marche pas. Toute autre solution est la bienvenue.
    J'espère avoir bien expliqué mon problème. Et merci pour ton aide PlaineR.

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pourquoi un raise ? Tu peux pas faire un EXIT pour sortir du LOOP ?

  9. #9
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Je me demande si ce n'est pas le raise form_trigger_failure qui pose problème.

    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    declare
       canvas_visible boolean;
    begin 
       :entreqpmt.dnumseriee := (:entreqpmt.pnumseriee + :entreqpmt.qteent - 1 ); 
       canvas_visible := false;
       --On parcourt l''intervalle de numéro pour savoir si au moins un numero de série existe déjà 
       while (:entreqpmt.pnumseriee + ln$cpt) <= :entreqpmt.dnumseriee and not canvas_visible loop 
          begin
            select count(*) 
            into ln$nbre 
            from entreqpmt 
            where  pnumseriee <= (:entreqpmt.pnumseriee + ln$cpt) 
              and (:entreqpmt.pnumseriee + ln$cpt) <= dnumseriee 
              and rownum = 1; 
            ln$requete := '   select * from entreqpmt where  pnumseriee <= (:entreqpmt.pnumseriee 
                           + ln$cpt) and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'; 
            set_block_property ('ENTREQPMT_CTRL', QUERY_DATA_SOURCE_NAME, ln$requete); 
            show_view('CV_CTRL_ENTRE'); 
            canvas_visible := true;
          when no_data_found then
               null;
          end;
          ln$cpt := ln$cpt + 1; 
       end loop; 
    end;
    NB j'ai remplacé ton count(*), très gourmand au niveau perf, par une exception when_nodata_found.

  10. #10
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Merci MCM, effectivement un petit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	show_view('CV_CTRL_ENTRE');
    					SYNCHRONIZE;
    			   	EXIT;
    permet de sortir de ma bloucle loop et d'afficher mon canevas empilé. Mais le bloc qui lui est associé n'affiche aucun enregistrement. PlaineR, merci pour l'optimisation de mon code, je débute et je dois dire que le peu que j'ai appris et que je continue d'apprendre sur ORACLE et FORMS c'est grâce à ce site et des gens comme toi, Sheikyerbouti et bien d'autres à travers les différents tutoriaux et ce forum. Je mets en pratique ta suggestion et verrai pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set_block_property ('ENTREQPMT_CTRL', QUERY_DATA_SOURCE_NAME, ln$requete);
    ne semble pas être pris en compte. Mes enregistrements incriminés ne s'affichant pas.

  11. #11
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Affiche la requête générée et exécute-là sous SQL*Plus, il y a peut-être une erreur.

    [EDIT] Je ne vois pas de execute_query sur ton bloc 'ENTREQPMT_CTRL' [/QUERY]

  12. #12
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    affiche la requête générée et exécute-là sous SQL*Plus
    Tu peux me dire où la réquête est générée? Je ne le sais pas.

  13. #13
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_req := get_block_property ('ENTREQPMT_CTRL' , LAST_QUERY');
    NB : si ce résultat est différent de LS$REQUETE c'est que la requête n'a pas été effectuée.

  14. #14
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Je ne vois pas de execute_query sur ton bloc 'ENTREQPMT_CTRL'
    Dans le declencheur WHEN-NEW-BLOCK-INSTANCE de mon bloc 'ENTREQPMT_CTRL' j'ai mis un execute_query. Je croyais que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    show_view('CV_CTRL_ENTRE');
    provoquera le déchenchement de cet execute_query. Pour ma dernière requête executé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ln$requete := '   select * from entreqpmt where  pnumseriee <= (:entreqpmt.pnumseriee 
                           + ln$cpt) and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'; 
            set_block_property ('ENTREQPMT_CTRL', QUERY_DATA_SOURCE_NAME, ln$requete); 
            show_view('CV_CTRL_ENTRE');
            ma_req := get_block_property ('ENTREQPMT_CTRL' , LAST_QUERY); 
    				message ('Ma requête '|| ma_req);
            canvas_visible := true;
    m'affiche Ma requête .

  15. #15
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par serme
    Dans le declencheur WHEN-NEW-BLOCK-INSTANCE de mon bloc 'ENTREQPMT_CTRL' j'ai mis un execute_query. Je croyais que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    show_view('CV_CTRL_ENTRE');
    provoquera le déchenchement de cet execute_query.
    Non, il faut que tu ailles sur ce block pour que le trigger WHEN-NEW-BLOCK-INSTANCE se déclenche.

  16. #16
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Etant donné que je ne peux pas faire un GO_BLOCK dans mon déclencheur WHEN-VALIDATE-ITEM où tout mon show se déroule, que me suggères tu, où dois je mettre mon EXECUTE_QUERY?

    PS: Je dois t'accaparer, merci pour ta patience.

  17. #17
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Si l'item auquel est rattaché ton déclencheur WHEN-VALIDATE-ITEM est le dernier item du block, tu peux mettre la propriété "style de navigation" de ton block à "changement de block" (et éventuellement indiqué dans la propriété "next block" ENTREQPMT_CTRL)

    Sinon, les solutions sont plus compliquées et plus capilotractées...
    Par exemple :
    1- gérer une variable "CHANGE_BLOCK := 1" dans ton déclencheur WHEN-VALIDATE-ITEM
    2- dans le déclencheur WHEN-NEW-ITEM-INSTANCE de l'item suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if :MON_BLOCK.CHANGE_BLOCK = 1 then
       mon_itm := :system.trigger_item;
       go_block ('ENTREQPMT_CTRL');
       execute_query;
       :MON_BLOCK.CHANGE_BLOCK := 0;
       go_item (mon_itm);
    end if;

  18. #18
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Si l'item auquel est rattaché ton déclencheur WHEN-VALIDATE-ITEM est le dernier item du block, tu peux mettre la propriété "style de navigation" de ton block à "changement de block"
    Mon item est le dernier item saisissable de mon bloc mais c'est un bloc multi enregistrement et j'ai déjà mis la propriété "style de navigation" à "Changement d'enregistrement" pour faciliter les saisies.
    La solution
    compliquées et plus capilotractées
    que tu m'as suggeré résout le problème de l'EXECUTE_QUERY par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	if :ENTREQPMT.CHANGE_BLOCK = 1 then 
     
    	   --:ENTREQPMT_CTRL.nument1 := :system.trigger_item; 
    	   go_block ('ENTREQPMT_CTRL'); 
    	   execute_query; 
    	   :ENTREQPMT.CHANGE_BLOCK := 0;
    	   ma_req := get_block_property ('ENTREQPMT_CTRL' , LAST_QUERY); 
    	   message ('Ma requête: '|| ma_req); 
    	   --go_item('nument1'); 
     
    	end if;
    Le problème se déplace maintenant au niveau de ma requête comme tu te le demandais. J'ai l'erreur
    FRM-40505 : Erreur ORACLE*: exécution impossible de l'interrogation'
    et voici la valeur de ma variable ma_req:
    SELECT NUMENT,CODEEQPMT,QTEENT,PNUMSERIEE,DNUMSERIEE FROM select * from entreqpmt where pnumseriee <= (:entreqpmt.pnumseriee
    + ln$cpt) and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)
    Ce qui ne correspond pas à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ln$requete := 'select * from entreqpmt where  pnumseriee <= (:entreqpmt.pnumseriee 
                           + ln$cpt) and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'
    Mon bloc ENTREQPMT_CTRL a part defaut sa propriété "Nom de source de données d'interrogation" à "select * from entreqpmt".

  19. #19
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Ok, avec query_data_source tu précises la source sur laquelle la requête va être faite (une table, une vue, ...).

    Toi, si j'ai compris ce que tu voulais faire, c'est modifier uniquement la clause where. Dans ce cas il faut que tu fasses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ln$requete := 'pnumseriee <= (:entreqpmt.pnumseriee + ln$cpt) ||
                        'and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'
    set_block_property ('ENTREQPMT_CTRL', DEFAULT_WHERE, ln$requete);

  20. #20
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Bonsoir

    Effectivement c'est ma clause Where qui change. Ta suggestion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ln$requete := 'pnumseriee <= (:entreqpmt.pnumseriee + ln$cpt)'||
            							' and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'; 
     
            set_block_property ('ENTREQPMT_CTRL', DEFAULT_WHERE, ln$requete);
    me ramène pour ma variable ma_req:
    SELECT NUMENT,CODEEQPMT,QTEENT,PNUMSERIEE,DNUMSERIEE FROM (select * from entreqpmt) where pnumseriee <= (3
    + ln$cpt) and 3<= (dnumseriee + ln$cpt)
    C'est à peu près la même chose avec le QUERY_DATA_SOURCE_NAME.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ln$requete := 'select * from entreqpmt where  pnumseriee <= (:entreqpmt.pnumseriee + ln$cpt)||
            							 and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'; 
            set_block_property ('ENTREQPMT_CTRL', QUERY_DATA_SOURCE_NAME, ln$requete);
    Valeur de ma_req:
    SELECT NUMENT,CODEEQPMT,QTEENT,PNUMSERIEE,DNUMSERIEE FROM select * from entreqpmt where pnumseriee <= (:entreqpmt.pnumseriee
    + ln$cpt) and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)
    Dans les deux cas, la partie:
    SELECT NUMENT,CODEEQPMT,QTEENT,PNUMSERIEE,DNUMSERIEE FROM
    qui vient se greffer à ma requête est de trop. C'est elle qui empêche son exécution. Comment l'éliminer?

    Pour faire la génèse de mon bloc turbulent ENTREQPMT_CTRL, je l'ai crée à l'aide de l'assistant en le basant sur ma table ENTREQPMT pour ne pas le faire manuellement. Ensuite, voulant le baser sur une requête "dynamique" ie qui change j'ai mis la propriété Type de source de données d'Interrogation à "Interrogation de clause FROM", Nom de source de données d'Interrogation à "select * from entreqpmt". Et dans le code j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ln$requete := 'select * from entreqpmt where  pnumseriee <= (:entreqpmt.pnumseriee + ln$cpt)||
            							 and :entreqpmt.pnumseriee <= (dnumseriee + ln$cpt)'; 
            set_block_property ('ENTREQPMT_CTRL', QUERY_DATA_SOURCE_NAME, ln$requete);
    La partie gênante de ma requête est-elle dûe à la façon dont j'ai crée mon bloc 'ENTREQPMT_CTRL'? Faut t'il changer une autre propriété de ce bloc. J'en ai presque perdu mon latin avec ce topic.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Affichage de deux canevas
    Par minooo dans le forum Forms
    Réponses: 2
    Dernier message: 28/08/2012, 11h35
  2. Histogramme empilé (affichage des valeurs)
    Par paris11 dans le forum iReport
    Réponses: 0
    Dernier message: 29/09/2008, 17h00
  3. Réponses: 2
    Dernier message: 28/07/2006, 14h29
  4. [Forms6i]Canevas integral et canevas empilé
    Par serme dans le forum Oracle
    Réponses: 2
    Dernier message: 07/02/2006, 10h53
  5. Réponses: 9
    Dernier message: 02/02/2005, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo