0

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

null
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    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;

    *

    • Markus_Weise
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Vielen Dank, das funktioniert super! Abholzeit und Ankunftszeit sind Uhrzeitfelder, die Fahrer sind tatsächlich eine per Switch verknüpfte Tabelle.

    • Andreas_Kappes
    • vor 10 Monaten
    • Gemeldet - anzeigen

    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

      • mirko3
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Hallo Andreas. Ändere doch bitte im Script in der if-Anweisung den Text in:

      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
      

      Mirko

      • Andreas_Kappes
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Dann ist alles eine Terminüberschneidung

      hier müßten die 3 Termine rot werden

      mit der Änderung sieht es dann so aus:

      vielleicht ist auch meine Abfrage falsch

      let Ergebnis := "";
      let next := Termin;
      let tag := Datum;
      let fahrer := Mitarbeiter;
      let counter := cnt(for i in (select ZeitBuchung)[Mitarbeiter = fahrer and tag = Datum and 'Übermittelt' = false] 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
          vF = color("green");
          bF = color("green");
          Ergebnis := "OK"
      else
          vF = color(255, 127, 102);
          bF = color(255, 127, 10);
          Ergebnis := "Terminüberschreitung"
      end;
      styled(text(Ergebnis), vF)

      vf und bf sind Farbfelder

      • mirko3
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Füge doch bitte in die if-else Anweisung noch ein "else 0" ein:

      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 else 0
                  end
              end);
      
      • Andreas_Kappes
      • vor 10 Monaten
      • Gemeldet - anzeigen

       leider ohne Erfolg

      • mirko3
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Schade. Müßten nicht in dem Farbteil Deines Scripts auch die Zuweisungsoperatoren stehen, statt "=" ? Siehe unten. Und es ist ja wahrscheinlich nicht das ganze Script, sondern ein Teil davon. Hast Du vielleicht eine Dummy-DB? -> level1@online.de, oder hier posten. Wenn Dir das nicht möglich ist, dann schreibe noch, welcher Feldtyp Termin ist. Dann stelle ich mir mal eine DB nach.

      if counter = 0 then
          vF := color("green");
          bF := color("green");
          Ergebnis := "OK"
      else
          vF := color(255, 127, 102);
          bF := color(255, 127, 10);
          Ergebnis := "Terminüberschreitung"
      end;
      

      Mirko

      • Andreas_Kappes
      • vor 10 Monaten
      • Gemeldet - anzeigen

       

      ich habe jetzt gleich eine Server Umstellung. Wenn's noch reicht mache ich noch danach eine Dummy Datenbank ansonsten dann morgen früh

    • Michi.1
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Vielleicht kann das von Leo helfen, hier wurden zwar Termine an einem Tag gezählt, aber das kann man bestimmt umbauen.

    https://forum.ninox.de/t/h7h9bn8

    • Andreas_Kappes
    • vor 10 Monaten
    • Gemeldet - anzeigen

    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

    image

      • mirko3
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Hallo Andreas. Hier mal ein Beispiel. Ich habe die Farbfelder gelöscht, da sie mir unnötig erschienen und im Dashboard liegt ein Bildfeld, in dem Du sehen kannst, wo ich Änderungen vorgenommen habe. Ich hätte noch mehr geändert, dann wird es aber für Dich vielleicht nicht so nachvollziehbar wie jetzt.

      Ein Funktionsfeld (isConflict) ergibt true, wenn ein Konflikt vorliegt. Die Felder "von Anzeige" und "bisAnzeige" werden danach eingefärbt. Der gleiche Code wird benutzt, um die Felder im Dashboard zu färben. Damit brauchst Du die Farbfelder nicht. Schau mal ob es Dich weiterbringt. Mirko

      • Andreas_Kappes
      • vor 10 Monaten
      • Gemeldet - anzeigen

       

      Super !!!!!!  👍👋🎉 funktioniert perfekt

      auf die case Verschachtelung währe ich nicht gekommen.

      Gruß und vielen Dank

      Andreas

      • Rafael_Sanchis
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Hi Andreas.

      what is the formula do you use in the View  Aufträge

      Thank fue all the info