AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Query OnUpdate-Procedure zur Laufzeit
Thema durchsuchen
Ansicht
Themen-Optionen

Query OnUpdate-Procedure zur Laufzeit

Ein Thema von Ykcim · begonnen am 22. Dez 2016 · letzter Beitrag vom 23. Dez 2016
Antwort Antwort
Seite 1 von 2  1 2      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
826 Beiträge
 
Delphi 10.4 Sydney
 
#1

Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 09:24
Hallo Zusammen,

ich bin mir nicht sicher, ob das Thema hierhin oder in den Datenbank-Bereich gehört. Ich vermute aber ehe um einen allgemeinen Fehler meinerseits...
Ich habe eine Klasse erstellt, in der ich alle meine Interaktionen mit der Datenbank kapseln möchte. Des Zusammenhangs wegen habe ich auch das Drumherum mit gepostet.

Mein Problem ist, dass ich der FMyQuery_Ticket (TUniQuery) keine Prozedure zum BeforeUpdateExecute-Ereignis zuweisen kann. Der fehler tritt in der letzten Zeile des Create-Constructors auf und mir wird gesagt, dass die Parameter-Liste nicht übereinstimmt. Das habe ich geprüft und bin der Meinung, dass das nicht der Fall ist...

Delphi-Quellcode:
unit TDBUnit;

interface

uses Uni, UniProvider, MySQLUniProvider, Codes, SysUtils, Forms, MemData,
      Data.DB, DBAccess, Classes, DADump, UniDump, vcl.Dialogs;

Type
   TDBMySQL = class
      private
         FMySQlConnection: TUniConnection;
         FMySQLProvider: TUniProvider;
         FMyQuery_Ticket: TUniQuery;
         FMyDataSource_Ticket: TUniDataSource;
      private
         procedure TicketAfterScroll(DataSet: TDataSet);
         procedure TicketAfterInsert (DataSet: TDataSet);
         //Die nachstehende Procedure möchte ich im Create der BeforeUpdateExecute-Ereignis der FMyQuery_Ticket zuweisen
         procedure TicketBeforeUpdate(Sender: TDataSet; var StatementTypes: TStatementTypes; var Params: TDAParams);

         procedure Query_Ticket_SQL;
         procedure Query_Ticket_Insert;
         procedure Query_Ticket_Update;
      public
         constructor create;
         property MyConnection: TUniConnection read FMySQLConnection write FMySQLConnection;
         property MyProvider: TUniProvider read FMySQLProvider write FMySQLProvider;
         property DSTicket: TUniDataSource read FMyDataSource_Ticket write FMyDataSource_Ticket;
      public //Procedure
         procedure Connect(Connection: TUniConnection; SQL_Verzeichnis: string='SQL.set'; Server: string ='';
                           User: string =''; Passwort: string =''; Database: string =''; Provider: string =''; Port: string ='0');
         procedure ExecQuery (query: TUniQuery; var Cols: TCols; var Rows: TRows; AddRows: integer);
         procedure Disconnect (Connection: TUniConnection);
   end;


var MySQL: TDBMySQL;

implementation

procedure TDBMySQL.TicketAfterInsert (DataSet: TDataSet);
begin
   DataSet.FieldByName('ticket_schliessung').Clear;
   DataSet.FieldByName('ticket_eroeffnung').AsDateTime:=now();
   DataSet.FieldByName('status_id').AsInteger:=1;
   DataSet.FieldByName('computer_id').AsString:=FMyDataSource_Ticket.DataSet.FieldByName('computer_id').AsString;
   DataSet.FieldByName('deleted').AsBoolean:=false;
end;

procedure TDBMySQL.TicketAfterScroll(DataSet: TDataSet);
begin
   FMyQuery_Kommentare.ParamByName('ticket_id').AsInteger:=FMyQuery_Ticket.FieldByName('ticket_id').AsInteger;
   FMyQuery_Kommentare.Active:=true;
   FMyQuery_Kommentare.Refresh;
end;

procedure TDBMySQL.KommentarAfterInsert(DataSet: TDataSet);
begin
   DataSet.FieldByName('ticket_id').AsInteger:=FMyQuery_Ticket.FieldByName('ticket_id').AsInteger;
   DataSet.FieldByName('user_id').AsInteger:=2;
   DataSet.FieldByName('info_user').AsBoolean:=FMyDataSource_Kommentare.DataSet.FieldByName('info_user').AsBoolean;
   DataSet.FieldByName('kommentar').AsString:=FMyDataSource_Kommentare.DataSet.FieldByName('kommentar').AsString;
   DataSet.FieldByName('deleted').AsBoolean:=false;
end;

//Hier sind die Einzelheiten der Query, die dem BeforeUpdateExecute-Ereignis zugewiesen werden soll
procedure TDBMySQL.TicketBeforeUpdate(Sender: TDataSet; var StatementTypes: TStatementTypes; var Params: TDAParams);
begin
   (Sender as TDataSet).FieldByName('ticket_thema').AsString:=FMyDataSource_Ticket.DataSet.FieldByName('ticket_thema').AsString;
   (Sender as TDataSet).FieldByName('kategorie_id').AsInteger:=FMyDataSource_Ticket.DataSet.FieldByName('kategorie_id').AsInteger;
   (Sender as TDataSet).FieldByName('ticket_eroeffnung').AsDateTime:=FMyDataSource_Ticket.DataSet.FieldByName('ticket_eroeffnung').AsDateTime;
   (Sender as TDataSet).FieldByName('ticket_schliessung').AsDateTime:=FMyDataSource_Ticket.DataSet.FieldByName('ticket_schliessung').AsDateTime;
   (Sender as TDataSet).FieldByName('status_id').AsInteger:=FMyDataSource_Ticket.DataSet.FieldByName('status_id').AsInteger;
   (Sender as TDataSet).FieldByName('computer_id').AsString:=FMyDataSource_Ticket.DataSet.FieldByName('computer_id').AsString;
   (Sender as TDataSet).FieldByName('ticket_thema').AsString:=FMyDataSource_Ticket.DataSet.FieldByName('ticket_thema').AsString;
   (Sender as TDataSet).FieldByName('deleted').AsBoolean:=false;
end;

procedure TDBMySQL.Query_Ticket_SQL;
begin
   FMyQuery_Ticket.SQL.Add('select t.ticket_id, '+
                                  't.ticket_thema, '+
                                  't.kategorie_id, '+
                                  'k.kategorie_name, '+
                                  't.ticket_eroeffnung, '+
                                  't.ticket_schliessung, '+
                                  't.status_id, '+
                                  's.status_text, '+
                                  't.computer_id '+
                           'from ticket as t '+
                           'left join kategorie as k on k.kategorie_id=t.kategorie_id '+
                           'left join status as s on s.status_id=t.status_id '+
                           'where (t.computer_id= :computer_id '+
                           'or t.user_computer= :cmputer )'+
                           'and t.deleted = false '+
                           'order by t.ticket_id');
   FMyQuery_Ticket.ParamByName('computer_id').AsString:=GetComputerName;
   FMyQuery_Ticket.Active:=true;
end;


procedure TDBMySQL.Query_Ticket_Insert;
begin
   FMyQuery_Ticket.SQLInsert.Add('INSERT INTO ticket '+
                                 '(ticket_id, ticket_thema, kategorie_id, '+
                                 'ticket_eroeffnung, ticket_schliessung, '+
                                 'status_id, computer_id, deleted)' +
                                 'VALUES '+
                                 '(:ticket_id, :ticket_thema, :kategorie_id, '+
                                 'SYSDATE(), :ticket_schliessung, '+
                                 '1, :computer_id, :deleted)')
end;

procedure TDBMySQL.Query_Ticket_Update;
begin
   FMyQuery_Ticket.SQLUpdate.Add('update ticket set '+
                                 'ticket_thema= :ticket_thema, '+
                                 'kategorie_id= :kategorie_id, '+
                                 'ticket_eroeffnung= :eroeffnung, '+
                                 'ticket_schliessung= :schliessung, '+
                                 'status_id= :status_id, '+
                                 'computer_id= :computer_id, '+
                                 'deleted= :deleted '+
                                 'where ticket_id= :ticket_id');
end;

constructor TDBMySQL.create;
begin
   //Connection und allgemeine Querys
   FMySQLConnection:= TUniConnection.Create(nil);
   FMySQLProvider:= TMySQLUniProvider.Create(nil);
   //Spezifische Querys
   FMyQuery_Ticket:= TUniQuery.Create(nil);
   //DataSources für die spezifischen Querys
   FMyDataSource_Ticket:= TUniDataSource.Create(nil);
   //Verbindung der Connection und Zuweisung zu den allgemeinen Querys
   Connect(FMySQLConnection);
   //Zuweisung der Connection zu den spezifischen Querys
   FMyQuery_Ticket.Connection:= FMySQLConnection;
   //Zuweisung der spezifischen Querys als DataSet zu den DataSources
   FMyDataSource_Ticket.DataSet:= FMyQuery_Ticket;
   //Connection-Options
   FMySQLConnection.Options.LocalFailover:= true;
   FMySQLConnection.OnConnectionLost:=LostConnection;
   //Querys ausführen
   Query_Ticket_SQL;

   //Object-Procedure
   FMyQuery_Ticket.AfterScroll:=TicketAfterScroll;
   FMyQuery_Ticket.AfterInsert:=TicketAfterInsert;
   
   FMyQuery_Ticket.BeforeUpdateExecute:=Query_Ticket_Update; //Hier kommt der Fehler
end;

{=============================================================================}

procedure TDBMySQL.Connect (Connection: TUniConnection; SQL_Verzeichnis: string='SQL.set'; Server: string ='';
                            User: string =''; Passwort: string =''; Database: string =''; Provider: string =''; Port: string ='0');
var Datei: TextFile;
    MyString: String;
begin
   if (Server='') and (User='') and (Passwort='') and (Database='') and (Provider='') and (Port='0') then begin
      AssignFile(Datei, SQL_Verzeichnis);
      Reset(Datei);
      try
         ReadLn(Datei, MyString);
         Connection.Server := copy(MyString, pos(':', MyString)+1, length(MyString));
         ReadLn(Datei, MyString);
         Connection.Username := copy(MyString, pos(':', MyString)+1, length(MyString));
         ReadLn(Datei, MyString);
         Connection.Password := copy(MyString, pos(':', MyString)+1, length(MyString));
         ReadLn(Datei, MyString);
         Connection.Database := copy(MyString, pos(':', MyString)+1, length(MyString));
         ReadLn(Datei, MyString);
         Connection.ProviderName := copy(MyString, pos(':', MyString)+1, length(MyString));
         ReadLn(Datei, MyString);
         Connection.Port := strtoint(copy(MyString, pos(':', MyString)+1, length(MyString)));
      finally
         CloseFile(Datei);
      end;
   end
   else begin
      Connection.Server := Server;
      Connection.Username := User;
      Connection.Password := Passwort;
      Connection.Database := Database;
      Connection.ProviderName := Provider;
      Connection.Port := StrToInt(Port);
   end;
  Connection.Connected:=true;
end;

{=============================================================================}

procedure TDBMySQL.ExecQuery (query: TUniQuery; var Cols: TCols; var Rows: TRows; AddRows: integer);
var I, J: integer;
begin
   Query.SQL.Text:=LowerCase(Query.SQL.Text);
   //Query.Active:=true;
   Query.Open;
   SetLength(Cols,0);
   SetLength(Rows,0, 0);
   SetLength(Cols,Query.FieldCount);
   SetLength(Rows,Query.FieldCount, Query.RecordCount+AddRows); //+1 für FloatFooter
   for J:=0 to Query.FieldCount -1 do begin
      Cols[J]:=Query.Fields.Fields[J].FieldName;
   end;
   for I:=0 to Query.RecordCount -1 do begin
      for J:=0 to Query.FieldCount -1 do begin
         Rows[J,I]:=Query.Fields.Fields[J].AsString;
      end;
      query.Next;
   end;
end;

{=============================================================================}

procedure TDBMySQL.Disconnect (Connection: TUniConnection);
begin
  Connection.Connected:=false;
end;

{=============================================================================}

initialization
  MySQL := TDBMySQL.Create;

finalization
   if MySQL <> nil then begin
      MySQL.Disconnect(MySQL.MyConnection);
      MySQL.Free;
   end;


end.
Würde mich über ANregungen freuen.

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 09:34
Die Methode in Deiner Klasse, die du der Eventproperty zuweisen möchtset, hat die falsche Signatur.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#3

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 10:09
Die Methode in Deiner Klasse, die du der Eventproperty zuweisen möchtset, hat die falsche Signatur.
Das kann nicht sein,
Zitat:
und mir wird gesagt, dass die Parameter-Liste nicht übereinstimmt. Das habe ich geprüft und bin der Meinung, dass das nicht der Fall ist...
Aber ich bin mir fast sicher, dass der Compiler dennoch Recht hat.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
826 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 10:59
Ich nehme an, dass Ihr, wenn Ihr von Signatur sprecht, das in den Klammern meint, oder?

Ich habe jetzt eine Query auf das Form gelegt und bin über den OI in das Event gegangen:

Delphi-Quellcode:
procedure TForm1.UniQuery1BeforeUpdateExecute(Sender: TDataSet;
  StatementTypes: TStatementTypes; Params: TDAParams);
begin

end;
Das sind aber die Elemente, die ich auch meiner Procedure mitgeben wollte.
Könnt Ihr mir einen Hinweis geben?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 11:01
Die Metode hast Du aber so deklariert:

procedure Query_Ticket_Update;
Markus Kinzler
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#6

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 11:03
Das sind aber die Elemente, die ich auch meiner Procedure mitgeben wollte.
Und warum tust Du das dann nicht?
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 11:04
Schau dir deine signatur genau an, du hast params und statmenttype als var parameter.
Das ist falsch
Fritz Westermann
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#8

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 11:09
Schau Dir einmal an, welche Methode Du da zuweist. Ich bin mir ziemlich sicher, dass Du die da gar nicht meinst, sondern eher diese: TDBMySQL.TicketBeforeUpdate
Und da solltest Du wie schon beschrieben mal die Deklaration der Parameter überprüfen.
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
826 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 11:51
Mist, die falsche Version gepostet...

In der ursprünglichen waren sie nicht als Variable deklariert, sondern so wie in der automatisch generierten...

@mkinzler
Zitat:
Die Metode hast Du aber so deklariert:

procedure Query_Ticket_Update;
Ich habe noch nie eine Signatur mitgegeben, wenn ich im Create-Statement einer Event-Procedure eine andere Procedure zugewiesen habe. Ich habe dann immer einen Fehler bekommmen. Allerdings habe ich das in der Vergangenheit auch nur mit einfachen Proceduren gemacht, die nur den Sender als Signatur habe.
Wie muss ich denn die Proceduren zuweisen?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#10

AW: Query OnUpdate-Procedure zur Laufzeit

  Alt 22. Dez 2016, 11:53
Du hast aber schon meinen letzten Beitrag gelesen?
Im Create weist Du die falsche Methode zu!
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz