collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 101
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 2
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14129
  • stats Beiträge insgesamt: 68359
  • stats Themen insgesamt: 9207
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: Fehler in Schleife  (Gelesen 737 mal)

Offline AOT

  • Newbie
  • Beiträge: 23
Fehler in Schleife
« am: Februar 27, 2018, 11:48:25 »
Liebes Forum,

ich muss in einer Schleife einen Denkfehler haben, komme aber einfach nicht drauf. Mit folgendem Code will ich in einer Tabelle, die mehrere Datensätze für das Jahr 2018 hat dieselben Einträge für das Jahr 2019 erzeugen.

Public Sub RankingJahrUebertrag()
Dim rsRankings As DAO.Recordset
Dim strJahr As String
Dim strRanking As String
Dim strLand As String
Dim strFind As String
Dim strSQL As String

'Fragt aus der Tabelle die Datensätze für das Jahr 2018 ab, weil nur diese neu angelegt werden sollen
Set rsRankings = CurrentDb.OpenRecordset("SELECT * FROM rankings WHERE Jahr = '2018' ORDER BY ID", dbOpenDynaset)

'Recordset durchlaufen
rsRankings.MoveLast
rsRankings.MoveFirst

'Überprüfen, auf welchen Datensatz gezeigt wird
Debug.Print "ID 0:" & rsRankings("ID").Value

'Schleife beginnen
Do While Not rsRankings.EOF

'Überprüfen, auf welchen Datensatz gezeigt wird
Debug.Print "ID 1:" & rsRankings("ID").Value

'Variablen mit Wert füllen, die erst gesucht und später evtl. ergänzt werden sollen
    strJahr = rsRankings("Jahr")
    strRanking = rsRankings("Ranking")
    strLand = rsRankings("Land")
'Da die Schleife mehrfach durchlaufen wird überprüft, ob der Datensatz bereits von 2018 auf 2019 übertragen wurde
    strFind = "Jahr = '2019' AND Land = '" & strLand & "' AND Ranking = '" & strRanking & "'"

rsRankings.FindFirst (strFind)
'Ergebnis zur Überprüfung ausgeben
Debug.Print rsRankings.NoMatch

'Bei Wahr den Datensatz neu einfügen
   If rsRankings.NoMatch = True Then
        strSQL = "INSERT INTO Rankings (Jahr, Land, Ranking) VALUES ('2019'" & ", '" & strLand & "', '" & strRanking & "');"
        'Überprüfung des SQL String
        Debug.Print strSQL
        CurrentDb.Execute strSQL
        'Requery, damit beim nächsten Durchlauf der neue Eintrag auch gefunden wird
        rsRankings.Requery
   Else
   End If
   
'Überprüfen, auf welchen Datensatz gezeigt wird
Debug.Print "ID 2:" & rsRankings("ID").Value

'Zumn nächsten Datensatz gehen
rsRankings.MoveNext

'Überprüfen, auf welchen Datensatz gezeigt wird
Debug.Print "ID 3:" & rsRankings("ID").Value

Loop

End Sub

Wenn der Code läuft, dann entstehe ein Endloscode mit folgender Ausgabe im Direktfenster
Zitat
ID 3:127
ID 1:127
Wahr
INSERT INTO Rankings (Jahr, Land, Ranking) VALUES ('2019', 'Pakistan', 'URAP');
ID 2:126
ID 3:127
ID 1:127
Wahr
INSERT INTO Rankings (Jahr, Land, Ranking) VALUES ('2019', 'Pakistan', 'URAP');
ID 2:126
ID 3:127
ID 1:127
Wahr
INSERT INTO Rankings (Jahr, Land, Ranking) VALUES ('2019', 'Pakistan', 'URAP');
ID 2:126
ID 3:127

Das Hauptproblem ist also, dass das Recordset nicht ganz durchlaufen ist.

Der SQL-Befehl wird einmal korrekt ausgeführt, aber obwohl er dann immer wieder erscheint, scheint er nicht ausgeführt zu werden, denn dann müsste eine Primärschlüsselverletzung auftreten. In einem ersten Versuch hatte ich es mit Recordset.AddNew.....Recordset.Update gemacht. Da ist die Primärschlüsselverletzung aufgetreten.

Die WHERE Jahr = 2018 Bedingung in der Definition des Recordsets hatte ich versuchsweise mal rausgenommen (so dass schon 2019 Datensätze beinhaltet waren), aber das hat nichts genutzt.

Komisch ist auch, dass die Ausgabe im Direktfenster das "Debug.Print "ID 0:" & rsRankings("ID").Value" nicht ausgibt.

Ich habe unten mal zwei Screenshots attached, die die Daten des Recordset zeigen und die Definition der Tabelle, in die geschrieben werden soll.

Ich befürchte, es ist ein ganz doofer Denkfehler.

Viele Grüße
Jürgen


 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 949
Re: Fehler in Schleife
« Antwort #1 am: Februar 27, 2018, 12:15:02 »
Aus der VBA-Hilfe:
Zitat
Beim Anwenden von Requery wird der erste Datensatz im Recordset zum aktuellen Datensatz.

Ansonsten ist das Ganze recht unklar und umständlich:
Ein Jahr als Text?
Warum verwendest Du nicht eine Abfrage mit Inkonsistenzprüfung als Datenbasis für eine Anfügeabfrage?
Mit freundlichem Glück Auf!

Eberhard
 

Offline AOT

  • Newbie
  • Beiträge: 23
Re: Fehler in Schleife
« Antwort #2 am: Februar 27, 2018, 12:26:23 »
Lieber Eberhard,

Vielen Dank! Da habe ich mal wieder zu kompliziert gedacht. Eine simple Abfrage der 2018-Datensätze und dann eine Anfügeabfrage dieser Abfrage an die Tabelle funktioniert.....

Dann bleibt die Frage des nicht funktionierenden Codes akademischer Natur. Das mit dem Requery wusste ich nicht, aber wenn ich es rausnehme, bleibt das Phänomen. Ist jetzt eigentlich egal, ich wäre nur neugierig... :-)

Vielen Dank noch mal!

Gruß
Jürgen
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 949
Re: Fehler in Schleife
« Antwort #3 am: Februar 27, 2018, 13:15:51 »
Zitat
Eine simple Abfrage der 2018-Datensätze und dann eine Anfügeabfrage dieser Abfrage an die Tabelle funktioniert.....
... wenn die Tabelle für 2019 leer ist. Ansonsten zusätzlich eine Inkonsistenzprüfung.

Im gleichen Sinne kann man aus dem einem Recordset in das andere übertragen. Wenn das Recordset für 2019 leer ist, braucht man auch nichts prüfen, wenn man die Datensätze aus 2018 in einem einfachen Durchlauf schreibt.

Dein Fehler wird also in der Kombination aus FindFirst und Requery zu suchen sein. Auch die verwendete Stilistik ist diskutabel. dbOpenDynaset würde ich nicht verwenden, wenn das Recordset nur zu lesen ist => dbOpenSnapshot oder dbOpenForwardOnly
Mit freundlichem Glück Auf!

Eberhard
 

Offline Wurliwurm

  • Access-Profi
  • **
  • Beiträge: 391
Re: Fehler in Schleife
« Antwort #4 am: Februar 27, 2018, 16:01:00 »
Dein Fehler wird also in der Kombination aus FindFirst und Requery zu suchen sein.

Ja. Niemals eine Schleife durch ein Recordset kombinieren mit Repositionieren innerhalb der Schleife. Es gibt Möglichkeiten, Recordsets zu klonen. In einem solchen Klon kann man beliebig Positionieren und Filtern, ohne am Zeiger des Originalrecordsets etwas ändern zu müssen.
 

 

Importieren von TxT Datei, Fehler bei Typumwandlung

Begonnen von ChristyleBoard Tabelle/Abfrage

Antworten: 5
Aufrufe: 8308
Letzter Beitrag Juni 22, 2010, 09:55:35
von LynnV
Endlosformular, Summe mit bedingter Formatierung, Fehler/Bug?

Begonnen von mongrawBoard Formular

Antworten: 2
Aufrufe: 2948
Letzter Beitrag Juni 02, 2010, 12:56:54
von mongraw
BAckend wird bereits verwenden FEHLER BITTE HELFEN

Begonnen von Muhtar99Board Access-Hilfe

Antworten: 5
Aufrufe: 4019
Letzter Beitrag Juli 02, 2010, 13:52:17
von DF6GL
Fehler in Beziehungen

Begonnen von BountyhunterBoard Tabelle/Abfrage

Antworten: 4
Aufrufe: 2764
Letzter Beitrag Juli 06, 2010, 12:58:08
von Bountyhunter
Fehler bei html-Seiten als Schnittstelle

Begonnen von derMarcBoard Access-Hilfe

Antworten: 6
Aufrufe: 4205
Letzter Beitrag August 24, 2010, 06:54:46
von Hondo