Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Existenzprüfung von Tabellen.. bizzl komplizierter. (https://www.delphipraxis.net/29074-existenzpruefung-von-tabellen-bizzl-komplizierter.html)

plautzer 3. Sep 2004 15:31


Existenzprüfung von Tabellen.. bizzl komplizierter.
 
Hi,

ich habe 4 tabelle(Datenbanken). Tabelle1 hängt mit allen andern tabellen zusammen, also wenn die nicht existiert, dann müssen die anderen auch neu erstellt werden, egal ob sie schon existieren.

Das abfragen ist ja kein problem, ich habe nur ein problem bei wenn die anderen existieren und ich die löschen und dann wieder erstellen muss.
Ich habe auch ziehmlich viel Code für die ganze sache, darum wäre es auch gut wenn ihr tipps geben könntet wie ich eine geeignete funktion dazu aufbauen könnte(hab das sowieso meine probleme.. weiß nicht sorecht wie/warum ich funktioen machen sollte).

Ich habe zur jeden tabelle eine procedure erstellen, die die Existenzprüfung macht und falls nicht gegeben, die tabelle erstellt:

Delphi-Quellcode:
procedure TFmain.Gruppe_proof;
var
  i, error_no: integer;
  query: TQuery;
  pfad,tabellen, name, ext: string;
begin

  pfad := ExtractFilePath(Application.ExeName);
  name := ExtractFileName(Application.ExeName);
  ext := ExtractFileExt(Application.ExeName);
  tabellen:=pfad + 'tabellen';

IF NOT FileExists(tabellen + '\table1.DB') THEN
        BEGIn
        if not ForceDirectories(tabellen) then
        ShowMessage('Beim Anlegen von '+Tabellen+' ist ein Fehler aufgetreten!');

  query := TQuery.Create(nil);

with query do
    begin
    DatabaseName := tabellen;
    SQL.Clear;
    SQL.Add('create table "table1.db"');
    SQL.Add('(');
    SQL.Add('  ID autoinc,');
    SQL.Add('  Gruppe char(20),');
    SQL.Add('  Name char(30),');
    SQL.Add('  Vorname char(30),');
    SQL.Add('  Strasse char(30),');
    SQL.Add('  Hausnr char(10),');
    SQL.Add('  PLZ Char(10),');
    SQL.Add('  Ort char(20),');
    SQL.Add('  Telefon char(30),');
    SQL.Add('  primary key(ID)');
    SQL.Add(')');
    SQL.Add('Drop table "table2.db"') ->> Wo sollte das stehen?
  end;
  try
    query.ExecSQL;
except
    on e: EDBEngineError do
    for i := 0 to e.ErrorCount - 1 do
    begin
      error_no := e.Errors[i].ErrorCode;
      if error_no <> 13057
      then
      begin
        MessageDlg(e.Message + #13 + 'Error no: ' + IntToStr(error_no), mtError, [mbOK], 0);
      end;
    end;
  end;
  query.Destroy;
end;
end;
Die Proceduren habe ich dann alle in das oncreate des progs gepackt. Die table2 wird aber nicht gelöscht und dann wieder erstellt.


THx,

Plautzer

Albi 3. Sep 2004 17:43

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
Hallo,

ich habe das jetzt nicht ausprobiert aber hast Du mal versucht, denn Befehl zum löschen der Table2 in einer extra Abfrage abzuarbeiten.

So in der Form, dass Du erst die DB Table erstellst und dann in einer neuen Abfrage schaust ob die DB Table2 schon vorhanden ist und daraufhin die gewünschte Aktion ausführst.

plautzer 3. Sep 2004 20:39

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
Das hatte ich auch schon gemacht... aber gut das du mich nochmal draufgebracht hast.. da ich einen kleinen entschiedenen teil über sehen hatte.

Aber noch ne frage zu SQL:

SQL-Code:
 with query1 do
       begin
       DatabaseName := tabellen;
       SQL.Clear;
       SQL.Add('Drop TABLE "tabelle1.DB" ???was muss hierhin???  "tabelle2.DB"');
       end;
Wie kann ich mehrer tabelle mit einmal löschen (droppen)??

UND:

SQL-Code:
 with query1 do
       begin
       DatabaseName := tabellen;
       SQL.Clear;
       SQL.Add('Drop TABLE IF exists "tabelle1.DB"');
       end;

Warum funzt IF EXISTS nicht? - gibt es das irgentwas anderes?

THx,
Plautzer

Albi 4. Sep 2004 06:43

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
Ich würde das erst gar nicht über SQL versuchen.

Hier mal meine Variante: (ohen Löschen)

Code:
try
  If Not DirectoryExists(ExtractFilePath(ParamStr(0))+'Database') Then //überprüft ob Ordner schon existiert
    if Not CreateDir(ExtractFilePath(ParamStr(0))+'Database') Then //Erstell Ordner
      Application.MessageBox('Der Ordner konnte nicht erstellt werden', 'Fehler', 64);
  Form2.Table2.TableName:= 'DataBase\'+Form2.BName.Text; //Zuweisung vom TableName
  Form2.Table2.TableType:= ttParadox; //Zuweisung der Table Art
  Dir:= ExtractFilePath(ParamStr(0))+Table2.Name;
  IF NOT FileExists(Dir) THEN BEGIN //Prüfung ob DB schon existiert
    WITH Table2 DO BEGIN //wenn nicht wird sie erstellt
      WITH fielddefs DO BEGIN
        clear;
        ....;
        ....;
       END;
      createTable;
    END;
    end;
  except
end;
Du kannst das ja ein wenig abwandeln und sagst, wenn Table bereits vorhanden, dann lösche sie oder was auch immer passieren soll

Zum löschen versuch mal folgendes:

SQL-Code:
Alter Table Drop "TableName"

grayfox 4. Sep 2004 14:13

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
hallo plautzer!

Zitat:

ich habe 4 tabelle(Datenbanken). Tabelle1 hängt mit allen andern tabellen zusammen, also wenn die nicht existiert, dann müssen die anderen auch neu erstellt werden, egal ob sie schon existieren.
einmal zum verständnis: wie kann in einer 'DB' eine tabelle mit anderen zusammenhängen, auch wenn sie gar nicht vorhanden sind. wie es aussieht, hast du die 'referentielle integrität' bei deinem projekt ausser acht gelassen.

zb muss das prog verhindern, dass man kundenstammdaten löschen kann, sobald aufträge dazu existieren, ebensowenig darf man auftraege löschen können, wenn sie mal bestellpositionen haben.

ich würde hier schon mal ansetzten, damit kann sich dein problem der verwaisten datensätze bzw tabellen, die mit nichts zusammenhängen gar nicht auftreten. oder hab ich da was falsch verstanden? :gruebel:

dass du die tabellen neu erstellen willst, obwohl sie vorhanden sind, hängt vermutlich mit deinem autoinc-primärindex zusammen. vergib die laufende nummer selbständig, dann bleiben dir solche aktionen erspart.

mfg, stefan

Leuselator 4. Sep 2004 14:27

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
Immer die selbe Leier: WELCHE DB BENUTZT DU?

grayfox 4. Sep 2004 14:47

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
@leuselator: er benützt paradox oder dbase und die bde...

gruss, stefan

plautzer 5. Sep 2004 00:30

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
@leuselator: grayfox hat recht (ich wüsste auch garnicht warum was anderes dafür einsetzen sollte)

@grayfox
ich will ja nur von den fall ausgehen, dass die erste Tabelle mal gelöscht wird, oder das mal beim ersten start die erste tabelle nicht vorhanden ist, und da will ich lieber sicher gegen und die anderen neu erstellen. Man weiss ja nie welcher fall mal eintreten kann, drum will ich lieber sichern gehen(und ausser acht gelassen, kann ich immernoch dabei lernen).

Zitat:

dass du die tabellen neu erstellen willst, obwohl sie vorhanden sind, hängt vermutlich mit deinem autoinc-primärindex zusammen. vergib die laufende nummer selbständig, dann bleiben dir solche aktionen erspart.
ich habe mich dahingehend schon abgesichert. Aber wenn ich welche lösche, da brauche ich die dazugehörigen daten auch nicht mehr, die wären nr belast in der datenbank.

Zitat:

einmal zum verständnis: wie kann in einer 'DB' eine tabelle mit anderen zusammenhängen, auch wenn sie gar nicht vorhanden sind. wie es aussieht, hast du die 'referentielle integrität' bei deinem projekt ausser acht gelassen.
keine ahnung wasdu damit meinst!! :gruebel:

@ Albi

bis jetzt funzt es eigentlich super,ich werde aber mal deine vorschlag ausprobieren.
Was aber anders an
SQL-Code:
Alter Table Drop "TableName"
als an
SQL-Code:
Drop table "TableName"
versteh ich nicht ganz.

Gruß

Plautzer

grayfox 5. Sep 2004 23:06

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
hallo plautzer!

Zitat:

ich will ja nur von den fall ausgehen, dass die erste Tabelle mal gelöscht wird, oder das mal beim ersten start die erste tabelle nicht vorhanden ist, und da will ich lieber sicher gegen und die anderen neu erstellen.
naja, dann hast du zb eine neu eingelegte, aber leere kundentabelle. ich frag deshalb, weil ich in deinem vorgehen keinen sinn sehe. ok, wenn du anschliessend beginnst, die originaleinträge zu restoren und somit die tabellen wieder auf den letztstand vor dem löschen bringst, dann verstehe ich dein vorgehen.

Zitat:

ich habe mich dahingehend schon abgesichert. Aber wenn ich welche lösche, da brauche ich die dazugehörigen daten auch nicht mehr, die wären nr belast in der datenbank.
meinst du vielleicht temporäre tabellen, die du nur kurzzeitig benötigst? dann würde aber auch ein 'EmptyTable' ausreichen, nicht wahr?

wenn du fragen zu SQL hast, dann schau in deinen ordner BDE, dort findest du das file 'localsql.hlp'.
nach dessen studium sollten keine fragen mehr offen sein ;)

Delphi-Quellcode:
ALTER TABLE "names.db"
DROP lastname, ADD lastname CHAR(30)
hiermit löscht du in der tabelle 'names.db' das feld 'lastname' und legst ein neues in einer
anderen grösse an

und mit
Delphi-Quellcode:
DROP TABLE "employee.db"
löscht du gleich die ganze mitarbeitertabelle.

mfg, stefan

plautzer 18. Sep 2004 19:55

Re: Existenzprüfung von Tabellen.. bizzl komplizierter.
 
Hi leute,

ich hatte in letzter Zeit alle Hände voll zu tun, aber nun kann ich mich wieder denn schönen dingen am leben widmen .... Coden :coder: :zwinker:

Zitat:

Zitat von grayfox
naja, dann hast du zb eine neu eingelegte, aber leere kundentabelle. ich frag deshalb, weil ich in deinem vorgehen keinen sinn sehe. ok, wenn du anschliessend beginnst, die originaleinträge zu restoren und somit die tabellen wieder auf den letztstand vor dem löschen bringst, dann verstehe ich dein vorgehen.
...
meinst du vielleicht temporäre tabellen, die du nur kurzzeitig benötigst? dann würde aber auch ein 'EmptyTable' ausreichen, nicht wahr?

Ok,

also ich hatte mir das erst so gedacht, dass wenn eine tabelle gelöscht wird, das dann die anderen auch weg müssen, da diese dann sinnlos daten enthalten, die keiner abrufen kann.
Aber du hast mich auf eine Idee gebracht, ich werde immer nach einer bestimmten Zeit ein automatische backup tabelle generieren.Falls mal eine Tabelle zufällug gelöscht wird, der schaden in grenzen gehalten kann etcpp.

danke auch für den Tipp mit SQL :thumb:
Das spart 'ne menge zeit!


Cya

Plautzer


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 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