1

概要:イベントをリッスン/テストしたいアプリケーションがあります。理想的なのは、イベント名をストアドプロシージャに渡し、イベントが成功したか失敗したかを報告できるようにすることです。

問題:イベントは最初に実行されるだけで、後続のイベントは実行されません。(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;
4

0 に答える 0