|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() Inscription : avril 2005 Messages : 1 672 ![]() |
Salut tout le monde,
Environnement : serveur Windows 2003 hébergeant une base en 10gR1 Je connais les règles du forum Oracle et je sais pertinemment qu'il ne sert pas à débogguer. Cependant, ma demande est particulière dans le sens où j'ai isolé le bout de code fautif et qu'il s'agit d'un pattern que j'utilise 10 fois par jour depuis des mois. Ce bout de code est tout simplement destiné à parcourir un bloc multilignes : Code :
Ma question est donc de savoir ce qui pourrait expliquer qu'au 2ème enregistrement de ce bloc parmi les 5 existants, la boucle se répète SANS JAMAIS passer à l'enregistrement suivant dans le bloc. Exemple : modification de la requête source du bloc dans le parcours de la boucle, timer existant et généré, variable système à tester / mal positionnée, etc. Merci par avance du moindre coup de pouce qui m'aidera à comprendre mon erreur. |
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Inscription : mai 2003 Messages : 6 533 ![]() |
Et bien peut-être une erreur est levée, mais trappée par un triger ON-ERROR, et l'instruction NEXT_RECORD du second enregistrement n'est jamais atteinte...
__________________
Rédacteur Oracle (Oracle ACE) Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche Je ne réponds pas aux questions techniques par MP Blogs: Forms-PL/SQL-J2EE - Forms Java Beans |
|
|
00
|
|
|
#3 | |
|
Membre Expert
![]() Inscription : avril 2005 Messages : 1 672 ![]() |
Salut SheikYerbouti,
Citation:
D'autre part, concernant le fait que l'instruction NEXT_RECORD ne soit jamais atteinte, je pense qu'elle l'est forcément sinon je n'aurais pas une boucle infinie, non ? Je te remercie de ta réponse ceci-dit et si tu as une autre idée suite à ma réponse alors n'hésite pas |
|
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Inscription : mai 2003 Messages : 6 533 ![]() |
Et bien si, justement, car sans NEXT_RECORD, pas de :SYSTEM.LAST_RECORD = 'TRUE' ....
exemple typique de boucle sans fin.
__________________
Rédacteur Oracle (Oracle ACE) Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche Je ne réponds pas aux questions techniques par MP Blogs: Forms-PL/SQL-J2EE - Forms Java Beans |
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Inscription : mai 2003 Messages : 6 533 ![]() |
Pour vous en assurer, affichez le numéro de l'enregistrement courant à chaque tour de boucle.
__________________
Rédacteur Oracle (Oracle ACE) Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche Je ne réponds pas aux questions techniques par MP Blogs: Forms-PL/SQL-J2EE - Forms Java Beans |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : avril 2005 Messages : 1 672 ![]() |
J'avais déjà effectué le test en débug.
Résultat : l'instruction EXIT WHEN... est bien évaluée à chaque tour de boucle et la variable :SYSTEM.TRIGGER_RECORD reste figée sur la valeur 2. En effet, en utilisant un synchronize, le curseur se déplace jusqu'au 2ème enregistrement et après il scintille sur celui-ci. Très sincèrement vu la simplicité de mon code et le nombre de fonctions / procédures dans lequel je l'utilise sans souci, je ne vois aucun mécanisme qui pourrait interférer dans ce parcours de boucle. Comment puis-je m'assurer que ce n'est pas un BUG d'Oracle / Forms ? |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : avril 2005 Messages : 1 672 ![]() |
Je progresse : l'origine de cette boucle infinie réside dans l'instruction suivante du trigger B5.KEY-DOWN :
Code :
SET_RECORD_PROPERTY(:SYSTEM.TRIGGER_RECORD, 'B3', STATUS, NEW_STATUS) 1/ c'est une des dernières lignes que j'ai ajoutées 2/ d'après la doc NEXT_RECORD échoue si le statut de l'enregistrement courant est NEW J'aimerais bien savoir ce que la doc implique par "échoue" (enfin "fails" en Anglais) car le déboggueur tourne quasiment indéfiniment avec cette instruction et on ne passe pas dans le trigger ON-ERROR niveau module ? Ceci dit, je n'utilise le déboggueur que depuis quelques jours seulement pour diverses raisons et il met en avant des résultats... "inattendus" Regardez bien la valeur de : 1/ la variable locale LC_item_dest 2/ la variable système CURSOR_ITEM Je n'y comprends plus rien !
|
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Chef de projet en SSII Inscription : janvier 2004 Messages : 2 866 ![]() |
Bonjour Magnus,
Quand tu es sur un enregistrement dont le statut est new tu ne peux pas aller sur le suivant. Fais le test à la main : insère un enregistrement au milieu de 2 autres et essaie de descendre sur le suivant, tu vas avoir l'erreur frm-40102. Pour ma part je n'ai qu'une confiance très limitée dans le debugger, j'ai eu certaines fois de grosses surprises qui m'ont fait perdre beaucoup de temps... Depuis j'insère mes traces dans une table de debuggage etlà je n'ai plus de mauvaises surprises.
__________________
Un problème sans solution est un problème mal posé Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP. |
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Inscription : mai 2003 Messages : 6 533 ![]() |
A ce propos, Steve Cosner a réalisé un outil Forms permettant d'insérer des traces dans une table ou via DBMS_OUTPUT en temps réel.
c'est bien cool pour débogger. http://userwww.sfsu.edu/~stevec/forms/zdebug.htm
__________________
Rédacteur Oracle (Oracle ACE) Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche Je ne réponds pas aux questions techniques par MP Blogs: Forms-PL/SQL-J2EE - Forms Java Beans |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Inscription : avril 2005 Messages : 1 672 ![]() |
Hello plaineR,
Je suis tout à fait d'accord avec toi mais ce qui m'a perturbé, c'est la notion de "fails" de l'invocation de la procédure NEXT_RECORD lorsque l'enregistrement courant a pour statut NEW. Je m'attendais à une sortie de programme, un message d'erreur, etc. ou autre mais certainement pas à ce que cette instruction soit "équivalente à une instruction NULL" (dis grossièrement, on passe dessus mais elle ne fait rien). En fait, à chaque fois que l'on utilise NEXT_RECORD il faut tester FORM_FAILURE sinon on risque de produire une boucle infinie ? Ce point est pour moi résolu mais concernant la capture d'écran que j'ai indiqué, je vais devoir ouvrir un nouveau thread après avoir fait des recherches sur metalink... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com