Précédent   Forum du club des développeurs et IT Pro > Bases de données > Firebird > Débuter
Débuter Forum d'entraide pour débuter avec Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/03/2011, 15h15   #1
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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 :
Citation:
DATE_ENREGISTREMENT >=TB_COURRIER.DATE_CORRESPONDANCE
mais ça marche pas, sous IBExpert j'ai eu cette erreur :
Citation:
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 19h21   #2
Barbibulle
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 726
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 43

Informations forums :
Inscription : octobre 2002
Messages : 1 726
Points : 2 375
Points : 2 375
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 21h54   #3
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 10h04   #4
Barbibulle
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 726
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 43

Informations forums :
Inscription : octobre 2002
Messages : 1 726
Points : 2 375
Points : 2 375
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 :
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 :
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 ; ^
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 10h26   #5
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 08h57   #6
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 09h12   #7
Cl@udius
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 860
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 50
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 860
Points : 9 946
Points : 9 946
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
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 12h11   #8
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 12h26   #9
makowski
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 260
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 50
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 260
Points : 3 582
Points : 3 582
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 19h33   #10
Barbibulle
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 726
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 43

Informations forums :
Inscription : octobre 2002
Messages : 1 726
Points : 2 375
Points : 2 375
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).
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h25.


 
 
 
 
Partenaires

Hébergement Web