Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2006, 15h55   #1
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Par défaut [forms 9i] [BUG ?] parcours d'un bloc multilignes

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 :
1
2
3
4
5
6
7
  GO_BLOCK('B3');
  FIRST_RECORD;
  LOOP
	MESSAGE('st_code = ' || :B3.ST_CODE);
  	EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
  	NEXT_RECORD;
  END LOOP;
Ce parcours est ICI une boucle infinie.

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.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 16h10   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 17h49   #3
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Salut SheikYerbouti,

Citation:
Envoyé par SheikYerbouti
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...
Ton idée est... alléchante mais ce n'est pas ça parce qu'en positionnant un point d'arrêt sur le début du trigger ON-ERROR, celui-ci n'est jamais exécuté.

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
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 17h55   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Et bien si, justement, car sans NEXT_RECORD, pas de :SYSTEM.LAST_RECORD = 'TRUE' ....

Code :
1
2
3
Loop
  NULL ;
End loop ;
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 18h02   #5
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 08h16   #6
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
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 ?
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 08h48   #7
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
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)
J'ai eu l'idée de mettre cette instruction en commentaire car :
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 !
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 09h20   #8
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 09h35   #9
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 10h07   #10
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
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...
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h38.


 
 
 
 
Partenaires

Hébergement Web