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 21 von erik vom 17.01.2019, 14:16 Options

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 vom 17.01.2019, 14:18 Options

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 vom 17.01.2019, 14:20 Options

Ups, einmal zuviel angefügt. :-)

Antwort 24 von RalfH vom 18.01.2019, 06:26 Options

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 vom 18.01.2019, 08:27 Options

*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 vom 18.01.2019, 08:48 Options

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 vom 23.01.2019, 06:58 Options

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 vom 23.01.2019, 08:24 Options

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 vom 23.01.2019, 09:19 Options

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 vom 23.01.2019, 13:47 Options

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 vom 24.01.2019, 08:41 Options

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 vom 24.01.2019, 14:23 Options

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 vom 24.01.2019, 15:18 Options

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 vom 25.01.2019, 07:43 Options

Guten Morgen,

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

Herzlichen Dank erik.
Gruß Ralf

Antwort 35 von erik vom 26.01.2019, 08:31 Options

*freu* :-D

Ä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:Mon Jan 26 01:23:17 2026