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

SQLite Discussion :

Je ne vois pas du tout comment faire ? O.o


Sujet :

SQLite

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 66
    Points
    66
    Par défaut Je ne vois pas du tout comment faire ? O.o
    Bonjour,

    Pour un TP projet de BD en SQLite j'ai une table nommé réservation que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table Reserver
           (id_reservation 	integer PRIMARY KEY,
             id_client_R integer NOT NULL,
             id_vehicule_R integer NOT NULL,
             debut_R Date NOT NULL,
             fin_R Date NOT NULL,
    Et en fait c'est un client qui peut réserver un véhicule.

    Et moi ce que je veux, c'est lorsque j’insère une nouvelle réservation pour un même véhicule.
    Cette réservation ne doit pas être durant la même plage que les réservations existantes. (En gros on ne peut réserver un véhicule déjà réservé).

    Comment peut-on exprimer ces contraintes ? svp car je galère depuis 2 jours et je n'ai pas trouvé de méthode...

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Comme il s'agit d'un TP, vous donner la solution serait certainement contre productif.
    Réfléchissez comment savoir s'il y a des réservations pour une date donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where date_début_reservation between debut_r and fin_r
    à cela vous rajoutez bien sûr le critère d'identification du véhicule
    Donc, si le véhicule est disponible à la location vous n'aurez aucune ligne résultat ce qui peut s'obtenir par exemple par un ou dans le cas de requêtes un peu plus complexes en utilisant EXISTS.
    À ceci vous devez aussi, évidemment rechercher si le véhicule n'est pas réservé avant que le client ne rende la voiture (date_fin_réservation).

    Bon, logiquement il devrait aussi y avoir des garde-fous pour permettre la maintenance, nettoyage, retard et autres écarts possibles mais rien que des fonctions de dates ne puissent gérer.

    Ah, un dernier point, pas la peine de CRIER dans le titre (que j'ai donc ajusté) de même un titre plus "parlant" aurait certainement été plus approprié i.e "recherche entre deux dates"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    SergioMaster, je vous remercie pour votre réponse .

    Pour moi le select ne pose pas de soucis j'ai même fait ceci (on affiche l'ensemble des véhicules disponibles entre la date de départ et de fin) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            SELECT * FROM (Vehicule NATURAL JOIN Energie NATURAL JOIN Ville NATURAL JOIN Boite NATURAL JOIN Categorie) where id_vehicule==(select id_vehicule_B from (select * from Bailler where (("2019-04-14 16:00" BETWEEN debut_B and fin_B) AND ("2019-04-14 20:00" BETWEEN debut_B and fin_B))) WHERE (NOT EXISTS (select * from Reserver where (("2019-04-14 16:00" BETWEEN debut_R and fin_R) AND ("2019-04-14 20:00" BETWEEN debut_R and fin_R)))));
    Mais moi mon principal soucis, c'est que je veux que cette vérification se lance lorsque j'insère dans réserver je fait automatiquement la base de donnée verifie si l'insertion peut se faire ou non et
    dans le cas contraire on génère une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into Reserver values(1,7,28,"2019-04-17 11:00","2020-04-17 11:00");

    PS : J'ai pensé au trigger mais celui-ci ne peut générer des erreurs, à moins que je rajoute un check dans réserver et le trigger va me faire déclencher le check... Je ne sais pas si c'est possible

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pour commencer, je suis un anti '*' acharné et adepte des CTEs histoire de rendre les codes plus "lisible", il y a certainement quelque chose de plus "lisible" à faire avec votre SQL.

    Pour ce qui est du Trigger il doit être possible de lever une erreur RAISE() à l'intérieur de celui-ci c'est en tout cas ce que je ferais avec Firebird pour SQLite que j'utilise peu, je ne sais pas avec certitude si c'est possible
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    à ok moi je fait du SQLite via JDBC en fesant.

    Merci SergioMaster pour l'astuce du Raise, effectivement en SQLite on peut générer une erreur en utilisant un trigger je vais chercher...

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par lockmanz Voir le message
    à ok moi je fais du SQLite
    Mdr, Firebird est le SGBD que j'utilise le plus souvent , JDBC est plus un outil de connexion JAVA à des bases de données
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 66
    Points
    66
    Par défaut recherche entre deux dates
    à ok xD en faite j'y connais pas grand chose lol

    Finalement j'ai réussi à trouver la solution grâce à vous SergioMaster que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER detection_conflit_baille
        BEFORE INSERT ON Bailler
        BEGIN
            SELECT CASE WHEN EXISTS(Select id_baille from Bailler where id_vehicule_B==NEW.id_vehicule_B AND ((debut_B < NEW.debut_B and NEW.debut_B < fin_B) or (debut_B < NEW.fin_B and NEW.fin_B < fin_B))) THEN RAISE (ABORT,'Les Dates saisies ne peuvent être ajouté, il y a des confils avec d autres bailles pour le même véhicule')
            END;
        END;

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

Discussions similaires

  1. Switch: pas de variables, comment faire ?
    Par ironzorg dans le forum SDL
    Réponses: 2
    Dernier message: 30/05/2007, 18h18
  2. Switch: pas de variables, comment faire ?
    Par ironzorg dans le forum C
    Réponses: 2
    Dernier message: 30/05/2007, 18h18
  3. [Always on top][pas de MFC] comment faire
    Par magnus2005 dans le forum Windows
    Réponses: 3
    Dernier message: 20/04/2007, 11h45
  4. [requête] Je ne vois pas comment faire
    Par Satch dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/05/2006, 12h02
  5. [XSL]Comment faire ceci ?? Mon for-each n'affiche pas tout !
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/07/2005, 15h04

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