Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > SQLite
SQLite Forum d'entraide SQLite
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 22/05/2008, 11h41   #1
Membre du Club
 
Inscription : décembre 2007
Messages : 239
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 239
Points : 59
Points : 59
Par défaut mask sur un integer

Bonjour,

J'ai dans ma base de données (type SQLite) un champ "codeP" d'une table.
ce champ est la primary key de ma table, et je voudrais poser un "mask" sur ce champ pour qu'au lieu de m'afficher "1", "2", etc il m'affiche "00001", "00002",..., "00010", ... , "00110" et ainsi de suite.

Ceci est juste dans le but d'avoir l'affichage d'un code à 5 chiffres quel que soit le numéro du codeP.

Pourriez m'indiquer comment réaliser ceci?
Somato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 13h08   #2
Membre actif
 
Inscription : décembre 2004
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 169
Points : 175
Points : 175
Salut,

pour un formatage d'un nombre sur 5 chiffres en SQL :
select substr('0000' || codeP,length(codeP))

Exemple :

Code :
1
2
3
4
5
DROP TABLE IF EXISTS ma_table;
CREATE TABLE ma_table ( codeP integer PRIMARY KEY, value text);
INSERT INTO ma_table VALUES ( 1,'abcd');
INSERT INTO ma_table VALUES ( 2,'fgh');
SELECT substr('0000' || codeP,length(codeP)), value FROM ma_table;
Résultat :

00001|abcd
00002|fgh

a+

PS: On peut utiliser une vue :

Code :
1
2
3
4
DROP VIEW IF EXISTS ma_table2;
CREATE VIEW ma_table2 AS SELECT substr('0000' || codeP,length(codeP)) AS codeP, 
value AS value FROM ma_table;
SELECT * FROM ma_table2;
bigane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h21   #3
Membre du Club
 
Inscription : décembre 2007
Messages : 239
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 239
Points : 59
Points : 59
Le problème, c'est que ça ne fait pas vraiment office de "mask" au sens où je l'entend:
par exemple si j'ai codeP = 10, ça me donnera 000010, alors que je veux avoir 00010 .

Le but serait de faire disons: 00000 + CodeP (sauf que je veux afficher tous les zeros).

Et étant donné que je ne pourrais pas modifier la table à chaque fois, il faudrait au mieux que je mette ce "mask" à la création de ma table afin que j'ai toujours 5 chiffres dans ce champ (ni plus ni moins).

Cela est-il possible?
Merci de votre aide.

PS: sinon j'essaierai de gérer ça directement dans le programme qui se sert de SQLite, mais j'aurais préféré avoir strictement la meme chose dans le SGBD et dans le programme...
Somato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 20h13   #4
Membre actif
 
Inscription : décembre 2004
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 169
Points : 175
Points : 175
Non,

Tu aurais du mieux regarder mon code avant de répondre, ça fait bien ce que tu demandes !

Voici la trace d'un exemple complet :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQLite version 3.5.8
Enter ".help" FOR instructions
sqlite> DROP TABLE IF EXISTS ma_table;
sqlite> CREATE TABLE ma_table ( codeP integer PRIMARY KEY, value text);
sqlite> INSERT INTO ma_table VALUES ( 1,'abcd');
sqlite> INSERT INTO ma_table VALUES ( 2,'fgh');
sqlite> INSERT INTO ma_table VALUES ( 100,'cent');
sqlite> INSERT INTO ma_table VALUES ( 10,'dix');
sqlite> INSERT INTO ma_table VALUES ( 512,'cinq cent douze');
sqlite> INSERT INTO ma_table VALUES ( 1512,'mille cinq cent douze');
sqlite> DROP VIEW IF EXISTS ma_table2;
sqlite> CREATE VIEW ma_table2 AS SELECT substr('0000' || codeP,length(codeP)) AS
 codeP,
   ...> value AS value FROM ma_table;
sqlite> SELECT * FROM ma_table2;
00001|abcd
00002|fgh
00010|dix
00100|cent
00512|cinq cent douze
01512|mille cinq cent douze
sqlite>

Tu as bien toujours 5 caractères à l'affichage.
a+
bigane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 20h16   #5
Membre actif
 
Inscription : décembre 2004
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 169
Points : 175
Points : 175
PS: Si tu voulais un formatage à droite (par exemple avec des espaces) tu pourrais avoir une formule du genre :


Code :
SELECT substr(codeP || '     ',6-length(codeP))
bigane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 20h27   #6
Membre du Club
 
Inscription : décembre 2007
Messages : 239
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 239
Points : 59
Points : 59
Ca m'interesse un peu plus alors, mais mon but est quand meme de stocker cette variable sous forme "00001" au lieu de "1", je ne crois pas savoir (je précise que je suis on ne peut plus débutant) qu'une vue permette de faire ça, est ce que "substr" pourrait me faire ça à la création de ma table?

Encore merci de ton aide
Somato est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 22h13   #7
Membre actif
 
Inscription : décembre 2004
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 169
Points : 175
Points : 175
Ha, mais ce n'est pas la même chose. Dans ton premier post c'était uniquement pour afficher...


Mais ce n'est pas grave, on peut tricher pour obtenir ton résultat.
Voici ce que je te propose : une colonne primary key cachée qui alimente ta colonne codeP lors des insert. En théorie, tu ne devrais jamais modifier la codeP avec un update puisque c'est une clé primaire. Donc pas de trigger pour les updates.

Voici un script qui résume tout :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
DROP TABLE IF EXISTS ma_table;
CREATE TABLE ma_table (codeP text, value text);
 
 
CREATE TRIGGER tg1 BEFORE INSERT ON ma_table
FOR EACH ROW BEGIN
  SELECT RAISE(ROLLBACK, 'codeP doit etre unique')
  WHERE (SELECT 1 FROM ma_table WHERE 
       codeP+0 = NEW.codeP+0) IS NOT NULL;
END;
 
CREATE TRIGGER tg2 AFTER INSERT ON ma_table
FOR EACH ROW BEGIN
  UPDATE MA_TABLE SET codeP = SUBSTR('0000' || NEW.rowid, LENGTH(NEW.rowid)) 
     WHERE new.codeP IS NULL AND rowid = NEW.rowid;
  UPDATE MA_TABLE SET codeP = SUBSTR('0000' || NEW.codeP, LENGTH(NEW.codeP)) 
     WHERE codeP = NEW.codeP AND NEW.codeP IS NOT NULL;
END;
 
INSERT INTO ma_table VALUES ( 1,'abcd');
INSERT INTO ma_table VALUES ( 2,'fgh');
INSERT INTO ma_table VALUES ( 100,'cent');
INSERT INTO ma_table VALUES ( 10,'dix');
INSERT INTO ma_table VALUES ( 512,'cinq cent douze');
INSERT INTO ma_table VALUES ( 1512,'mille cinq cent douze');
INSERT INTO ma_table (value) VALUES ('valeur sans codeP');
INSERT INTO ma_table VALUES ( 512,'cinq cent douze encore');
SELECT * FROM ma_table;
Et voilà le résultat sur une base :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SQLite version 3.5.8
Enter ".help" FOR instructions
sqlite> .READ ma_table.sql
SQL error near line 28: codeP doit etre UNIQUE
00001|abcd
00002|fgh
00100|cent
00010|dix
00512|cinq cent douze
01512|mille cinq cent douze
00007|valeur sans codeP
sqlite>
Il ne te reste plus qu'à mettre un index simple sur la colonne codeP avec la commande create index ou directement dans la création de la table.

Au résultat : pas de vue, une colonne qui se comporte comme une clé primaire et comme si elle était numérique car elle contient soit la valeur numérique que tu y mets, soit la valeur de l'autoincrément qui est gérée par SQLite.

ouf.
a+
bigane est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h19.


 
 
 
 
Partenaires

Hébergement Web