0

Auswahlfeld gibt keine Werte aus wenn es automatisiert angetriggert wird

Ich stehe mal wieder auf dem berühmten Schlauch.

Ich habe ein Auswahlfeld. Damit werden Uhrzeiten im Viertelstundentakt ausgewählt. Dazu ist ein Script drin wie auf dem Screenshot zu sehen. Das brauchte ich neben einer schnellen Bedienung auch um Werte zu erhalten mit denen ich rechnen kann (Minuten ab Mitternacht in diesem Fall werden da ausgegeben) Das klappt händisch auch alles vorzüglich.

Triggere ich das Auswahlfeld aber durch ein anderes Script an (springe auf Uhrzeiz XX:xx wenn dies oder das passiert). Dann erscheint zwar die gewollte "Viertelstunde" im Fenster des Auswahlfelds aber im Berechnungsfeld in dem sonst die Minuten ankommen passiert dann nichts. Dort bleiben alte Werte auch einfach stehen.

 

Was mache ich falsch

?

27 Antworten

null
    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    keine Ahnung...

    aber mal einen Vorschlag zum Überdenken:

    if 'Zeit Mo. Morgens' = null then

        'MinMorgens Mo.' := null

    else

        'MinMorgens Mo.' := 405 + 'Zeit Mo. Morgens' * 15

    end;

    diese Zeilen dann bei dem auszulösenden Ereignis mit eintragen...

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Das ist auch so gewollt um die Endlosschleifen zu vermeiden. Wenn man ein Feld mit Trigger von einem anderen Trigger ändert, muss man den zweiten Trigger dann auch mitschreiben. Ansonsten würde ich auch zu der Formel von Bernd tendieren. Ist viel schlanker.

    Leo

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hmm...

    Hab ich mal probiert deinen Code, da meckert Ninox schon wenn ich es nur eingebe.

    Was genau bezweckst Du damit und wo genau soll ich den einfügen? Anstelle meiner langen Liste oder zusätzlich. Nur in dem Auswahlfeld oder in zwei Feldern?

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich habe mal Pfeile gemalt um besser zu verdeutlichen was ich machen möchte.

    Es gibt eine blöde Sonderregel die sich "Mitternachtregel" nennt. Das passiert z.B. wenn man von Daheim zu einem Kunden fährt, nicht übernachtet sondern in der Nacht arbeitet und ohne Übernachtung danach zurück fährt. Um das anzuwählen möchte ich am Montag einfach die Mitternachregel wählen.

     

    Dann sollen folgende Dinge passieren: Die "Zeit Mo. Abends" soll automatisch auf 24:00 switchen und am folgenden Dienstag soll die "Zeit Di. Morgens" auf 0:00 schalten und im Feld "Abfahrtsort Di. Morgens" soll die Mitternachtregel erscheinen.

     

    Das bekomme ich auch hin.

     

    Aber dann wird in den beiden Berechnungsfeldern die den beiden Zeitauswahlfenstern zugeordnet sind nichts eingetragen noch berechnet. Mache ich die selbe Sache per Hand, geht es. Ich bin für schlankere Codes immer zu haben, war aber froh überhaupt soweit gekommen zu sein :-) Wenn ich wüsste wie ich Bernds schlankere Sache wie einbauen soll, würde ich es sofort tun.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wie sehen die Berechnungsfelder aus?

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Im Moment Zahlenfelder. In einem Berechnungsfeld lässt sich die Minutenzahl irgendwie nicht eintragen (Ninox meckert dann, dass es kein normales Datenfeld ist)

    • Ninox-Professional
    • planoxpro
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hm. Ich überlege mal laut: Die Uhrzeiten des Auswahlfeledes liegen ja erst mal als Texte vor und müssten wohl zunächst ins Zeit-Format konvertiert werden. Wenn die Einträge alle im Format "00:00" wären, dann ginge das bspw. so:

     

    time(number(substr(text(Startzeit), 0, 2)), number(substr(text(Startzeit), 3, 2)))

     

    Da im vorliegenden Fall einstellige Werte aber auch nur einstellig eingetragen sind ("7:00"), müsste man zunächst die Länge des Eintrages abfragen:

     

    if length(text(Startzeit)) = 5 then
        time(number(substr(text(Startzeit), 0, 2)), number(substr(text(Startzeit), 3, 2)))
    else
        if length(text(Startzeit)) = 4 then
            time(number(substr(text(Startzeit), 0, 2)), number(substr(text(Startzeit), 2, 2)))
        else

            time(11, 11)        

        end
    end

     

    Geht aber vielleicht auch noch besser/eleganter, aber als Ergebnis hätte man schon mal einen Zeitwert, den man auch als solchen weiterverarbeiten könnte. 

     

    Nebenbei: Die Uhrzeiten alle in Auswahlfelder einzutragen, ist ja wirklich irre aufwändig. Muss natürlich jeder selbst wissen, aber ich frage mich, ob das am Ende wirklich schneller geht als das Eintippen der Uhrzeit in ein entsprechendes Feld. Eine weitere Alternative wäre vielleicht noch, zwei Auswahlfelder zu machen, eines für Stunden, eines für Minuten. Nur so als Idee.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Da Stimmt was nicht. Ein Zahlenfeld kann kein Berechnungsfeld sein.

    Füge ein Berechnungsfeld namens 'MinMorgens Mo.test' und trage ins Formula-Feld:

    ----

    405 + 'Zeit Mo. Morgens' * 15

    ---

    Leo

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    war kurz abwesend...

    ich kann jetzt nicht ganz folgen, ich sehe kein Feld 'MinMorgens Mo.', wo die Minuten eingetragen werden sollen...

    ... und eine Frage, was passiert bei einer Arbeit von Sonntag bis Montag?

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wenn ich die Datenbank richtig verstehe, kann man pro Tag nur einen Kundenbesuch eintragen. Und die Felder pro Wochentag sind identisch. Wenn das ganze auch der Arbeitsweise entspricht, wäre es zu überlegen, die Datenbank anders aufzubauen. Eine Tabelle Tage und eine Tabelle Wochen. Man kann beim Anlegen des Tags ein Skript einbauen welcher prüft ob die Kalenderwochen existiert und wenn nein eine neue erstellt und den Tag damit verknüpft. Alle diese komplizierte Auswahlfelder musste man nur einmal einbauen, wobei ich dem Copytexter Recht gebe, die drei Felder am/pm(2 Einträge), Stunden(12 Einträge) und Minuten (4 Einträge) werden hier eventuell bequemer. Vorteil bei solcher Auftrilug: man werden nur die Tage eingetragen, wo man tatsächlich gearbeitet hat. Die Auswertung wird viel leichter weil die Stunden in Schleifen berechnet werden. Ist aber nur so als Gedanke.

    Lei

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo. Ich möchte vielleicht mal kurz erklären, was der Hintergedankte hinter dieser Lösung sein soll. Zum Einen habe ich so eine ähnliche Sache schon mal mit Tapforms gebaut, die ist aber lange nicht so ausgefeilt weil Tapforms keine Programmiersprache hat usw.

    Kalenderwochen:

    Ich arbeite und ordne alles in Kalenderwochen seit jeher. Auch die meisten meiner Auftraggeber aus der Industrie teilen die Jobs so ein. Das ist einfach so und wird bei mir auch so bleiben. Ein Griff und ich muss alles von einer KW sofort übersehen.

     

    Hauptziel: Blitzschnelle Erfassung und Erledigung

    Darum geht es. Die nötigsten Eingaben finden unterwegs am Pad oder auch iPhone statt. Es muss einfach schnell gehen. Es soll möglichst gar nichts getippt sondern nur "getappt" und ausgewählt werden. Daher auch die Auwahlfenster mit denen ich sehr gute Erfahrungen gemacht habe. Die Erstellung ist sehr mühsam, das spätere Arbeiten damit aber die schnellste Methode einen Wert zu erfassen.

     

    Kein Fahrtenbuch sondern nur Verpflegungskostenpauschalenrechner

    Das Ganze dient nicht dazu haarklein aufzulisten wieviele KM ich von wo nach wo gefahren bin. Sondern lediglich um die Reisetage zu erfassen und die Abwesenheit von Daheim. Dann noch ob in DE übernachtet oder in welchem Land übernachtet wurde. Das sind die einzig wichtigen Kriterien die über den jeweiligen Spesensatz entscheiden. Dafür habe ich schon komplizierte IF-WHEN-ELSE Schleifen in dieser Anwendung, die auch immer genau den richtigen Satz finden. Das allein hat mich Tage gekostet weil die Gesetze komplizierter als eine Scriptsprache sind ;-)

     

    Nachweisen müsste ich im Falle einer Prüfung nur, dass die Sätze passen und ich wirklich an Tag X nicht daheim war. Das erreiche ich indem ich einen oder zwei meiner Aufträge  von dem Tag in diese Reisekosten verlinke.  So muss ich hier in den meisten Fällen auch nichts schreiben, da sich der Reisegrund ja schon in Ninox befindet an anderer Stelle. Viel mehr als 2 Jobs am Tag schaffe ich eh nicht. Zur Not gibts ja noch ein Kommentarfeld zu den Reisegründen falls es eine Reise ohne Ninox Auftrag war z.B.

    Hier suche ich noch eine Möglichkeit, dass Ninox auch diese Aufträge für die Reisegründe von allein findet. Die Infos KW, Jahr, Datum sind ja vorhanden. Es müsste also möglich sein, dass Ninox zumindest passende Reisegründe von allein vorschlägt. Im Moment tippe ich das noch per Verlinkung zur Auftragstabelle selber rein.

     

    Und hier ein komplettes Bild mit meinen derzeitigen Berechnungsfeldern. Die sind im Moment nur Baustelle bis die endgültige Lösung fertig ist. Dann wird da unten aufgeräumt :-)

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Achso: Natürlich "rechnet" das Ding auch über die Tage hinweg.... Das ergibts sich aber meistens automatisch aus der Bedingung: "Abends im Hotel oder nicht?" Wenn ja, dann wird automatisch an dem Tag bis Mitternacht gerechnet. Ebenso wird dann am Folgetag ab Mitternacht gerechnet. Aus den vorggebenen Länder Hotels und der Abwesenheitsdauert ergibt sich dann welcher Spesensatz in Frage kommt. Nur wenn man heim fährt oder von dort fährt spielen wieder die eingegebenen Zeiten eine wichtige Rolle.

    Die einzelnen Hotelnachweise wiederum liegen eh bei meinen Aufträgen, sind also nachweisbar und schnell zu finden. Und ja eh verlinkt. Vielleicht kommt auch noch ein "PDF Fach hinein um die auch dort anzuheften"

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Das Ganze ist, wenn man es auf die Spitze treiben will, hochkomplex dank der Steuergesetzgebung. Denn es müsste eigentlich auch berücksichtigt werden wann man sich wo um Mitternacht befindet. Es könnte ja sein, dass man noch zum Hotel in Frankreich fährt aber um 23:59 noch auf deutschen Boden ist. Dann würde der deutsche Satz für den Tag gelten. Bin ich um 23:59 aber schon mit einem Fuß in Frankreich, gilt der französische Satz.

    Kann man später noch mal einbauen. Solche Situationen kommen bei mir aber sehr selten vor und wer will das auch genau überprüfen. Man weiss es ja oft selber nicht mal wenn im Dunklen stumpf vor sich hinfährt wann man wo welche Grenze überschritten hat.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    zurück zum Problem: Du mußt halt nur den Skript mit dort eintragen, wo das Auswahlfeld getriggert wird. Also den Code doppelt hinterlegen.

    Ich würde das aber auch anders aufbauen, sind die Daten wie Steuersätze usw. fest in den Skripten hinterlegt?

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    nochmal, das Feld 'MinMorgens Mo.' müßte doch eigentlich ein Berechnungsfeld sein und dort muß dann der Skript stehen... Dann wird es immer berechnet, egal, ob getriggert oder manuell 

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    habe es gerade gesehen, Leo hatte es ja auch schon so geschrieben. Lege ein Testfeld an und probiere es...

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hi...

    Bei deiner Formel mit dem *15 meckert Ninox immer, dass es ein ungültiger Operator wäre. + und - geht. Aber * nicht.

    Und nein: Die Spesensätze für die Länder und die beiden Zeitvarianten sind in einer eigenen Tabelle hinterlegt um die jährlich anpassen zu können. Wohl aber sind die gesetzlichen Regeln in den Scripten hinterlegt. Wenn die Gesetze sich ändern, dann müssen diese Scripte neu angepasst werden. Solang es bei 8 Stunden und 24 Stunden Grenzen bleibt und denen nicht irgendwann wieder was Kurioses einfällt mit 3 oder 4 Variationen wie wir es ja schon hatten, sollte es funktionieren.

     

    Irgendwie mit viel Try & Error habe ich aber nun eine Lösung gefunden.

     

    Ich habe für diese seltene "Mitternachtregel" einfach ein eigenes Zeitfeld (0 Uhr) in den Auswahlfenstern erstellt welches nichts weiter triggert. Wählt man nun eine der Mitternachtsregeln für ein Land, dann bestimmt in diesem Fall das Auswahlfenster für den Ankunftsort, dass 1440 Minuten bei den Min.Abends eingetragen werden sollen und am nächsten Tag im Min.Morgens Feld eben 0 Minuten. (Das was eigentlich das Zeitauswahlfenster sonst macht)

    Gleichzeitig werden die beiden beteiligten Zeitauswahlfenster auf den Wert "0 Uhr" gesetzt und gesperrt solang die Regel aktiv ist.

     

    Wie gesagt: Es funktionierte ja auch alles vorher. Nur das automatische eintragen der Minutenwerte wenn man die Zeitfenster automatisiert einstellen will hat nicht funktioniert. Händisch gings. Auch per Befehlsschaltfläche ging es. Aber ich wollte keinen Button, das ist wieder ein Schritt mehr bei der Eingabe den ich nicht möchte.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    wenn + und - geht, dann geht auch das Multiplikationszeichen *, eventuell verkehrte Taste?

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wundere mich auch. Ich habe eine normale DE Mac Tastatur. Das Multiplikatorzeichen ist doch das Sternchen auf der Plus Taste? Es wird ja auch angezeigt. Oder welches Zeichen ist es?

    • Ninox-Professional
    • planoxpro
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Okay, wenn's für dich funktioniert ...

     

    Aber noch mal: Die Fehlermeldung "Ungültiger Operator" erscheint vermutlich, weil für das Auswahlfeld 'Zeit Mo. Morgens' standardmäßig ein Textwert zurückkgegeben wird.

     

    Will man die Nummer des gewählten Eintrags verarbeiten, so müsste es m. E. heißen:

     

    405 + number('Zeit Mo. Morgens') * 15

     

    Oder man geht ganz anders vor und wandelt die gewählte Option des Zeit-Auswahlfeldes gleich mit time() in "echte" Zeitwerte um (siehe Posting von gestern Abend), dann spart man sich auch das Zurückrechnen in Stunden und Minuten.

    Oder liegt der Denkfehler bei mir? Wäre ja nicht das erste Mal. Ist zwar nicht mein Projekt, aber ich würde es trotzdem gerne verstehen.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ja, copytexter hat recht... beim Auswahlfeld wird standardmäßig ein Text zurückgegeben...

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    BINGO!

    Copytexter hat meinen Pfad  gefunden den Bernd so gut vorgegeben hat und es ist dann an meiner Blödheit gescheitert :-)

    Nun gehts!

     

    Statt hundert langer Scriptzeilen reicht nun ein kurzer Schnippsel fürs selbe Ergebnis in den Zeitauswahlfenstern:

     

    if 'Zeit Auswahlfenster' = null then 'Minuten Zahlenfeld' := null end;
    'Minuten Zahlenfeld' := 405 + number('Zeit Auswahlfenster') * 15

     

    Ich habs mir mal als Versuchsanordnung aufgebaut und siehe da: Nun geht alles wie gewünscht. Bernd und Copytexter haben zusammen die richtige Lösung gefunden. Cool. Ich habs mal grafisch aufbereitet wie ich es nun machen kann - und werde:

    • Ninox-Professional
    • planoxpro
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Okay. Sachlich verstehe ich zwar immer noch nicht, was da genau passiert (7:30 Uhr = 405 Minuten?), aber gut - wenn es nun immerhin technisch funktioniert und dein Problem löst, dann soll's mir recht sein. ;)

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    👍👍👍

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Funktioniert nun perfekt. Vielen herzlichen Dank für Eure Hilfe. Ich weiss, dass die Sache unnötig kompliziert aufgebaut scheint. Aber ich möchte am Ende genau dieses Bedienerlebnis. Die Arbeit mache ich mir (hoffentlich) ja nur einmal und werde dann Jahre davon profitieren. Außerdem macht Ninox echt Spaß wenn die Dinge so funktionieren wie gedacht.

    Ich habe noch eine Zeile in die Zeitauswahlfenster einfügen müssen: Bernd sein Code zählt mit 15 Minuten los und das funktioniert bis Minute 1440 (24 Uhr = Tagesende). Ich brauchte aber auch ein 0:00 Uhr = Tagesbeginn.

    Ich habe mir das nun als Bildbeispiel abgelegt nach dem Muster auf dem Screenshot. Dort stimmt die Zuordnung des Ortsfensters zwar noch nicht wie es später sein wird aber ich weiss nun wie ich die Syntax für alle Felder schreiben muss damit alles funktioniert. Die Minuten werden nun sowohl bei händischer Auswahl ins Zahlenfeld eingetragen als auch wenn die Uhrzeit automatisch über das Ortsauswahlfenster gestellt wird. Die 0 von 0:00 Uhr wollte erst nicht so richtig, nun geht aber auch die.

     

    Zur allgemeinen Erlustigung habe ich auch die Zeitfenster neu gemacht. Die starten nun mit Uhrzeit 0:15 bei 1 und gehen dann durch bis 97. Wobei die 96 = 24 Uhr (1440 Min) darstellt und die 97 als Sonderfall die 0 Uhr (0 Min) erzeugt.