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 :

Trigger et tables liées


Sujet :

SQLite

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut Trigger et tables liées
    Bonjour,

    Voilà un moment que je tourne en rond sans m'en sortir. C'est pourquoi je vous sollicite en espérant que quelqu'un trouve une solution à mon problème.

    J'ai 3 tables (base de données SQLite3) :

    Employe
    Contrat

    Table Employe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE [Employe] ([idEmploye] INTEGER PRIMARY KEY AUTOINCREMENT, 
    [Nom] VARCHAR(200) NOT NULL, 
    [Prenom] VARCHAR(200) NOT NULL);
    Table Contrat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE [Contrat] ([idContrat] INTEGER PRIMARY KEY AUTOINCREMENT, 
    [NumeroContrat] VARCHAR(100);
    Table Souscription (lien entre les tables Contrat et Employe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE [Souscription] ([idContrat] INTEGER REFERENCES [Contrat](idContrat) ON DELETE CASCADE ON UPDATE CASCADE ON INSERT CASCADE,
    [idEmploye] INTEGER REFERENCES [Employe](idEmploye) ON DELETE RESTRICT ON UPDATE CASCADE, [DateSouscription] DATE);
    Depuis une fenêtre, je souhaite ajouter un nouveau contrat pour un employé. J'ai donc mes 2 tables Contrat et Souscription ouverte en mode ajout.
    Lorsque je valide les saisies, je retrouve bien toutes mes informations dans mes tables sauf une. Dans la table Souscription, le champ idContrat est à NULL.

    Je pensais passer par un trigger after insert sur la table Contrat mais ça ne fonctionne pas.

    Quelqu'un aurait-il une solution à m'apporter ? Merci d'avance pour vos réponses.

  2. #2
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 169
    Par défaut
    Bonjour,

    SQLite a besoin de plus d'éléments pour remplir ses tables ; leur structure seule ne suffisant pas.

    En effet, tu as deux tables indépendantes (Employe et Contrat) et une table qui devrait faire le lien entre elles. Cependant, rien n'indique que ce lien est unique ou pas (relations de 0 à n, de 1 à 1, de n à n, etc...). Tu dois donc gérer ces relations par code ou par trigger.

    Pour arriver à tes fins, je te propose une vue contenant toutes les colonnes utiles pour tes trois tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DROP VIEW IF EXISTS Souscrire;
    CREATE VIEW Souscrire AS 
    SELECT e.idEmploye, c.NumeroContrat, s.DateSouscription
    FROM Employe e, Contrat c, Souscription s
    WHERE e.idEmploye = s.idEmploye AND c.idContrat = s.idContrat;
    Avec un seul trigger sur cette vue, on arrive à gérer les INSERTs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TRIGGER insert_Souscrire INSTEAD OF INSERT ON Souscrire 
    FOR EACH ROW BEGIN
        INSERT INTO Contrat (NumeroContrat) values (new.NumeroContrat);
     
        INSERT INTO Souscription (idContrat, idEmploye, DateSouscription) 
          VALUES (last_insert_rowid(), NEW.idEmploye, NEW.DateSouscription);
    END;
    Lorsque l'on valide la saisie d'un nom de contrat et d'une date pour un employé donné, on lance une unique requête (exemple de création de quelques enregistrements) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Insert into Employe (Nom, Prenom) values ('A','PAAA');
    Insert into Employe (Nom, Prenom) values ('B','PBBB');
    Insert into Employe (Nom, Prenom) values ('C','PCCC');
     
     
    INSERT INTO Souscrire (idEmploye, NumeroContrat, DateSouscription)
    VALUES (1, 'Premier Contrat de A', '20090819');
     
    INSERT INTO Souscrire (idEmploye, NumeroContrat, DateSouscription)
    VALUES (1, 'Second Contrat de A', '20090820');
     
    INSERT INTO Souscrire (idEmploye, NumeroContrat, DateSouscription)
    VALUES (2, 'Contrat de B', '20090819');
     
    INSERT INTO Souscrire (idEmploye, NumeroContrat, DateSouscription)
    VALUES (3, 'Contrat de C', '20090819');
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sqlite> select * from Contrat;
    1       Premier Contrat de A
    2       Second Contrat de A
    3       Contrat de B
    4       Contrat de C
    sqlite> select * from Souscription;
    1       1       20090819
    2       1       20090820
    3       2       20090819
    4       3       20090819
    Voili, voilà,
    a+

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Merci bigane. Ca marche
    J'ai juste fais la même chose avec update et maintenant, tout fonctionne.

    Encore merci

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

Discussions similaires

  1. Mise à jour des tables liées + TIMESTAMP
    Par Homegrown dans le forum Access
    Réponses: 11
    Dernier message: 25/04/2005, 21h52
  2. Réponses: 8
    Dernier message: 05/04/2005, 22h17
  3. Connaitre si table liée
    Par Njara dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2004, 16h35
  4. [select dans case] reconnaitre un champ d une table liée
    Par the_edge dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 22/10/2004, 16h47
  5. Count et tables liées ?
    Par seb_perl dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/02/2004, 12h52

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