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
-
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
-
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!
-
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
-
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!
-
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
-
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)
endend
-
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!
-
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)
endend
---
Leo
-
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
-
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
Content aside
- vor 4 JahrenZuletzt aktiv
- 10Antworten
- 2167Ansichten