0

Terminüberschneidungen vermeiden

Über drei Feldtypen erstelle ich einer Untertabelle sogenannte Appointments / Termine in den Kalender: DATUM, VON, BIS:

if Datum = null or Von = null or Bis = null then
alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS")
else
Termin := appointment(datetime(Datum + Von), Bis - Von)
end

Wie kann ich in der Tabelle nach überschneidenden Terminen suchen lassen und deren Eintragung, zusammen mit einem Warnhinweis unterbinden?

Vielen Dank schonmal :) 

10 Antworten

null
    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Zwei Termine überschneiden sich NICHT wenn Start2>Ende1 oder Ende2<Start1 in allen anderen Fällen gibt es ein Überschneidung. Also:

    ---

    if Datum = null or Von = null or Bis = null then
    alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS")
    else
    let myTermin:= appointment(datetime(Datum + Von), Bis - Von);
    let myStart:=start(myTermin);
    let myEnd:=endof(myTermin);
    if cnt(select DEINETABELLE [myStart>endof(Termin) or myEnd<start(Termin)])!=cnt(select DEINETABELLE) then
    alert("es gibt Terminüberschneidungen!")
    else
    Termin := myTermin
    end
    end

    ---

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo,

     

    danke für die Antwort, endlich konnte ich es testen. Bekomme es aber leider nicht hin. Wie folgt lautet mein Trigger, dei Tabelle heißt "Termine" der prüfende Kalender "Reinhard":

     

    if Datum = null or Von = null or Bis = null then
    alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS")
    else
    let myTermin := appointment(datetime(Datum + Von), Bis - Von);
    let myStart := start(myTermin);
    let myEnd := endof(myTermin);
    if cnt((select Termine)[myStart > endof(Reinhard) or myEnd < start(Reinhard)]) != cnt(select Termine) then
    alert("Es gibt Terminüberschneidungen!")
    else
    Reinhard := myTermin
    end
    end

     

    Obwohl ich am selben Tag eine Startzeit > als das letzte Ende der selben Tabellenspalte vergebe kommt die Meldung "Es gibt Terminüberschneidungen!".

    Vielen Dank für Hilfe!

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Zwei Sachen:

    Wenn ein Start des Termins auch eine Ende einen anderenn Termin sein kann, dann sollten wir statt kleiner ->kleiner oder gleich schreiben und ich würde dann sicherheitshalber den Datensatz wo man sich gerade befindet, aus dem Vergleich weg lassen (weil das Feld Reinhard in diesem Moment noch nicht gefüllt ist):

    ---

    let myID := Nr;
    if Datum = null or Von = null or Bis = null then
    alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS")
    else
    let myTermin := appointment(datetime(Datum + Von), Bis - Von);
    let myStart := start(myTermin);
    let myEnd := endof(myTermin);
    if cnt((select Termine)[myStart >= endof(Reinhard) or myEnd <= start(Reinhard) and Nr != myID]) != cnt((select Termine)[Nr != myID]) then
    alert("es gibt Terminüberschneidungen!")
    else
    Reinhard := myTermin
    end
    end
    ---

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo,

    perfekt funktioniert das, vielen Dank!

    Als letzten Schritt bräuchten wir nun noch das Abgleichen von 3 unabhängigen Terminspalten, da es 3 Mitarbeiter gibt:

    REINHARD, ELLA, TOMMY 

    Wir befüllen die jeweils gleichnamigen Terminfelder, entsprechend dem ausgewähltem Mitarbeiter in einem Auswahlfeld KALENDER. Die Schaltfläche RESERVIEREN soll nun entsprechend dem ausgewählten Mitarbeiter nur die gleichnamige Terminspalte auf Überschneidungen prüfen.

    Habe es mit verschachtelter if Funktion versucht, aber bislang leider erfolglos :(... Du hast bestimmt eine elegante Lösung,

     

    Vielen Dank!

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Bislang wurde ohne dem Prüfen auf Überschneidungen folgender Maßen befüllt:

     

    if Datum = null or Von = null or Bis = null or Kalender = null then
    alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS, KALENDER")
    else
    if Kalender = 1 then
    Reinhard := appointment(datetime(Datum + Von), Bis - Von)
    else
    if Kalender = 2 then
    Ella := appointment(datetime(Datum + Von), Bis - Von)
    else
    if Kalender = 3 then
    Tommy := appointment(datetime(Datum + Von), Bis - Von)
    end
    end
    end
    end

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    let myID := Nr;
    if Datum = null or Von = null or Bis = null then
    alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS")
    else
    let myTermin := appointment(datetime(Datum + Von), Bis - Von);
    let myStart := start(myTermin);
    let myEnd := endof(myTermin);

    switch Kalender do

    case 1:
    (if cnt((select Termine)[myStart >= endof(Reinhard) or myEnd <= start(Reinhard) and Nr != myID]) != cnt((select Termine)[Nr != myID]) then
    alert("es gibt Terminüberschneidungen!")
    else
    Reinhard := myTermin
    end)

    case 2:
    (if cnt((select Termine)[myStart >= endof(Ella) or myEnd <= start(Ella) and Nr != myID]) != cnt((select Termine)[Nr != myID]) then
    alert("es gibt Terminüberschneidungen!")
    else
    Ella := myTermin
    end)

    case 3:
    (if cnt((select Termine)[myStart >= endof(Tommy) or myEnd <= start(Tommy) and Nr != myID]) != cnt((select Termine)[Nr != myID]) then
    alert("es gibt Terminüberschneidungen!")
    else
    Tommy := myTermin
    end)
    end

    end

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo,

     

    Das funktioniert schonmal sehr gut. Leider scheint es noch ein Problem zu geben: 

    Wenn sich ein Termin überschnitten hat und ich weise diesen nun einem anderen Mitarbeiter zu, oder ändere die Daten auf einen passenden Zeit-Slot oder auf ein freies Datum, wird nach wie vor die Fehlermeldung angezeigt alert("es gibt Terminüberschneidungen!") und der Termin nicht eingtragen, obwohl dieser frei wäre...

    Woran kann das liegen? Evtl. an der ID?

    Liebe Grüße und vielen Dank!

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich glaube, ich habe hier vergessen die umklammerungen bei "or"-Bedingungen anzupassen:

    ---

    let myID := Nr;
    if Datum = null or Von = null or Bis = null then
    alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS")
    else
    let myTermin := appointment(datetime(Datum + Von), Bis - Von);
    let myStart := start(myTermin);
    let myEnd := endof(myTermin);

    switch Kalender do

    case 1:
    (if cnt((select Termine)[(myStart >= endof(Reinhard) or myEnd <= start(Reinhard)) and Nr != myID]) != cnt((select Termine)[Nr != myID]) then
    alert("es gibt Terminüberschneidungen!")
    else
    Reinhard := myTermin
    end)

    case 2:
    (if cnt((select Termine)[(myStart >= endof(Ella) or myEnd <= start(Ella)) and Nr != myID]) != cnt((select Termine)[Nr != myID]) then
    alert("es gibt Terminüberschneidungen!")
    else
    Ella := myTermin
    end)

    case 3:
    (if cnt((select Termine)[(myStart >= endof(Tommy) or myEnd <= start(Tommy)) and Nr != myID]) != cnt((select Termine)[Nr != myID]) then
    alert("es gibt Terminüberschneidungen!")
    else
    Tommy := myTermin
    end)
    end

    end

    ---

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo,

    danke für den neuen Input. Das Anpassen eines Termins ist nun möglich, sofern ich den KALENDER nicht umschalte. Sobald ich den bestehendem Termin einer anderen Person über das Auswahlfeld KALENDER zuweisen möchte kommt wieder die Fehlermeldung, obwohl der selektierte Kalender eigentlich noch leer ist...

    Es wäre toll wenns hierfür noch eine Lösung gäbe.

    Danke,

    Reinhard

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Reinhard,

    ---

    let myID := Nr;
    if Datum = null or Von = null or Bis = null then
    alert("Es fehlen leider noch Werte, bitte prüfe DATUM, VON, BIS")
    else
    let myTermin := appointment(datetime(Datum + Von), Bis - Von);
    let myStart := start(myTermin);
    let myEnd := endof(myTermin);
    let myTable := (select Termine where Nr != myID);
    switch Kalender do
    case 1:
    if cnt(myTable[Reinhard and not (myStart >= endof(Reinhard) or myEnd <= start(Reinhard))]) = 0 or cnt(myTable[Reinhard]) = 0 then
    Reinhard := myTermin;
    Ella := null;
    Tommy := null
    else
    alert("es gibt Terminüberschneidungen!")
    end
    case 2:
    if cnt(myTable[Ella and not (myStart >= endof(Ella) or myEnd <= start(Ella))]) = 0 or cnt(myTable[Ella]) = 0 then
    Ella := myTermin;
    Reinhard := null;
    Tommy := null
    else
    alert("es gibt Terminüberschneidungen!")
    end
    case 3:
    if cnt(myTable[Tommy and not (myStart >= endof(Tommy) or myEnd <= start(Tommy))]) = 0 or cnt(myTable[Ella]) = 0 then
    Tommy := myTermin;
    Reinhard := null;
    Ella := null
    else
    alert("es gibt Terminüberschneidungen!")
    end
    end
    end

    ---

    Leo