DerWolf Geschrieben 24. Februar 2003 Geschrieben 24. Februar 2003 Hallo zusammen! Ich möchte 2 versch. Datenbanken vergleichen (Tabellen, Feldnamen, Indices) und in einem 2ten Form (ListView)das Ergebnis ausgeben! Frage: Ist es überhaupt möglich, das Ergebnis in einem 2ten Fenster auszugeben? Und wie funktioniert so ein Vergleich? Kann mir da jemand helfen? Greetz Zitieren
beetFreeQ Geschrieben 25. Februar 2003 Geschrieben 25. Februar 2003 Klar kannst du auf einem zweiten Form etwas ausgeben - du mußt das zweite Form dazu nur in die "uses"-Klausel des ersten aufnehmen und dann kannst du mit "formname.listviewname" z.B. auf den Listview zugreifen. Wie du so einen Vergleich anstellst, hängt ganz von der Art der Tabellen ab - da gibt's ja sehr viele Möglichkeiten und auch Komponenten, mit denen du arbeiten kannst... - meistens bieten diese Komponenten aber eigentlich auch Möglichkeiten, die Spaltennamen etc auszulesen... - am besten, du guckst dir mal die Hilfe zu den entsprechenden Datenbank-Komponenten an - in den Eigenschaften oder Methoden sollte sowas zu finden sein... Zitieren
DerWolf Geschrieben 25. Februar 2003 Autor Geschrieben 25. Februar 2003 Danke für die Antwort! Das Problem mit dem Form hatt ich schon selbst gelöst, und mit dem Vergleich, ja mal schaun, das werde ich schon irgendwie hinbekommen. Werde versuchen, es mit StringListen zu machen und die Stringlisten dann vergleichen! Hoffe es funktioniert! Greetz Zitieren
DerWolf Geschrieben 25. Februar 2003 Autor Geschrieben 25. Februar 2003 Nochmal zurüch zum Vergleich zweier Datenbanken! Als erstes möchte ich die Tabellen der Datenbanken vergleichen, d. H., ich mache es mit StringLists. Tabellen := TStringList.Create; Somit will ich die StringList1 mit der StringList2 vergleichen und nur die Unterschiede in einem ListView ausgeben! Hoffe, ich habe es einigermaßen verständlich erklärt! Wer kann mir diesmal helfen? Bitte! Greetz Zitieren
DerWolf Geschrieben 26. Februar 2003 Autor Geschrieben 26. Februar 2003 Nachtrag: Der Stringlisten-Vergleich soll ja mit der Funktion Equals funktionieren, aber ich als Newbie bin da völlig :confused: . Wo sind denn die ganzen Delphi-Cracks hin? Wer mir da helfen kann,..... die Lösung ist mir sehr wichtig, da ich es für mein Projekt brauche! Habt Verständnis! Greetz Zitieren
Der Kleine Geschrieben 26. Februar 2003 Geschrieben 26. Februar 2003 Das Problem was ich bei dir sehe, ist "das Problem". Es ist schwer zu verstehen, wo genau deine Fragen sind. Wenn etwas ganz spezielles gefragt ist, dann kommen auch die Antworten und meistens in drei verschiedenen Versionen. Aber Probleme - raten kostet Zeit, die keiner investieren kann. Also klar kann man Stringlisten vergleichen, klar kann man eine Funktion namens equals nutzen. Und klar kann man die Unterschiede in einem Listview ausgeben. Aber was wann genau wie bei dir geschehen soll, ist leider nicht eindeutig zu erkennen. Also sei nicht sauer, poste den notwendigen (nicht hinreichenden) Quelltext, stelle eine gezielte Frage und du wirst gezielte Antworten erhalten. Manche Probleme lösen andere effizienter, also ich kann auch nur davon lernen. Zitieren
DerWolf Geschrieben 26. Februar 2003 Autor Geschrieben 26. Februar 2003 Okay, Hier der Quelltext: procedure TForm1.btnVergleichenClick(Sender: TObject); var Tabellen, Tabellen2: TStrings; i, z: Integer; // List: TListItem; begin if WilleDatabase.Connected and WilleDatabase2.Connected then Form2.Show else Application.MessageBox(PChar('Sie müssen 2 Datenbanken auswählen!'), PChar('DB-Explorer: Information'), MB_OK + MB_ICONINFORMATION); Tabellen := TStringList.Create; Tabellen2 := TStringList.Create; WilleDatabase.GetTableNames(Tabellen, true); WilleDatabase2.GetTableNames(Tabellen2, true); for i := 0 to Tabellen.Count-1 do begin for z := 0 to Tabellen2.Count-1 do begin Tabellen.Equals(Tabellen2); //if Tabellen2[z] <> Tabellen then begin ShowMessage(Tabellen.Strings[z]); //List := ListView1.Items.Add; //List.Caption := Tabellen2[z]; //end; end; end; end; Das mit dem Vergleich stimmt ja halt noch nicht! Also ich möchte erst die Tabellen vergleichen und im ListView ausgeben, dann die Feldnamen und dann die Indizes! Alles im ListView. Und da ich in allen Büchern, die ich hier finden konnte, nix über einen Vergleich gefunden habe, seit ihr meine letzte Rettung! Mein Chef mosert schon rum, ich solle mal langsam fertig werden. Die ShowMessage ist nur zum Test da drin! Eine Update-Funktion muß ich danach auch noch schreiben, das ist aber ein anderes Thema! Nun hoffe ich, ihr könnt hiermit mehr anfangen! Greetz Zitieren
Der Kleine Geschrieben 26. Februar 2003 Geschrieben 26. Februar 2003 Nutze mal die Tags Quelltext mit Einrückung liesst sich etwas einfacher. Also : mit Tabellen.Equals(Tabellen2); vergleichst du die beiden Stringlisten miteinander. Ergebnis ist vom Typ Boolean und genau dann wahr, wenn beide Listen übereinstimmen. Dafür brauchst du die i - und die z-Schleife nicht. Wenn du die einzelnen Einträge (String) miteinander vergleichen willst, dann mußt du über Tabellen.strings bzw. Tabellen2.strings[z] auf die einzelnen Einträge in den Listen zugreifen. Es reicht dabei auch eine Schleife, die wo mehr Werte drin stehen. Wenn der Wert in der zweiten vorhanden ist, zählst du die Variable für die zweite DB um eines nach oben. Also ungefähr ... z:=0; for i := 0 to Tabellen.Count-1 do begin if Tabellen.Strings[i]=Tabellen2.Strings[z] then begin z:=z+1; end else begin ShowMessage(Tabellen.Strings[i]); end; Sollten jetzt aber mal in der ersten, mal in der zweiten Tabelle mehr Werte stehen (was glaube ich dein Problem sein könnte), dann wäre ein Vorschlag, eine Liste zu erstellen mit den Werten, die genau einmal vorhanden sind, und diese Liste dann entsprechend zuzuordnen : var testwert: String; gefunden: Boolean; begin ... for i := 0 to Tabellen.Count-1 do begin testwert:=Tabellen.String[i]; gefunden:=false; for z := 0 to Tabellen2.Count-1 do begin if tabellen2.string[z]=testwert then begin gefunden:=true; break; end; end; if gefunden=false then begin showmessage('Gefunden wurde :'+testwert+'in erster Tabelle, aber nicht in zweiter'); end; end; for z := 0 to Tabellen2.Count-1 do begin testwert:=Tabellen2.String[z]; gefunden:=false; for i := 0 to Tabellen.Count-1 do begin if tabellen.string[i]=testwert then begin gefunden:=true; break; end; end; if gefunden=false then begin showmessage('Gefunden wurde :'+testwert+'in zweiter Tabelle, aber nicht in erster'); end; end; end;//fucntion An den Stellen von : Showmessage(); muss entsprechend die geforderten Listen gefüllt werden. Ich hoffe mal, keinen Syntaxfehler gemacht zu haben. Zitieren
DerWolf Geschrieben 26. Februar 2003 Autor Geschrieben 26. Februar 2003 Ich Danke dir! Ich muß mir das jetzt erstmal genauer anschauen, dann kann ich dir auch sagen, ob du ein Syntaxfehler eingebaut hast! MfG Zitieren
DerWolf Geschrieben 26. Februar 2003 Autor Geschrieben 26. Februar 2003 Hm, Schade, wäre auch zu schön um wahr zu sein! Nach beseitigung einiger nicht gravierender Fehler habe ich das Prog. dann ausgeführt, aber immer eine Zugriffsverletzung bekommen! Trotzdem Danke! Mal sehen, wie ich das jetzt mache. MfG Zitieren
DerWolf Geschrieben 27. Februar 2003 Autor Geschrieben 27. Februar 2003 Nachtrag: @ Der Kleine: Sorry, das es nicht funktionierte, war ganz allein mein Fehler. Immer diese Auskommentiererei! Hatte etwas zuviel auskommentiert! Es funktioniert jetzt! Greetz Zitieren
geloescht_JesterDay Geschrieben 27. Februar 2003 Geschrieben 27. Februar 2003 Originally posted by DerWolf Ich Danke dir! Ich muß mir das jetzt erstmal genauer anschauen, dann kann ich dir auch sagen, ob du ein Syntaxfehler eingebaut hast! MfG <EDIT> Ups, hatte was falsches gelesen Dachte du redest wegen dem Syntaxfehler von deinem Code </EDIT> Syntaxfehler nicht unbedingt, aber du erzeugst 2 Stringlisten, gibst sie aber nicht wieder frei :eek: Der Speicher ist somit belegt, auch wenn du die Listen überhaupt nicht mehr brauchst. Merke: Alles was du erzeugst musst du auch wieder frei geben. Bei Komponenten macht das Delphi (das Erzeugen und das freigeben). Aber von den von dir erzeugten Objekten weiss Delphi nix. Try... finally... end ist ganz praktisch für sowas. [b]try[/b] Liste1:= TStringList.create; Liste2:= TStringList.create; {alles mögliche mit den Listen anstellen...} [b]finally[/b] Liste1.free; Liste2.free; [b]end[/b]; In finally springt er immer rein, auch wenn ein Fehler o.ä. auftritt. Somit werden die Listen (oder andere Objekte) am Ende immer freigegeben. Falls du deine Objekte für länger brauchst kannst du z.B. das OnDestroy des Formulars benutzen, oder du überschreibst den Destructor TForm1 = [b]Class[/b](TForm) {...} [b]public[/b] [b]destructor[/b] destroy; override; [b]end[/b]; [b]implementation[/b] [b]destructor[/b] TForm1.destroy; [b]begin[/b] Liste1.free; {...}//Deine Freigaben inherited destroy; // Am Ende den geerbten Destructor ausführen (WICHTIG!) [b]end[/b]; oder du benutzt einen finalization Abschnitt (siehe Hilfe) Zitieren
DerWolf Geschrieben 27. Februar 2003 Autor Geschrieben 27. Februar 2003 @ JesterDay: Danke auch für diesen Tip! Ja, genau diesen Fehler hatte ich, und Oh Wunder , diesen selber gefunden und beseitigt! Greetz Zitieren
DerWolf Geschrieben 28. Februar 2003 Autor Geschrieben 28. Februar 2003 Sorry Jungs! Noch ein kleines Problem! Ich muß ja auch die Feldnamen und Indizes vergleichen. Bei GetFieldNames habe ich das Problem, das ich für die Prozedur eine Tabelle auswählen muß. (Database.GetFieldNames(const TableName: String; List: TString); Ich möchte es aber so machen, das ich keine Tabelle auswähle. Wie kann ich dieses Problem lösen? Wie könnt ihr mir da helfen? Greetz Zitieren
Der Kleine Geschrieben 28. Februar 2003 Geschrieben 28. Februar 2003 Um die Feldnamen einer Tabelle zu bekommen, musst du doch wissen, welche Tabelle du gerade ansprichst. Du wirst wahrscheinlich alle gefundenen Tabellen durchlaufen müssen und dann die entsprechenden Feldnamen bearbeiten bzw. suchen. Das hast du ja schon gemacht. Also kannst du deine bisherigen Schleifen erweitern, so daß, wenn er die Tabellen in beiden DB findet, du gleich an dieser Stelle den vergleich der Feldnamen machst. Und wenn du schon mal dabei bist, vergleiche an der gleichen Stelle die Indizees der Tabellen, um die Unterschiede auszugeben. Das Wissen, um diese Vergleiche durchführen zu können, besitzt du bereits. Also Viel Spaß. Zitieren
DerWolf Geschrieben 28. Februar 2003 Autor Geschrieben 28. Februar 2003 Hm, Danke! Ich versuche mein Bestes! MfG Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.