Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/08/2007, 10h01   #1
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 2
Points : 2
Par défaut Trigger sur une même table

Bonjour,

Me voila fraichement débarqué sur ce forum pour déjà appeler au secours.
En même temps je suis pas un killer SQL DB2 ...


J'ai essayé de simplifier au maximum ma demande.

J'ai la table suivante
Code :
1
2
3
4
5
6
7
 
CREATE TABLE ARTICLE ( 
    ARTID       DECIMAL(8,0) NOT NULL DEFAULT 0.0,
    ARTCOLOR	CHARACTER(3) NOT NULL DEFAULT ' ',
    ARTTVA      CHARACTER(1),
    PRIMARY KEY(ARTID,ARTCOLOR)
)
qui me permet de stocker le code article, la couleur et son code TVA.
Un meme code article peut donc avoir plusieurs couleurs.

Mon problème :
Le code TVA doit etre le meme pour un meme code article. Sauf que mon appli ne me permet de ne modifier qu'une ligne à la fois. Je dois donc parcourir toutes les lignes du même article et lui imposer le même code TVA.

Exemple :
Code :
1
2
3
4
5
 ARTID     ARTCOLOR     ARTTVA    
 --------  -----------  --------- 
 23400276  B32          1         
 23400276  V03          1         
 23400276  R90          1
J'aimerais donc à partir d'un trigger ou d'une procédure stockée, pouvoir effectuer la modif de toutes les lignes dès qu'une ligne de cet article est modifiée.

Pour le moment le trigger que j'ai créé effectue des boucles infinie ...

Quelqu'un a t'il la solution miracle pour effectuer cette manipulation ???



Merci d'avance
lamanoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 17h02   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Par défaut Pourquoi un trigger ?

Sur quel OS travailles-tu et dans quel langage ?

Pourquoi ne pas faire un update SQL directement dans le programme ? Pourquoi vouloir un trigger pour fair ela mise à jour ?
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2007, 21h23   #3
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

Informations professionnelles :
Activité : SharePoint developpeur
Secteur : Service public

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
Tu y gagnerais en facilité en utilisant 2 tables en relation.
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h43   #4
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 2
Points : 2
Il s'agit d'une appli ... multi systèmes !
Base de données sur aix
Appli de traitement sur Serveur Windows 2003
Modif de données par appli ou par SQL
Je ne vous détail pas tout, ça ne servirais à rien.
Je connais les différentes solutions à mettre en oeuvre pour optimiser les traitements, dont l'update direct dans l'appli, mais pour le moment je souhaite juste effectuer ma manip à partir d'un trigger, surtout par manque de temps.

De plus je ne peux en aucun cas modifier l'architecure et le schéma actuel des tables !!!

En fait je cherche vraiment à comprendre la limite d'un trigger ...
lamanoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h07   #5
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

Informations professionnelles :
Activité : SharePoint developpeur
Secteur : Service public

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
Citation:
Envoyé par lamanoo Voir le message
Pour le moment le trigger que j'ai créé effectue des boucles infinie ...
C'est normale puisqu'il est appelé à chaque changement et comme dans le trigger tu change une même colonne dans la même table le trigger est à nouveau appelé et ainsi de suite.
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2007, 12h54   #6
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 2
Points : 2
Bonjour à tous !
et merci JAb pour ton analyse de mes boucles infinies ...

et c'est précisement la solution que je cherche ...
N'y a t'il pas moyen de faire la mise à jour de cette table 1 seule fois sans que cela engendre des boucles infinies ???

j'avais vu quelques part une option "no cascade" ...
lamanoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2007, 17h01   #7
Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 56
Points : 56
bonjour,

Il y a bien une option "NO CASCADE BEFORE" mais elle détermine un trigger BEFORE qui n'autorise pas les update...

Je proposerai plutot quelque chose du genre

DROP TRIGGER XTOF.MAJTAV;

CREATE TRIGGER XTOF.MAJTAV
AFTER UPDATE OF ARTTVA
ON XTOF.ARTICLE
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
Declare nb INTEGER;
SET nb = (select count(*) from XTOF.ARTICLE where artid=n.artid and arttva=n.arttva);
IF nb = 1
THEN update article set arttva=n.arttva where artid=n.artid;
END IF;
END ;

On teste si il y a plus d'une ligne, pour l'aticle mis à jour, qui contienne le nouveau code TVA. Si il n'y en a qu'une (celle mise à jour par le premier update), on fait la mise à jour de masse.
Cette mise à jour de masse, redéclenche le trigger mais lui même, n'en déclenche pas.

Ca reste à optimiser mais mon idée est là : définition de la condition d'arrêt de la récursivité : si elle est atteinte, on ne fait plus d'update.

A tester également sur un grand nombre de lignes...
clalevee est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web