概要:イベントをリッスン/テストしたいアプリケーションがあります。理想的なのは、イベント名をストアドプロシージャに渡し、イベントが成功したか失敗したかを報告できるようにすることです。
問題:イベントは最初に実行されるだけで、後続のイベントは実行されません。(NotifyEventAlertを参照)
ストアドプロシージャ:
CREATE PROCEDURE TESTEVENT(EVENTNAME VARCHAR(65))
AS
BEGIN
POST_EVENT(:EVENTNAME);
END;
NotifyEventAlert:
//Note event is only getting excuted the first time
procedure TObjApplicationEvents.NotifyEventAlert(Sender: TObject;
EventName: string; EventCount: Integer; var CancelAlerts: Boolean);
begin
if Assigned(Self.OnPostedEvent) then
Self.OnPostedEvent(Self, Eventname);
end;
EventPosting:
procedure TFrmEventProcessingTestLkp.btnTestEventClick(Sender: TObject);
var
c : TCursor;
ae : TObjApplicationEvents;
cq : TCustomQuery;
begin
inherited;
c := Screen.Cursor;
Screen.Cursor := crHourglass;
ae := nil;
cq := nil;
try
try
ae := TObjApplicationEvents.Create;
ae.OnPostedEvent := Self.OnPostedEvent;
cq := TCustomQuery.Create(nil);
cq.StartTransaction;
cq.SetOperationType(cqotStoredProcedure);
cq.SetStoredProcName('TESTEVENT');
cq.Params.CreateParam(ftString, 'EVENTNAME', ptInput);
cq.ParamByName('EVENTNAME').Value := GetRecordColumnValue(cxColEvent.Index);
cq.ExecSQL;
cq.CommitTransaction;
Sleep(1000);
except on e: Exception do
begin
cq.RollBackTransaction;
raise Exception.Create(e.message);
end;
end;
finally
FreeAndNil(ae);
FreeAndNil(cq);
Screen.Cursor:= c;
end;
end;