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

SQL Firebird Discussion :

Récuperer une 2eme fois l'identifiant depuis une vue


Sujet :

SQL Firebird

  1. #1
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
     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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select gen_id(NOM_GENERATEUR, 1)
    from rdb$database
    into :IDLIGNE ;


    Merci de votre aide.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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

  3. #3
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    aie !!!
    changement de méthode alors.....
    Merci Barbibulle
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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);

  5. #5
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Le problème c'est que j'avais codé cela :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  6. #6
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Pardon, c'est un seul générateur qui est appelé dans toutes les tables de détail
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     IF (NEW.ligne_id IS NULL) then
     NEW.ligne_id  = GEN_ID(gen_tb_ligne,1);
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  7. #7
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

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

Discussions similaires

  1. Diapo automatique depuis une 2eme source
    Par municipum dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 23/01/2014, 11h27
  2. executer une commande sur un serveur depuis une page web
    Par nico33410 dans le forum Général Conception Web
    Réponses: 12
    Dernier message: 21/04/2007, 19h02
  3. Réponses: 1
    Dernier message: 31/10/2006, 11h15
  4. Réponses: 2
    Dernier message: 07/02/2005, 16h43
  5. Réponses: 4
    Dernier message: 16/09/2003, 10h51

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