Zum Inhalt springen

Vergleichen von Datensätzen in VBScript


Empfohlene Beiträge

Hallo zusammen,

ich muss ein Script programmieren das Datensätze einer Datenbank miteinander vergleicht.

Und zwar gibt es dort einen Baublockschlüssel dem eine Straße, Hausnummer und GebietsNr zugeordnet sind. Sieht in etwa so aus:

Baublockschlüssel - Straßenschlüssel - HausNr - GebietsNr

1234567 - 2846 - 5 - 9,8,7

1234567 - 2846 - 6 - 9,8,7

1234567 - 2846 - 7 - 9,8,7

1234567 - 2846 - 8 - 9,8

6548741 - 8949 - 5 - 4,7,1

6548741 - 8949 - 6 - 4,1

6548741 - 8949 - 7 - 4,7,1

1987357 - 1837 - 12 - 15, 18

1987357 - 1837 - 13 - 15, 18

1987357 - 1837 - 14 - 15, 17

Nun soll geprüft werden ob die Datensätze gleich sind, bis auf die HausNr natürlich. Als Vergleichsdatensatz soll immer der erste des Baublockschlüssels dienen, in dem Beispiel also folgende:

1234567 - 2846 - 5 - 9,8,7

6548741 - 8949 - 5 - 4,7,1

1987357 - 1837 - 12 - 15, 18

Geprüft werden soll ob die Straßenschlüssel gleich sind und ob die GebietsNr gleich sind. Wenn diese unterschiedlich sind soll es in eine Ausgabedatei geschrieben werden.

Das Problem das ich habe ist, dass ich nicht weiß wie ich sagen soll das der nächste Straßenschlüssel genutzt werden.

Über jegliche Hilfe würde ich mich freuen.

Mfg

SnOOp87

Link zu diesem Kommentar
Auf anderen Seiten teilen

nun, du kannst ein recordset aufmachen die datensätze der einzelnen tabellen durchgehen oder aber ein spezifisches SQL bauen.

mir ist nur noch nicht klar, ob du jetzt VBS-code sehen willst (bzw. eine frage dazu hast), oder eher datenbankspezifischer antworten hören willst; im zweiteren fall passt das eher ins datenbankforum.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe nun das Recordset implementiert. Bin nun aber auf das Problem gestoßen, dass ich es nur hinbekomme alle Datensätze gleichzeitig aus der DB auslesen kann.

Wie jedoch, oben schon angedeutet, muss ich Schrittweise vorgehen.

1. Schritt: Auslesen eines Datensatzes mit Baublockschlüssel X

2. Schritt: Vergleichen von Baublockschlüssel, Straßenschlüssel und GebietsNr des Datensatzes aus Schritt 1 mit den folgenden Datensätzen bei denen der Baublockschlüssel gleich ist

3. Schritt: Schreiben von Fehlerhaften Datensätzen in eine Ausgabedatei

4. Schritt: Nächsten Baublockschlüssel auslesen

Wiederholen der Schritte 2-4.

Wie setze ich das in VBS um? Kann mir da jemand ein kurzes Beispielscript geben an dem ich mich orientieren kann?

Gruß,

SnOOp87

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe nun das Recordset implementiert. Bin nun aber auf das Problem gestoßen, dass ich es nur hinbekomme alle Datensätze gleichzeitig aus der DB auslesen kann.

Wie jedoch, oben schon angedeutet, muss ich Schrittweise vorgehen.

1. Schritt: Auslesen eines Datensatzes mit Baublockschlüssel X

2. Schritt: Vergleichen von Baublockschlüssel, Straßenschlüssel und GebietsNr des Datensatzes aus Schritt 1 mit den folgenden Datensätzen bei denen der Baublockschlüssel gleich ist

3. Schritt: Schreiben von Fehlerhaften Datensätzen in eine Ausgabedatei

4. Schritt: Nächsten Baublockschlüssel auslesen

Wiederholen der Schritte 2-4.

Wie setze ich das in VBS um? Kann mir da jemand ein kurzes Beispielscript geben an dem ich mich orientieren kann?

Gruß,

SnOOp87

Moin,

ich nehme mal an du suchst so etwas.


Fehlerprotokolldatei öffen

Lesen der Tabelle sortiert nach Baublockschlüssel, Strassenschlüssel, Gebietsnr

solange nicht Ende des Recordsets

	Baublock_1 <-- Baublockschlüssel

	Strasse_1 <-- Strassenschlüssel

	Gebiet_1 <-- Gebietsnr

	solange nicht Ende des Recordsets und Baublockschlüssel = Baublock_1

		wenn Strasse_1 <> Strassenschlüssel oder Gebiet_1 <> Gebietsnr

			Satz des Recordsets als Fehler protokollieren

		Ende Wenn

		nächsten Satz des Recordsets lesen

	Ende Solange

Ende Solange

Fehlerprotokolldatei schließen

Ich hoffe, du kannst mit dem Pseudocode etwas anfangen.

Reinhold

(der mit den tollen Ohren)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich das richtig verstanden habe dann müsste der Code so aussehen:


Do while not rs.EOF


varStrasse	 	 = rs.Fields("Strasse")

varHausnummer	 = rs.Fields("Hausnummer")

varGebietNr 	 = rs.Fields("GebietNr")

varGebietstyp    = rs.Fields("Gebiettyp") 


varStrasse2	 	 = varStrasse

varHausnummer2	 = varHausnummer

varGebietNr2 	 = varGebietNr

varGebietstyp2   = varGebietstyp


Do while not rs.EOF and varGebietNr = varGebietNr2


if varStrasse2 <> varStrasse or varGebietNr2 <> varGebietNr then 

Datei.WriteLine(varGebietNr & ";" & varStrasse & ";" & varGebietstyp & ";" & varHausnummer & ";" & "Fehler")

end if

rs.MoveNext

Loop

Loop


Datei.Close

Das auslesen der Daten aus der DB und das erstellen/öffnen der Ausgabedatei habe ich jetzt mal weggelassen. Das funktioniert nämlich ganz gut.

Mit dem Beispiel habe ich allerdings Probleme. Ich bekomme keinerlei Fehlermeldungen. Kannst du vielleicht einmal drübersehen ob das von mir richtig umgesetzt wurde?

Gruß,

SnOOp87

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,


Set rs = currentdb.OpenRecordset(...)

rs.MoveFirst

Do while not rs.EOF

    varStrasse2 = rs.Fields("Strasse")

    varHausnummer2 = rs.Fields("Hausnummer")

    varGebietNr2 = rs.Fields("GebietNr")

    varGebietstyp2  = rs.Fields("Gebiettyp") 


    Do while not rs.EOF and varGebietNr = rs.Fields("GebietNr")

       if varStrasse2 <> rs.Fields("Strasse") or varGebietNr2 <> rs.Fields("GebietNr") then 

            Datei.WriteLine(rs.Fields("GebietNr") & ";" & rs.Fields("Strasse")& ";" & rs.Fields("Gebiettyp") & ";" & rs.Fields("Hausnummer") & ";" & "Fehler")

       end if

       rs.MoveNext

    Loop

Loop

Datei.Close

rs.close

set rs=nothing

ungefähr so, wie immer ungetestet.

Reinhold

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke schon mal für die Umfangreiche Hilfe, sieht so aus als ob ich dem Ergebnis immer näher komme. Allerdings verstehe ich folgenden Teil des Codes nicht:


Set rs = currentdb.OpenRecordset(...)

[/QUOTE]


Wofür ist das? 

Ich habe die Verbindung zur DB bisher über die ADODB gemacht. Also so:


[CODE]

Set rs = CreateObject("ADODB.Recordset")

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= vorlage.mdb"

SQL = "SELECT..."


Conn.Open (strConn)

rs.Open SQL, Conn, 0, 1

Für einen weiteren Tip wäre ich sehe dankbar.

Gruß,

SnOOp87

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Es passiert nichts, das Script läuft nicht durch. Es sieht so aus als ob es in eine Endlosschleife geht.

Nehme ich diesen Teil raus, läuft das Script durch. Allerdings wird dort jeder Datensatz als falsch gekennzeichnet, was definitiv nicht der Fall ist.

and varGebietNr = rs.Fields("GebietNr")

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

Habe den Fehler gefunden. Es war ein Tippfehler, nichts weiter.

Das Script läuft nun durch, die Funktion ist jedoch noch nicht 100% richtig.

Und zwar funktionert die Prüfung des Gebietstyps nicht.

Es muss geprüft werden ob die Gebietstypen bei jeder Gruppe von Baublöcken gleich sind. Soweit ich das sehen kann hast du das auch in den Code mit integriert, aber irgendwie geht das nicht.

Ich bin dir trotzdem schon sehr dankbar für die bisherige Hilfe.

Gruß,

SnOOp87

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

ich habe mein Script so gut wie fertig leider bricht es immer ab. Hier erst einmal das komplette Script:

'On Error Resume Next


Const Ausgabedatei = "Ausgabe.csv"

Const ForReading = 1


Set Conn = CreateObject("ADODB.Connection")

Set rs = CreateObject("ADODB.Recordset")

Set fso = CreateObject("Scripting.FileSystemObject")


strDriver = "PROVIDER=MSDASQL;DRIVER=SQL Server;"

strServer = "SERVER=XXX;"		'Server ändern wenn nötig

'strUsername = "UID=[myUsername];"			'Benutzername einfügen wenn nötig

'strPassword = "PWS=[myPassword];"			'Passwort einfügen wenn nötig

strDatabase = "DATABASE=XXX;"	'Datenbank ändern wenn nötig


Dim strComplete

strComplete = strDriver & strServer & strUsername & strPassword & strDatabase


SQL = XXX

Conn.Open strComplete

rs.Open SQL, Conn, 0, 1


'Ausgabedatei erstellen

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set Datei = objFSO.OpenTextFile(Ausgabedatei, 2, true)


If Not objFSO.FileExists(Ausgabedatei) Then

Set Datei = objFSO.CreateTextFile(Ausgabedatei, True)

Datei.close

End If


Datei.WriteLine("GebietsNr" & ";" & "Straße" & ";" & "Hausnummer" & ";" & "Buchstabe" & ";" & "Gebietstyp")

rs.MoveFirst

Do while not rs.EOF

	varStrasse		 = rs.Fields("Strasse")

	varHausnummer	 = rs.Fields("HAUSNR")

	varGebietNr 	 = rs.Fields("Gebiet_Nr")

	varGebietstyp   = rs.Fields("Gebiettyp") 

	varBuchstabe 	 = rs.Fields("BUCHSTABE")


	Do while not rs.EOF and varGebietNr = rs.Fields("Gebiet_Nr") 	

		if varStrasse <> rs.Fields("Strasse") or varGebietNr <> rs.Fields("Gebiet_Nr") or varGebietNr = "999999" then 

			Datei.WriteLine(rs.Fields("Gebiet_Nr") & ";" & rs.Fields("Strasse")& ";" & rs.Fields("HAUSNR") & ";" & rs.Fields("BUCHSTABE") & ";" & rs.Fields("Gebiettyp") & ";" & "Fehler")

		end if

	rs.MoveNext

	Loop

Loop 

Datei.Close

rs.close

set rs=nothing

MsgBox "Fertig!"
Im Anhang ist die Fehlermeldung. Ich habe jetzt schon google befragt, aber ich finde leider keine Lösung zum genannten Fehler. Die Zeile mit dem Fehler ist folgende:
Do while not rs.EOF and varGebietNr = rs.Fields("Gebiet_Nr") 

Wäre klasse wenn mir jemand schnell helfen könnte.

Gruß,

SnOOp87

post-52535-14430448278303_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

habe den Fehler gelöst. Habe es nun so gemacht:


if varGebietNr <> rs.Fields("GEBIET_NR") then

exit do

end if

Allerdings habe ich ein weiteres Problem im Ablauf des Scriptes entdeckt. In der Datenbank befinden sich eine Menge an Daten die in etwa so aussehen:

Datensatz 1:

Strasse HausNr Buchstabe Gebietstyp GebietsNr ObjektNr

Ackerweg 1 A 2 120 6733

Ackerweg 1 A 6 50 6733

Ackerweg 1 A 9 1201803 6733

Ackerweg 1 A 12 50 6733

Ackerweg 1 A 26 2 6733

Ackerweg 1 A 27 10 6733

Ackerweg 1 A 29 300 6733

Ackerweg 1 A 46 101 6733

Ackerweg 1 A 47 300 6733

Ackerweg 1 A 48 130 6733

Ackerweg 1 A 64 2302 6733

Ackerweg 1 A 65 120 6733

Datensatz 2:

Strasse HausNr Buchstabe Gebietstyp GebietsNr ObjektNr

Ackerweg 1 B 2 120 6733

Ackerweg 1 B 6 50 6733

Ackerweg 1 B 9 1201803 6733

Ackerweg 1 B 12 50 6733

Ackerweg 1 B 26 2 6733

Ackerweg 1 B 27 10 6733

Ackerweg 1 B 29 300 6733

Ackerweg 1 B 46 101 6733

Ackerweg 1 B 47 300 6733

Ackerweg 1 B 48 130 6733

Ackerweg 1 B 64 2302 6733

Ackerweg 1 B 65 120 6733

Bei diesen Datensätzen muss verglichen werden ob bei beiden Datensätzen die Gebietstypen identisch sind. (Im Anhang ist es etwas besser zu erkennen).

Leider habe ich keine Ahnung wie ich das anstellen soll. Dafür sind meine Programmierkenntnisse zu gering.

Kann mir da jemand sagen wie man das umsetzen kann?

post-52535-14430448279748_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

das hat weniger mit programmieren zu tun, ehr mit logik :)

if varGebietNr == rs.Fields("GEBIET_NR") then

  if varGebietsTyp == rs.Fields("Gebietstyp_NR") then

      mach was tolles

  end if

else

  exit do

end if

ka ob die syntax so richtig is da ich nur php programmiere :P

Ted

Link zu diesem Kommentar
Auf anderen Seiten teilen

funktioniert nicht is immer ne schlechte aussage.

der von mir unten gelistete code sollte dir

wenn die gebietsnr gleich is ueberprüfen ob der gebietstyp gleich ist

also von der logik her.

wars das was du brauchtest oder hab ich dich missverstanden?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich mach es mal so:

Es gibt eine ObjektNr die einem bestimmten Haus zugeordnet ist, z.B. 45678. Der 45678 sind nun verschiedene Gebietstypen zugeordnet.

Der Gebietstyp steht für einen Typen, beispielsweise 100 für die Müllabfuhr.

Die GebietsNr ist dann die Nummer des Gebietes z.B. 63 für den Müllbezirk 63.

So ist die ganze Stadt in zig Gebiete aufgeteilt. Jede Gebietstyp-Nr steht für eine andere Art (da gibt es noch Kindergarten, Schule, Wahlbezirke etc.).

Die Objekte sind noch einmal in Baublockseiten (GebietsNr) unterteile, beispiel 7413684.

Und ich muss Prüfen ob alle Objekte im Baublock 7413684 die gleichen Gebietstypen hat. Und natürlich alle anderen auch ;)

Vielleicht habe ich es oben etwas unverständlich ausgedrückt. Aber ich denke so ist das verständlicher.

Zu deinem Code:

Teilweise würde ich sagen ist das korrekt, allerdings prüfst du ja nur die Gebietstypen der einen GebietsNr.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zu deinem Code:

Teilweise würde ich sagen ist das korrekt, allerdings prüfst du ja nur die Gebietstypen der einen GebietsNr.

ja, weil ich dachte das soll so ;p

du kannst die bedingung ja auch irgendwo anders hinsetzen?!

aber so wirklich schlau werd ich aus dem was du machen sollst trotzdem ned :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielleicht sieht man das hier etwas besser (Anhang).

Da sind 3 verschiedene Objekte (Häuser, wieso die keinen Buchstaben hat ist egal). Wie man sieht erscheinen die Nummern für die Gebietstypen immer wieder auf.

Jetzt habe ich z.B. 25 Objekte im Gebietstypen 9 (500202 bei Objekt 1). Dort muss verglichen werden ob alle Objekte im Gebietstyp 500202 die gleichen Gebietstypen hat und ob der Inhalt identisch ist.

D.h. es muss geprüft werden ob alle Objekte im Gebiet 500202 die Gebietstypen 1, 2, 6, 9, 12, 26, 27, 29, 46, 47, 48, 64, 65, 100 haben und ob der Inhalt bei allen Objekt identisch ist. Wenn nicht -> Meldung!

Verständlich?

Gruß,

SnOOp87

PS: Ich kann dich verströsten, ich habe es auch erst nach dem 3x kapiert was ich machen soll.

post-52535-14430448280303_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...

Ich hol das hier noch mal hoch, da sich die Anforderung noch einmal geändert hat.

Am besten kann ich das anhand des Bilds im Anhang erklären.

Folgende Prüfung muss erfolgen:

Münsterstrasse 287 100202 9

Münsterstrasse 289 100202 9

Münsterstrasse 291 100202 9

Münsterstrasse 293 100202 9

Berlinerstrasse 303 100202 9

Im Bruch 2 100204 9

Es muss im Datensatz geprüft werden ob alle Daten identisch sind (bis auf die Hausnummer. Sobald eine neue GebietsNr kommt, muss geprüft werden ob die Straße eine andere ist oder ob diese gleich ist. Bei einer gleichen Straße ist alle in Ordnung, ist die Straße eine andere (siehe Berlinerstrasse) muss eine Fehlermeldung ausgegeben werden. Bei der Straße "Im Bruch" hingegen ist alles in Ordnung.

Ich habe mir gedacht, dass man es mit moveNext und movePrevious lösen kann, aber ich weiß nicht wie ich das aufbauen soll.

Kann mir da jemand einen Tipp geben?

Gruß,

SnOOp87

post-52535-1443044839708_thumb.jpg

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