online 1
gast (50)

/ Forum / Datenbanken

DatenbankenDatenbanken

Fragevon RalfH vom 11.01.2019, 14:23 Options

Schleife über Recordset

Hallo,

Eine Tabelle mit 3 Spalten ( Batch1 Batch2 Batch3 ) und 43 Zeilen pro Spalte möchte ich mit einem Recordset auslesen und mit einigen zusätzlichen Variablen in einer neuen Tabelle speichern.
Hier mal der Code:
Dim qd As QueryDef
Dim db As dao.Database
Dim td As TableDef
Dim rst As dao.Recordset
Dim rst2 As dao.Recordset
Dim xy
Dim a, b, z As String
Dim m, n, o, p As Long
Dim I, j, ll As Long
Dim EingDatum As Date
Dim Uhrz As Date
Dim AnzDS As Long
Uhrz = Time
EingDatum = Date
b = "Produktionsnummer"

Set db = CurrentDb

Set rst = db.OpenRecordset("Neue Tabelle", dbOpenTable)
Set rst2 = db.OpenRecordset("TabFahrzeuge", dbOpenTable)

With rst
´I = 0
For I = 1 To 3 ´Spalte
j = 0
For j = 1 To 43 ´Zeile
Next


If j Mod 43 = 1 Then
For ll = 1 To 3
rst.MoveNext
rst2.AddNew
rst2![Eingabe am] = EingDatum
rst2!Uhrzeit = Uhrz
rst2!Bereich = o
rst2!Linie = n
rst2!ProdNr = a
rst2!Radstand = m
rst2!Farbcode = z
rst2!mp1 = rst!Batch1
rst.MoveNext
rst2!mp2 = rst!Batch1
rst.MoveNext
rst2!mp3 = rst!Batch1
rst.MoveNext
rst2!mp4 = rst!Batch1
rst.MoveNext
rst2!mp5 = rst!Batch1
rst2.Update
Next ll

Hier bekomme ich die Fehlermeldung 3021 Kein altueller Datensatz, obwohl die Ursprungstabelle definitiv gefüllt ist.

Was mach ich falsch ?
Gruß Ralf


Antwort schreiben

Antwort 1 von Teddy7 vom 11.01.2019, 15:46 Options

Hi Ralf !

Also erstmal:
hier stimmt auch was nicht:
For I = 1 To 3 ´Spalte
j = 0
For j = 1 To 43 ´Zeile
Next

fehlt da ein next / ist das noch nicht fertig ???

zum Problem:
Du machst als erstes ein rst.movenext

next - von wo aus ?
Als erstes gehört da also ein rst.movefirst hin

Gruß
Teddy

Antwort 2 von RalfH vom 12.01.2019, 08:20 Options

Hallo Teddy7 und ein frohes , Gesundes und hoffentlich Erfolgreiches neues Jahr2007 wünsche ich Dir !

Erstmal: Schleifen sind meine Schwäche :(

Zitat:
For I = 1 To 3 ´Spalte
j = 0
For j = 1 To 43 ´Zeile
Next

fehlt da ein next / ist das noch nicht fertig ???

Ich kann leider nicht den ganzen Code reinsetzen, hast recht!


Habe den Code nun verändert, das Recordset liest auch alle drei Batches, schreibt mir allerdings immer nur Batch1 in die Tabelle.
Hier mal der Code :

Zitat:
For ll = 1 To 1
rst.MoveFirst

rst2.AddNew
rst2![Eingabe am] = EingDatum
rst2!Uhrzeit = Uhrz
rst2!Bereich = o
rst2!Linie = n
rst2!ProdNr = a
rst2!Radstand = m
rst2!Farbcode = z
rst2!mp1 = rst!Batch1
rst.MoveNext
rst2!mp2 = rst!Batch1
rst.MoveNext
rst2!mp3 = rst!Batch1
rst.MoveNext
rst2!mp4 = rst!Batch1
rst.MoveNext
rst2!mp5 = rst!Batch1
rst.MoveNext
rst2!mp6 = rst!Batch1
rst.MoveNext
rst2!mp7 = rst!Batch1
rst.MoveNext
rst2!mp8 = rst!Batch1
rst.MoveNext
rst2!mp9 = rst!Batch1
rst.MoveNext
rst2!mp10 = rst!Batch1
rst.MoveNext
rst2!mp11 = rst!Batch1
rst.MoveNext
rst2!mp12 = rst!Batch1
rst.MoveNext
rst2!mp13 = rst!Batch1
rst.MoveNext
rst2!mp14 = rst!Batch1
rst.MoveNext
rst2!mp15 = rst!Batch1
rst.MoveNext
rst2!mp16 = rst!Batch1
rst.MoveNext
rst2!mp17 = rst!Batch1
rst.MoveNext
rst2!mp18 = rst!Batch1
rst.MoveNext
rst2!mp19 = rst!Batch1
rst.MoveNext
rst2!mp20 = rst!Batch1
rst.MoveNext
rst2!mp21 = rst!Batch1
rst.MoveNext
rst2!mp22 = rst!Batch1
rst.MoveNext
rst2!mp23 = rst!Batch1
rst.MoveNext
rst2!mp24 = rst!Batch1
rst.MoveNext
rst2!mp25 = rst!Batch1
rst.MoveNext
rst2!mp26 = rst!Batch1
rst.MoveNext
rst2!mp27 = rst!Batch1
rst.MoveNext
rst2!mp28 = rst!Batch1
rst.MoveNext
rst2!mp29 = rst!Batch1
rst.MoveNext
rst2!mp30 = rst!Batch1
rst.MoveNext
rst2!mp31 = rst!Batch1
rst.MoveNext
rst2!mp32 = rst!Batch1
rst.MoveNext
rst2!mp33 = rst!Batch1
rst.MoveNext
rst2!mp34 = rst!Batch1
rst.MoveNext
rst2!mp35 = rst!Batch1
rst.MoveNext
rst2!mp36 = rst!Batch1
rst.MoveNext
rst2!mp37 = rst!Batch1
rst.MoveNext
rst2!mp38 = rst!Batch1
rst.MoveNext
rst2!mp39 = rst!Batch1
rst.MoveNext
rst2!mp40 = rst!Batch1
rst.MoveNext
rst2!mp41 = rst!Batch1
rst.MoveNext
rst2!mp42 = rst!Batch1
rst.MoveNext
rst2!mp43 = rst!Batch1
´ rst.MoveNext
rst2.Update
Next ll


If rst.EOF And I <> 43 Then
If I < 43 Then MsgBox ("es fehlen Daten!")
If I > 43 Then MsgBox ("zuviele Daten")
Resume

rst.Close
Set rst = Nothing

Set db = Nothing
End If

Next
End With
Gruß Ralf

Antwort 3 von Teddy7 vom 12.01.2019, 09:06 Options

Hi Ralf !
Also so ganz verstehe ich noch nicht was Du da machen willst.
Ich gehe jetzt mal davon aus, dass Deine Ursprungstabelle(rst) 3 Felder hat (Spalten gibt´s nicht) - Batch1 bis 3.
Wie viele Zeilen (Datensätze) die Tabelle hat ist unerheblich wenn man alle verarbeiten will.
Das sieht dann so aus:

.....
......
rst.MoveFirst
Do Until rst.EOF
rst2.addnew
rst2!Feld1 = rst!Batch1
rst2!Feld2 = rst!Batch2
rst2!Feld3 = rst!Batch3
.........
.....usw....
rst2.update
rst.movenext
loop
........
.......usw....

Gruß
Teddy

Antwort 4 von erik vom 12.01.2019, 09:07 Options

Hallo Ralf,

dein Code liest nicht alle drei Batches, sondern nur Batch1 (... = rst!Batch1)

Aus deinem Code kann man kaum erkennen, was du eigentlich vorhast. Könntest du nochmal in reinen Worten erklären, was du bewirken willst? Es sieht so aus, als ob du die Daten ähnlich wie in Excel transponieren willst, d.h. aus Zeilen werden Spalten und umgekehrt.

Ein Paar Zeilen mit einem Beispiel wären vielleicht nicht schlecht.

Antwort 5 von Teddy7 vom 12.01.2019, 09:09 Options

Ach ja - und Dir (und allen Mitlesenden) natürlich auch noch ein gutes neues Jahr mit viel Gesundheit und Zufriedenheit.

Teddy

Antwort 6 von RalfH vom 12.01.2019, 10:04 Options

OK ich versuche mal die Sache zu erklären.

Ich Importiere eine DBase Tabelle. Diese beinhaltet 3 Batches mit jeweils 43 Datensätze. Es müssen (!) 43 Datensätze sein.

Diese lese ich nun mit einem Recordset aus, und muss aber noch einige Variable dazu tun( Datum,Uhrzeit,usw) dies mache ich über Input.

Jetzt möchte ich gerne, das neue Recordset in einer neuen Tabelle speichern, weil sich die Ursprungs -Tabelle, jeden Tag erneuert.

@erik
Zitat:
Es sieht so aus, als ob du die Daten ähnlich wie in Excel transponieren willst, d.h. aus Zeilen werden Spalten und umgekehrt.

Ja genau richtig

Nur ist eben das Problem, das ich bei Schleifen Konstrukte nicht so meine Sternstunde habe , und ich immer nur Batch1 reinbekomme :(
Gruß Ralf

Antwort 7 von Teddy7 vom 12.01.2019, 10:57 Options

Heißt das Du hast in der Quelle 3 x 43 Datensätze mit jeweils einem Wert(Feld) ??

Und die sollen in einer neuen Tabelle zu 3 Datensätzen a 43 Felder(Werte) werden ?

Antwort 8 von RalfH vom 12.01.2019, 10:58 Options

Korrekt!

Antwort 9 von Teddy7 vom 12.01.2019, 12:02 Options

Wenn man nur den einen Wert hat, dann kann man also auch nicht an den Daten sehen, welche 43 Werte zusammengehören.
Bleibt also nur zählen.
--Soweit richtig ? --

Das sähe dann so aus:
dim i1 as integer
dim i2 as integer
.....
......
rst.MoveFirst
i1 = 0
Do Until rst.EOF
i1 = i1 + 1
"Wenn die 43 Wertfelder hintereinander liegen kann
" man sie über den Index leichter ansprechen
" Achtung - das erste Feld in Datensatz hat den Index 0
I2 = I1 + 5 " Beispiel !!!! muß angepasst werden !
if i1 = 1 then
rst2.addnew
rst2.Fields(i2) = rst!Wert
else
rst2.Fields(i2) = rst!Wert
endif
if i1 = 43 then
rst2!Zusatzfeld1 = "wasauchimmer"
.....usw....
rst2.update
i1 = 0
clear rst2
endif
rst.movenext
loop
........
.......usw....

Antwort 10 von RalfH vom 12.01.2019, 12:47 Options

@ Teddy7
Kannste mir das mit:
Zitat:
I2 = I1 + 5 " Beispiel !!!! muß angepasst werden !

genauer erklären, bitte ?

Antwort 11 von Teddy7 vom 12.01.2019, 13:16 Options

I2 soll ja der Index des zu füllenden feldes in rst2 sein.
Das ist natürlich nur dann sinnvoll, wenn Du in Deiner Tabellendefinition die Wertfelder hintereinander liegen hast.
Wenn dem so ist, dann zählst Du die Felder durch.
Wenn z.B. das erste Wertfeld als 5. Feld in der Tabelle definiert ist, dann kannst Du es mit
rst2.fields(4) ansprechen.
Wenn z.B. das erste Wertfeld als 8. Feld in der Tabelle definiert ist, dann kannst Du es mit
rst2.fields(7) ansprechen.
Das ganze soll nur ein mühsames
if i1 = 1 then
rst2!Wert01 = rst.Wert
elseif i1 = 2 then
rst2!Wert02 = rst.Wert
...usw...
ersetzen.

Antwort 12 von RalfH vom 12.01.2019, 13:23 Options

Oha,
das werde ich jetzt mal umsetzen.
Hab vielen Dank Teddy7

Antwort 13 von erik vom 12.01.2019, 13:32 Options

Hallo ihr beiden!

@Teddy
Vielen Dank, das wünsche ich dir und allen anderen Lesern ebenso. :-)

Ich habe zwischenzeitlich auch einen Lösungsansatz gebastelt, der auf einer Anfügeabfrage basiert. Dazu muss die folgende Abfrage unter dem Namen "qryFahrzeugAnfuegen" gespeichert und der nachstehende Code benutzt werden.

PARAMETERS [Eingabe am] DATETIME, Uhrzeit DATETIME, Bereich LONG, Linie LONG, ProdNr TEXT(255), Radstand TEXT(255), Farbcode TEXT(255), Batchwert TEXT(255)
INSERT INTO TabFahrzeuge ([Eingabe am], Uhrzeit, Bereich, Linie, ProdNr, Radstand, Farbcode, mp1, mp2, mp3, mp4, mp5, mp6, mp7, mp8, mp9, mp10, mp11, mp12, mp13, mp14, mp15, mp16, mp17, mp18, mp19, mp20, mp21, mp22, mp23, mp24, mp25, mp26, mp27, mp28, mp29, mp30, mp31, mp32, mp33, mp34, mp35, mp36, mp37, mp38, mp39, mp40, mp41, mp42, mp43)
SELECT [Eingabe am], Uhrzeit, Bereich, Linie, ProdNr, Radstand, Farbcode, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert;




Public Sub FahrzeugeAnfuegen()
	 Dim db As Database
	 Dim rstQuelle As Recordset
	 Dim qdfZiel As QueryDef
	 Dim lngCount As Long

	 Set db = CurrentDb
	 Set rstQuelle = db.OpenRecordset("Neue Tabelle", dbOpenDynaset)
	 Set qdfZiel = db.QueryDefs("qryFahrzeugAnfuegen")

	 With qdfZiel
		  .Parameters("Eingabe am").Value = EingDatum
		  .Parameters("Uhrzeit").Value = Uhrz
		  .Parameters("Bereich").Value = o
		  .Parameters("Linie").Value = n
		  .Parameters("ProdNr").Value = a
		  .Parameters("Radstand").Value = m
		  .Parameters("Farbcode").Value = z
	 End With
	 
	 With rstQuelle
		  Do Until .EOF
				For lngCount = 1 To 3
					 qdfZiel.Parameters("Batchwert").Value = .Fields("Batch" & lngCount)
					 qdfZiel.Execute
				Next
				.MoveNext
		  Loop
	 End With
End Sub


Möglicherweise müssen in der Parameterabfrage noch die Datentypen entsprechend den Feldern in der Tabelle angepasst werden. Das dürfte aber dann alles sein, was zu tun wäre.

Gruß
erik

Antwort 14 von RalfH vom 12.01.2019, 13:48 Options

@ erik
wow da haste dich ja mächtig ins Zeug gelegt, Respekt !

Leider bekomme ich bei der Abfrage eine Fehler Meldung:
Zitat:
Syntaxfehler in Parameter Klausel

Die Hilde sagt:
Zitat:
Syntaxfehler im PARAMETER-Abschnitt. (Fehler 3139)
Sie haben eine SQL-Anweisung eingegeben, die eine ungültige PARAMETERS-Deklaration enthält.

Mögliche Ursachen:

Ein reserviertes Wort oder ein Argumentname wurde falsch eingegeben bzw. fehlt.
Die Zeichensetzung ist nicht korrekt.


Markiert wird Insert Into

Gruß Ralf

Antwort 15 von erik vom 12.01.2019, 15:23 Options

Au ja, ich habe das Semikolon vergessen am Ende der PARAMETERS-Zeile. Probiere es mal so:

PARAMETERS [Eingabe am] DATETIME, Uhrzeit DATETIME, Bereich LONG, Linie LONG, ProdNr TEXT(255), Radstand TEXT(255), Farbcode TEXT(255), Batchwert TEXT(255);
INSERT INTO TabFahrzeuge ([Eingabe am], Uhrzeit, Bereich, Linie, ProdNr, Radstand, Farbcode, mp1, mp2, mp3, mp4, mp5, mp6, mp7, mp8, mp9, mp10, mp11, mp12, mp13, mp14, mp15, mp16, mp17, mp18, mp19, mp20, mp21, mp22, mp23, mp24, mp25, mp26, mp27, mp28, mp29, mp30, mp31, mp32, mp33, mp34, mp35, mp36, mp37, mp38, mp39, mp40, mp41, mp42, mp43)
SELECT [Eingabe am], Uhrzeit, Bereich, Linie, ProdNr, Radstand, Farbcode, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert, Batchwert;

Antwort 16 von RalfH vom 15.01.2019, 11:18 Options

Guten Morgen,
@ erik

Habe das mal ausprobiert, doch ich bekomme nur vom ersten Batch die Werte und das 3 mal.
Ich möchte aber gerne Batch1 bis Batch3 jeweils einmal haben
Gruß Ralf

Antwort 17 von erik vom 15.01.2019, 15:39 Options

Hallo Ralf,

du hast doch in der Importtabelle drei Spalten namens Batch1, Batch2, Batch3. Die werden über die folgende Zeile nacheinander abgeklappert:

qdfZiel.Parameters("Batchwert").Value = .Fields("Batch" & lngCount)


Bist du sicher, dass in den Spalten der Tabelle wirklich unterschiedliche Werte enthalten sind? Bei mir funktioniert es immerhin.

Antwort 18 von RalfH vom 17.01.2019, 08:01 Options

Hallo,
@erik
Ich hatte gestern TüV Termin und meine alte Möhre hat es nochmal geschafft, daher melde ich mich jetzt erst.

Also, Deine Abfrage funktioniert soweit, das er mir die 3 Batches 3 mal einliest. 3*43=129 Datensätze.
Ich brauche aber 3 Datensätze mit jeweils 43 Felder.

Dabei fragt er aber nur einmal nach den Daten.

Ein Batch repräsentiert allerdings ein Objekt mit Messwerten von 43 Messpunkten.
Nach den 43 Messpunkten, kommt ein neues Objekt, dessen Individuellen Daten erneut abgefragt werden müssten + die 43 Messwerte.

Ich bitte um Rücksicht, weil ich mich bei Schleifen (warum auch immer?) sehr schwer tue. Und bedanke mich bei Euch allen, für die Gedult mit mir.
Gruß Ralf

Antwort 19 von erik vom 17.01.2019, 08:45 Options

Guten Morgen, Ralf!

Ja, jetzt fällt es mir wie Schuppen von den Augen, was du bezweckst. Die entsprechenden Anpassungen habe ich zwar schon im Kopf, aber mir fehlt momentan die Gelegenheit, das umzusetzen. Bitte gedulde dich also bis zur Mittagspause. :-)

Nur nochmal, um ganz sicher zu sein: Du hast eine Quelltabelle mit 43 Zeilen, in denen VERSCHIEDENE Messwerte stehen, die sollen in 43 Spalten NEBENEINANDER gestellt werden. Ich ging bisher davon aus, dass das immer der gleiche Messwert wäre, und habe mich schon gefragt, was das denn soll. *g*

Gruss
erik

Antwort 20 von RalfH vom 17.01.2019, 09:37 Options

Hallo erik,
Zitat:
Nur nochmal, um ganz sicher zu sein: Du hast eine Quelltabelle mit 43 Zeilen, in denen VERSCHIEDENE Messwerte stehen, die sollen in 43 Spalten NEBENEINANDER gestellt werden. I


BINGO !!!

Ähnliche Themen

Per VBA an Wert aus Abfrage zugreifen
Booyeoo  07.07.2007 - 19 Hits - 1 Antwort

Bericht aus Recordset erstellen
Vossibaer  15.08.2007 - 97 Hits - 2 Antworten

schleife beim installieren von winxp
reese  18.11.2007 - 72 Hits - 8 Antworten

Daten aus dem Excel in die Datenbank schreiben
Sleezer  05.02.2008 - 60 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026