Zum Inhalt springen

VBA: zwei Tabellen via Recordset vergleichen


Empfohlene Beiträge

Geschrieben

Hallo Forum,

etwas für Logik Tüftler:

Ich habe in meiner Datenbank zwei Tabellen. Beide sind nach dem

gleichen Schema aufgebaut:

ta_server_1 und ta_server_2

---------------------------

servername (string)

la (integer)

Menge (double)

Ich möchte die beiden Tabellen miteinander inhaltlich vergleichen.

D.h. ich habe eine Menge von la an Servername x in ta_server_1 und eine

Menge von la an Servername x in ta_server_2.

Ich habe es bis jetzt so gemacht:


dim arr_errors(1 to 100, 1 to 3) as string 


sSQL = "select * from ta_server_1"

set qdf = db.createQueryDef("", sSQL) 

set rs_tabelle1 = qdf.createRecordSet


sSQL = "select * from ta_server_2"

set qdf = db.createQueryDef("", sSQL) 

set rs_tabelle2 = qdf.createRecordSet



while rs_tabelle1.eof = false

 while rs_tabelle2.eof = false 

  if rs_tabelle1.fields(0).value = rs_tabelle2.fields(0).value then 

   if rs_tabelle1.fields(1).value = rs_tabelle2.fields(1).value then 

    if rs_tabelle1.fields(2).value <> rs_tabelle2.fields(2).value then

	 sSQL = "insert into ta_delta (server, Menge1, Menge2) values ('" & rs_Tabelle1.fields(0).value & "..."

	 docmd.runSQL

    end if

   end if 

  end if

 rs_tabelle2.movenext

 wend 

 rs_tabelle1.movenext

 rs_tabelle2.movefirst

wend

Damit habe ich alle Inhalte der Tabelle1 mit der Tabelle2 verglichen. Es gibt nur

noch ein paar Probleme:

1. Wie finde ich heraus, wenn ein Server, der in Tabelle1 ist, gar nicht in Tabelle2 ist?

2. Gibt es eine effizientere Methode so etwas zu machen??? (bei 3000 Datensätzen pro Tabelle

geht meine Performance langsam in den Keller)

Wäre super genial, wenn Ihr mir helfen könntet!!!

Gruß

Druid :cool:

Geschrieben

servername (string)

la (integer)

Menge (double)

nur so rein interessehalber, hast du primärschlüssel definiert bzw. aus welchen feldern setzen sich diese zusammen?

1. Wie finde ich heraus, wenn ein Server, der in Tabelle1 ist, gar nicht in Tabelle2 ist?

SELECT ta_server_1.*

FROM ta_server_1 LEFT JOIN ta_server_2 ON ta_server_1.servername = ta_server_2.servername

WHERE (((ta_server_2.servername) Is Null));

sollte m.e. funktionieren (alle von 1 ohne übereinstimmung in 2).

not in subselect sollte das genau gleiche ergebnis liefern, denke ich.

SELECT ta_server_1.*

FROM ta_server_1, ta_server_2

WHERE (([ta_server_1].[servername] Not In (select ta_server_2.servername from ta_server_2)));

2. Gibt es eine effizientere Methode so etwas zu machen??? (bei 3000 Datensätzen pro Tabelle

geht meine Performance langsam in den Keller)

primärschlüssel bzw. index definieren, sql-grundfunktionen nützen und mit möglichst wenig vba (if in if in if in schleife in schleife) auskommen.

wenn du bei vba bleiben möchtest, probiere die verschiedenen datenzugriffsmethode von ado aus: adOpenKeyset, adOpenDynamic, adOpenStatic, adOpenForwardOnly, CursorLocation. forward only ist gewöhnlich am schnellsten.

s'Amstel

edit: achja, sei froh, 3000 datensätze ... bei 30 millionen ists erst so richtig lustig *fg*

Geschrieben
nur so rein interessehalber, hast du primärschlüssel definiert bzw. aus welchen feldern setzen sich diese zusammen?

die tabellen sind natürlich ein bisschen aufwändiger. Meine Primärschlüssel

setzen sich aus Servername und Seriennummer zusammen.

primärschlüssel bzw. index definieren, sql-grundfunktionen nützen und mit möglichst wenig vba (if in if in if in schleife in schleife) auskommen.

ich probier morgen in der Arbeit gleich mal deine Lösung mit den SubSelects

aus.

Dass das mit den verschachtelten ifs nicht die optimale ist war mich auch klar.

Leider gabs für mich keine andere Lösung.

Und mit welchen SQL - Grundfunktionen würde ich das hinbekommen?

Geschrieben

vom prinzip funktioniert es.

Dann müsste ich doch mit folgendem Statement alle fehlenden Einträge

bekommen:


select ta_server_1.* from ta_server_1, ta_server_2 where 

(([ta_server_1].[servername] Not In (select ta_server_2.servername 

from ta_server_2))

wie kann ich obigen Code verändern, dass er mir Datensätze zurückgibt, die in Kombination aus servername und la in ta_server_2 nicht vorkommen? und mit folgendem Code müsste ich dann alle Differenzen bekommen?

select ta_server_1.Servername, ta_server_1.la, ta_server_1.menge, 

ta_server_2.menge from ta_server_1, ta_server_2 where 

ta_server_1.servername = ta_server_2.servername AND 

ta_server_1.la = ta_server_2.la AND 

ta_server_1.menge <> ta_server_2.menge

und dann nur noch per Schleife in die DB ta_delta schreiben:

while rs.eof = false

 sSQL = "insert into ta_delta (servername, menge1, menge2) values ('" & _

            "rs.fields(0).value & "', '" & rs.fields(1).value & ", " & rs.fields(2).value & ")"

 rs.movenext 

wend

so müsste das ganze doch klappen, oder?

Danke und Gruß

Druid :cool:

Geschrieben

Alle die es interessiert:

Mit Statement 1 kriege ich alle Server, die in Ta_Server_1,

aber nicht in ta_server_2 sind. (--> Kombinationsschlüssel aus

servername und la)


select ta_server_1.* 

from 

ta_server_1 left join ta_server_2 ON 

((ta_server_1.servername = ta_server_2.servername) 

AND 

(ta_server_1.la = ta_server_2.la)) 

where 

(((ta_server_2.servername) Is Null) 

OR 

(ta_server_2.la Is Null));

Mit Statement 2 kriege ich das ganze andersherum:

select ta_server_2.* 

from 

ta_server_2 left join ta_server_1 ON 

((ta_server_2.servername = ta_server_1.servername) 

AND 

(ta_server_2.la = ta_server_1.la)) 

where 

(((ta_server_1.servername) Is Null) 

OR 

(ta_server_1.la Is Null))

Und mit dem letzten Statement kriege ich die Differenzen der Mengen la an einem Server aus beiden Tabellen!!

select 

ta_server_1.Servername, 

ta_server_1.la, 

ta_server_1.menge, 

ta_server_2.menge 

from ta_server_1, ta_server_2 

where 

((ta_server_1.servername = ta_server_2.servername) AND 

(ta_server_1.la = ta_server_2.la) AND 

(ta_server_1.menge <> ta_server_2.menge))

alles getestet --> läuft und liefert die richtigen Werte.

Danke für den Denkanstoß ;)

Greetz

Druid :cool:

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