Précédent   Forum du club des développeurs et IT Pro > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 18/12/2012, 15h22   #1
Jefty
Nouveau Membre du Club
 
Avatar de Jefty
 
Homme
Développeur informatique
Inscription : décembre 2009
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2009
Messages : 169
Points : 39
Points : 39
Par défaut Trigger de vérification et de mise à jour

Bonjour,

J'ai un soucis sur la réalisation d'un trigger.
Je m'explique, j'ai 3 tables, COMMANDE, BL et BL_Ligne.
Une COMMANDE peut avoir plusieurs BL, un BL n'appartient qu'a une COMMANDE.
Un BL peut avoir plusieurs BL_Ligne et un BL_Ligne n'appartient qu'a un BL.

Je souhaite qu'a l'insert, l'update et le delete d'un BL, on vérifie que le BL est valide et que chaque BL_Ligne est Valide aussi.
Pour ça dans chacune des deux tables on à une propriété Valide de type booléen.

Si tous les BL d'une COMMANDE sont "Valide" et que tous les BL_Ligne des BL correspondant sont "Valide" aussi, on considère que COMMANDE est "Soldé".
Soldé est aussi un booléen, dans la table COMMANDE.

Mon trigger doit donc, en ayant à disposition l'Identifiant du BL et celui de la COMMANDE puisqu'il aura lieu au insert/update/delete d'un BL, vérifié que les BL_Lignes qui lui sont rattachés soient tous "Valide" et que le BL lui même soit "Valide".
Il doit de plus chercher tout les autres BL qui correspondent à la COMMANDE, à partir de l'IdCommande. Et donc vérifié de nouveau la validité des BL et des BL_Ligne.

Je sais pas si c'est pas un peu confus ce que je raconte.
Si vous avez des questions, hésité pas.

J'avais fait un petit bout de code complètement faux, mais bon, c'est juste pour vous montrez que j'ai chercher un peu.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
BEGIN
		FOR each row(
			SELECT BON_LIVRAISON_LIGNE.Solde 
			FROM BON_LIVRAISON 
			INNER JOIN BON_LIVRAISON_LIGNE ON BON_LIVRAISON_LIGNE.IdBonLivraison = BON_LIVRAISON.IdBonLivraison
			WHERE BON_LIVRAISON.IdCommande = @IdCOmmande
			)
		IF BON_LIVRAISON_LIGNE.Solde = 0
			@Count = 1
		end loop;
		IF @Count = 0 
			UPDATE COMMANDE SET Commande.Solde = 1
    END
Merci d'avance pour toute aide apportée.
Jefty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 16h24   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
1) Quel est votre SGBD ?
Il y a des variantes dans le langage et la syntaxe employés pour le SQL procédural selon le SGBD.

2) Le trigger s'applique à quelle table ?
Citation:
Je souhaite qu'a l'insert, l'update et le delete d'un BL, on vérifie que le BL est valide et que chaque BL_Ligne est Valide aussi.
Apparemment, c'est un trigger sur la table des BL.

3) Quel type de BL ?
Sont-ce des BL de commandes reçues d'un fournisseur ou des BL de commandes à livrer à un client ?

4) Quel est le processus ?
Validation individuelle des lignes puis validation manuelle du BL ou automatique ?

L'application permet-elle d'enregistrer en même temps un nouveau BL et toutes ses lignes validées ou bien y a t-il d'abord création du BL puis des lignes puis validation des lignes... ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 16h39   #3
Jefty
Nouveau Membre du Club
 
Avatar de Jefty
 
Homme
Développeur informatique
Inscription : décembre 2009
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2009
Messages : 169
Points : 39
Points : 39
Vous allez rire, ou pas, mais en faite je suis partie trop loin.
Mon chef de projet vient de me voir et j'ai mal compris la table BL_Ligne.
En faite j'ai juste un trigger à faire qui vérifie la validité dans la table BL a l'insert update et delete d'un BL.
Ça va être tout de suite moins perché.

A part peut être la vérification de chaque BL dans un trigger.
Jefty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 17h16   #4
Jefty
Nouveau Membre du Club
 
Avatar de Jefty
 
Homme
Développeur informatique
Inscription : décembre 2009
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2009
Messages : 169
Points : 39
Points : 39
Voilà mon nouveau code:

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
 DECLARE @IdCommande int
    DECLARE @IdFacture int
    DECLARE @Count int = 0
 
    SELECT @IdCommande = IdCommande FROM deleted
    SELECT @IdCommande = IdCommande FROM inserted
 
 
    CREATE TABLE #Result
    (
		IdFacture int
    )
 
     INSERT #Result (IdFacture)
		SELECT 
		IdFacture
		FROM BON_LIVRAISON
		WHERE BON_LIVRAISON.IdCommande = @IdCommande 
 
 
    SELECT @IdFacture = IdFacture FROM #Result
    IF @IdFacture = NULL
		SET @Count = 1
 
	IF @Count = 0
		UPDATE COMMANDE SET Solde = 1 WHERE IdCommande = @IdCommande
Mais je me pose plusieurs questions.

La première, c'est au sujet de la gestion des tables Inserted et Deleted, la manière utilisé est elle bonne?

L'autre question c'est de savoir si en fessant comme ça, je lis bien toutes les lignes de la table #Result que j'ai créée avant de faire le IF, si c'est pas le cas, bah ça sert à rien, je me trompe donc.

Si vous pouviez m'éclairé.
Merci.
Jefty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 10h26   #5
Jefty
Nouveau Membre du Club
 
Avatar de Jefty
 
Homme
Développeur informatique
Inscription : décembre 2009
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2009
Messages : 169
Points : 39
Points : 39
J'ai finalement fait une simple reqête avec un count.

Code :
1
2
3
4
5
6
7
8
9
10
11
 
DECLARE @IdCommande int
DECLARE @IdFacture int
 
SELECT @IdCommande = IdCommande FROM deleted
SELECT @IdCommande = IdCommande FROM inserted
 
SELECT @IdFacture = COUNT(1) 
FROM BON_LIVRAISON bl 
WHERE bl.IdFacture IS NULL 
AND bl.IdCommande = @IdCommande
Jefty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h26.


 
 
 
 
Partenaires

Hébergement Web