Also Arbeiten tue ich mit VBA + Access
ich poste dann mal die einzelnen Codes die für dich wichtig sind
Ich habe eine Klasse tablequery erstellelt öhm sie dient einfach nur dazu das ich über die Objekte die einzelnen Abfragen ansprechen kann....
Option Compare Database
Public r As Recordset
Private WS As Workspace
Private DB As database
Private SysMdwFileName As String
Private DBFileName As String
Private strquery As String
Property Let queryname(querystr As String)
strquery = querystr
End Property
Property Let dbname(dbdata As String)
DBFileName = "H:\.............." & dbdata
End Property
Function query()
SysMdwFileName = "H:\.....................MDW"
'DBEngine mitteilen, wo die System.mdw liegt
DBEngine.SystemDB = SysMdwFileName
'Workspace mit dem Namen "MyWs" für User "..............." mit Passwort
' "..........." erzeugen
Set WS = DBEngine.CreateWorkspace("Zeiterfassung", ".....", ".........", _
dbUseJet)
'und dann die DB öffnen
Set DB = WS.OpenDatabase(DBFileName, False)
Set r = DB.OpenRecordset(strquery, dbOpenDynaset)
End Function Ich habe ein Formular mit Kombobox dort kann man einen Namen der Teamleiter auswählen dann öffnet sich ein neues Formular, dann wird unter anderem das Objekt (abfrage3) erstellt zusätzlich wird noch ein 2. Objekt (abfrage2) erstellt in dem dann alle Mitarbeiter des TL abgefragt werden.
Abfrage3 ist dafür da die Daten Anwesenheitszeit, Komm und Gehzeit des jeweils aktuell angezeigten Mitarbeiters abzufragen
Dim abfrage2 As New tablequery
Dim abfrage3 As New tablequery Sobald das Formular aufgerufen wird, wird die Funktion setfields() aufgerufen:
Function setfields()
With abfrage2
Me.txtPerNr = .r!PerNr
Me.txtname = .r!PerName
Me.txtvorname = .r!PerVorname
Me.txtlart = .r!LArt
Me.txtarbplatz = .r!PerArbPlatz
Me.Mitarbeiterauswahl.Value = .r!PerNr
End With
If Me.Datumauswahl.ListCount > 0 Then
i = 0
j = Me.Datumauswahl.ListCount - 1
Do Until i > j
Me.Datumauswahl.RemoveItem (j - i)
i = i + 1
Loop
End If
Set abfrage3 = Nothing
With abfrage3
.dbname = "ZeitRM.mdb"
.queryname = "SELECT Erfassung.EPerNr, Erfassung.EKom, Erfassung.EGeh," & _
"Erfassung.EIstAZeit, " & _
"Sum(Belegung.IstArbeit) AS SumIstArbeit, Erfassung.EVol, Belegung.Erled," & _
"Belegung.PMVor, " & _
"Erfassung.EDatum, Erfassung.ESAP FROM Erfassung LEFT JOIN Belegung ON (" & _
"Erfassung.EPerNr = Belegung.PerNr) " & _
"WHERE Erfassung.EPerNr = " & Me.txtPerNr & _
"AND (Erfassung.EDatum = Belegung.BDatum) GROUP BY Erfassung.EPerNr," & _
"Erfassung.EKom, Erfassung.EGeh, " & _
"Erfassung.EIstAZeit, Erfassung.EVol, Belegung.Erled, Belegung.PMVor," & _
"Erfassung.EDatum, Erfassung.ESAP " & _
"HAVING Erfassung.ESAP Like 'F' ORDER BY Erfassung.EDatum"
.query
If .r.EOF = False Then
Do Until .r.EOF = True
Debug.Print .r.AbsolutePosition
Me.Datumauswahl.AddItem .r![EDatum] & ";" & .r![EKom] & ";" & .r![EGeh] _
& ";" & .r![EIstAZeit] & ";" & .r![SumIstArbeit]
.r.MoveNext
Loop
.r.MoveFirst
End If
End With
End Function So das Problem an der Sache ist wenn ich nun einen anderen Mitarbeiter auswähle wird wieder setfields aufgerufen und das Recordset der Abfrage3 enthält immer noch die Daten des vorherigen Mitarbeiters und die Position ist auf den 1. Eintrag egstelt. Jetzt muss natürlich erst mal dieses Recordset geleert werden damit ich die neuen Werte rein schreiben kann und das ist das PRoblem wo ich nicht weis wie es geht. |