Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Connexion aux bases de données
Connexion aux bases de données Forum d'entraide sur la connectivité Firebird: composants, drivers, transactions, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/12/2006, 18h16   #1
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Par défaut IBQuery + IBUpdateSQL + BOOLEAN Erreur à l'affection d'une valeur TRUE

Bonjour,

J'ai un problème avec les champs de type BOOLEAN et IBUpdateSQL où la mise à jour d'un booléen provoque une exception.

- Je crée un IBQuery
- Je crée un IBUpdateSQL attaché au IBQuery
- Dans IBUpdateSQL.ModifySQL je rentre la chaîne:
UPDATE R_REG SET
F_PREGID=:F_PREGID, ... , F_FG_COMPMUL=:F_FG_COMPMUL
WHERE F_REGID=:F_REGID
où le champ F_FG_COMPMUL est défini BOOLEAN dans la table.
- je définis les TxxField dont un TBooleanDataField lié à F_FG_COMPMUL
- et un TDbCheckBox lié au TBooleanDataField

En lecture, tout va bien, le CheckBox reflete bien l'état du champ.

En écriture:
- si le CheckBox n'est pas coché, dans le SQL produit la valeur est transmise comme un 0 (zéro) et ça passe.
- si le CheckBox est coché, la valeur transmise est -1 et j'obtient une erreur "arithmetic exception, numeric overflow, or string truncation"

en exécutant pas à pas je vois que le problème est dans IBQuery.349 dans TIBQuery.SetParams où:
case ....
ftBoolean, ftSmallint, ftWord:
SQLParams[i].AsShort := Params[i].AsSmallInt;

la propriété AsSmallInt convertit un variant booléen TRUE en SmallInt = -1.

Serais-je le premier à avoir utilisé IBQuery + IBUpdateSQL + Champ booléen !
Sinon, ça me dépannerai bien de savoir comment faire.

Merci
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2006, 19h06   #2
Membre émérite
 
Avatar de Yurck
 
Homme
Ingénieur développement logiciels
Inscription : février 2005
Messages : 682
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 3
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2005
Messages : 682
Points : 921
Points : 921
Bonjour,

Les champs BOOLEAN n'existe pas.
Regarde plutôt dans Delphi la valeur des propriétés ValueUnchecked et Valuechecked de ton TDBCheckBox.

a+
__________________
Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
Aymond d'Alost
Yurck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2006, 21h03   #3
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Bonjour,

si, si les champs booleans existent bien avec la version d'interbase que j'utilise, 7.5. Je ne sais pas ce qu'il en est avec d'autre, ni avec Firebird.

Cordialement
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 08h35   #4
Membre actif
 
Inscription : juillet 2003
Messages : 190
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 190
Points : 195
Points : 195
bonjour

pourquoi ne pas utiliser un champ de type integer ? en général les propriétés qui n'ont que 2 états au début du projet, terminent souvent avec 3 ou 4 états (les combinaisons)

ex :
Client Fournisseur
0 0
0 1
1 0
1 1
__________________
@+
WolffN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 14h21   #5
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
bonjour

Citation:
pourquoi ne pas utiliser un champ de type integer ? en général les propriétés qui n'ont que 2 états au début du projet, terminent souvent avec 3 ou 4 états (les combinaisons)
parce que je pensais pouvoir utiliser simplement un DbCheckBox qui est fait pour ça.
J'ai contourné le problème en excluant les champs booleans de la requête UpdateSQL, puis dans OnUpdateRecord j'exécute une seconde requête qui envoie les booleans. Un peu tiré par les cheveux quand même
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 14h26   #6
Membre actif
 
Inscription : juillet 2003
Messages : 190
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 190
Points : 195
Points : 195
tu peux utiliser un TDBCheckBox avec un integer

il suffit de renseigner les propriétés

ValueChecked = 1
ValueUnchecked = 0
__________________
@+
WolffN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 16h01   #7
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Citation:
tu peux utiliser un TDBCheckBox avec un integer
Ok, ça marche. J'ai fait l'essai avec un champ CHAR(1) plutôt qu'un integer, car les propriétés ValueChecked et ValueUnchecked sont de type string.
Mais la solution ne me satisfait pas complètement car l'editeur doit savoir que ce champ n'est pas à interpréter en tant que CHAR mais en tant que Boolean.

Par contre ton idée, m'en donne une autre. Laisser le champ en boolean et agir à l'ouverture du IBQuery, détécter le champ de type booleen et dans ce cas créer des TStringField ou lieu des TBooleanField. J'essaye ...

Cordialement
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 17h06   #8
Membre émérite
 
Avatar de Yurck
 
Homme
Ingénieur développement logiciels
Inscription : février 2005
Messages : 682
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 3
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2005
Messages : 682
Points : 921
Points : 921
Oui
ou faire

Code :
1
2
3
 
SELECT cast(Mon_Boolean AS smallint) AS Mon_Boolean, champ2, ...
  FROM ...
a+
__________________
Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
Aymond d'Alost
Yurck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2006, 20h30   #9
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Citation:
SELECT cast(Mon_Boolean AS smallint) AS Mon_Boolean, champ2, ...
FROM ...
C'est l'inverse que je cherche à faire. D'ailleurs j'avais pensé à faire
Code :
UPDATE .... VALUES ... CAST(:FIELD AS BOOLEAN)
qui provoque une erreur de syntaxe sur CAST
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2006, 13h28   #10
Membre actif
 
Inscription : juillet 2003
Messages : 190
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 190
Points : 195
Points : 195
euh stop, je t'assure que si tu met un champ en integer sur un tdbcheckbox et que dans l'editeur de propriété du dbcheckbox tu met valuechecked a 1 et valueunchecked a 0 ça marche pas besoin de faire un char(1)
__________________
@+
WolffN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2006, 12h09   #11
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Oui, c'est bien ce que je disais:
- soit avoir un champ numérique, transtypé au SELECT
- soit avoir un champ Boolean, transtypé au UPDATE.
mais aucun n'est possible dans les circonstances
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2007, 17h39   #12
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
J'ai réglé mon problème de la façon suivante:
- les champs booleans sont des Char
- au moment d'afficher le champ dans un TDbGrid je teste si c'est un Char(1) et j'y associe un TDbCheckBox avec ValueChecked := '1' et ValueUnchecked := '0'.

un peu tordu quand même.
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h04.


 
 
 
 
Partenaires

Hébergement Web