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

Bases de données Delphi Discussion :

IBQuery et évênement AfterInsert


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Par défaut IBQuery et évênement AfterInsert
    Bonjour,

    Je suis surpris, apparement l'évênement AfterInsert ne se déclenche pas lors d'un ExecSQL avec un TQuery.
    Qu'est ce qui déclenche le AfterInsert, un commit ?
    Merci d'avance

  2. #2
    Membre éclairé Avatar de touhami
    Inscrit en
    Avril 2002
    Messages
    327
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 327
    Par défaut
    Bonjour,
    ne pas oublier le IBUpdateSql.
    Bon developpement.

  3. #3
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Par défaut
    Citation Envoyé par touhami
    Bonjour,
    ne pas oublier le IBUpdateSql.
    Bon developpement.

    Merci pour ton indication mais avec IBUpdateSQL, il n'y a aucun événement associé à ce composant, comment je fais pour lancer une procédure stockée sur Firebird si je n'ai pas d'événement associé à l'insertion d'enregistrement ?

  4. #4
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut,

    La solution serait peut-être de gérer cela au niveau de la base de données Firebird et de lancer ta procédure stockée depuis un trigger AfterInsert sur ta table !

    @+ Claudius

  5. #5
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Bonjour,

    Dans ce type de situation j'aurais tendance à me construire moi-même mes outils. Donc créer dans une classe un événement onInsert ainsi qu'un événement onAfterInsert. Cela donnerait un schéma de ce type:

    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
      TNotifyEvent = procedure(Sender: TObject) of object;
      TNotifyInsert = procedure(Sender: TObject; query: string) of object;
     
      maclass = class
      private
        FonInsert: TNotifyInsert;
        FonAfterInsert: TNotifyEvent;
      public
        constructor Create;
        property onInsert:TNotifyInsert read FonInsert write FonInsert;
        property onAfterInsert:TNotifyEvent read FonAfterInsert
                                            write FonAfterInsert;
        procedure doInsert(Sender: TObject; query: string);
        procedure doAfterInsert(Sender: TObject);
     
        procedure insertItems(query: string);
      end;
    TNotifyEvent est définit dans l'unité classes.
    Pour la partie implémentation cela donnerait :

    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
    26
    27
    28
    { maclass }
     
    constructor maclass.Create;
    begin
      onInsert := doInsert;
      onAfterInsert := doAfterInsert;
    end;
     
    procedure maclass.doAfterInsert(Sender: TObject);
    begin
     //le traitement de l'after insert
    end;
     
    procedure maclass.doInsert(Sender: TObject; query: string);
    begin
      //execSQL avec query en paramètre
    end;
     
    procedure maclass.insertItems(query: string);
    begin
      try
        if assigned(onInsert) then onInsert(Self,query);
        if assigned(onAfterInsert) then onAfterInsert(Self);
      except
        Raise;
      end;
    end;
    Donc dès que tu appelles insertItems tu auras à la fois un événement insert qui se produira mais également un événement afterInsert.

    Autre avantage d'une telle méthode c'est que pour un descendant de ma class, tu pourras modifier les comportements de onInsert et onAfter insert, si tu le désires.
    Tu pourras également, les surcharger ou redéfinir d'autres actions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    monDescendant = class(maClass)
      private
      public
        constructor Create;
        procedure doInsert(Sender: TObject; query: string);
        procedure doAfterInsert(Sender: TObject);
      end;
    Implémentation

    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
    { monDescendant }
    constructor monDescendant.Create;
    begin
      onInsert := doInsert;
      onAfterInsert := doAfterInsert;
    end;
     
    procedure monDescendant.doAfterInsert(Sender: TObject);
    begin
      //ajout de code possible qui sera effectué avant le after insert
     //surcharge
      inherited doAfterInsert(Self);
      //ajout de code 
     //surcharge
    end;
     
    procedure monDescendant.doInsert(Sender: TObject; query: string);
    begin
      // pas de inherited
      //autre code. Je change le comportement de onInsert
    end;
    Tu appelles également la méthode InsertItems pour le descendant.

    En espérant te donner une piste exploitable.
    Cordialement

  6. #6
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Par défaut
    Citation Envoyé par Claudius40
    Salut,

    La solution serait peut-être de gérer cela au niveau de la base de données Firebird et de lancer ta procédure stockée depuis un trigger AfterInsert sur ta table !

    @+ Claudius

    Désolé de ne pas avoir tout dit :
    Après chaque insertion dans une table, je dois appeler la procédure stockée pour récupérer la valeur d'un générateur.
    Si je fais donc cela avec un trigger AfterInsert dans FB, je ne pourrais pas récupérer la valeur du générateur dans mon code.
    Merci quant meme !
    J'ai la solution de consulter la valeur du générateur directement dans mon code et je crois que je vais en rester la.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Par défaut
    Salut

    L'évênement AfterInsert seulement se déclenche avec Insert ou Append, pas avec ExecSQL. Une sentence executé avec ExecSQL est traité au coté serveur, pas au cote client et pour ça il n'y a aucun événement que se déclenche.

    Tu peux egalement recuperer le valeur de ton generator au trigger avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gen_id(name_generator, 1)
    Aussi, tu peux consulter le valeur du generator dans ton code avec une requete comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select gen_id( Name_Generator, 0) as ID from rdb$database
    ou bien de saboir le prochain valeur avec la même réquete mais avec increment 1

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

Discussions similaires

  1. [AC-97] Docmd.gotorecord sur évènement AfterInsert
    Par paidge dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/01/2012, 17h38
  2. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  3. exploiter un évènement d'un sous composant dans un
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 16h44
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

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