Mai 19, 2022, 16:53:03

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Daten aus mehreren Datensätze in andere Tabelle in 1 Datensatz schreiben

Begonnen von bullenhai1881, April 09, 2022, 07:06:25

⏪ vorheriges - nächstes ⏩

bullenhai1881

April 09, 2022, 07:06:25 Letzte Bearbeitung: April 14, 2022, 12:06:24 von bullenhai1881
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

Lalikowski

Moin,

das sollte über eine union-Abfrage funktionieren.

Goggle mal "Access Daten transponieren". Da findest Du diverse Beispiele...

DF6GL

Hallo,


@bullenhai1881

Zitatleider kann ich dort nicht in einem Datensatz (gleichem Starter) drei Zeiten zuweisen

welchen Vorteil erhoffst Du Dir daraus?


bullenhai1881

April 09, 2022, 13:56:36 #3 Letzte Bearbeitung: April 09, 2022, 14:01:51 von bullenhai1881
@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




MzKlMu

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
Gruß
Klaus

bullenhai1881

April 09, 2022, 19:17:18 #5 Letzte Bearbeitung: April 09, 2022, 19:28:10 von bullenhai1881
@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

DF6GL

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

bullenhai1881

@DF6GL
Danke 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 VERSUCH

Laufzeitfehler 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
        Next

kommt 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.


DF6GL

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

bullenhai1881

@DF6GL

Herzlichen Dank Franz für deine schnelle und äußerst kompetente Hilfestellung!

______________________##
_______________________####
______________________######
______________________######
_____________________#######
____________________########
____________________#######
___________________#######
__________________########
_________________########
_______________##########
_______________##########
______________############_____#######
_____________##########################
____________###########################
___________############################
__________#############################
_________#############################
_________###############################
___#####################################
########################################
########################################
######################################
#######################################
#######################################
#######################################
#####################################
######################################
#####################################
####################################
##################################
#########___________##########