Neuigkeiten:

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

Mobiles Hauptmenü

Recordset aus Zeiträumen generieren

Begonnen von Klaus S. aus B, August 22, 2017, 11:13:22

⏪ vorheriges - nächstes ⏩

Klaus S. aus B

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:







IDMitarbTaetigkStartEnde
1MüllerB80501.06.1705.06.17
2SchmittB85102.08.1702.08.17
3MüllerB81108.06.1720.06.17
4MüllerB80501.08.1705.08.17
1BauerB96510.06.1711.06.17

Ziel(-Tabelle) / Array:









MitarbTaetigkDatum
MüllerB80501.06.17
MüllerB80502.06.17
MüllerB80503.06.17
...
MüllerB80505.06.17
SchmittB85102.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

DF6GL

#1
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

Josef P.

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

Klaus S. aus B

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

Josef P.

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

Klaus S. aus B

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

Josef P.

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

DF6GL

#7
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)