Supportnet / Forum / Datenbanken
Gruppieren
Frage
Hallo,
Frohes neues Jahr!
Kleine Neujahrsknobelei gefällig?
Ich gruppiere in einer Abfrage Datensätze mit gleicher Anfangszeit und gleicher Endzeit.(Feld "von" und "bis")
Darüber hinaus möchte ich aber die Datensätze weiter zusamenfassen wenn es Überschneidungen gibt. Beispiel:
[code]
von bis
07:00 09:00
12:00 18:00
13:00 18:00
11:00 15:00
soll ergeben:
07:00 09:00
11:00 18:00
[/code]
Wer hat eine gute Idee wie ich das möglichst einfach lösen kann?
gruß struppi
Antwort 1 von Teddy7
Hallo struppi !
Erst mal ein Frohes Neues Jahr !!
Jaaa - möglichst einfach ???
Ich sehe nur eine Möglichkeit:
bau Dir mit VBA-Zugriffen eine temporäre Tabelle auf.
Gruß
Teddy
Erst mal ein Frohes Neues Jahr !!
Jaaa - möglichst einfach ???
Ich sehe nur eine Möglichkeit:
bau Dir mit VBA-Zugriffen eine temporäre Tabelle auf.
Gruß
Teddy
Antwort 2 von struppi
Hallo Teddy,
Jaaa - die Antwort habe ich befürchtet.
Dachte halt es gäbe da noch einen Obertrick. Bis jetzt mach ich es so umständlich:
(Wobei das Datum später immer per Variable der SQL übergeben werden soll)
Danke und Gruß struppi
Jaaa - die Antwort habe ich befürchtet.
Dachte halt es gäbe da noch einen Obertrick. Bis jetzt mach ich es so umständlich:
(Wobei das Datum später immer per Variable der SQL übergeben werden soll)
Function TerminBerechnung()
Dim rs, rs1 As DAO.Recordset, sql As String, i As Integer
Dim MitarbeiterID, Zeitsumme, von, bis, TabObjekteID, TerminDatum, Anzahl As Variant
sql = "SELECT TabPlanMitarbeiter.MitarbeiterID, Sum(TabPlanMitarbeiter.Zeit) AS [Summe von Zeit], " _
& "TabPlanMitarbeiter.von, TabPlanMitarbeiter.bis, TabPlanung.TabObjekteID, TabTermine.TerminDatum, " _
& "Sum(([R1]+[R2])*-1) AS anz FROM (TabPlanMitarbeiter RIGHT JOIN TabPlanung ON " _
& "TabPlanMitarbeiter.TabPlanungID = TabPlanung.ID) LEFT JOIN TabTermine ON " _
& "TabPlanung.ID = TabTermine.TabPlanungID GROUP BY TabPlanMitarbeiter.MitarbeiterID, " _
& "TabPlanMitarbeiter.von, TabPlanMitarbeiter.bis, TabPlanung.TabObjekteID, " _
& "TabTermine.TerminDatum HAVING (((TabTermine.TerminDatum) = #1/8/02#)) ORDER BY TabPlanMitarbeiter.MitarbeiterID, TabPlanMitarbeiter.von;"
Set rs = CurrentDb.OpenRecordset(sql)
'*******ersten Datensatz übergeben**********
If rs.EOF = False Then
rs.MoveFirst
MitarbeiterID = rs.Fields(0).Value
Zeitsumme = rs.Fields(1).Value
von = rs.Fields(2)
bis = rs.Fields(3)
TabObjekteID = rs.Fields(4)
TerminDatum = rs.Fields(5)
Anzahl = rs.Fields(6)
rs.MoveNext
If rs.EOF Then TabABRTermineSchreiben MitarbeiterID, Zeitsumme, von, bis, TabObjekteID, TerminDatum, Anzahl
' ********* Mit nächstem Datensatz vergleichen **********
Do Until rs.EOF
If MitarbeiterID = rs.Fields(0).Value And TabObjekteID = rs.Fields(4) Then 'Bei gleichem Objekt und Mitarbeiter
'*******Vergleich***********
If bis >= rs.Fields(2).Value Then
'******* Überschneidung ***********
'von = von
Zeitsumme = Zeitsumme + CInt(rs.Fields(1).Value) ' Bei Überschneidung Zeiten addieren
Anzahl = Anzahl + CInt(rs.Fields(6).Value) ' und Anzahl addieren
If bis <= rs.Fields(3).Value Then
bis = rs.Fields(3).Value
Else
'bis = bis
End If
Else
'*******keine Überschneidung ******
'Updaten
TabABRTermineSchreiben MitarbeiterID, Zeitsumme, von, bis, TabObjekteID, TerminDatum, Anzahl
'Variablen neu laden
MitarbeiterID = rs.Fields(0).Value
Zeitsumme = rs.Fields(1).Value
von = rs.Fields(2)
bis = rs.Fields(3)
TabObjekteID = rs.Fields(4)
TerminDatum = rs.Fields(5)
Anzahl = rs.Fields(6)
End If
Else
TabABRTermineSchreiben MitarbeiterID, Zeitsumme, von, bis, TabObjekteID, TerminDatum, Anzahl
'Variablen neu laden
MitarbeiterID = rs.Fields(0).Value
Zeitsumme = rs.Fields(1).Value
von = rs.Fields(2)
bis = rs.Fields(3)
TabObjekteID = rs.Fields(4)
TerminDatum = rs.Fields(5)
Anzahl = rs.Fields(6)
End If
rs.MoveNext
If rs.EOF Then TabABRTermineSchreiben MitarbeiterID, Zeitsumme, von, bis, TabObjekteID, TerminDatum, Anzahl
Loop
DoCmd.OpenTable "TabABRTermine", acNormal, acEdit
Else
MsgBox "Keine Termine am xx.xx.xx", vbInformation, "TERMINE"
End If
End Function
Function TabABRTermineSchreiben(w1, w2, w3, w4, w5, w6, w7)
Dim rs1 As DAO.Recordset
Set rs1 = CurrentDb.OpenRecordset("TabABRTermine")
rs1.AddNew
rs1.Fields(0).Value = w1
rs1.Fields(1).Value = w2
rs1.Fields(2).Value = w3
rs1.Fields(3).Value = w4
rs1.Fields(4).Value = w5
rs1.Fields(5).Value = w6
rs1.Fields(6).Value = w7
rs1.Update
rs1.Close
Set rs1 = Nothing
End Function
Danke und Gruß struppi
Antwort 3 von accsiggi
Moin struppi,
ich würde die Tabelle zuerst mal nach der Feldreihenfolge d.h. 1. Anfangszeit 2. Endzeit sortieren.
Anschließend eine Schleife basteln in der der aktuelle Datensatz (der bei jedem Schleifendurchlauf um 1 erhöht wird) mit dem vorhergehenden dahingehend verglichen wird ob die Endzeit kleiner oder gleich der vorhergehenden Endzeit ist.
Wenn kleinder oder gleich, bleibt es bei den Werten der bisherigen Gruppe(n).
Wenn größer, wird eine neue Gruppe gebildet mit den aktuellen Feldwerten in Anfangszeit und Endzeit.
Falls ich Dich mit meinem Vorschlag verschreckt haben sollte, bitte ich um Nachsicht, da ich mich gerade erst in Access einarbeite.
Tschüß
Siggi
ich würde die Tabelle zuerst mal nach der Feldreihenfolge d.h. 1. Anfangszeit 2. Endzeit sortieren.
Anschließend eine Schleife basteln in der der aktuelle Datensatz (der bei jedem Schleifendurchlauf um 1 erhöht wird) mit dem vorhergehenden dahingehend verglichen wird ob die Endzeit kleiner oder gleich der vorhergehenden Endzeit ist.
Wenn kleinder oder gleich, bleibt es bei den Werten der bisherigen Gruppe(n).
Wenn größer, wird eine neue Gruppe gebildet mit den aktuellen Feldwerten in Anfangszeit und Endzeit.
Falls ich Dich mit meinem Vorschlag verschreckt haben sollte, bitte ich um Nachsicht, da ich mich gerade erst in Access einarbeite.
Tschüß
Siggi
Antwort 4 von struppi
Hallo Siggi,
Danke für Deinen Tip.
Auf den ersten Blick ist es sicher nicht erkennbar....aber in obigem Code habe ich versucht genau das umzusetzen was Du schreibst.
Aber irgendwie ist es ziemlich umfangreich geworden. Nun dachte ich, es gäbe da vielleicht doch noch was genial Einfaches.
Hab ZB in einem Forum mal gelesen wie unter A2000 SQL verschachtelt wurde.
Geht aber mit A97 nicht...
Gruß struppi
Danke für Deinen Tip.
Auf den ersten Blick ist es sicher nicht erkennbar....aber in obigem Code habe ich versucht genau das umzusetzen was Du schreibst.
Aber irgendwie ist es ziemlich umfangreich geworden. Nun dachte ich, es gäbe da vielleicht doch noch was genial Einfaches.
Hab ZB in einem Forum mal gelesen wie unter A2000 SQL verschachtelt wurde.
Geht aber mit A97 nicht...
Gruß struppi
Antwort 5 von struppi
...Nachtrag
Erleuchtung! Ich habs mit Abfrage hinbekommen. Wen`s interessiert:
Erleuchtung! Ich habs mit Abfrage hinbekommen. Wen`s interessiert:
SELECT TempTagTermine.Mitarbeiter, Sum(TempTagTermine.Zeit) AS [Summe von Zeit], TempTagTermine.TabObjekteID, TempTagTermine.TerminDatum, TempTagTermine.Kategorie, Sum(1) AS Ausdr1, DMin("von","TempTagTermine"," Mitarbeiter=" & [Mitarbeiter] & " AND TabObjekteID=" & [TabobjekteID] & " AND von<=#" & [bis] & "#") AS Gruppvon, DMax("bis","TempTagTermine"," Mitarbeiter=" & [Mitarbeiter] & " AND TabObjekteID=" & [TabobjekteID] & " AND von<=#" & [bis] & "#") AS Gruppbis
FROM TempTagTermine
GROUP BY TempTagTermine.Mitarbeiter, TempTagTermine.TabObjekteID, TempTagTermine.TerminDatum, TempTagTermine.Kategorie, DMin("von","TempTagTermine"," Mitarbeiter=" & [Mitarbeiter] & " AND TabObjekteID=" & [TabobjekteID] & " AND von<=#" & [bis] & "#"), DMax("bis","TempTagTermine"," Mitarbeiter=" & [Mitarbeiter] & " AND TabObjekteID=" & [TabobjekteID] & " AND von<=#" & [bis] & "#")
HAVING (((TempTagTermine.TerminDatum)=#1/2/2003#))
ORDER BY TempTagTermine.TerminDatum;

