Hallo zusammen!
Vorgabe
Tabelle1 mit den Feldern ID, Startnummer, Starter, Zeit
immer 3 Datensätze mit der gleichen Startnummer und gleichem Starter, Zeit 3x unterschiedlich
Diese Daten kommen von einer Stoppuhr - leider kann ich dort nicht in einem Datensatz (gleichem Starter) drei Zeiten zuweisen
Wunsch!
Die Werte aus Tabelle1 sollten in Tabelle2 geschrieben werden
Tabelle2 besteht aus Feldern ID, Startnummer, Starter, Zeit1, Zeit2, Zeit3
Bitte das beiliegende Bild ansehen, damit es verständlicher wird...
Hoffe, mein Problem verständlich geschildert zu haben.
Im Prinzip Daten aus Tabelle1 (aus mehreren DS) einlesen und in Tabelle2 (in einem DS) schreiben...
Mir fehlt der Ansatz im vba, um das zu verwirklichen
Herzlichen Dank für eure Hilfe
Moin,
das sollte über eine union-Abfrage funktionieren.
Goggle mal "Access Daten transponieren". Da findest Du diverse Beispiele...
Hallo,
@bullenhai1881Zitatleider kann ich dort nicht in einem Datensatz (gleichem Starter) drei Zeiten zuweisen
welchen Vorteil erhoffst Du Dir daraus?
@franz, DF6GL
Hallo Franz
Bei mir sollte es ein Wertungsprogramm für einen Triathlon-Bewerb werden.
Zu einem DS (sprich Starter) gehören immer 3 Zeiten (Schwimmen = Zeit1, Radfahren = Zeit2, Laufen=Endzeit = Zeit3)
Das Wertungsprogramm in Access ist ja im Prinzip fertig.
Für mein Stoppuhrprogramm brauche ich jedes Mal nur die z.B. Leertaste drücken und die Zeit wird automatisch in ein Feld abgespeichert.Dann wird händisch zu dieser Zeit die Startnummer eingetragen. Die Zeiten werden dann in Access importiert.
Im Prinzip erhält dann jede Startnummer 3 Zeiten (Nach dem Schwimmen, nach dem Radfahren und nach dem Laufen)
schaut nach Sortierung aus wie am Bild links die Tabelle1
Im Echtbetrieb beim Stoppen natürlich anders
Stnr Zeit
15 00:05:09 (Wäre Zeit1)
18 00:06:12
...
....
18 00:30:02 /wäre Zeit2
15 00:30:16
....
....
20 00:55:55
15 00:56:09 wäre Zeit3
18 00:57:12
Für meinen Zweck (lt Bild rechts die Tabelle2)
ist es dann für mich einfacher, wenn ich in einem Datensatz
die Startnummer und Zeit1, Zeit2, Zeit3 habe.
Ich kann dann leichter Differenzzeiten in Abfragen z.B. Zeit2 - Zeit1; Zeit3 - Zeit2 etc. ausrechnen oder Ergebnisliste etc. oder Kontrolllisten machen.
Für meine Bedürfnisse wäre mir diese Lösung am liebsten - auch wenn es für euch Spezialisten eventuell nicht
die richtige "Lösung" für eine Datenbankgestaltung ist.
Bis dato bin ich immer einen Umweg über Excel gegangen, um dann meine Zeiten in 1 Datensatz zu bekommen
Herzlichen Dank für die Bemühungen
Hallo
meiner Meinung nach bleibt hier nur der Umweg über Excel.
PS:
Es nutzt nix das Forum zu wechseln, Du hast auch hier das gleiche Problem und außerdem sind es ohnehin fast die gleichen Leute die in den bekannten Foren antworten.
https://www.ms-office-forum.net/forum/showthread.php?t=380186
@MzKIMu
Hallo, ich weiß, dass sehr viele User bei mehreren Foren unterwegs sind - aber nicht alle - und manche haben dann die richtige Lösung bzw. einen brauchbaren Lösungsvorschlag.@Lalikowski - Danke, war ein hilfreicher Hinweis
Dank Durchstöbern anderer Foren bin ich auch schon etwas weiter gekommen.
Es klappt mit folgendem Code, dass ich das Ergebnis erhalte (siehe Bild3)
Bräuchte vermutlich noch bei der Schleife Hilfe, damit es in Tabelle2 mit 1 Datensatz klappt.
(3 Tabellen und union Abfrage hätte ich eventuell noch in Reserve)
Dim rs As DAO.Recordset
Dim rs1 As DAO.Recordset
Dim i As Integer
Set rs = CurrentDb.OpenRecordset("Tabelle2")
Set rs1 = CurrentDb.OpenRecordset("Tabelle1")
If rs1.RecordCount > 0 Then
rs1.MoveLast
rs1.MoveFirst
For i = 1 To rs1.RecordCount
rs.AddNew
rs![Stnr] = rs1!Stnr
rs![Starter] = rs1!Starter
' >>>> HIER KOMME ICH MIT DER SCHLEIFE NICHT ZURECHT[
rs![Zeit1] = rs1!Zeit
rs![Zeit2] = rs1!Zeit
rs![Zeit3] = rs1!Zeit
rs.Update
rs1.MoveNext
Next i
Else
MsgBox "keine Daten"
End If
rs.Close
rs1.Close
Set rs = Nothing
Set rs1 = Nothing
End Sub
Hallo,
trotz Crossposting...
">>>> HIER KOMME ICH MIT DER SCHLEIFE NICHT ZURECHT..."
Womit genau kommst Du nicht zurecht?
Grundsätzlich fehlt bei rs1 eine aufsteigende Sortierung nach den Zeiten, sonst ist die zeitliche
Reihenfolge unbekannt. Zudem ist ein weiterer Recordset nötig:
(Luftcode!)
Sub ZeitTranspond()
Dim Db As Database
Dim rs As DAO.Recordset
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim i As Long
Set rs = Db.OpenRecordset("Tabelle2", dbOpenDynaset)
Set rs1 = Db.OpenRecordset("Select StNr from Tabelle1 Group by StNr", dbOpenSnapShot)
Do Until rs1.EOF
rs.AddNew
rs![Stnr] = rs1!Stnr
rs![Starter] = rs1!Starter
set rs2 = Db.Openrecordset ("Select * from Tabelle1 Where StNr =" & rs1!StNr & " Order by [Zeit]", dbOpenSnapShot)
rs2.Movelast
rs2.Movefirst
If rs2.Recordcount > 3 Then
Msgbox "Zu viele Zeiten"
Else
For i = 1 to rs2.RecordCount
rs("Zeit" & i) = rs2![Zeit]
rs2.MoveNext
Next
End If
rs2.Close
rs.Update
rs1.MoveNext
Loop
Else
MsgBox "keine Daten"
End If
rs.Close
rs1.Close
Set rs = Nothing
Set rs1 = Nothing
Set rs2 = Nothing
End Sub
@DF6GLDanke Franz für deine Bemühungen und für deinen Code
Beim Abarbeiten erhalte ich bei deinem Code folgenden Fehler
Set rs = CurrentDb.OpenRecordset("Tabelle2", dbOpenDynaset)
' Set rs1 = CurrentDb.OpenRecordset("Select * from Tabelle1 Group by Stnr", dbOpenSnapshot) <<< DEIN CODE
Set rs1 = CurrentDb.OpenRecordset("Tabelle1", dbOpenDynaset) ' >>> MEIN VERSUCHLaufzeitfehler 3121 - Mit '*' ausgewählte Felder können nicht gruppiert werden.
Ich habe dann >>> Mein Versuch genommen - Fehlermeldung kommt da nicht mehr, weiß aber nicht, ob das richtig ist.
In der Zeile
For i = 1 To rs2.RecordCount
rs([Zeit] & i) = rs2![Zeit1] ' [b]>>>> Fehler in dieser Codezeile[/b]
rs2.MoveNext
Nextkommt dann dafür Laufzeitfehler 3265 - Element in dieser Auflistung nicht gefunden -
Weiß jetzt nicht, ob der zweite Fehler aufgrund des ersten resultiert
google etc brachte keine Lösung für mich.
Wäre die Demo-Datei dazu
Hallo,
-- Es ist nicht vorteilhaft, Zeit-Felder als vom Datentyp TEXT zu deklarieren
-- In jeden Modulkopf Option Compare Database und Option Explicit einbauen
hier der angepasste Code :
Option Compare Database
Option Explicit
Private Sub Befehl5_Click()
Dim Db As Database
Dim rs As DAO.Recordset
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim i As Long
Set Db = CurrentDb 'hat gefehlt
Set rs = Db.OpenRecordset("Tabelle2", dbOpenDynaset)
Set rs1 = Db.OpenRecordset("Select StNr,Starter from Tabelle1 Group by StNr,Starter", dbOpenSnapshot) 'Bei Gruppierung kein Sternchen
Do Until rs1.EOF
rs.AddNew
rs![StNr] = rs1!StNr
rs![Starter] = rs1!Starter
Set rs2 = Db.OpenRecordset("Select * from Tabelle1 Where StNr =" & rs1!StNr & " Order by [Zeit]", dbOpenSnapshot)
rs2.MoveLast
rs2.MoveFirst
If rs2.RecordCount > 3 Then
MsgBox "Zu viele Zeiten"
Else
For i = 1 To rs2.RecordCount
rs("Zeit" & i) = rs2![Zeit]
rs2.MoveNext
Next
End If
rs2.Close
rs.Update
rs1.MoveNext
Loop
' Else-End IF Codezeilen entfernt
rs.Close
rs1.Close
Set rs = Nothing
Set rs1 = Nothing
Set rs2 = Nothing
End Sub
@DF6GL Herzlichen Dank Franz für deine schnelle und äußerst kompetente Hilfestellung!
______________________##
_______________________####
______________________######
______________________######
_____________________#######
____________________########
____________________#######
___________________#######
__________________########
_________________########
_______________##########
_______________##########
______________############_____#######
_____________##########################
____________###########################
___________############################
__________#############################
_________#############################
_________###############################
___#####################################
########################################
########################################
######################################
#######################################
#######################################
#######################################
#####################################
######################################
#####################################
####################################
##################################
#########___________##########
Danke, gelöst