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

 Firebird Discussion :

Contrainte sur un champ d'une autre table


Sujet :

Firebird

  1. #1
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut Contrainte sur un champ d'une autre table
    Salut
    est-il possible de faire une contrainte sur un champ d'une autre table ?
    j'ai la table TB_COURRIER et la table TB_ARRIVEE, dans la seconde table j'ai le champ DATE_ENREGISTREMENT alors que dans la première table j'ai le champ DATE_CORRESPONDANCE. Je veux faire une contrainte sur le champ DATE_ENREGISTREMENT qui doit être supérieur ou égale à la date renseignée dans le champ DATE_CORRESPONDANCE car un courrier peut pas être enregistré avant d'être édité !

    donc j'ai fais ça :
    DATE_ENREGISTREMENT >=TB_COURRIER.DATE_CORRESPONDANCE
    mais ça marche pas, sous IBExpert j'ai eu cette erreur :
    Column does not belong to referenced table.
    Dynamic SQL Error.
    SQL error code = -206.
    Column unknown.
    TB_COURRIER.DATE_CORRESPONDANCE.
    At line 3, column 42.
    ma question est puis-je faire ça ou non ? si oui comment ?

    merci par avance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonjour,

    Non, d'ailleurs pour s'en persuader, il suffit de se poser la question comment FB retrouverait l'enregistrement correspondant de la table TB_COURRIER ?

    Pour faire ce genre de contrainte il faut tout simplement utiliser les triggers.

  3. #3
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    merci pour la réponse quoique pour le 1ière partie je ne suis pas tout à fait d'accord car une clé étrangère résoudrait le problème de l'enregistrement correspondant.

    donc, je vais voir coté triggers même si ça parait difficile rien qu'en lisant le nom triggers .....
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    merci pour la réponse quoique pour le 1ière partie je ne suis pas tout à fait d'accord car une clé étrangère résoudrait le problème de l'enregistrement correspondant.
    En théorie oui, mais ca ne traiterai qu'un cas particulier...
    S'il y a plusieurs clés étrangères, laquelle choisir ? S'il n'y en a pas, (gérer par l'application) comment faire ? Si c'est une relation n-n quoi mettre à jour ? etc... Beaucoup de cas qui ne peuvent pas être gérés 'automatiquement' avec une règle 'simple'.
    De plus ca pose des problèmes plus profonds, comme : Si je supprime ma clé étrangère quid des contraintes liés ?

    Citation Envoyé par Just-Soft Voir le message
    donc, je vais voir coté triggers même si ça parait difficile rien qu'en lisant le nom triggers .....
    Il n'y a rien de compliqué dans les triggers.
    Un trigger peut être exécuté avant ou après une action. (une action c'est INSERT, UPDATE ou DELETE).

    Ici pour faire votre contrôle on va choisir de le faire AVANT INSERT et AVANT UPDATE.

    Dans un trigger on a accès aux anciennes et aux nouvelles valeurs de l'enregistrement à insérer ou mettre à jour. (Dans le cas d'un insert on ne se sert que des nouvelles valeurs).
    Pour cela il suffit de préfixer les champs par OLD. pour les anciennes valeurs et NEW. pour les nouvelles valeurs.

    Et pour signaler l'erreur, le plus simple est de créer une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE EXCEPTION ERR_DATE_ARRIVE_SUP_CREATION 'Erreur, la date d''arrivée doit être plus grande ou égale à la date de création du courrier.';
    Donc le triggers serait du type :

    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
    17
    18
    19
    20
    SET TERM ^ ;
     
    CREATE OR ALTER TRIGGER TB_ARRIVEE_BIU0 FOR TB_ARRIVEE
    ACTIVE BEFORE INSERT OR UPDATE POSITION 0
    AS
    declare variable date_correspondance date;
    begin
      /* Rechercher la date de correspondance du courrier correspondant
      à l'enregistrement ARRIVE à vérifier                             */
      select c.DATE_CORRESPONDANCE
      from TB_COURRIER c
      where c.id=NEW.id_courrier
      into :DATE_CORRESPONDANCE;
      /* Si la date du courrier est plus grande que la date d'arrivée
         signaler l'erreur                                             */
      if (DATE_CORRESPONDANCE>NEW.date_enregistrement) then
         exception ERR_DATE_ARRIVE_SUP_CREATION;
    end
    ^
    SET TERM ; ^

  5. #5
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    merci Barbibulle pour tes explications, je vais les prendre en considération et te tenir au courant de l'état d'avancement.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Re,

    le trigger marche très bien et le SGBD parait assez intelligent de cette façon mais ..... et oui j'ai toujours des mais

    comme je développe mon application sous delphi, je veux exploiter le trigger et remonter l'exception relevée par FB, quelqu'un a-t-il une idée ?

    merci par avance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par Just-Soft Voir le message
    [...]comme je développe mon application sous delphi, je veux exploiter le trigger et remonter l'exception relevée par FB, quelqu'un a-t-il une idée ?
    Une exception sera de toute façon levée par l'application. Le type d'exception dépendant du type de composants utilisés.

    Si tu utilises les UIB, regarde RegisterException de TUIBDatabase. Cela te permet de gérer les exceptions à ta guise et de retourner un message personnalisé à l'utilisateur.

    @+ Claudius

  8. #8
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    malheureusement je suis toujours à l'air des IB ! je continue à chercher mais pour le moment pas très encourageant
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  9. #9
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    l'exception remontera toute seule
    c'est juste que UIB t'aide à mieux les gérer c'est tout
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  10. #10
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Le message de l'exception apparaitra dans une messagebox.

    Tu peux aussi l'intercepter et la traiter par programme dans un bloc try except.

    Et en effet UIB et Fibplus permettent de centraliser la gestion des exceptions. (Ce qui est faisable aussi avec les IBX il suffit de d'intercepter au niveau de l'application des exceptions et de traiter celles qui t'intéressent).

Discussions similaires

  1. [MySQL] [MySQL] Select avec WHERE sur un champs d'une autre table ?
    Par danydan01 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/05/2011, 16h05
  2. Réponses: 3
    Dernier message: 06/09/2008, 06h51
  3. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26
  4. afficher un champ d'une autre table, Help!
    Par chakan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2004, 23h20
  5. [CR] Afficher un champs lié à un champs d'une autre table
    Par Madduck dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 17/09/2003, 11h48

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