Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Débuter
Débuter Forum d'entraide pour débuter avec Firebird
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 26/06/2003, 17h23   #1
rgz
Invité de passage
 
Inscription : mars 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 14
Points : 3
Points : 3
Envoyer un message via ICQ à rgz Envoyer un message via MSN à rgz Envoyer un message via Yahoo à rgz
Par défaut [RESOLU]Char(x) -> chaine concaténée d'espaces ?

Bonjour à tous,
Je développe une application client serveur avec une base sous fire Bird (Alterna. D’Interbase). Je possède plusieurs tables (évidemment ) composées de champs de type char et de dimensions différentes. Jusque là, rien de spécial…

L’application est développée sous Delphi via les composant interbase.
A plusieurs moments, j’insert et je récupère des données de la base via des Tedit ou de Tmemo.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE DOMAIN memo AS BLOB SUB_TYPE 1 SEGMENT SIZE 1000;
 
CREATE TABLE societe (
   Soc_Id int NOT NULL,
   Soc_nom char(30) NOT NULL,
   Soc_Fax char(12),
   Soc_email char(30),
   Soc_Pageweb char(50),
   Soc_Commentaire memo,
   Soc_User_id Int,
   Soc_type CHAR(20),
   Soc_mode_id Int,
      PRIMARY KEY (Soc_Id)
);
Code :
1
2
3
4
edt_fax.Text :=IBQuery_cli.FieldByName('soc_fax').AsString;
edt_mail.Text :=IBQuery_cli.FieldByName('soc_email').AsString;
edt_web.Text :=IBQuery_cli.FieldByName('soc_pageweb').AsString;
Memo_comment.Text :=IBQuery_cli.FieldByName('soc_commentaire').AsString;
Le champ memo de ma base à une dimension non prédéfinit puisque c’est un type que j’ai créée précédemment. Lorsque je lis une information dans un champ de ma base et que je l’affiche dans un Tedit (par exemple), il se passe un truc bizarre.

Si le champ est du type memo, pas de problème, la chaîne renvoyée est nickel. Mais si elle d’un type char(X), la chaîne renvoyée est bonne mais elle concaténée d’espace jusqu’à la taille maximum (X)

Exemple : si j’ai un champ
Cli_nom char(50),

Et que je lui affecte la chaine ‘developpez.com’
La valeur renvoyée par :
IBQuery.FieldByName(‘Cli_Nom’).AsString
Sera ‘developpez.com________________________________________‘ et non ‘developpez.com’, je trouve ça dommage de devoir traiter les chaîne à chaque lecture !

Existe t’il un moyen de remédier à ce problème ou ce problème est un fait ?

Merci d'avance...[/u][/b][/code]
rgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2003, 17h41   #2
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Ton erreur est plutôt normal. En fait ce n'est pas une erreur. Tu peux utiliser deux types pour les chaînes de caractères (CHAR ou VARCHAR).

CHAR: renvoit toujours le nombre maximum de caractères. Si la longueur est de 10, alors tu récupères 10 caractères.

VARCHAR: renvoit toujours le nombre de caractères requit. Si la longueur est 10, et que tu as besoin que de 3 caractères, tu récupères 3 caractères.

Soi tu utilises la fonction trunc avec char ou tu changes ton type char pour varchar.

Bonne journée !
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2003, 17h51   #3
rgz
Invité de passage
 
Inscription : mars 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 14
Points : 3
Points : 3
Envoyer un message via ICQ à rgz Envoyer un message via MSN à rgz Envoyer un message via Yahoo à rgz
hummm "dakor"


Merci à toi Dihap ...
rgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2003, 17h53   #4
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Mais de rien
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2003, 09h47   #5
Membre du Club
 
Inscription : mars 2003
Messages : 44
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 44
Points : 44
Points : 44
pour pousser un poil plus loin les explications :

char ou varchar ?
niveau taille mémoire : ~equivalent

si tu comptes faire des recherches sur ce champ, ou ordonner dessus : utilise char

si tu comptes avoir un champ de taille variable, sur lequel tu ne fait pas de recherche ni de order by, varchar est ton type de variable

enfin , pour liquider les espaces surnuméraires, quelques UDF sont fournies avec firebird et peuvent etre intégrées à tes bases ... parmi celles ci, il y a rtrim, qui supprime tous les espaces situés à droite d'une chaine de caractères...
Gillou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2003, 09h57   #6
rgz
Invité de passage
 
Inscription : mars 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 14
Points : 3
Points : 3
Envoyer un message via ICQ à rgz Envoyer un message via MSN à rgz Envoyer un message via Yahoo à rgz
ça c'est interressent Gillou merci, je vais regarder.

Dit moi, un order by sur des champs de type varchar(X), c'est vraiment un risque au point de vue de la rapiditée ? ou ça va ?

Et comment on utilise le rTrim ? Merci d'avance
rgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2003, 11h30   #7
Membre du Club
 
Inscription : mars 2003
Messages : 44
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 44
Points : 44
Points : 44
pour le order by désolé, je sais pas du tout j'ai pas fait de test moi meme ... si tu veux vraiment le savoir tu peux tester toi même

normalement dans le répertoire IB / FB , tu dois trouver
rep UDF , avec IB_udf.dll
rep exemples, avec ib_udf.sql
qui te permettent de rajouter plusieurs fonctions a utiliser dans tes requetes SQL.
ex :
Code :
1
2
3
4
5
 
DECLARE EXTERNAL FUNCTION RTRIM 
    CSTRING (80)
    RETURNS CSTRING (80)
    ENTRY_POINT 'IB_UDF_rtrim' MODULE_NAME 'ib_udf';
une fois rajoutées , ce sont des fonctions qui s'utilisent normalement : select rtrim(table1.col1) from table1
Gillou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2003, 11h59   #8
rgz
Invité de passage
 
Inscription : mars 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 14
Points : 3
Points : 3
Envoyer un message via ICQ à rgz Envoyer un message via MSN à rgz Envoyer un message via Yahoo à rgz
Merci gillou (j'ai l'impression de faire que ça )

Je viens de tester sur 2 bases différentes, avec varchar(x) et char(x).
J'ai fait des vieilles requetes bien lourdes sur les 2 BDD que j'avais surchargée précédemment, et je ne vois pas vraiment de différences de temps de réponses...

Donc, je vais rester sur les VarChar(x) qui me semble suffisant pour mon appli'.


Merci encore
rgz 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 03h46.


 
 
 
 
Partenaires

Hébergement Web