0

Termin aus Start- und Enddatum generieren

Ich habe einen Ferienkalender in meine Datenbank importiert (csv)
Der Import gibt mir jeweils ein Start- und Enddatum (von-bis)
Nun möchte ich diese als Termine im Kalender anzeigen.
Ich wusste das schonmal hab mich jedoch längere Zeit nicht mehr mit der Programmierung beschäftigt und vieles vergessen.
Im Voraus vielen Dank für Hilfe
Gruß Uwe

12Antworten Älteste zuerst
  • Älteste zuerst
  • Neuste zuerst
  • Aktive Threads
  • Beliebt
  • Dazu brauchst du noch ein Termin Feld in deiner Tabelle

    In der Konsole oder einem Button kannst du anschliessend folgenden Code ausführen:

    let appointments := select Termine;
    appointments.(Termin := appointment(Start,Ende))
    
    Gefällt mir
    • Siskokeys
    • Siskokeys
    • Vor 5 Tagen
    • Gemeldet - anzeigen

    Zuerst mal vielen Dank aber es funktioniert nicht ganz.
    Das Terminfeld habe ich Ferientermine genannt, den Start Von, das Ende Bis
     

    Gefällt mir
    • Siskokeys
    • Siskokeys
    • Vor 5 Tagen
    • Gemeldet - anzeigen

    nun hab ich den Code eingegeben (s. Bild) Wo ist der Fehler?

    Gefällt mir
    • Siskokeys 

      for i in select 'Ferien-BW-2022-2023' do
          i.Ferientermine := appointment(i.Von, i.Bis)
      end
      Gefällt mir
    • Siskokeys
    • Siskokeys
    • Vor 5 Tagen
    • Gemeldet - anzeigen

    Das sieht schon ganz gut aus:
    2 Probleme:

    • Ich hätte die Termine gerne als mehrtägige Einträge ohne Uhrzeit
    • eintägige Einträge tauchen nicht auf, da die Termine gleichzeitig beginnen und aufhören. z.B. 1. Mai - Termin:01.05.2023 02:00 - 02:00 

    So sieht die Tabelle nach dem Import der Daten aus. Ich hätte also sogar eine Unterscheidung der Datensätze für eintägig, bzw mehrtägig

    Gefällt mir
    • Siskokeys 

       

      let AlleFerien := (select 'Ferien-BW-2022-2023');
      AlleFerien.(Ferientermine := appointment(datetime(Von, time(0)), datetime(Bis, time(23, 59))))
      
      

      So erstellt es alle Termine ganztägig von 00:00 Uhr bis 23:59 Uhr egal ob sie mehrtägig sind oder eintägig.

      Oder hast du bei den eintägigen eine spezielle dauer im Sinn?

      Gefällt mir
    • Siskokeys
    • Siskokeys
    • Vor 5 Tagen
    • Gemeldet - anzeigen

    Ich hätte sie gerne als Termine in dem oberen Kalenderbereich (wo auch die Geburtstage auftauchen) Wenn ich das richtig verstehe sind das jedoch keine Termine sondern Datumsevents. Hab schon versucht eine Untertabelle mit solchen zu erstellen. Dann bräuchte ich ein Script, dass mir Von-Bis diese Einzeldaten generiert. 

    Gefällt mir
    • Siskokeys 

      Ja genau dazu braucht es eine zusätzliche Tabelle in dieser Art.

       

      Das Script dazu könnte folgendermassen aussehen:

      do as server
          let Ferien := (select 'Ferien-BW-2022-2023');
          for Tag in Ferien do
              let startDate := Tag.Von;
              let endDate := Tag.Bis;
              let eventTitle := Tag.'Ferien/Feiertage';
              let currentDate := startDate;
              while currentDate <= endDate do
                  let newEvent := (create Ferientage);
                  newEvent.(
                      Bezeichnung := eventTitle;
                      Datum := currentDate
                  );
                  currentDate := currentDate + 1
              end
          end
      end
      
      Gefällt mir
    • Siskokeys
    • Siskokeys
    • Vor 4 Tagen
    • Gemeldet - anzeigen

    Wahnsinn, hat geklappt!! Vielen Dank
    Ein kleines Problem noch. Wenn ich nun einen neuen Ferientermin erstelle (oder importiere) und dann wieder meinen Script-Button drücke bekomme alle vorher schon dagewesene doppelt. Ließe sich das verhindern?

    Gefällt mir
    • Siskokeys 

      do as server
          let Ferien := (select 'Ferien-BW-2022-2023');
          let alleFerientage := select Ferientage;
          for Tag in Ferien do
              let startDate := Tag.Von;
              let endDate := Tag.Bis;
              let eventTitle := Tag.'Ferien/Feiertage';
              let currentDate := startDate;
              while currentDate <= endDate do
                  let existing := alleFerientage[Bezeichnung = eventTitle and Datum = currentDate];
                  if cnt(existing) = 0 then
                      let newEvent := (create Ferientage);
                      newEvent.(
                          Bezeichnung := eventTitle;
                          Datum := currentDate
                      );
                  end;
                  currentDate := currentDate + 1
              end
          end
      end
      
      Gefällt mir
    • Siskokeys
    • Siskokeys
    • Vor 4 Tagen
    • Gemeldet - anzeigen

    Vielen Dank, funktioniert hervorragend. 
    Noch ein paar Fragen zum Verständnis:

    • was macht „do as server“?
    • Die Zeile „    let Ferien := (select 'Ferien-BW-2022-2023');“ brauch ich um das Script auch von einer anderen Tabelle aus (oder Konsole) starten zu können?
    Gefällt mir
    • Siskokeys ich bin mal so frei:

       

      a) "do as server" sorgt dafür, dass der dort inkludierte Skript-Teil auf dem Server direkt ausgeführt wird - gerade wenn mutmasslich große Schleifen durchlaufen werden, macht sich das in der Performance durchaus bemerkbar.

       

      b) zu Skriptbeginn ist der interne "Zeiger" von Ninox immer auf dem Datensatz, in dem es angestossen wird. Wenn Du, wie hier, komplette Tabellen durchlaufen willst, musst Du Ninox mitteilen, welche. "let Variable := (select Tabelle)" erstellt einfach ein Array mit den IDs der Datensätze aus der gewählten Tabelle, welches später mit "for i in Variable do ... end" durchlaufen wird.

      Gefällt mir 1
Gefällt mir Folgen
  • Vor 4 TagenZuletzt aktiv
  • 12Antworten
  • 73Ansichten
  • 3 Folge bereits