Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

loop läuft sich tot

Begonnen von Umbauwfb, Februar 26, 2022, 10:34:01

⏪ vorheriges - nächstes ⏩

Umbauwfb

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

MzKlMu

#1
Hallo,
erstelle eine Abfrage mit der jetzigen Abfrage und der Tabelle, verknüpfe über die Mailadresse und ändere den Beziehungstyp (left oder right join).
Gruß Klaus

DF6GL

#2
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

.
.
.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ebs17

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

Die Eleganz von Abfragen in einer Datenbankumgebung wird, obwohl Umsetzung der nativen Sprache in einer DB, nicht so oft erkannt.
Mit freundlichem Glück Auf!

Eberhard

Umbauwfb

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

MzKlMu

Hallo,
und was ist damit:
ZitatWie macht man das eleganter?
Siehe #1 und Eberhards Hinweise in #3.
Gruß Klaus

Beaker s.a.

Eleganz beim Programmieren entsteht durch Lernen und Erfahrung.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Umbauwfb

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

MzKlMu

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

Umbauwfb

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