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

Forms Oracle Discussion :

[Forms] Problème de curseur


Sujet :

Forms Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    x + NULL = NULL

    Modifie sum(solde_comptable) par SUM(NVL(solde_comptable,0) ou ajoute AND solde_comptable IS NOT NULL

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Par défaut
    Le champ en question est not null. Mais effectivement, ça aurait pu.

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Essaye :
    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
     
    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

  5. #5
    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
    Citation Envoyé par ludo.guy
    Le champ en question est not null. Mais effectivement, ça aurait pu.
    Ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Par défaut
    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.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Par défaut
    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.

  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
    Moi je suis partisan du FOR IN LOOP et je n'ai jamais eu de pb.
    Faudrait le code entier pour comprendre.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2005, 15h14
  2. Réponses: 12
    Dernier message: 06/04/2005, 11h54
  3. parser un XHTML bien formé (problème namespace)
    Par luta dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 18/10/2004, 12h55
  4. [Trigger] Problème de curseur
    Par Superstivix dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/06/2004, 10h30
  5. Réponses: 5
    Dernier message: 27/08/2003, 11h45

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