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
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
Bonjour,
ne pas oublier le IBUpdateSql.
Bon developpement.
Envoyé par touhami
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 ?
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
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:
TNotifyEvent est définit dans l'unité classes.
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;
Pour la partie implémentation cela donnerait :
Donc dès que tu appelles insertItems tu auras à la fois un événement insert qui se produira mais également un événement afterInsert.
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;
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.
Implémentation
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;
Tu appelles également la méthode InsertItems pour le descendant.
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;
En espérant te donner une piste exploitable.
Cordialement
Envoyé par Claudius40
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.
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
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 gen_id(name_generator, 1)
ou bien de saboir le prochain valeur avec la même réquete mais avec increment 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part select gen_id( Name_Generator, 0) as ID from rdb$database
Partager