Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Voilà, j'ai une procédure stockée sous oarcle qui me renvoie une donnée de type Number.
Mon Problème est que sous PB, je ne récupère pas la valeur exacte. Est-ce qu'il existe une solution.
Exemple: Sous Oracle je trouve 56212.51 et sous Pb je récuère 56212.50
Merci
Hors ligne
ossarc a écrit:
Voilà, j'ai une procédure stockée sous oarcle qui me renvoie une donnée de type Number.
Mon Problème est que sous PB, je ne récupère pas la valeur exacte. Est-ce qu'il existe une solution.
Exemple: Sous Oracle je trouve 56212.51 et sous Pb je récuère 56212.50
Merci
As-tu déclaré un float ou un decimal ?
Hors ligne
Il y a un bug en pb des fois 56212.51 est recuperé
56212.50999999999999999999999999999998
Tu peux verifier ?
Hors ligne
1) http://www.gnurou.org/documents/smart-questions-fr.html
2) Number (x, y) : que valent x et y ?
"Number" tout seul ça ne veut rien dire pour moi
3) Donne ton script PB qui lance la proc et récupère les valeurs
4) Versions de PB et d'Oracle, driver utilisé
Hors ligne
J'ai déclaré un Number 15.2 au niveau de la base et un decimal sou pb
Hors ligne
Decimal ou dec{2} ??
Hors ligne
un Dec {2}.
Ensuite la proc renvoie un number.
Voici le code sous ORACLE
CREATE OR REPLACE FUNCTION "FS_CALC_MNT_PROP_DOSSIER" (p_ann_dossier varchar2, p_num_dossier varchar2) return number is integrity_error exception; errno integer; errmsg char(200); sann varchar2(4); snum varchar2(6); r_mnt_prop_dossier number(15, 2); sidf_comp varchar2(3); sidf_nat varchar2(6); smnt_max number(15,2); smnt_retenu_ventil number(15,2) :=0; begin smnt_retenu_ventil:=fs_calc_mnt_ventil_sum(p_ann_dossier ,p_num_dossier); select gide.regles.idf_compet, gide.regles.idf_nattrav, gide.dossier.ann_dossier, gide.dossier.num_dossier, gide.regles.mnt_max_paye into sidf_comp, sidf_nat, sann, snum, smnt_max from gide.regles, gide.dossier where gide.regles.idf_compet = gide.dossier.idf_compet and gide.regles.idf_nattrav = gide.dossier.idf_nattrav and gide.dossier.ann_dossier=p_ann_dossier and gide.dossier.num_dossier=p_num_dossier; if smnt_max is not null and smnt_retenu_ventil>smnt_max then r_mnt_prop_dossier:=smnt_max; else r_mnt_prop_dossier:=smnt_retenu_ventil; end if; return r_mnt_prop_dossier; EXCEPTION WHEN NO_DATA_FOUND then errno := -20005; errmsg := 'PAS D ENREGISTREMENT TROUVE POUR CES CRITERES'; raise_application_error(errno, errmsg); end;
Sous PB, je le récupère comme celà:
dec{2} ldec_mnt_prop_dossier //Appel fonction stockée lb_ret =FS_CALC_MNT_PROP_DOSSIER (as_identifiant,as_annee) -- A coder Declare fs_calc_mnt_prop_dossier Procedure For FS_CALC_MNT_PROP_DOSSIER(:as_annee,& :as_identifiant) using sqlca; execute fs_calc_mnt_prop_dossier; FETCH fs_calc_mnt_prop_dossier INTO :ldec_mnt_prop_dossier; CLOSE fs_calc_mnt_prop_dossier;
Voilà
Dernière modification par JCZ (26-08-2007 15:06:44)
Hors ligne
JCZ a écrit:
Il y a un bug en pb des fois 56212.51 est recuperé
56212.50999999999999999999999999999998
ossarc a écrit:
un Dec {2}.
Ensuite la proc renvoie un number.
Voilà
1. voici une bidouille
Tu recuperes dans un decimal et fais un round( '' ,2)
2. Tu peux aussi essayer de faire un retour de type : table.colonne%TYPE
avec table.colonne de type number(15,2)
Dernière modification par JCZ (20-08-2007 11:34:55)
Hors ligne
--------------------------------------------------------------------
Bonjour, peut-on considérer que le problème est Résolu ?
--------------------------------------------------------------------
Hors ligne
oui le problème a été résolu en récupérant une chaine de caractère au lieu d'un number.
Concernant la base64, le problème est résolu aussi car finalement on a opté pour la solution de crypt32.dll
Merci pour votre aide
Hors ligne