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

Composants VCL Delphi Discussion :

[D6][ADO][MYSQL] problème avec les valeurs négatives


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut [D6][ADO][MYSQL] problème avec les valeurs négatives
    Bonjour à tous,

    Me voilà devant un problème particulier. Je remonte des valeurs de ma base de données MYSQL depuis mon application Delphi et lorsque la valeur est négative, Delphi (ou ADO) me renvoie une valeur positive.

    Définition de mon champ :
    table : editionlivre
    champs : nbarestocker
    type : tinyint (signé)

    Dans ma base, les valeurs négatives sont bien affichées avec le SELECT qui va bien.

    le même SELECT depuis Delphi me remonte :
    la bonne valeur si cette valeur est >= 0 (2 retourne 2)
    une valeur calculée (la valeur + 256) si la valeur est <0 (-2 retourne 254)

    C'est un peu comme si Delphi gérait le champ comme un unsigned.
    Mon code :
    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
    16
    17
    18
    19
    20
    21
     
                    qry:=TADOQuery.Create(self);
                    qry.AutoCalcFields := False;
                    qry.CacheSize := 10;
                    qry.CursorType := ctStatic;
                    qry.LockType := ltReadOnly;
                    qry.ParamCheck := true;
                    qry.ExecuteOptions:=[];
                    qry.Connection:=QryItem.Connection;
     
                    sql := 'SELECT nbARestocker FROM editionlivre ';
                    sql:=sql+'WHERE numEditionLivre = 0310311';
    showmessage(sql);
                    qry.SQL.Text:=sql;
                    qry.open;
    showmessage(qry.Fields[0].AsString);
                    vendabilite:=qry.Fields[0].AsInteger;
    ShowMessage(IntToStr(vendabilite));
                    qry.close;
     
                    qry.free;
    Quelqu'un a-t-il une idée ?
    merci
    shug

  2. #2
    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
    fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage(qry.Fields[0].ClassName);
    le tinyint est souvent considéré comme un Boolean, en tout avec MyDAC de CoreLab c'est le cas ... en Java, aussi ...
    Fait des tests avec d'autre champs déclaré un UNSIGNED et les mêmes en SIGNED, et vérifie si cela a un impact !
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Bonjour ShaiLeTrol,

    J'ai fais le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    showmessage(qry.Fields[0].ClassName);
    et il me retourne
    Je ne sais pas ce qu'il faut en conclure.

    La base de données est accédée par une application en Delphi et par un petit portail en PHP. PHP récupère bien les bonnes valeurs.

    Merci

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    J'ai changé le type de ma colonne de TINYINT vers SMALLINT et cela fonctionne.
    le ClassName me répond toujours TSmallIntField mais j'ai bien mes valeurs négatives maintenant.

    Ca m'embête par contre beaucoup d'aller me battre avec mon architecte de données maintenant pour faire convertir ce champ.

    Donc si j'ai pas le choix, je bataillerai mais si quelqu'un a une autre solution je suis preneur

    Merci encore

  5. #5
    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
    Si tu regarde, un TinyInt signé c'est -127 à 128, le TSmallintField c'est -32768 à 32767, il avait déjà agrandi la taille du champ, possible que le TinyInt est récupéré en Smallint au lieu de Shortint, et comme le bit de poids fort (le marquer du négatif) est en position 7, dans le Smallint cela n'a pas de signification spécifique car le bit de poids fort c'est le 15, ainsi tu récupères donc un nombre non signé ...
    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

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Je concorde avec l'analyse de ShaiLeTroll, en effet déjà si tu regardes la panoplie de TxxxField qui existe il n'y a pas de TTinyIntField. Celui qui se rapproche le plus alors c'est le TSmallIntField qui s'attend à stocker un SmallInt soit deux octets.

    Or comme ta valeur ne dépasse pas le premier octet, le SmallInt considère que la valeur est toujours positive, puisque son bit de poids fort (le 32e) n'est jamais mis à 1 comme le disais ShaiLeTroll.

    Comme solution soit tu fais changer le champ en base de donnée, c'est la solution la moins impactante pour toi. Soit est obligé de mettre un "accesseur" supplémentaire à ton champ qui se contentera de regarder le 16e bit de ta valeur, si il est à 1 alors il faudra le passer à 0 et passer le 32e bit à 1 sinon ne rien faire par exemple (ou bien convertir le SmallInt en TinyInt directement).
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vendabilite:=qry.Fields[0].AsInteger;
    Est-ce que vendabilite est une variable locale, un champ? quel est son type?
    Dans ton cas, ne suffirait-il pas de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShortInt(qry.Fields[0].AsInteger)
    ou une bête fonction de conversion?

    A la création de tes articles, quelles données envoies-tu vers ta base de donnée? Peux-tu nous montrer un bout de code où tu crées un article?
    *LeGEC*

  8. #8
    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
    En théorie, cela doit fonctionner
    Si tu fais ton transtypage en ShortInt, tu vas tronquer la valeur lu au premier octet et dans notre cas, où l'on avait à la base un TinyInt, c'est tout à fait faisable, comme ensuite tu manipules un ShortInt, finalement, le bit 7 qui n'avait pas de signification dans un SmallInt ou dans un Integer, reprend sa signification de bit de signe !
    C'est bien vu LeGEC ...




    NB: je numérote de 0 à n ... l'habitude ...
    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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Brillant !

    Merci LeGEC pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShortInt(qry.Fields[0].AsInteger)
    ca fonctionne impeccablement avec ça.

    Merci beaucoup

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

Discussions similaires

  1. Problème avec les valeurs 0
    Par mat120784 dans le forum QlikView
    Réponses: 6
    Dernier message: 30/01/2012, 11h58
  2. [MySQL] Requête MySQL : problèmes avec les espaces
    Par superseba888 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/07/2007, 16h12
  3. Problème avec les listes de valeurs
    Par yalla3 dans le forum Débuter
    Réponses: 2
    Dernier message: 03/05/2007, 15h36
  4. [Migration BDE en ADO][SQLServer] Problème avec les types char
    Par pitango dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2007, 17h17
  5. Problème avec les valeurs par défaut
    Par Steph Ace dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/12/2005, 09h55

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