Supportnet Computer
Planet of Tech

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

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)

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


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

Antwort 5 von struppi

...Nachtrag
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;



Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: