PDA

Vollständige Version anzeigen : Recordset spielt nicht alle Datensätze ein


PhilRich
03.11.2017, 12:43
Hallo MSO-Profis,

ich habe mir mit hilfe von Recordset zweier Abfragen eine dritte Abfrage gebastelt. Leider spielt es mir nicht alle Datensätze in die Zieltabelle und ich finde den Fehler nicht und kann ihn mir auhc nicht erklären, da er mir recht willkürlich erscheint.

Der VBA-Code sieht wie folgt aus:
Sub Kombi()

Dim db As DAO.Database
Dim abf As DAO.QueryDef
Dim rs_Tab As DAO.Recordset 'TabZiel
Dim rs_A As DAO.Recordset 'abfNeu
Dim rs_B As DAO.Recordset 'abfpastWeek
Dim rs_C As DAO.Recordset
Dim strA As String 'abfNeu
Dim strB As String 'abfpastWeek
Dim dA As Date 'DateA Parameter, für die Übergabe an die Abfrage abfpastWeek
Dim ingA As Integer
Dim iCountA As Integer 'Datensatz Counter
Dim i As Integer 'counter
Dim iID As Integer 'iID Parameter, zur übergabe an die Abfrage abfpastWeek
Dim iNeu As Integer
Dim iKonA As Integer
Dim iKonB As Integer
Dim iKonC As Integer
Dim iKonD As Integer

strA = "abfNeu"
strB = "abfpastWeek2"

Call löschen 'sub leert die Tabelle tabZiel vor dem einspielen

'DB-Verbindung
Set db = Application.CurrentDb
With db

Set rs_Tab = .OpenRecordset("tabZiel")
Set rs_A = .OpenRecordset(strA)

rs_A.MoveLast
iCountA = rs_A.RecordCount
Debug.Print "Anzahl: " & iCountA
rs_A.MoveFirst

For i = 1 To iCountA
Debug.Print "Beginn " & i
dA = rs_A.Fields("Datum").Value 'bestimmen von DateA
iID = rs_A.Fields("ID").Value ' bestimmen von iID
iNeu = rs_A.Fields("Neu").Value
Set abf = .QueryDefs(strB) ' abfpastWeek starten
abf.Parameters!DateA = dA
abf.Parameters!iID = iID
Set rs_B = abf.OpenRecordset(dbOpenDynaset)
iKonA = rs_B.Fields("Week1").Value
iKonB = rs_B.Fields("Week2").Value
iKonC = rs_B.Fields("Week3").Value
iKonD = rs_B.Fields("Week4").Value
Debug.Print "I: " & i & ", " & dA & ", " & iID & ", " & iNeu & ", " & iKonA; ";" & iKonB & ";" & iKonC & ";" & iKonD
With rs_Tab
.AddNew
.Fields("DatumNeu") = dA
.Fields("ID") = iID
.Fields("AnzahlNeu") = iNeu
.Fields("Week1") = iKonA
.Fields("Week2") = iKonB
.Fields("Week3") = iKonC
.Fields("Week4") = iKonD
.Update
End With
rs_B.Close
Set rs_B = Nothing
i = i + 1
rs_A.MoveNext
Debug.Print "Ende " & i & ", " & iCountA
Next
rs_A.Close
rs_Tab.Close
Set rs_A = Nothing
Set rs_Tab = Nothing
End With
Set db = Nothing
End Sub


Die Abfragen alleine funktionieren zu meiner zufriedenheit und liefern das gewünschte Ergebnis.
Es sollten jedoch 139 Datensätze eingespielt werden, leider kommen nur 70 an (vgl. dazu: 105984). Insbesondere sind Datensätze mit der ID 789 betroffen, aber ich glaube es fehlen noch weitere.
Ansonsten funktioniert der Code wie von mir beabsichtigt und das Ergbniss ist bis auf die fehlenden Datensätze wie von mir beabsichtigt und nach Stichproben Tests auch richtig.

Bin über jeden Verbessungsvorschlag und Tipp sehr dankbar.
Vielen Dank für eure Bemühungen im vorraus.

Ich hoffe es kann mir jmd. helfen.
Gruß Phil

PS: Ich teste es mit Acces2007-2010, es soll jedoch in Access2016 eingesetzt werden. Sollte aber meines Wissens keine Auswirkungen haben.

trekking1
03.11.2017, 13:18
Hi Phil,

warum "bastelst" Du aus 2 recordsets, die auf Abragen berufen eine dritte?

Geht das nicht komplett über SQL und dann nur eine Abrage?
In der Regel ist SQL ja deutlich schneller als "recordset gedaddel"

Viele Grüße
trekking

PhilRich
03.11.2017, 14:50
Hallo trekking,
Für SQL fehlt mir das Wissen und der Ansatz. Habe es auch schon versucht aber kein Licht am Ende des Tunnels gesehen. Die Variante über vba war leichter für mich umzusetzen. Die Performance steht nicht an erster Stelle. Hauptsache ich komme an die Daten.
Aber wenn du einen Ansatz für SQL hast werde ich mich diesen nicht verweigern.
Gruß Phil

ebs17
03.11.2017, 15:24
Aber wenn du einen Ansatz für SQL hast werde ich mich diesen nicht verweigern.
Die beiden Ausgangstabellen sind ja sehr übersichtlich, die Zieltabelle schon mal merkwürdig (Aufzählungsfelder Week1 ... Week4).

Kannst Du beschreiben, was eigentlich passieren soll? Aus dem verschlungenen Code würde ich den Sinn nur ungern entnehmen wollen.

trekking1
03.11.2017, 16:03
Schließe mich Eberhardt an.

Sag mal was Du genau machen willst und eventuell postest Du mal Deine Tabellenstruktur.

VG
trekking

Nouba
03.11.2017, 16:58
Die gezeigte Zieltabelle sollte wohl besser ein Resultat einer Kreuztabellenabfrage sein.

PS: warum ist denn die Dauer der ersten Woche um einen (1) Tag länger als die der restlichen drei Wochen?

PPS: mit wachsender Datenmenge wird früher oder später auch die Performance ein Faktor sein - ansonsten kannst Du die Daten ja auch in Excel belassen - oder wo stammen die Daten her?

PhilRich
03.11.2017, 20:05
Hallo,

ich versuche mal etwas Klarheit zu bringen.

Die Abfrage "abfNeu" grieft auf die Tabelle "tabAnzahl" zu und gibt den Tag (Datum) die ID und die Anzahl (Neu) wenn diese größer als am vor Tag ist.
Die Abfrage "abfpastWeek2" gibt basierend auf einem Datum und einer ID für diese die Kontakte "A" welche eine Woche (Week1), zwei Wochen (Week2) etc.
Ziel ist die Kombination der beiden Abfragen. Basierend auf dem Ergebnis von "abfNeu" sollen jeweils die Kontakte der Vorwoche ausgegeben werden. Beim SQL Code bin ich daran gescheitert das Datum aus der abfNeu an die abfpastWeek2 weiter zu geben.

Tabellenstruktur:
tabAnzahl(Datum;ID;Anzahl)
tabKontakte(Datum;ID;Kontakte)
tabZiel(Datum;ID;Week1;etc.)

Beispieldaten:
ID-123;456;789
Kontakte-A;B;C
Datum von 1.1.2016-31.12.2016
Jede ID hat je Tag einen Kontakt in tabKontakte (im Orginal sind es mehrere Kontakte unterschiedlicher Art je Tag, deshalb gibt es auch keinen Schlüssel) und eine Zahl >=0 in Anzahl in der Tabelle tabAnzahl.

@Nouba: Die Dauer der Wochen überprüfe ich noch einmal, danke für den Hinweis.

Die Tabellen sind nur vereinfachte Beispiele, so auch die Anzahl der Datensätze, weshalb eine verarbietung in Excel ausscheidet. Die kommen aus einer anderen Datenbank.

Gruß Phil

PhilRich
07.11.2017, 18:41
Hallo,

ich konnte den Fehler beheben.
In der For-Schleife war noch ein i=i+1, also ein blöder Anfängerfehler...-.-

Ich danke für die Hinweise und Denkanstöße.:D

Schönen Abend
Phil