Zum Inhalt springen

[Delphi] DB-Vergleich


DerWolf

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...