AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Existenzprüfung von Tabellen.. bizzl komplizierter.
Thema durchsuchen
Ansicht
Themen-Optionen

Existenzprüfung von Tabellen.. bizzl komplizierter.

Ein Thema von plautzer · begonnen am 3. Sep 2004 · letzter Beitrag vom 18. Sep 2004
Antwort Antwort
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#1

Existenzprüfung von Tabellen.. bizzl komplizierter.

  Alt 3. Sep 2004, 15:31
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
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 3. Sep 2004, 17:43
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.
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#3

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

  Alt 3. Sep 2004, 20:39
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
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 4. Sep 2004, 06:43
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:

Alter Table Drop "TableName"
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#5

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

  Alt 4. Sep 2004, 14:13
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?

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
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#6

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

  Alt 4. Sep 2004, 14:27
Immer die selbe Leier: WELCHE DB BENUTZT DU?
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#7

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

  Alt 4. Sep 2004, 14:47
@leuselator: er benützt paradox oder dbase und die bde...

gruss, stefan
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#8

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

  Alt 5. Sep 2004, 00:30
@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!!

@ Albi

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

Gruß

Plautzer
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#9

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

  Alt 5. Sep 2004, 23:06
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
DROP TABLE "employee.db" löscht du gleich die ganze mitarbeitertabelle.

mfg, stefan
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#10

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

  Alt 18. Sep 2004, 19:55
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

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
Das spart 'ne menge zeit!


Cya

Plautzer
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:58 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