Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Schleife über Recordset





Frage

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: [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 1 von Teddy7

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

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

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

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

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

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

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

Korrekt!

Antwort 9 von Teddy7

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

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

genauer erklären, bitte ?

Antwort 11 von Teddy7

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

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

Antwort 13 von erik

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

@ 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

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

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

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

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

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

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 !!!

Antwort 21 von erik

Hallo Ralf!

Jetzt müsste ich genau das haben, was du brauchst. Bitte aktualisiere entsprechend die alte Abfrage und Code.

PARAMETERS [Eingabe am] DateTime, Uhrzeit DateTime, Bereich Long, Linie Long, ProdNr Text ( 255 ), Radstand Text ( 255 ), Farbcode Text ( 255 ), Wert1 Text ( 255 ), Wert2 Text ( 255 ), Wert3 Text ( 255 ), Wert4 Text ( 255 ), Wert5 Text ( 255 ), Wert6 Text ( 255 ), Wert7 Text ( 255 ), Wert8 Text ( 255 ), Wert9 Text ( 255 ), Wert10 Text ( 255 ), Wert11 Text ( 255 ), Wert12 Text ( 255 ), Wert13 Text ( 255 ), Wert14 Text ( 255 ), Wert15 Text ( 255 ), Wert16 Text ( 255 ), Wert17 Text ( 255 ), Wert18 Text ( 255 ), Wert19 Text ( 255 ), Wert20 Text ( 255 ), Wert21 Text ( 255 ), Wert22 Text ( 255 ), Wert23 Text ( 255 ), Wert24 Text ( 255 ), Wert25 Text ( 255 ), Wert26 Text ( 255 ), Wert27 Text ( 255 ), Wert28 Text ( 255 ), Wert29 Text ( 255 ), Wert30 Text ( 255 ), Wert31 Text ( 255 ), Wert32 Text ( 255 ), Wert33 Text ( 255 ), Wert34 Text ( 255 ), Wert35 Text ( 255 ), Wert36 Text ( 255 ), Wert37 Text ( 255 ), Wert38 Text ( 255 ), Wert39 Text ( 255 ), Wert40 Text ( 255 ), Wert41 Text ( 255 ), Wert42 Text ( 255 ), Wert43 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, Wert1, Wert2, Wert3, Wert4, Wert5, Wert6, Wert7, Wert8, Wert9, Wert10, Wert11, Wert12, Wert13, Wert14, Wert15, Wert16, Wert17, Wert18, Wert19, Wert20, Wert21, Wert22, Wert23, Wert24, Wert25, Wert26, Wert27, Wert28, Wert29, Wert30, Wert31, Wert32, Wert33, Wert34, Wert35, Wert36, Wert37, Wert38, Wert39, Wert40, Wert41, Wert42, Wert43;




Public Sub FahrzeugeAnfuegen()
	 Dim db As Database
	 Dim rstQuelle As Recordset
	 Dim qdfZiel As QueryDef
	 Dim lngBatchCount As Long
	 Dim lngValueCount As Long
	 
	 Set db = CurrentDb
	 Set rstQuelle = db.OpenRecordset("Batches", dbOpenDynaset)
	 Set qdfZiel = db.QueryDefs("qryFahrzeugAnfuegen")

	 With qdfZiel
		  .Parameters("Eingabe am").Value = Date
		  .Parameters("Uhrzeit").Value = Now
		  .Parameters("Bereich").Value = 1
		  .Parameters("Linie").Value = 2
		  .Parameters("ProdNr").Value = "3"
		  .Parameters("Radstand").Value = "4"
		  .Parameters("Farbcode").Value = "5"
	 End With
	 
	 For lngBatchCount = 1 To 3
		  With rstQuelle
				.MoveFirst
				lngValueCount = 1
				
				Do Until .EOF
					 qdfZiel.Parameters("Wert" & lngValueCount).Value = .Fields("Batch" & lngBatchCount)
					 .MoveNext
					 lngValueCount = lngValueCount + 1
				Loop
				
				qdfZiel.Execute
		  End With
	 Next
End Sub


Gruß
erik

Antwort 22 von erik

Hallo Ralf!

Jetzt müsste ich genau das haben, was du brauchst. Bitte aktualisiere entsprechend deine alte Abfrage und Code.


PARAMETERS [Eingabe am] DateTime, Uhrzeit DateTime, Bereich Long, Linie Long, ProdNr Text ( 255 ), Radstand Text ( 255 ), Farbcode Text ( 255 ), Wert1 Text ( 255 ), Wert2 Text ( 255 ), Wert3 Text ( 255 ), Wert4 Text ( 255 ), Wert5 Text ( 255 ), Wert6 Text ( 255 ), Wert7 Text ( 255 ), Wert8 Text ( 255 ), Wert9 Text ( 255 ), Wert10 Text ( 255 ), Wert11 Text ( 255 ), Wert12 Text ( 255 ), Wert13 Text ( 255 ), Wert14 Text ( 255 ), Wert15 Text ( 255 ), Wert16 Text ( 255 ), Wert17 Text ( 255 ), Wert18 Text ( 255 ), Wert19 Text ( 255 ), Wert20 Text ( 255 ), Wert21 Text ( 255 ), Wert22 Text ( 255 ), Wert23 Text ( 255 ), Wert24 Text ( 255 ), Wert25 Text ( 255 ), Wert26 Text ( 255 ), Wert27 Text ( 255 ), Wert28 Text ( 255 ), Wert29 Text ( 255 ), Wert30 Text ( 255 ), Wert31 Text ( 255 ), Wert32 Text ( 255 ), Wert33 Text ( 255 ), Wert34 Text ( 255 ), Wert35 Text ( 255 ), Wert36 Text ( 255 ), Wert37 Text ( 255 ), Wert38 Text ( 255 ), Wert39 Text ( 255 ), Wert40 Text ( 255 ), Wert41 Text ( 255 ), Wert42 Text ( 255 ), Wert43 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, Wert1, Wert2, Wert3, Wert4, Wert5, Wert6, Wert7, Wert8, Wert9, Wert10, Wert11, Wert12, Wert13, Wert14, Wert15, Wert16, Wert17, Wert18, Wert19, Wert20, Wert21, Wert22, Wert23, Wert24, Wert25, Wert26, Wert27, Wert28, Wert29, Wert30, Wert31, Wert32, Wert33, Wert34, Wert35, Wert36, Wert37, Wert38, Wert39, Wert40, Wert41, Wert42, Wert43;




Public Sub FahrzeugeAnfuegen()
	 Dim db As Database
	 Dim rstQuelle As Recordset
	 Dim qdfZiel As QueryDef
	 Dim lngBatchCount As Long
	 Dim lngValueCount As Long
	 
	 Set db = CurrentDb
	 Set rstQuelle = db.OpenRecordset("Batches", dbOpenDynaset)
	 Set qdfZiel = db.QueryDefs("qryFahrzeugAnfuegen")

	 With qdfZiel
		  .Parameters("Eingabe am").Value = Date
		  .Parameters("Uhrzeit").Value = Now
		  .Parameters("Bereich").Value = 1
		  .Parameters("Linie").Value = 2
		  .Parameters("ProdNr").Value = "3"
		  .Parameters("Radstand").Value = "4"
		  .Parameters("Farbcode").Value = "5"
	 End With
	 
	 For lngBatchCount = 1 To 3
		  With rstQuelle
				.MoveFirst
				lngValueCount = 1
				
				Do Until .EOF
					 qdfZiel.Parameters("Wert" & lngValueCount).Value = .Fields("Batch" & lngBatchCount)
					 .MoveNext
					 lngValueCount = lngValueCount + 1
				Loop
				
				qdfZiel.Execute
		  End With
	 Next
End Sub


Gruß
erik

Antwort 23 von erik

Ups, einmal zuviel angefügt. :-)

Antwort 24 von RalfH

Guten Morgen ,

@ erik,

Nach ein paar kleinen individuellen Anpassungen klappt es so wie ich mir das gewünscht habe :)

Ich kann nur DANKESCHÖN sagen.

Falls der Weg mal nach Düsseldorf führt, bist Du und Teddy7 auf ein leckeres Alt Bier eingeladen.

Gruß Ralf

Antwort 25 von erik

*lach* Sollte ich tatsächlich mal nach Düsseldorf kommen, dann nehme ich das Angebot gerne an. Die Wahrscheinlichkeit liegt aber eher im unteren Promillebereich, da ich aus Baden-Württemberg komme. :-)

Vermutlich hast du die ersten Parameterwerte wieder mit deinen eigenen Variablen versorgt? An die hatte ich nicht mehr gedacht, nachdem der Code in meiner Umgebung gelaufen ist.

Antwort 26 von RalfH

Hallo Erik,
Zitat:
Vermutlich hast du die ersten Parameterwerte wieder mit deinen eigenen Variablen versorgt?

Ja, genau.

Würde mich sehr freuen, wenn das mal klappen würde, alter Schwabe ;-)

Gruß Ralf

Antwort 27 von RalfH

Guten Morgen,

der Code und die Abfrage laufen genauso wie ich das haben wollte, allerdings müsste ich da noch eine Fehlerroutine haben.
Wenn die Parameter ungenau sind, d.h. zuviele oder zu wenig Parameter, bricht Access ab, mit ner Fehlermeldung, bei der Runtimeversion ohne Fehlernummer.
Wie kann ich einen Überlauf bzw. zuwenig Parameter abfangen ?

Hier mal der Code :
Function FahrzeugeAnfuegen()
    Dim db As Database
    Dim rstQuelle As Recordset
    Dim qdfZiel As QueryDef
    Dim lngBatchCount As Long
    Dim lngValueCount As Long
    Dim a, b, z As String
    Dim m, n, o, p As Long
    Dim I, j, ll As Long
    Dim Anzahlfahrzeuge As Long
    Dim AnzDS As Long
    Set db = CurrentDb
    Set rstQuelle = db.OpenRecordset("Neue Tabelle", dbOpenDynaset)
    Set qdfZiel = db.QueryDefs("qryFahrzeugAnfuegen")
    Anzahlfahrzeuge = InputBox("Wieviele Fahrzeuge sollen eingelesen werden )
    For lngBatchCount = 1 To Anzahlfahrzeuge
    a = InputBox("Neues Fahrzeug erkannt, bitte geben Sie die Produktionsnummer ein:", ")
 m = InputBox("Bitte geben Sie ....")
      n = InputBox("Bitte geben Sie die Linie als Zahl ein z.B. Linie 3 = 3 Eingeben.")
      o = InputBox("Bitte geben Sie den Bereich ein: ")
     z = InputBox("Bitte geben Sie den Farbcode ein:  ( Falls keiner Vorhanden, bitte 0 eingeben"
      
      rstQuelle.MoveLast
      AnzDS = rstQuelle.RecordCount
    With qdfZiel
       .Parameters("Eingabe am").Value = Date
       .Parameters("Uhrzeit").Value = Now
       .Parameters("Bereich").Value = o
       .Parameters("Linie").Value = n
       .Parameters("ProdNr").Value = a
       .Parameters("Radstand").Value = m
       .Parameters("Farbcode").Value = z
    End With
    
´    For lngBatchCount = 1 To 3
       With rstQuelle
            .MoveFirst
            lngValueCount = 1
            
            Do Until .EOF
                qdfZiel.Parameters("Wert" & lngValueCount).Value = .Fields("Batch" & lngBatchCount)
                .MoveNext
                lngValueCount = lngValueCount + 1
            Loop
            
            qdfZiel.Execute
       End With
    Next
    DoCmd.Close acForm, "Fahrzeug"
    DoCmd.OpenForm "Fahrzeug", acNormal, , , acFormReadOnly
    
    
End Function


Gruß Ralf

Antwort 28 von erik

Guten Morgen Ralph,

wenn es zuwenige Parameter in der Quelltabelle gibt, dann müsste die Abfrage mit Null-Werten an den entsprechenden Stellen gefüllt werden, das wäre soweit kein Problem.

Aber wie kann deine Tabelle zuviele Werte liefern? Insbesondere dann, wenn die Zieltabelle eine fest vordefinierte Anzahl von Spalten hat, um diese Werte aufzunehmen? Und was mit den übrigen Werten geschehen? Vermutlich muss nach Erreichen der 43 Spalten der Schleifendurchlauf abgebrochen werden und damit die restlichen Werte ignoriert werden?

Gruß
erik

Antwort 29 von RalfH

Hallo erik,
Du hast in beiden Punkten recht.
Die Tabelle die Eingelesen wird, kann entweder zuviele oder zuwenig Werte enthalten.
Gruß Ralf

Antwort 30 von erik

Hallo Ralph,

ich habe die Prozedur an die aktuellen Gegebenheiten angepasst. Fehlende Parameter werden mit NULL gefüttert und übrig bleibende Parameter werden ignoriert. Damit müsste es nun perfekt laufen. Deine eigenen Anpassungen müssten hier ebenfalls komplett integriert sein.


Function FahrzeugeAnfuegen()
	Dim db As Database
	Dim rstQuelle As Recordset
	Dim qdfZiel As QueryDef
	Dim lngBatchCount As Long
	Dim lngMaxRows As Long
	Dim lngCurrentRows As Long

	Dim a, b, z As String
	Dim m, n, o, p As Long
	Dim I, j, ll As Long
	Dim Anzahlfahrzeuge As Long
	Dim AnzDS As Long

	lngMaxRows = 43
	Set db = CurrentDb
	Set rstQuelle = db.OpenRecordset("Neue Tabelle", dbOpenDynaset)
	Set qdfZiel = db.QueryDefs("qryFahrzeugAnfuegen")
	
	Anzahlfahrzeuge = InputBox("Wieviele Fahrzeuge sollen eingelesen werden )
	For lngBatchCount = 1 To Anzahlfahrzeuge
		a = InputBox("Neues Fahrzeug erkannt, bitte geben Sie die Produktionsnummer ein:", ")
		m = InputBox("Bitte geben Sie ....")
		n = InputBox("Bitte geben Sie die Linie als Zahl ein z.B. Linie 3 = 3 Eingeben.")
		o = InputBox("Bitte geben Sie den Bereich ein: ")
		z = InputBox("Bitte geben Sie den Farbcode ein: ( Falls keiner Vorhanden, bitte 0 eingeben"

		rstQuelle.MoveLast
		AnzDS = rstQuelle.RecordCount
		
		With qdfZiel
			.Parameters("Eingabe am").Value = Date
			.Parameters("Uhrzeit").Value = Now
			.Parameters("Bereich").Value = o
			.Parameters("Linie").Value = n
			.Parameters("ProdNr").Value = a
			.Parameters("Radstand").Value = m
			.Parameters("Farbcode").Value = z
		End With
	
		For lngBatchCount = 1 To 3
			With rstQuelle
				.MoveFirst
				lngCurrentRow = 1
			
				Do Until lngCurrentRow > lngMaxRows
					If .EOF = False Then
						qdfZiel.Parameters("Wert" & lngValueCount).Value = .Fields("Batch" & lngBatchCount)
						.MoveNext
					Else		
						qdfZiel.Parameters("Wert" & lngCurrentRow).Value = Null
					End If			
					lngCurrentRow = lngCurrentRow+ 1
				Loop
	
				qdfZiel.Execute
			End With
		Next
	Next
	DoCmd.Close acForm, "Fahrzeug"
	DoCmd.OpenForm "Fahrzeug", acNormal, , , acFormReadOnly
End Function


Die letzten zwei Zeilen sehen so aus, als ob du das Formular schließt und öffnest, nur um es zu aktualisieren. Wenn dem so ist, dann müsste ein
Forms("Fahrzeug").Requery 
eigentlich reichen. Damit rufst du die Datenherkunft erneut ab, ohne das Formular schließen zu müssen.

Viele Grüße
erik

Antwort 31 von RalfH

Guten Morgen erik,

Das sieht ja ganz gut aus, werde ich im laufe des Tages mal Testen- ich gebe dann Feddback.
Bis dahinn, einen richtig netten Tag noch.
Ralf

Antwort 32 von RalfH

Hallo,

Also hier mal mein Feedback,

Bei :
qdfZiel.Parameters("Wert" & lngValueCount).Value = .Fields("Batch" & lngBatchCount)
, sagt Access "Element in dieser Auflistung nicht gefunden"

Antwort 33 von erik

Sorry, mal wieder ein Schreibfehler. Tausche "lngValueCount" durch "lngCurrentRow" aus, dann funktioniert es. :-/

Ich hatte die Variable namentlich ersetzt, weil sie mir nicht mehr zugesagt hatte.

Antwort 34 von RalfH

Guten Morgen,

Das läuft super !!!!!!!!!

Herzlichen Dank erik.
Gruß Ralf

Antwort 35 von erik

*freu* :-D