Terminüberschneidungen überprüfen
Hallo zusammen,
ich entwickle eine Anwendung zur Verwaltung und Zuweisung von Taxifahrten und bekomme die Überprüfung auf Überschneidung von Terminen einfach nicht hin. Ich habe einen Button, mit dem ich den Zeitraum, in dem ein Fahrer unterwegs ist ermittle und als Termin in den Kalender eintrage:
if Abholort and Ziel and Ankunftszeit and Datum != 0 then
let myURL := url("https://maps.googleapis.com/maps/api/distancematrix/json", {
origins: Abholort,
destinations: Ziel,
mode: "car",
key: "KEY"
});
let gcode := do as server
http("GET", myURL)
end;
Strecke := number(first(first(gcode.result.rows).elements).distance.value) / 1000;
Fahrdauer := time(number(gcode.result.first(rows).first(elements).duration.value) * 1000);
Abholzeit := if Fahrdauer != null then
Ankunftszeit - Fahrdauer - 300000
end;
let myStart := datetime(Datum, Abholzeit);
let myEnd := myStart + Fahrdauer + 300000 + Wartezeit;
Termin := appointment(myStart, myEnd)
else
alert("Bitte Fahrtdaten ausfüllen!")
end
Wie kann ich nun bevor der Termin ins Terminfeld eingetragen wird überprüfen, ob zwischen Abholzeit und Ankunftszeit des zu erstellenden Termins bereits andere Termine platziert sind und daraufhin einen Warnhinweis platzieren? Es gibt auch 3 Fahrer, kann das auch je nach ausgewähltem Fahrer überprüft werden? Schon mal vielen Dank für Ratschläge!
LG Markus
14 Antworten
-
Du mußt über eine Schleife prüfen, ob der Start und das Ende des neuen Termins innerhalb aller anderen Termine liegt. In meinem Beispiel ist FAHRER ein Auswahlfeld und TABELLE die Tabelle, die die Termine enthält. Du setzt dann das angepasste Script für Zeile 19 ein. Aber. In Deiner Anfrage gibst Du Dein Datenmodell nicht preis (Tabellenname, Feldtypen, Verknüpfungen etc.), deshalb ist viel hineininterpretiert. Gruß Mirko
*
let next := appointment(myStart, myEnd);
let fahrer := FAHRER;
let counter := cnt(for i in (select TABELLE)[FAHRER = fahrer] do
if start(next) > start(i.Termin) and start(next) < endof(i.Termin) or endof(next) > start(i.Termin) and endof(next) < endof(i.Termin) then
1
end
end);
if counter = 0 then
Termin := next
else
alert("Terminüberschneidung")
end;
*
-
Vielen Dank, das funktioniert super! Abholzeit und Ankunftszeit sind Uhrzeitfelder, die Fahrer sind tatsächlich eine per Switch verknüpfte Tabelle.
-
Hallo zusammen,
ich habe jetzt hier noch eine Frage dazu.
der Code funktioniert wunderbar. Jedoch nicht wenn 2 exakt gleiche Termine drin stehen mit gleicher Startzeit und gleicher Endzeit dies müsste auch als Terminüberschreitung angezeigt werden tut es aber nicht. wenn ich noch eine Erweiterung mit
or next = i.termin
hinzufüge macht er alle Einträge auf Überschneidung
Gruß
Andreas
-
Vielleicht kann das von Leo helfen, hier wurden zwar Termine an einem Tag gezählt, aber das kann man bestimmt umbauen.
-
Hier mal die Datenbank dazu
Arbeitszeiterfassung ist das Dashboard die der Monteur als Ansicht hat. Die Daten in Aufträge dort stammen aus einer anderen Tabelle die über do as database abgerufen werden ebenso die Tabelle Mitarbeiter die ich jetzt aber zum Testen hier mit rein genommen habe.
Über den vorherigen und nächster Datensatz wird dann durch die Aufträge navigiert und der Monteur kann dann über den Button "Termin in die Zeiterfassung übernehmen" den Termin dann in die Tabelle ZeitBuchung schreiben. Dort soll jetzt die Prüfung stattfinden. Dies geschieht in dem Formelfeld "Überwachung" und im Dashboard in der Tabelle Ansicht gleich optisch dargestellt werden wo es Zeitüberschreitungen gibt die der Monteur dann anpassen muss.
Bsp. Datum 05.02.2024 Mitarbeiter 9
Content aside
- vor 10 MonatenZuletzt aktiv
- 14Antworten
- 238Ansichten
-
4
Folge bereits