SnOOp87 Geschrieben 16. März 2009 Teilen Geschrieben 16. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 16. März 2009 Teilen Geschrieben 16. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 18. März 2009 Autor Teilen Geschrieben 18. März 2009 Wie ich das Problem löse ist egal. Vielleicht kannst du mir ja mal ein Beispiel bzgl. der Datenbankspezifischen Version geben. Welches ist denn die bessere Variante? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 20. März 2009 Autor Teilen Geschrieben 20. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 26. März 2009 Autor Teilen Geschrieben 26. März 2009 Kann keiner helfen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Reinhold Geschrieben 26. März 2009 Teilen Geschrieben 26. März 2009 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) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Reinhold Geschrieben 27. März 2009 Teilen Geschrieben 27. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Reinhold Geschrieben 27. März 2009 Teilen Geschrieben 27. März 2009 Moin, deine Variante mit ADO kann auch klappen, hast du es denn schon probiert? Ich alter Mann nehme idR DAO, aber das sollte doch so auch gehen. Verrate doch mal, was nicht funktioniert? Reinhold Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 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") Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 30. März 2009 Autor Teilen Geschrieben 30. März 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 1. April 2009 Autor Teilen Geschrieben 1. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 6. April 2009 Autor Teilen Geschrieben 6. April 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 6. April 2009 Teilen Geschrieben 6. April 2009 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 Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 6. April 2009 Autor Teilen Geschrieben 6. April 2009 Habe das mal ausprobiert (natürlich vorher die Syntax geändert), aber das funktioniert leider absolut nicht. Trotzdem danke für deine Bemühungen. Gruß, SnOOp87 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 6. April 2009 Teilen Geschrieben 6. April 2009 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?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 6. April 2009 Autor Teilen Geschrieben 6. April 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 6. April 2009 Teilen Geschrieben 6. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 6. April 2009 Autor Teilen Geschrieben 6. April 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SnOOp87 Geschrieben 29. Mai 2009 Autor Teilen Geschrieben 29. Mai 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.