![]() |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Guten Morgen...
Zitat:
:hi: |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Hallo,
ich habe mein "Update-Tool" in eine DLL ausgelagert. Damit kann ich es in mehreren Programm-Modulen benutzen. Ausserdem ist eine DLL schnell aktualisiert und weggeschickt, falls mal was internes an der DB geändert/verbessert wird, was das eigentliche Programm nicht interessieren muss. Mit RecordCount meinte ich, dass verschiedene DB-Komponenten das unterschiedlich "implementieren". Metadaten sollte mn nie direkt schreiben, es sei denn: - es geht nicht anders - man weiss, was man macht Ich teste solche Sachen zuerst per IBExpert, dort wird der "Metadaten-Code" ja angezeigt. Heiko |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Hallo zusammen,
so ich habe jetzt so eine
Delphi-Quellcode:
mal bearbeitet und auch versucht das mit der Transaktion und so umzusetzten. Was mit noch fehlt ist die Auswertung der Exception. Also dadurch bitte nicht verwirren lassen. Ich will nur mal hören, ob das sonst so schon besser aussieht.
function
Delphi-Quellcode:
Über Eure Anregungen bin ich dankbar.
//function zur Reorganisation der Datenbank aus der Stammdatenbank
procedure TForm1.Reorganisation1Click(Sender: TObject); var i : integer; ComPortConnect : Boolean; begin ComPortConnect := false; if MessageDlg('Achtung durch die Reorganisation werden vorhandene Daten gelöscht!'+ 'Wollen Sie die Reorganisation wirklich starten?' ,mtWarning,[mbYes, mbNo], 0) = mrYes then begin FPasswort.EDPasswort.Clear; FPasswort.BTOK.Enabled := false; case FPasswort.ShowModal of mrOK: begin if ComPort1.Connected = true then begin ComPort1.Close; tbConnect.Enabled := true; tbDisconnect.Enabled := false; ComPortConnect := true; end; VST.Clear; try try Qry_Reorganisation.SQL.Text := 'SELECT 1 FROM rdb$relations where rdb$relation_name = :TableName'; Qry_Reorganisation.ParamByName('TableName').AsString:= 'MB100'; Qry_Reorganisation.Open; if DropDataTableMB100 then //function Tabelle löschen inkl. Generator und Trigger if CreateDataTableMB100 then //function Tabelle neu erstellen inkl. Generator und Trigger etc. DM_PS.ConPSSecur.Commit; //Wenn alles OK, dann Commit als Transaktion except DM_PS.ConPSSecur.Rollback; //Wenn Exception das Rollback ShowMessage('Reorganisation fehlgeschlagen'); end; finally if InsertDataTableMB100 then begin ShowMessage('Reorganisation erfolgreich abgeschlossen'); Servicefunktionen1.Visible := false; Reorganisation1.Visible := false; if ComPortConnect then tbConnect.Click; end; end; end; end; end; end; //Tabelle löschen function TForm1.DropDataTableMB100 : Boolean; begin DropDataTableMB100 := true; try if Qry_Reorganisation.Fields[0].AsString = '1' then begin Qry_Reorganisation.SQL.Text := 'DROP TRIGGER TRI_MB100'; Qry_Reorganisation.ExecSQL; Qry_Reorganisation.SQL.Text := 'DROP SEQUENCE GEN_MB100_ID'; Qry_Reorganisation.ExecSQL; Qry_Reorganisation.SQL.Text := 'DROP TABLE MB100'; Qry_Reorganisation.ExecSQL; end; except DropDataTableMB100 := false; end; end; //Tabelle Erstellen function TForm1.CreateDataTableMB100 : Boolean; begin CreateDataTableMB100 := true; try Qry_Reorganisation.Close; Qry_Reorganisation.SQL.Text := 'CREATE GENERATOR GEN_MB100_ID; '; Qry_Reorganisation.ExecSQL; Qry_Reorganisation.SQL.Text := 'CREATE TABLE MB100 (ID ID_DOM NOT NULL, LFDNR NUMMER_DOM NOT NULL, '+ 'DATUM DATUM_DOM NOT NULL, UHRZEIT ZEIT_DOM NOT NULL, EREIGNIS TEXT_DOM, '+ 'TEILNEHMER TEXT_DOM, BEREICH TEXT_DOM, SYSTEMZEIT ZEITEN_DOM DEFAULT ''NOW'' NOT NULL)'; Qry_Reorganisation.ExecSQL; Qry_Reorganisation.SQL.Text := 'ALTER TABLE MB100 ADD CONSTRAINT PK_MB100 PRIMARY KEY (ID) USING INDEX ID'; Qry_Reorganisation.ExecSQL; Qry_Reorganisation.SQL.Text := 'CREATE OR ALTER TRIGGER TRI_MB100 FOR MB100 ACTIVE BEFORE INSERT POSITION 0 '+ 'AS BEGIN '+ 'IF (NEW.ID IS NULL) THEN '+ 'NEW.ID = GEN_ID(GEN_MB100_ID,1);END'; Qry_Reorganisation.ExecSQL; except CreateDataTableMB100 := false; end; end; //Daten aus Stammdatenbank wieder in die neu erstellte Datenbank einfügen function TForm1.InsertDataTableMB100 : Boolean; var i : integer; begin InsertDataTableMB100 := true; try Qry_Reorganisation.Close; Qry_Reorganisation.SQL.Text := 'SELECT DATA_READ_COM FROM SERVICE_TABLE'; Qry_Reorganisation.Open; PBFortschritt.Position := 0; PBFortschritt.Max := Qry_Reorganisation.RecordCount; Qry_Reorganisation.First; for i := 0 to Qry_Reorganisation.RecordCount - 1 do begin DataMB100 := Qry_Reorganisation.FieldByName('DATA_READ_COM').AsString; DatenverarbeitungVSTMB100; PBFortschritt.Position := Qry_Reorganisation.RecNo; Qry_Reorganisation.Next; Application.ProcessMessages; end; PBFortschritt.Position := 0; except InsertDataTableMB100 := false; end; end; Gruß Jens |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Hallo,
ein paar Anmerkungen 1. Ich mache das immer so
Delphi-Quellcode:
2.
function CreateDataTableMB100: Boolean;
begin Result:= False; try // create code Result:= True; except // Ausnahme-Behandlung end; end; Create Or Alter Trigger Warum Alter, der Trigger ist doch gelöscht. Aber OK, neue Syntax darf man auch nutzen. 3. Den Primary Key würde ich gleich an das Create Table packen.
SQL-Code:
Dabei wird allerdings ein RDBXXX Index angelegt, was nicht so schön aussieht,
Create Table XXX (Id Integer, Name Char(20), primary key(id))
per Using könnte man eine anderen (unique) Index festlegen. 4. Domains Warum schreibst du das Not Null noch dahinter ? Ich bin mir jetzt nicht ganz scher, aber kann man das bei der Domain selber nicht schon hinschreiben ? Das wars ;) Heiko |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Hallo,
danke schon mal für die Anregungen.
Delphi-Quellcode:
Ja, scheint mir logisch zu sein.
function CreateDataTableMB100: Boolean;
begin Result:= False; try // create code Result:= True; except // Ausnahme-Behandlung end; end; Zitat:
Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz