Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 12/01/2011, 09h49   #1
Membre éprouvé
 
Homme
Analyste-développeur
Inscription : mai 2002
Messages : 989
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Analyste-développeur

Informations forums :
Inscription : mai 2002
Messages : 989
Points : 426
Points : 426
Par défaut Récuperer une 2eme fois l'identifiant depuis une vue

Bonjour à tous et bonne année 2011,


Lors de l'insertion dans une vue multi-table je récupère l'identifiant d'une table pour l'insérer dans une autre table :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE OR ALTER TRIGGER V_LIGNE_COMMANDE_AI0 FOR V_LIGNE_COMMANDE
ACTIVE AFTER INSERT POSITION 0
AS
declare LigneID BIGINT;
begin
  INSERT INTO tb_commande_ligne (commande_id,taux_remise,taux_taxe,accepted)
  VALUES (new.commande_id, new.taux_remise, new.taux_taxe,new.accepted)RETURNING LIGNE_ID INTO : LigneID;
 
  INSERT INTO st_tb_ligne (Ligne_id,Ligne_qte,ligne_pu,art_id)
  VALUES (:LigneID,new.ligne_qte,new.ligne_pu,new.art_id);
end

Jusque là ça fonctionne bien.

L'appel de l'Insert se fait dans une procédure stockée :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 INSERT INTO v_ligne_commande
  (commande_id,
   taux_remise,
   taux_taxe,
   accepted,
   ligne_qte,
   ligne_pu,
   art_id)
 
  VALUES
   (:commande_id,
    :taux_remise,
    :taux_taxe,
    :accepted,
    :ligne_qte,
    :ligne_pu,
    :art_id) returning ligne_id INTO :IDLIGNE;

J'essaye de faire un 2eme RETURNING pour récupérer le LIGNE_ID dans le IDLIGNE mais il semblerais que ca ne fonctionne pas (valeur NULL).
J'aimerais savoir si il n' y a pas un autre moyen de le faire autre que :
Code SQL :
1
2
3
4
 
SELECT gen_id(NOM_GENERATEUR, 1)
FROM rdb$database
INTO :IDLIGNE ;


Merci de votre aide.
__________________
Seul le Savoir est le Pouvoir
freud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 10h37   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Bonjour et bonne année également :p

La clause returning ne vois pas les changements fait par les triggers after.

Ceci explique peut être cela :p
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 10h56   #3
Membre éprouvé
 
Homme
Analyste-développeur
Inscription : mai 2002
Messages : 989
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Analyste-développeur

Informations forums :
Inscription : mai 2002
Messages : 989
Points : 426
Points : 426
aie !!!
changement de méthode alors.....
Merci Barbibulle
__________________
Seul le Savoir est le Pouvoir
freud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 11h01   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Ceci dit je ne sais pas si sur une vue ca fonctionne la recup d'ID avec returning.

Ce que je ferais moi c'est :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE OR ALTER TRIGGER V_LIGNE_COMMANDE_AI0 FOR V_LIGNE_COMMANDE
ACTIVE BEFORE INSERT POSITION 0
AS
 
begin
  IF (new.LIGNE_ID IS NULL) then
    new.LIGNE_ID = gen_id(gen_tb_commande_ligne_id,1);
 
  INSERT INTO tb_commande_ligne (LIGNE_ID, commande_id,taux_remise,taux_taxe,accepted)
  VALUES (new.LIGNE_ID, new.commande_id, new.taux_remise, new.taux_taxe,new.accepted);
 
  INSERT INTO st_tb_ligne (Ligne_id,Ligne_qte,ligne_pu,art_id)
  VALUES (new.LIGNE_ID,new.ligne_qte,new.ligne_pu,new.art_id);
end
et dans la PS
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LIGNE_ID = gen_id(gen_tb_commande_ligne_id,1);
 
INSERT INTO v_ligne_commande
  (LIGNE_ID,
   commande_id,
   taux_remise,
   taux_taxe,
   accepted,
   ligne_qte,
   ligne_pu,
   art_id)
 
  VALUES
   (:LIGNE_ID
    :commande_id,
    :taux_remise,
    :taux_taxe,
    :accepted,
    :ligne_qte,
    :ligne_pu,
    :art_id);
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 11h21   #5
Membre éprouvé
 
Homme
Analyste-développeur
Inscription : mai 2002
Messages : 989
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Analyste-développeur

Informations forums :
Inscription : mai 2002
Messages : 989
Points : 426
Points : 426
Le problème c'est que j'avais codé cela :
Code SQL :
1
2
3
 
IF (new.LIGNE_ID IS NULL) then
    new.LIGNE_ID = gen_id(gen_tb_commande_ligne_id,1);

dans les triggers BEFORE INSERT dans pratiquement toutes les tables de détail
(tb_commande_ligne,tb_devis_ligne, etc...)
Mais je vais essayer votre méthode en déplaçant le code.

Merci.
__________________
Seul le Savoir est le Pouvoir
freud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 11h28   #6
Membre éprouvé
 
Homme
Analyste-développeur
Inscription : mai 2002
Messages : 989
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Analyste-développeur

Informations forums :
Inscription : mai 2002
Messages : 989
Points : 426
Points : 426
Pardon, c'est un seul générateur qui est appelé dans toutes les tables de détail
Code SQL :
1
2
3
 
 IF (NEW.ligne_id IS NULL) then
 NEW.ligne_id  = GEN_ID(gen_tb_ligne,1);
__________________
Seul le Savoir est le Pouvoir
freud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 11h56   #7
Membre éprouvé
 
Homme
Analyste-développeur
Inscription : mai 2002
Messages : 989
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Analyste-développeur

Informations forums :
Inscription : mai 2002
Messages : 989
Points : 426
Points : 426
Citation:
Envoyé par Barbibulle Voir le message
Ceci dit je ne sais pas si sur une vue ca fonctionne la recup d'ID avec returning.
Si, ça fonctionne bien sur une vue. Je viens de le faire avec le code dans le trigger que vous m'avez proposé. J'ai juste mis les Insert avec la génération de l'ID et changer d'evènement. Sauf que, je n'ai pas mis dans la PS la ligne :
Code SQL :
1
2
 
LIGNE_ID = gen_id(gen_tb_commande_ligne_id,1);

Donc, pas de changement de méthode, parce que j'allais remplacer la vue par les tables dans la PS. Heureusement......

Merci encore Barbibulle
__________________
Seul le Savoir est le Pouvoir
freud est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h54.


 
 
 
 
Partenaires

Hébergement Web