Hallo zusammen,
sorry erstmal für die wenig aussagekräftige Bezeichnung des Themas, aber ich wusste nicht wie umschreiben.
Ich muss etwas ausholen:
Das "Endziel" soll sein, dass ich ein Array fülle, ich versuche mich aber Schritt für Schritt dahin zu arbeiten und hänge schon im ersten Schritt.
Ich habe eine Tabelle mit (u.a.) einem Mitarbeiter, einer Tätigkeit und einem Zeitraum (Start, Ende).
Daraus möchte ich ein Array (vermute mal, das wäre eine gute Idee, vielleicht liege ich aber auch falsch und ein recordset oder sogar temporäre Tabelle wären eine sinnvollere Lösung?) erstellen, dass aus den Feldern "Mitarbeiter", "Tätigkeit" und für jeden Tag des Zeitraums einen Datensatz hat.
Ausgangstabelle:
ID | Mitarb | Taetigk | Start | Ende |
1 | Müller | B805 | 01.06.17 | 05.06.17 |
2 | Schmitt | B851 | 02.08.17 | 02.08.17 |
3 | Müller | B811 | 08.06.17 | 20.06.17 |
4 | Müller | B805 | 01.08.17 | 05.08.17 |
1 | Bauer | B965 | 10.06.17 | 11.06.17 |
Ziel(-Tabelle) / Array:
Mitarb | Taetigk | Datum |
Müller | B805 | 01.06.17 |
Müller | B805 | 02.06.17 |
Müller | B805 | 03.06.17 |
... |
Müller | B805 | 05.06.17 |
Schmitt | B851 | 02.08.17 |
Ich denke das Prinzip ist klar.
Mein Gedanke war, dass der erste Schritt ist, herauszufinden, wie viele Datensätze muss das Array haben. Dazu wollte ich pro DS und Mitarbeiter die Anzahl herausfinden und mit DateDiff die zusätzlich benötigten DS ermitteln.
... und bei diesem ersten Schritt hänge ich schon. :(
Kann mir jemand einen generellen Tipp geben, wie ich da drangehen könnte? Recordset erstellen, ein Array, SQL Abfrage,...???
Gruß
Klaus
Hallo,
eine Kombination von Recordset und SQL dürfte sich wohl eignen:
(Luftcode)
Dim db as Dao.Database, lngTage as Long, rs as Dao.Recordset
Set db =Currentdb
Set rs = db.Openrecordset (" Select * from [eineTabelle] order by Mitarb, Taetigk, Start ", dbOpensnapshot)
If Not (rs.BOF and rs.EOF) Then
lngTage = Int(rs!Ende)-Int(rs!Start)
For i= 0 to lngTage
db.Execute ("Insert into [tblErgebnis] (Mitarb, Taetigk, Tagesdatum) Values ('" & rs!Mitarb & "'," & rs!Taetigk & "'," & Format (rs!Start +i , "\#yyyy-mm-dd\#") & ")"
Next
End If
rs.Close:Set rs = Nothing
Set db = Nothing
Hallo!
Ich würde eine Kalender-Hilfstabelle verwenden und damit die benötigten Daten über eine SQL-Anweisung erzeugen.
Prinzip:
select
T.Mitarb, T.Taetigk, K.KalenderDatum
from
Ausgangstabelle T
inner join
Kalendertabelle K ON K.KalenderDatum between T.Start AND T.Ende
mfg
Josef
Hallo Josef,
kling auch reizvoll.
Ich bekomme aber eine Fehlermeldung "Syntaxfehler (fehlender Operator) in Abfrageausdruck ..."
???
mir ist auch der "Inner Join" mit "between" nicht ganz klar, wie der funktioniert.
Gruß
Klaus
Hallo!
Kann sein, dass Jet den Join-Ausdruck nicht versteht.
Probiere bitte einmal mit Klammer:
.. Kalendertabelle K ON (K.KalenderDatum between T.Start AND T.Ende)
Falls das auch nicht klappt, kannst du eine Where-Anweisung verwenden.
select
T.Mitarb, T.Taetigk, K.KalenderDatum
from
Ausgangstabelle T,
Kalendertabelle K
where
K.KalenderDatum between T.Start AND T.Ende
mfg
Josef
Hallo Franz,
habe wieder etwas mit dem Datum und den Anführungszeichen "rummurksen" müssen, bis das funktioniert hat, aber jetzt geht es.
Anstelle If ... habe ich aber ein Do While ... Loop und "OR" anstelle "AND" eingebaut.
Jetzt funktioniert's.
So, jetzt gehe ich an die nächsten Schritte. Muss noch schauen, mit welcher Variante. Die von Franz oder die von Josef.
Danke!
Klaus
Hallo!
Falls du die Recordset-Schleife zum Einfügen verwendest, könntest du mit einem QueryDef die Werte an Parameter übergeben. Dann musst du dich nicht um die Formatierung in SQL-Text kümmern.
Prinzip (Luftcode von Franz in der Luft umgebaut ;)):
Dim db as Dao.Database, lngTage as Long, rs as Dao.Recordset
dim Qdf as Dao.QueryDef
dim InsertSql as String
Set db =Currentdb
Set rs = db.Openrecordset (" Select * from [eineTabelle] order by Mitarb, Taetigk, Start ", dbOpensnapshot)
InsertSql ="parameters @Mitarb varchar(255), @Taetigk varchar(255), @Tagesdatum datetime; " & _
"Insert into [tblErgebnis] (Mitarb, Taetigk, Tagesdatum) Values (@Mitarb, @Taetigk, @Tagesdatum)"
set Qdf = db.CreateQueryDef("", InsertSql)
qdf.ReturnsRecords = false
Do While not rs.EOF
lngTage = Int(rs!Ende)-Int(rs!Start)
For i= 0 to lngTage
Qdf.Parameters(@Mitarb) = rs!Mitarb
Qdf.Parameters(@Taetigk) = rs!Taetigk
Qdf.Parameters(@Tagesdatum) = Dateadd("d", i , rs!Start)
Qdf.Execute dbfailonerror
Next
rs.Movenext
Loop
rs.Close:Set rs = Nothing
mfg
Josef
Hallo,
ja, die Do-Schleife hab ich tatsächlich vergessen... Aber die ist ja offensichtlich erforderlich.
@Josef:
sag doch gleich: in der Luft zerrissen... :D ;D 8)