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

12 Antworten

null
    • m2apla gmbh
    • Etienne_Scherrer
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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))
    
    • Siskokeys
    • vor 1 Jahr
    • Gemeldet - anzeigen

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

    • Siskokeys
    • vor 1 Jahr
    • Gemeldet - anzeigen

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

      • Torsten_Stang.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Siskokeys 

      for i in select 'Ferien-BW-2022-2023' do
          i.Ferientermine := appointment(i.Von, i.Bis)
      end
    • Siskokeys
    • vor 1 Jahr
    • 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

      • m2apla gmbh
      • Etienne_Scherrer
      • vor 1 Jahr
      • Gemeldet - anzeigen

      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?

    • Siskokeys
    • vor 1 Jahr
    • 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. 

      • m2apla gmbh
      • Etienne_Scherrer
      • vor 1 Jahr
      • Gemeldet - anzeigen

      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
      
    • Siskokeys
    • vor 1 Jahr
    • 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?

      • m2apla gmbh
      • Etienne_Scherrer
      • vor 1 Jahr
      • Gemeldet - anzeigen

      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
      
    • Siskokeys
    • vor 1 Jahr
    • 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?
      • Torsten_Stang.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

      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.

Content aside

  • Status Answered
  • vor 1 JahrZuletzt aktiv
  • 12Antworten
  • 135Ansichten
  • 3 Folge bereits