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

SQLite Discussion :

Traitement d'une colonne de nombres réels


Sujet :

SQLite

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    juin 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 130
    Points : 162
    Points
    162
    Par défaut Traitement d'une colonne de nombres réels
    Bonjour.

    Mon souci est le suivant : dans une application qui traite des nombres réels, j'ai un problème d'affichage (cadrage à gauche ou à droite, point ou virgule comme séparateur décimal, choix du nombre de décimales) et, après plusieurs essais, j'ai diagnostiqué que le problème survenait quand la 1ère valeur rencontrée était "nulle".

    Pour être plus clair (!), j'ai fait un test avec DB Browser for sqlite, illustrations ci-dessous :

    création de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE "test" (
    	"Nom"	TEXT,
    	"Montant"	REAL
    )
    Quelques données :
    Nom : données.png
Affichages : 73
Taille : 2,7 Ko
    l'exécution du sql : "select * from test" donne :
    Nom : commetexte.png
Affichages : 70
Taille : 3,1 Ko
    les montants sont traités comme du texte (cadrage à gauche)

    avec le sql : "select * from test order by nom desc" donne :
    Nom : commenombre.png
Affichages : 73
Taille : 2,5 Ko
    cette fois, les montants sont traités comme des nombres (cadrage à droite)

    Y a-t-il un moyen d'éviter cela ?

    D'avance merci.
    Christian

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 105
    Points : 38 179
    Points
    38 179
    Billets dans le blog
    59
    Par défaut
    Bonjour,

    En première approche, j'aurai suggéré l'utilisation de COALESCE
    SELECT Nom,COALESCE(montant,0) montant FROM TEST ou toute autre variation SELECT Nom, montant FROM TEST ORDER BY COALESCE(montant,0).

    Après recherche, pour mettre <NULL> en fin de liste, il est possible d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TEST ORDER BY Montant IS NULL
    D'un autre côté, pour ce qui est de la représentation de l'affichage d'une colonne, cela dépend de l'outil, car mes tests sous DBWeaver et SQLite Studio ne m'ont pas montré ce souci
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    juin 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 130
    Points : 162
    Points
    162
    Par défaut
    Bonjour.

    Merci pour la réponse. J'avais trouvé hier soir tard (!) une solution en utilisant COALESCE que je ne connaissais pas ... mais du coup cela m'oblige à avoir 0 là où j'aurais préféré avoir une case vide ce qui correspond à l'affichage de "NULL" dans mon application.

    Concernant les outils, il n'y a effectivement pas le même comportement dans sqlite studio !

    Bonne journée.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    juin 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 130
    Points : 162
    Points
    162
    Par défaut
    Pour compléter ma réponse : mon souci n'est pas un problème de tri ... mais de traitement des données au moment de l'affichage.

    L'application pour laquelle j'ai découvert ce fonctionnement "bizarre" est développée avec Lazarus/Sqlite3/TSqlite3Dataset.

    J'indique "résolu" bien que pas entièrement !

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 105
    Points : 38 179
    Points
    38 179
    Billets dans le blog
    59
    Par défaut
    Citation Envoyé par thewolf Voir le message
    L'application pour laquelle j'ai découvert ce fonctionnement "bizarre" est développée avec Lazarus/Sqlite3/TSqlite3Dataset.
    Ah, Lazarus, ce n'est donc qu'un problème de définition de format de sortie
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    juin 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 130
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Ah, Lazarus, ce n'est donc qu'un problème de définition de format de sortie
    pas compris !

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 105
    Points : 38 179
    Points
    38 179
    Billets dans le blog
    59
    Par défaut
    Cela fait longtemps que je n'ai mis le nez dans Lazarus
    Je pensais à un truc comme ça
    Nom : Capture.PNG
Affichages : 46
Taille : 28,9 Ko
    Où l'on peut indiquer un formatage pour la colonne, mais je ne vois aucun soucis avec les valeurs = Null
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    juin 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 130
    Points : 162
    Points
    162
    Par défaut
    Pour moi, ce n'était pas un problème lié à Lazarus ... d'où mon test avec une base créée avec DB Browser for sqlite et quelques données saisies directement. Et même comportement que dans mon appli Lazarus ... (mais surprise : pas de souci dans sqlite studio !)

    C'est la raison pour laquelle je suis venu sur le forum Sqlite et non Lazarus.

    En plus, j'utilise TSqlite3Dataset (au lieu de TSqlite3Connexion, TSqlQuery, TSqlTransaction).
    Le champ pour lequel j'ai des soucis est un champ calculé par sql : "sum(case when O.type = "Int" then montant end) as IntProj" suivi d'un "group by".

    Après, j'affiche dans un TDBGrid où je peux définir pour chaque colonne la largeur, l'alignement ... et un "DisplayFormat" où je mets "0.00" quand c'est du numérique que je veux afficher avec 2 décimales.

    Et tout fonctionne parfaitement ! Sauf quand cela commence par un enregistrement où sum n'a rien trouvé (l'affichage est vide, parfait) mais ensuite les valeurs suivantes ne sont pas affichées correctement ...
    Par exemple, j'ai "205.06" ou "40.0" cadrés à gauche c'est-à-dire comme du texte mais j'ai bien "205,06" ou "40,00" cadrés à droite si on commence par un enregistrement avec une valeur.
    Ce qui prouve que c'est considéré comme du texte dans ce cas-là (!) dont j'arrive à forcer l'affichage à droite mais cela ne règle pas le problème du point à la place de la virgule ni du nombre de décimales.

    Dans le Dataset auquel est relié le DBGrid, j'ai essayé de créer un FieldDef que j'ai nommé IntProj et pour lequel je mets le DataType à ftFloat, mais cela ne change rien.

    J'ai donc le choix d'utiliser COALESCE et d'avoir "0,00" au lieu d'une case vide (ce que je préfèrerais) ou la solution "texte" cadré à droite ... je vais vraisemblablement prendre la 1ère option ... pas grave, mais j'aurais vraiment aimé comprendre ce qui se passe !

    En tout cas, merci pour l'aide apportée.

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 105
    Points : 38 179
    Points
    38 179
    Billets dans le blog
    59
    Par défaut
    Bonjour,

    Ah, SUM ! voilà le coupable et effectivement du coup, je reproduis le comportement , même le CAST n'opère pas !

    ci-dessous avec SQlite Studio
    Nom : Capture.PNG
Affichages : 35
Taille : 19,9 Ko

    donc mon impression : déclarer les champs se confirme (tant que c'est du readonly)
    Nom : Capture.PNG
Affichages : 34
Taille : 31,0 Ko
    ou en utilisant (quand c'est possible si la colonne est reconnue comme un NUMERIC)
    Nom : Capture.PNG
Affichages : 33
Taille : 39,9 Ko
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    juin 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 130
    Points : 162
    Points
    162
    Par défaut
    Bonjour.

    Pas sûr que SUM soit le coupable (!) puisque le problème existe aussi dans DbBrowser avec une table toute simple sans SUM ...
    Mais il est quand même surprenant qu'en partant d'un champ numérique puis en en faisant la somme ce qui devrait donner également un nombre, on ait un tel comportement, et cela uniquement si on commence par un enregistrement où SUM n'a rien trouvé à sommer !

    Dans mon application, ce que je cherche à afficher n'est pas une table existante a priori mais le résultat d'une requête sql construite dans le code à partir de paramètres choisis par l'utilisateur et de ma bdd qui comporte plusieurs tables (d'où jointures, clauses group by, having).

    Je n'ai donc pas accès direct aux champs mais comme indiqué dans mon dernier message, j'ai créé un champ pour lequel je mets le DataType à ftFloat, mais cela ne change rien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une colonne, plusieurs nombres
    Par M221122M dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/12/2013, 10h34
  2. Convertir une colonne en nombre
    Par bentor22 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/03/2013, 21h25
  3. [SQL Loader] Ignorer le traitement d'une colonne
    Par romaintaz dans le forum SQL
    Réponses: 7
    Dernier message: 01/07/2009, 15h02
  4. Remplir et ordonner une matrice de nombres réels
    Par madaou dans le forum Pascal
    Réponses: 4
    Dernier message: 20/11/2008, 11h37
  5. Somme d'une colonne (avec nombre de rangée variable)
    Par Berny77 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/05/2008, 00h30

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