Comment initialiser la propriété DecimalDeparator dans un SQLConnection, par du code ?
(sachant que je me connecte à une bdd Oracle).
Dans l'inspecteur d'objets, la propriété est bien présente, mais je ne vois pas comment l'initialiser par code.
Version imprimable
Comment initialiser la propriété DecimalDeparator dans un SQLConnection, par du code ?
(sachant que je me connecte à une bdd Oracle).
Dans l'inspecteur d'objets, la propriété est bien présente, mais je ne vois pas comment l'initialiser par code.
Pour Oracle, je passe par ces requêtes pour déterminer le format de valeurs, après la connexion du TSQLConnection (parce qu'en Delphi 7 je n'ai pas de propriété DecimalSeparator):
Code:
1
2
3 'ALTER SESSION SET NLS_DATE_FORMAT=''DD/MM/YYYY HH24:MI:SS''' 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ". "'
C'est ce que je fais dans une fonction appelée à la connexion pour le NLS_NUMERIC_CHARACTERS. Et je cherchais à modifier le DecimalSeparator du SQLConnection, juste après, pour le mettre en conformité.
A moins que ça ne soit pas nécessaire.
Mais, pour l'instant, quand je ne spécifiais pas de valeur pour le DecimalSeparator, j'avais des problèmes lors de mes requêtes.
Si imposer le NLS_NUMERIC_CHARACTERS suffit, mon problème est résolu.
Je creuse ...
;)
ALors, imposer le NLS_NUMERIC_CHARACTERS est utile pour une exécution correcte du SQL; mais par contre je bute sur un autre problème :
Il y a des postes (tous sauf le mien, en fait 8O ) qui m'affiche mal les nombres à virgule.
7,38 sur mon poste, s'affiche 738 sur d'autres. Ce qui est assez génant. :aie:
Y a t'il un autre paramétrage à faire ?
Le sujet n'a pas l'air d'intéresser grand monde en cette période estivale.
Pour ma part j'ai en plus
Par contre, je n'affiche jamais directement les résultats dans des composants DB. Je créé des listes d'objets et c'est à partir de ces listes que j'affiche les résultats. Mes champs sont es NUMBER(28,5) et je les récupère avec des AsFloat.Code:
1
2Application.UpdateFormatSettings:=False;
Perso, je n'ai eu pas de problème en D7 avec Oracle
Pourquoi ce besoin de modifier le séparateur décimal ?
Pour les Flottants et les Dates, je ne génère JAMAIS le SQL, je passe par un paramètre puis un AsFloat ou AsDate sur le ParamByName !
Pourquoi s'embetter avec FloatToStr ou FormatDateTime lors que l'objet TParam, le fait très bien !
Trop risqué de se poser la question sur le séparateur décimal, le "prepare statement" fait nettement mieux le travail que nous !
Code:SELECT * FROM TABLE WHERE Valeur > :ValeurFlottante
Tu peux procéder ainsi pour un INSERT ou UPDATE aussi !Code:Query.FieldByName('ValeurFlottante').AsFloat := StrToFloat(Edit.Text);
Par contre, pour les Post depuis un DataSet, normalement, il n'y a pas de problème, c'est surtout pour du SQL manuel
Pour la Couche Objet Métier (InstantObjects, ECO, Bold ,...), rien n'empeche d'avoir des Composants DB lié à un Objet, j'ai fait ma propre couche de persistance, donc j'ai une certains expérience, c'est dommage de se priver des composants DB, en reprenant l'exemple du TMemoryDataSet sur Dev.com on peut faciler mapper un objet avec tous les composants DB, le TMemoryDataSet n'étant qu'un adaptateur sur l'objet Persistant ou une Collection d'objet Persistant (et gérer le LazyLoading est très important, les objets ne devant être créé qu'au moment opportun)
Bon, perso, j'ai fait mon propre système d'affichage (pour gérer le mapping un objet et des controls non DB), et avec le recul, je me dit que j'aurais pu mieux faire (surtout plus simple via ce TDataSetObjectAdapter)
C'est souvent le problème, sur Delphi, dès que l'on pousse le O/R Mapping un peu loin, faut toujours refaire la roue carrée ! moi la mienne approche de l'hexagone, c'est déjà pas si mal :mouarf:
Moi non plus en D6 avec le BDE.
Pour pouvoir utiliser les procédures stockées (http://www.developpez.net/forums/d16...bcd-cest-quoi/).
Moi aussi, généralement.
Mais, ca ne change pas mon problème d'affichage. :(
C'est ce que je faisais sous D6 avec le BDE.
Avec DBExpress sous D2010, pour une procédure stockée (par exemple), ca donne :Trop compliqué pour moi de ré-inventer des composants. :koi:Code:SQLStoredProc.ParamByName('QuantiteFabriquee').AsFMTBCD := DoubleToBcd(1.38);
Salut Ludwig,
Et voila :
En fait il faut faire attention car le nom de paramètres dans l'inspecteur d'objets n'est pas forcément le même que celui qu'on retrouve dans Params. La preuve avec le Decimal Separator, dans l'inspecteur d'objet sans espace et avec un espace dans Params.Code:SQLConnection1.Params.Values['Decimal Separator']:='.';
Donc le mieux c'est une petite boucle pour tester tous les paramètres, pour pouvoir vérifier le nom de chaque paramètre :
Chaque ligne apparaitra alors sous la forme :Code:
1
2
3
4 for i := 0 to SQLConnection1.Params.Count - 1 do begin showmessage(SQLConnection1.Params[i]); end;
La partie gauche avant le = est donc le nom du paramètre.Code:Decimal Separator=,
Je viens de refaire un test et j'ai remarqué quelque chose de bizarre. Si à la conception dans Decimal Separator je mets "." alors mon paramètre n'apparait pas. Par contre si je mets "," alors il apparait bien.
Je suppose que le "." doit être le spéarateur par défaut et que c'est pour ça qu'il doit le supprimer.
Donc fais un test avec la virgule et là tu dois le voir.
Effectivement !
Si je spécifie le séparateur de Windows (la virgule sur mon poste), il n'apparait pas dans la liste des paramètres. Mais, sinon oui.
Un problème de résolu.
:ccool: :merci:
Par contre, j'ai encore mon problème d'affichage.
Sur mon poste, les nombres à virgule apparaissent bien avec la virgule dans une DBGrid, mais pas sur d'autres postes.
7,38 devient 738
- Pour Oracle, les paramètres sont différents, mais je modifie la session Oracle pour cette raison, après la connexion :- Pour Windows, on est tous en Français(France) avec la virgule en séparateur décimal. Donc SysUtils.DecimalSeparator est identique.Code:SQLQuery.SQL.Add('alter session set NLS_NUMERIC_CHARACTERS = ''' + DecimalSeparator + ThousandSeparator + '''');
- Pour DBExpress, je ne sais pas où regarder. Il n'y a rien en rapport dans les deux fichiers INI dbxconnections.ini et dbxdrivers.ini