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

Bases de données Delphi Discussion :

[D2010] Comment initialiser DecimalDeparator dans un SQLConnection ?


Sujet :

Bases de données Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut [D2010] Comment initialiser DecimalDeparator dans un SQLConnection ?
    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.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'ALTER SESSION SET NLS_DATE_FORMAT=''DD/MM/YYYY HH24:MI:SS'''
    'ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ". "'
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    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 ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    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 ) qui m'affiche mal les nombres à virgule.
    7,38 sur mon poste, s'affiche 738 sur d'autres. Ce qui est assez génant.

    Y a t'il un autre paramétrage à faire ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Le sujet n'a pas l'air d'intéresser grand monde en cette période estivale.

    Pour ma part j'ai en plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Application.UpdateFormatSettings:=False;
    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.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Le sujet n'a pas l'air d'intéresser grand monde en cette période estivale.
    snif

    Citation Envoyé par Linkin Voir le message
    Pour ma part j'ai en plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Application.UpdateFormatSettings:=False;
    Ca ne change rien.

    Citation Envoyé par Linkin Voir le message
    Par contre, je n'affiche jamais directement les résultats dans des composants DB.
    Pourquoi ?
    Ils marchent bien. Je n'ai jamais eu de problème de ce côté là.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE Valeur > :ValeurFlottante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.FieldByName('ValeurFlottante').AsFloat := StrToFloat(Edit.Text);
    Tu peux procéder ainsi pour un INSERT ou UPDATE aussi !

    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
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Perso, je n'ai eu pas de problème en D7 avec Oracle
    Moi non plus en D6 avec le BDE.

    Citation Envoyé par ShaiLeTroll Voir le message
    Pourquoi ce besoin de modifier le séparateur décimal ?
    Pour pouvoir utiliser les procédures stockées (http://www.developpez.net/forums/d16...bcd-cest-quoi/).

    Citation Envoyé par ShaiLeTroll Voir le message
    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 !
    Moi aussi, généralement.
    Mais, ca ne change pas mon problème d'affichage.

    Citation Envoyé par ShaiLeTroll Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE Valeur > :ValeurFlottante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.FieldByName('ValeurFlottante').AsFloat := StrToFloat(Edit.Text);
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLStoredProc.ParamByName('QuantiteFabriquee').AsFMTBCD := DoubleToBcd(1.38);
    Citation Envoyé par ShaiLeTroll Voir le message
    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
    Trop compliqué pour moi de ré-inventer des composants.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  9. #9
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Lung Voir le message
    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.
    Salut Ludwig,

    Et voila :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLConnection1.Params.Values['Decimal Separator']:='.';
    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.

    Donc le mieux c'est une petite boucle pour tester tous les paramètres, pour pouvoir vérifier le nom de chaque paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i := 0 to SQLConnection1.Params.Count - 1 do
    begin
      showmessage(SQLConnection1.Params[i]);
    end;
    Chaque ligne apparaitra alors sous la forme : La partie gauche avant le = est donc le nom du paramètre.

  10. #10
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Donc le mieux c'est une petite boucle pour tester tous les paramètres, pour pouvoir vérifier le nom de chaque paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i := 0 to SQLConnection1.Params.Count - 1 do
    begin
      showmessage(SQLConnection1.Params[i]);
    end;
    J'ai testé, mais même en spécifiant en conception le séparateur décimal, il n'apparait pas dans la liste des paramètres.
    Je n'obtiens que trois paramètres à l'exécution :
    Database=INSTANCE
    Password=mdp
    User_Name=shema
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  11. #11
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Lung Voir le message
    J'ai testé, mais même en spécifiant en conception le séparateur décimal, il n'apparait pas dans la liste des paramètres.
    Je n'obtiens que trois paramètres à l'exécution :
    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.

  12. #12
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    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.


    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
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  13. #13
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Lung Voir le message
    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
    Et la config du séparateur décimal est la même pour tout le monde (Config driver DBexpress, config Oracle, config paramètres régionaux du poste) ?

  14. #14
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Et la config du séparateur décimal est la même pour tout le monde (Config driver DBexpress, config Oracle, config paramètres régionaux du poste) ?
    - Pour Oracle, les paramètres sont différents, mais je modifie la session Oracle pour cette raison, après la connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLQuery.SQL.Add('alter session set NLS_NUMERIC_CHARACTERS = ''' + DecimalSeparator + ThousandSeparator + '''');
    - Pour Windows, on est tous en Français(France) avec la virgule en séparateur décimal. Donc SysUtils.DecimalSeparator est identique.
    - 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
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/01/2013, 08h10
  2. Réponses: 4
    Dernier message: 15/11/2007, 10h22
  3. Comment initialiser une liste dans la méthode reset()
    Par don'de dans le forum Struts 1
    Réponses: 10
    Dernier message: 19/03/2007, 21h17
  4. Réponses: 1
    Dernier message: 10/10/2006, 15h14
  5. Réponses: 35
    Dernier message: 14/02/2006, 18h57

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