Hallo,
ich habe mich an einem simplen loop festgebissen und komme alleine nicht weiter...
Aufgabe:
In einer Abfrage befinden sich Datensätze mit einer Email-Adresse
Die Datensätze sollen dahingehend geprüft werden, dass in einer Tabelle diese Email-Adresse noch nicht vorhanden ist.
Ich probiere das mit 2 Loops...wahrscheinlich gibt es elegantere Lösungen...
Der innere Loop läuft endlos...warum???
Wie macht man das eleganter?
Option Compare Database
Option Explicit
Public Sub EmailDoppelt()
Dim dB As DAO.Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim l As Long
Set dB = CurrentDb
Set rs = dB.OpenRecordset("tmpCheckDuplikateLeerQ", dbOpenSnapshot)
Do Until rs.EOF
Set rs2 = dB.OpenRecordset("AdressdatenT", dbOpenSnapshot)
For l = 0 To rs2.EOF
If rs!tmpEmail = rs2!Email Then
Debug.Print "Die Email-Adresse von" & rs!Nr & rs!tmpFirma & rs!tmpEmail & "besteht schon in der Datenbank"
End If
Next l
Loop
MsgBox "Durchgelaufen"
'Aufräumen
Set rs = Nothing
Set rs2 = Nothing
Set dB = Nothing
End Sub
Hallo,
erstelle eine Abfrage mit der jetzigen Abfrage und der Tabelle, verknüpfe über die Mailadresse und ändere den Beziehungstyp (left oder right join).
Hallo,
nur(!) bzgl. dem Code:
Zitat.
.
.
Set rs = dB.OpenRecordset("tmpCheckDuplikateLeerQ", dbOpenSnapshot)
Do Until rs.EOF
Set rs2 = dB.OpenRecordset("AdressdatenT", dbOpenSnapshot)
Do until rs2.EOF
If rs!tmpEmail = rs2!Email Then
Debug.Print "Die Email-Adresse von " & rs!Nr & "~" & rs!tmpFirma & "~" & rs!tmpEmail & " besteht schon in der Datenbank"
Exit Do
End If
rs2.MoveNext
Loop
rs.MoveNext
Loop
.
.
.
ZitatDer innere Loop läuft endlos...warum???
Bei Wahrheit der Behauptung hättest Du eine endlose Liste aus dem Debug vorliegen. Ist das so?
Franz hat ja schon korrigiert und die größten Grauenhaftigkeiten beseitigt.
Loop ohne MoveNext gibt eine Endlosschleife. Das betrifft die ÄUßERE Schleife.
For l = 0 To rs2.EOFEOF kann True oder False ergeben. l=1 wird wahrscheinlich als True ausgewertet, also eher nicht endlos in der Schleife, sondern sehr schnell abgebrochen. Die Schleife ist da aber recht umsonst im Sinne einer beabsichtigten Wirkung. Wie man mit einer Laufvariable ernsthaft zu EOF aufrücken will, müsste man besonders erklären.
Zitatwahrscheinlich gibt es elegantere Lösungen...
... dafür nicht so aufregend und empfänglich für selbst hineingetragene Fehler.
Grundlagen - SQL ist leicht (18) - Datensätze aus A, die nicht in B sind (https://www.ms-office-forum.net/forum/showthread.php?t=379033)
Die Eleganz von Abfragen in einer Datenbankumgebung wird, obwohl Umsetzung der nativen Sprache in einer DB, nicht so oft erkannt.
Vielen Dank für die Hilfe!
Läuft jetzt einwandfrei!
Public Sub EmailDoppelt()
Dim dB As DAO.Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim msg As String
Set dB = CurrentDb
Set rs = dB.OpenRecordset("tmpCheckDuplikateLeerQ", dbOpenSnapshot)
Do Until rs.EOF
Set rs2 = dB.OpenRecordset("AdressdatenT", dbOpenSnapshot)
Do Until rs2.EOF
If rs!tmpEmail = rs2!Email Then
msg = msg & vbCrLf _
& "Die Email-Adresse von " & "Nr " & rs!Nr & " " & rs!tmpFirma & " " & "~ " _
& rs!tmpEmail & " ~" & " besteht schon in der Datenbank" & vbCrLf
Exit Do
End If
rs2.MoveNext
Loop
rs.MoveNext
Loop
If Len(msg) > 0 Then _
MsgBox msg & vbCrLf & "Vermutlich besteht die Firma schon in einer ähnlichen Schreibweise." _
& vbCrLf & "Die korrekte Schreibweise ist die mit GmbH oder KG oder ... am Ende." _
& vbCrLf & "Bitte korrigieren Sie entsprechend."
'Aufräumen
Set rs = Nothing
Set rs2 = Nothing
Set dB = Nothing
End Sub
Hallo,
und was ist damit:
ZitatWie macht man das eleganter?
Siehe #1 und Eberhards Hinweise in #3.
Eleganz beim Programmieren entsteht durch Lernen und Erfahrung.
Genau!
Und durch gute Hilfestellung!
Ein paar Zeilen Code können dabei Wunder bewirken!
Vor allem in der Anfangsphase, wenn Vokabular und Satzbau noch in der Kinderstube stecken.
Und jede Zeile mühsam zusammengeklaubt werden muss. Man Techniken, Befehle und Zusammenhänge noch nicht genügend kennt oder einordnen kann.
Ich habe in dieser Gruppe sehr viel Hilfe bekommen. Wenn ich mir anschaue, was ich innerhalb eines Vierteljahres gelernt und umgesetzt habe...das hätte ich niemals gedacht.
Die schnellsten und qualitativ besten Fortschritte kamen immer dann, wenn sich jemand die Mühe gemacht hat und den nötigen Code geschrieben hat. Das erhält dann auch die Motivation.
Beim nächsten mal kennt man die Situation und kann in der Regel darauf aufbauen oder ableiten.
Ich hatte gestern eine weitere ähnliche Situation mit einem Loop...das war überhaupt kein Thema mehr!
Schöne Grüße aus Lüneburg
Harry
Hallo,
die Eleganz kann auch darin bestehen, gar nix (oder wenig) programmieren zu müssen.
Wenn Du dich mit den Hinweisen in #1 und #3 beschäftigst, wirst Du festellen, dass man so gut wie gar keinen Code mehr benötigt und schon gar keine Schleife.
Vielen Dank für die Anregungen,
mein kleines Projekt hat momentan
- 33 Tabellen und
- 23 Abfragen
Von diesem Konstrukt werden bei Aufsplittung der Datenbank momentan 7 Tabellen ins Backend gehen.
Der Rest Abfragen und Tabellen dient der Erzielung von Ergebnissen.
Über teilweise mehrstufige Abragen/Tabellenerzeugungsabfragen/erzeugte Tabellen usw...usf...
In diesem Konstrukt verliert man irgendwann den Überblick und muss ihn sich immer wieder mühsam zurückerkämpfen. Ich habe mir dazu schon eine Excel-Tabelle angelegt, um schneller sehen zu können, was von wem und wie erzeugt wird.
Ich habe am Anfang nahezu alles mit Abfragen und temporären Tabellen geregelt, weil meine Programmierkenntnisse bei NULL waren...
Man stößt aber offensichtlich irgendwann an die Grenzen der Übersichtlichkeit, wenn man Dinge nicht im Code geschlossen regelt.
Ich habe durch die Code-Zeilen, die mir hier geschrieben gegeben wurden - gerade auch in SQL - gesehen, wie komprimiert und schnell man Daten ermitteln und verwerten kann, wenn man SQL beherrscht.
Das nächste was ich mache, wenn ich etwas Luft habe, wird die tiefere Einarbeitung in das Thema SQL sein!
Schöne Grüße aus Lüneburg
Harry