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 16/02/2007, 11h22   #1
Futur Membre du Club
 
Inscription : juin 2002
Messages : 55
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : juin 2002
Messages : 55
Points : 17
Points : 17
Par défaut [Forms] Problème de curseur

Bnjour tout le monde.

Alors voilà j'ai un petit problème avec un procédure, un Bug que je n'arrivep as à expliquer.

J'ai un curseur

Code :
1
2
3
4
5
6
7
8
9
 
cursor cur_verif_cpt_sain IS
SELECT sum(solde_comptable) solde_comptable, code_devise
FROM tmpcompte
WHERE cdos = :PARAMETER.P_CDOS
AND numero_client = tmpcli.numero_client
AND code_produit != (SELECT col4 FROM cxparametre WHERE cdos = :PARAMETER.P_CDOS AND code_param = 'CPTREC')
AND numero_compte_genera NOT IN (SELECT numero_compte_genera FROM cxcompte_general WHERE cdos = :PARAMETER.P_CDOS AND nature IN ('G','P'))	
GROUP BY code_devise;
Bref, un petit curseur sympa quoi.

Pour le parcourir je fais la boucle suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
open cur_verif_cpt_sain;
 
fetch cur_verif_cpt_sain INTO sum_wsolde_comptes,w_code_devise_cpt;
 
while cur_verif_cpt_sain%found loop
 
   wsolde_comptes := wsolde_comptes + une fonction(sum_wsolde_comptes);
 
   fetch cur_verif_cpt_sain INTO sum_wsolde_comptes,w_code_devise_cpt;
 
end loop;
 
close cur_verif_cpt_sain;
J'ai bien sûr vérifié qu'il y avait des enregistrements ramenés par mon curseur en faisant un select count(distinct code_devise) avant (j'ai un enregistrement). Et le programme passe pourtant sur le open, le fetch et le résultat de ce dernier donne bien sûr les valeurs null dans les deux variables de destination.

J'ai essayé aussi avec la syntaxe
Code :
1
2
3
 
FOR mavariable IN moncuseur loop
end loop;
Toujours le même problème.

Est-ce que quelqu'un pourrait m'expliquer ce qu'il se passe ?
__________________
Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
Bernard Werber
ludo.guy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 11h31   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
x + NULL = NULL

Modifie sum(solde_comptable) par SUM(NVL(solde_comptable,0) ou ajoute AND solde_comptable IS NOT NULL
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 11h32   #3
Futur Membre du Club
 
Inscription : juin 2002
Messages : 55
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : juin 2002
Messages : 55
Points : 17
Points : 17
Le champ en question est not null. Mais effectivement, ça aurait pu.
__________________
Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
Bernard Werber
ludo.guy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 11h33   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Essaye :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
open cur_verif_cpt_sain;
 
fetch cur_verif_cpt_sain INTO sum_wsolde_comptes,w_code_devise_cpt;
wsolde_comptes := 0;
 
while cur_verif_cpt_sain%found loop
 
   wsolde_comptes := wsolde_comptes + une fonction(sum_wsolde_comptes);
 
   fetch cur_verif_cpt_sain INTO sum_wsolde_comptes,w_code_devise_cpt;
 
end loop;
 
close cur_verif_cpt_sain;
Tu n'as pas initialisé wsolde_comptes à 0 surement
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 12h32   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Citation:
Envoyé par ludo.guy
Le champ en question est not null. Mais effectivement, ça aurait pu.
Ou alors
Code :
une fonction(sum_wsolde_comptes);
qui renvoie NULL

Et puis tu n'as qu'à afficher les différentes variables avec du DBMS_OUTPUT et puis tu verras bien où ça foire.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 12h36   #6
Futur Membre du Club
 
Inscription : juin 2002
Messages : 55
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : juin 2002
Messages : 55
Points : 17
Points : 17
Bon, après quelques recherches il semblerait que ce soit un problème de déclaration de ROWTYPE, je trouve exactement et je vous dis ça.

Merci pour les indications en tout cas.
__________________
Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
Bernard Werber
ludo.guy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 14h25   #7
Futur Membre du Club
 
Inscription : juin 2002
Messages : 55
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : juin 2002
Messages : 55
Points : 17
Points : 17
Bon, le verdict est tombé, j'ai corrigé l'erreur.

en fait cette boucle sur le curseur était dans une autre boucle. Le tmpcli.numero_client faisait partie de la boucle mère. Or cette boucle (un curseur elle aussi) était déclarée sous la forme

for tmpcli in cur_client loop
end loop;


Depuis que j'ai modifié pour faire des open/fetch/close tout se passe mieux... Si quelqu'un a une explications je suis preneur ;-)

Merci de votre attention en tout cas.
__________________
Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
Bernard Werber
ludo.guy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 17h04   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Moi je suis partisan du FOR IN LOOP et je n'ai jamais eu de pb.
Faudrait le code entier pour comprendre.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h10.


 
 
 
 
Partenaires

Hébergement Web