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 02/07/2008, 13h55   #1
Candidat au titre de Membre du Club
 
Inscription : juillet 2008
Messages : 27
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : juillet 2008
Messages : 27
Points : 11
Points : 11
Par défaut Sqlite sous OpenOffice (Base)

Bonjour,
J'ai une base de donnée sous OObase qui comprends :
- Une base
- Un formulaire
- Plusieurs requêtes
- Plusieurs rapports

Mon problème actuel interviens au niveau des requêtes, je n'arrive pas a faire une recherche à choix multiples.
Ex :
>> Si "cloture 1" = 'vraie' alors j'attrape la valeur "date 1" et/ou
>> Si "cloture 2" = 'vraie' alors j'attrape la valeur "date 2" et/ou
>> Si "cloture 3" = 'vraie' alors j'attrape la valeur "date 3" etc etc...
Ceci dans mes nombreuses fiches que comprens ma base.

En ce moment je suis obligé de faire une requête pour chaque recherche, dans la première :
>> Si "cloture 1" = 'vraie' alors j'attrape la valeur "date 1".
Puis dans une autre :
>> Si "cloture 2" = 'vraie' alors j'attrape la valeur "date 2".
etc etc...

Vous comprennez donc que c'est très long au vue du nombre de champ a tester et je dirrait même que c'est très difficile par la suite de faire un rapport lisible avec un minimum de trie (par date par ex.)


Voila, je suis ouvert à toute vos aides et conseils que vous pouvez m'apporter. Et si vous avez besoin de plus d'informations n'hésitez pas.

Cordialement,
Guillaume M.
Guillaume M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2008, 12h03   #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
Bonjour Guillaume,

J'ai du mal à comprendre ton problème et je pense que d'autres ont la même difficulté d'où l'absence de réponse à ta question.

Je vais tenter d'y répondre quand même. Voyons...

1) OObase je connais, seulement :
- soit tu utilises la base de données intégrée à OpenOffice.org et dans ce cas, tu publies dans le mauvais forum.
- soit tu utilises réellement un pilote ODBC pour accéder à une base SQLite et dans ce cas, il nous faut plus de précision sur ce pilote (sa provenance et la version de SQLite).
- soit tu utilises une autre solution que je ne connais pas et je suis preneur !

2) Si tu utilises SQLite, il y a une solution qui passe par l'utilisation de la commande "CASE ... WHEN ... THEN ... ELSE ... END" dans la requête.
Cette commande est ultra puissante mais peu de monde l'utilise car elle ne ressemble à rien de connu dans le SQL habituel.

Je vais créer une base pour te faire un exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
DROP TABLE IF EXISTS COURS;
CREATE TABLE Cours (
  ID  INTEGER PRIMARY KEY,
  CLOTURE_1 BOOLEAN,
  DATE_1 DATE,
  CLOTURE_2 BOOLEAN,
  DATE_2 DATE,
  CLOTURE_3 BOOLEAN,
  DATE_3 DATE);
 
INSERT INTO Cours VALUES (NULL, 0, '2008/07/01', 1, '2008/07/02', 0, '2008/07/03');
INSERT INTO Cours VALUES (NULL, 1, '2008/07/04', 0, '2008/07/05', 1, '2008/07/06');

Sélection d'une colonne selon les cas :

Code :
1
2
3
4
5
6
7
8
9
 
SELECT ID,
CASE 
  WHEN CLOTURE_1 = 1 THEN DATE_1
  WHEN CLOTURE_2 = 1 THEN DATE_2
  WHEN CLOTURE_3 = 1 THEN DATE_3
  ELSE NULL
END AS LaDate
FROM Cours;
Et voici le résultat de la requête :

Code :
1
2
1|2008/07/02
2|2008/07/04
Si tu es sur SQLite, alors ce type de commande SQL doit pouvoir résoudre en partie ton problème.

a+
bigane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2008, 10h53   #3
Candidat au titre de Membre du Club
 
Inscription : juillet 2008
Messages : 27
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : juillet 2008
Messages : 27
Points : 11
Points : 11
Bonjour,

Mon problème n'est pas facile à exposer je m'en excuse.

Pour le premier point, je n'utilise pas la base de données OObase (non adapté) mais un pilote ODBC comme tu le stipule.
Citation:
Le nom du driver est le suivant : SQLite 3 ODBC driver et la version : 0.74.00.00
Pour ce qui est du second point, j'utilise actuellement le code suivant :
Code :
SELECT "NUM", "date_2", "cloture_2" FROM "BaseODBC" WHERE ( ( "cloture_2" = 1 ) )
Ce code fonctionne actuellement pour la prise d'informations si une case est cochée.

J'ai l'impression que les requêtes que je fais sous OObase ne peuvent pas être sur plusieurs lignes (de programmation) ou sur plusieurs critères (de sélection). Est-ce une fausse idée que je me suis faite ?

Je peux te transmettre mes lignes de codes (non fonctionnel car erreur) que je souhaiterai mettre en pratique.
Code :
1
2
3
4
5
SELECT "NUM", "date_1", "cloture_1" FROM "BaseODBC" WHERE ( ( "cloture_1" = 1 ) ) 
SELECT "NUM", "date_2", "cloture_2" FROM "BaseODBC" WHERE ( ( "cloture_2" = 1 ) )
SELECT "NUM", "date_3", "cloture_3" FROM "BaseODBC" WHERE ( ( "cloture_3" = 1 ) )
SELECT "NUM", "date_4", "cloture_4" FROM "BaseODBC" WHERE ( ( "cloture_4" = 1 ) )
SELECT "NUM", "date_5", "cloture_5" FROM "BaseODBC" WHERE ( ( "cloture_5" = 1 ) )
Je sais déjà qu'il manque des opérateurs de fin de ligne tel que "OU" ou "ET" et que mon développement n'ai pas judicieux. Tu trouveras surement un moyen de corriger ces erreurs de programmation.

Je te remercie et j'attends vivement ta réponse.
Cordialement
Guillaume M.
Guillaume M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2008, 13h34   #4
Candidat au titre de Membre du Club
 
Inscription : juillet 2008
Messages : 27
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : juillet 2008
Messages : 27
Points : 11
Points : 11
Bonjour,

Tout d'abord, Bigane, je souhaiterai savoir si tu n'a pas fait une erreur ici
Citation:
Et voici le résultat de la requête :
Code :
1
2
1|2008/07/02
2|2008/07/04
Car avec la table que tu décris plus haut il devrait aussi en ressortir une ligne 2|2008/07/06.


Pour ce qui est de l'exemple de requête que tu m'as fourni : je l'ai adapté à ma base et à mes besoins et cela me donne ceci.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT "NUM"	 AS "Num","NOM" AS Nom,
CASE 
  WHEN cloture_1 = '1' THEN date_1
  WHEN cloture_2 = '1' THEN date_2
  WHEN cloture_3 = '1' THEN date_3
  WHEN cloture_4 = '1' THEN date_4
  WHEN cloture_5 = '1' THEN date_5
  WHEN cloture_6 = '1' THEN date_6
  WHEN cloture_7 = '1' THEN date_7
ELSE NULL
END AS Date
FROM BASE
Ce code me sort la totalité de mes fiches, pour ce qui est de celle qui sont concernées dans la case Date il y a la date de correspondance pour les autres un champ vide.
A mon niveau je ne veux pas voir les fiches qui ne sont pas concerné et donc qui n'ont aucune donnée dans leur colonne "Date" qui leurs son associé.
J'ai passé à travers le problème de façon bête et méchante, j'ai ajouté un trie par "Date" décroissante
Code :
1
2
3
...
FROM BASE 
ORDER BY Date DESC
Et après il me suffira que couper mon tableau une fois le rapport édité.

Je te joins par MP le formulaire de ma base de donnée ça t'aidera sûrement à comprendre un peu mieux graphiquement ce que je recherche.

Cordialement,
Guillaume M.
Guillaume M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2008, 00h53   #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
Bonsoir Guillaume,

1) réponse à ton dernier mail : non je n'ai pas fait d'erreur, le cas 1 passe avant le cas 3 et termine le select. En gros, en pseudo code cela donnerait :
si cloture_1 alors Date_1
sinon si cloture_2 alors Date_2
sinon si cloture_3 alors Date_3
sinon NULL

Ce qui explique la ligne "2|2008/07/04" uniquement.

2) Difficile de bien comprendre ton besoin mais je peux te proposer quelques pistes.

En premier, je vais optimiser un peu ta requête (pour la présentation seulement : pas besoin de mettre des guillemets pour désigner tes colonnes s'il n'y a pas d'espace, tu peux oublier le AS si le nom de la colonne de résultat est le même que celui dans la table) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT Num, Nom,
CASE 
  WHEN cloture_1 = '1' THEN date_1
  WHEN cloture_2 = '1' THEN date_2
  WHEN cloture_3 = '1' THEN date_3
  WHEN cloture_4 = '1' THEN date_4
  WHEN cloture_5 = '1' THEN date_5
  WHEN cloture_6 = '1' THEN date_6
  WHEN cloture_7 = '1' THEN date_7
ELSE NULL 
END AS Date
FROM BASE WHERE Date IS NOT NULL ORDER BY Date DESC
Cette requête ne te donne que les fiches Num ayant au moins une case de cochée. Par contre, la date sera celle de la première clôture rencontrée, donc pas forcément la plus récente.

3) En fait, on peut imaginer une vue qui te retourne la date la plus ancienne (ou la plus récente) d'une fiche à condition qu'elle ait au moins une clôture sinon, cette date sera NULL. L'intérêt de la vue c'est que tu peux l'interroger comme une table depuis ton moteur ODBC sans avoir à faire des requêtes complexes.

Voyons... je me permet de créer une table d'essais pour te montrer cet exemple :
Code :
1
2
3
4
5
6
7
8
9
10
CREATE TABLE Base (
  NUM INTEGER PRIMARY KEY,
  NOM TEXT,
  CLOTURE_1 BOOLEAN, DATE_1 DATE,
  CLOTURE_2 BOOLEAN, DATE_2 DATE,
  CLOTURE_3 BOOLEAN, DATE_3 DATE,
  CLOTURE_4 BOOLEAN, DATE_4 DATE,
  CLOTURE_5 BOOLEAN, DATE_5 DATE,
  CLOTURE_6 BOOLEAN, DATE_6 DATE,
  CLOTURE_7 BOOLEAN, DATE_7 DATE);
On ajoute quelques données :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO Base VALUES (NULL, 'Toto', 
  0, '2008/07/07',  0, '2008/07/06', 
  0, '2008/07/05',  0, '2008/07/04',
  0, '2008/07/03',  0, '2008/07/02',  0, '2008/07/01');
 
INSERT INTO Base VALUES (NULL, 'Titi', 
  0, '2008/07/17',  0, '2008/07/16', 
  0, '2008/07/15',  1, '2008/07/14',
  0, '2008/07/13',  0, '2008/07/12',  1, '2008/07/11');
 
INSERT INTO Base VALUES (NULL, 'Tata', 
  0, '2008/07/21',  0, '2008/07/24', 
  1, '2008/07/22',  0, '2008/07/25', 
  0, '2008/07/23',  1, '2008/07/26',  0, '2008/07/27');
Accroche toi, on attaque la vue complexe, je cherche à trouver le date de clôture minimale (la plus ancienne donc) pour chaque fiche :

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
30
31
32
33
34
35
36
37
38
39
40
DROP VIEW IF EXISTS VueBase;
CREATE VIEW VueBase AS 
SELECT Num, Nom,
CASE 
  WHEN (cloture_1 = '1') THEN 
    MIN(MIN(MIN(MIN(MIN(MIN(date_1, 
    CASE WHEN (cloture_2 = '1') THEN date_2 ELSE date_1 END),
    CASE WHEN (cloture_3 = '1') THEN date_3 ELSE date_1 END),
    CASE WHEN (cloture_4 = '1') THEN date_4 ELSE date_1 END),
    CASE WHEN (cloture_5 = '1') THEN date_5 ELSE date_1 END),
    CASE WHEN (cloture_6 = '1') THEN date_6 ELSE date_1 END),
    CASE WHEN (cloture_7 = '1') THEN date_7 ELSE date_1 END)
  WHEN (cloture_2 = '1') THEN 
    MIN(MIN(MIN(MIN(MIN(date_2, 
    CASE WHEN (cloture_3 = '1') THEN date_3 ELSE date_2 END),
    CASE WHEN (cloture_4 = '1') THEN date_4 ELSE date_2 END),
    CASE WHEN (cloture_5 = '1') THEN date_5 ELSE date_2 END),
    CASE WHEN (cloture_6 = '1') THEN date_6 ELSE date_2 END),
    CASE WHEN (cloture_7 = '1') THEN date_7 ELSE date_2 END)
  WHEN (cloture_3 = '1') THEN 
    MIN(MIN(MIN(MIN(date_3, 
    CASE WHEN (cloture_4 = '1') THEN date_4 ELSE date_3 END),
    CASE WHEN (cloture_5 = '1') THEN date_5 ELSE date_3 END),
    CASE WHEN (cloture_6 = '1') THEN date_6 ELSE date_3 END),
    CASE WHEN (cloture_7 = '1') THEN date_7 ELSE date_3 END)
  WHEN (cloture_4 = '1') THEN 
    MIN(MIN(MIN(date_4, 
    CASE WHEN (cloture_5 = '1') THEN date_5 ELSE date_4 END),
    CASE WHEN (cloture_6 = '1') THEN date_6 ELSE date_4 END),
    CASE WHEN (cloture_7 = '1') THEN date_7 ELSE date_4 END)
  WHEN (cloture_5 = '1') THEN 
    MIN(MIN(date_5, 
    CASE WHEN (cloture_6 = '1') THEN date_6 ELSE date_5 END),
    CASE WHEN (cloture_7 = '1') THEN date_7 ELSE date_5 END)
  WHEN (cloture_6 = '1') THEN 
    MIN(date_6, 
    CASE WHEN (cloture_7 = '1') THEN date_7 ELSE date_6 END)
  WHEN (cloture_7 = '1') THEN date_7 
ELSE NULL END AS Date
FROM BASE;
Cette vue est intéressante, car elle montre l'utilisation que l'on peut faire de l'ordre CASE WHEN...THEN...ELSE...END. On peut en mettre presque partout. C'est comme une fonction, il faut la comparer à la fonction SI(...;...;...) de Calc.

Et voici les résultats de quelques requêtes simples :
Code :
1
2
3
4
5
6
7
8
9
10
11
sqlite> SELECT * FROM vuebase;
1|Toto|
2|Titi|2008/07/11
3|Tata|2008/07/22
sqlite> SELECT num,nom,date FROM vuebase;
1|Toto|
2|Titi|2008/07/11
3|Tata|2008/07/22
sqlite> SELECT num,nom,date FROM vuebase WHERE date IS NOT NULL;
2|Titi|2008/07/11
3|Tata|2008/07/22
Tout cela ne répond pas exactement à ta demande, mais je pense que ça peut t'aider à trouver une solution.

a+
bigane 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 03h47.


 
 
 
 
Partenaires

Hébergement Web