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

Forms Oracle Discussion :

TRIGGER sur INSERT


Sujet :

Forms Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Par défaut TRIGGER sur INSERT
    Bonjour,

    Soit la table ventes: prodno, quantite, montant_ligne

    Supposons que pour le moment je souhaite renseigner "montant_ligne"
    avec "quantite * 2"
    Le plan A serait que le trigger récupère les infos ("prodno" et "quantite") déjà passées par l'ordre insert pour calculer "montant_ligne".
    Je tente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace trigger calcule_vente
    before insert on ventes
    for each row
    begin
    	if inserting then
    		montant_ligne := :new.quantite * 2;
    	end if;
    end;
    Bien sûr ça ne marche pas:
    SQL>SHOW ERROR
    PLS--063 Expression .. ne peut être utilisée come cible d'affectation
    Normalement sous forms ça irait tout seul avec un petit post-field, mais là j'interface avec ACCESS (2002 SP3) && ODBC, j'ai pas trop envie de me lancer dans VB, et je n'arrive pas à renseigner le champ "valeur par défaut" de la requête, car la table est liée.

    Donc j'en appelle à votre aide pour le plan B

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Essayer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :new.montant_ligne := :new.quantite * 2;

  3. #3
    Membre éclairé Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Par défaut
    ça marche!!!

    Merci beaucoup

  4. #4
    Membre éclairé Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Par défaut
    Je cite le trigger qui marche pour le moment, je ne sais pas si on peut optimiser:

    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
    21
    22
    23
    24
    25
    create or replace trigger compute_sales
    before insert on sales
    for each row
    declare
    var_product_id number(6);
    var_normal_value number(10,2);
     
    cursor C1 is
    select product_id, normal_value
    from products;
     
    begin
    open c1;
    	if inserting then
    		loop
    		fetch c1 into var_product_id, var_normal_value;
    		if var_product_id = :new.product_id then
    			:new.sale_value := var_normal_value * :new.quantity;
    		end if;
    		exit when c1%notfound;
    		end loop;
    	end if;	
    close c1;
    end;
    /
    Je n'ai pas réussi à compiler :new.product_id dans le prédicat du curseur en section declare.

    Merci encore

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu peux passer un paramètre à un curseur (PS : C'est mieux d'utiliser FOR LOOP que les FETCH pour des boucles comme ceci).

    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
    CREATE OR REPLACE TRIGGER compute_sales
    BEFORE INSERT ON sales
    FOR EACH ROW
    DECLARE
     
    CURSOR C1 (p_id IN NUMBER) IS
    SELECT normal_value
    FROM products
    WHERE product_id = p_id;
     
    BEGIN
    	IF INSERTING 
    	THEN
    		FOR r IN c1 (:NEW.product_id)
    		LOOP
    			:NEW.sale_value := r.normal_value * :NEW.quantity;
    		END LOOP;
    	END IF;	
    END;
    Sinon, à quoi ça sert de faire un curseur ? Tu peux avoir plusieurs lignes ?
    Sinon, faut faire un SELECT INTO avec gestion d'erreur (on ne fait rien si on trouve pas dans PRODUCTS.
    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
    CREATE OR REPLACE TRIGGER compute_sales
    BEFORE INSERT ON sales
    FOR EACH ROW
    DECLARE
     v_value NUMBER;
    BEGIN
    	IF INSERTING 
    	THEN
    		BEGIN
    			SELECT normal_value
    			INTO v_value
    			FROM PRODUCTS
    			WHERE product_id =:NEW.product_id;
     
    			:NEW.sale_value := v_value * :NEW.quantity;
     
    		EXCEPTION WHEN OTHERS THEN NULL;
    		END;
    	END IF;	
    END;

  6. #6
    Membre éclairé Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Par défaut
    Effectivement, c'est trop excellent!

    (Pour la solution 1 je ne vois pas comment passer un paramètre au trigger depuis la fenêtre "Table" de Access;
    Pour la gestion des erreurs dans la solution 2 je tenterai (( quand j'aurai trouvé où télécharger Forms 6i Win32)) une liste déroulante dynamique sur product_id ou product_description, de façon que l'utilisateur n'entre en "Sales" que des produits déjà renseignés en base.)

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

Discussions similaires

  1. BULK INSERT et trigger sur INSERT
    Par fufurax dans le forum Développement
    Réponses: 7
    Dernier message: 12/03/2010, 16h55
  2. Triggers sur insertion avec SQL Server 2005
    Par Naail dans le forum Développement
    Réponses: 14
    Dernier message: 01/07/2009, 15h23
  3. Création Trigger sur INSERTION
    Par tibblou dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/05/2008, 11h13
  4. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 10h26
  5. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38

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