Ein kurzes Update nach weiteren ausführlichen Tests.
Ich habe nun verstanden, dass sobald ich in einer Backend-Funktion einen täglichen Aufgabenplan hinzufüge, dieser unabhängig vom eingestellten Zeitpunkt auf jeden Fall auch mindestens einmal sofort ausgeführt wird. Ändere ich nun die Uhrzeit auf einen späteren Zeitpunkt des aktuellen Tags ab, wird die Aufgabe trotzdem frühestens am nächsten Tag zur eingestellten Uhrzeit erneut ausgeführt - ausser ich entferne den Eintrag im Aufgabenplan, füge einen neuen Eintrag hinzu, und speichere die Aufgabe wieder ab. Damit kann ich leben - auch wenn es ein paar Mausklicks mehr erfordert, als ich erwartet hätte.
Nun wird es aber merkwürdig! Der Grund warum meine Backend-Funktion nicht ausgeführt wird, hat seine Ursache wohl in einem Fehler, welchen ich im Log vorgefunden habe. Dort wurde protokolliert: Aufgabenplaner task 'tsk_task_reminder_notification' failed to execute, ERROR: null value in column "contact" of relation "task_contributors" violates not-null constraint (SQLSTATE 23502).
Bis hierhin klingt es erstmal logisch, wenn da nicht folgender Sachverhalt wäre:
Die Fehlermeldung sagt mir nach meinem Verständnis, dass in der Spalte "contact" der Tabelle "task_contributors" ein Datensatz mit einem nicht zulässigen NULL Wert enthalten ist - richtig? Nur habe ich mir die Tabelle angesehen, und finde keinen einzigen Datensatz, bei welchem das auch zutrifft. Im Gegenteil: alle Datensätze enthalten einen gültigen Wert, nämlich eine ID aus einer 1:n Beziehung zu einer Tabelle mit Kontakten. Diese Beziehung als Feld mit der Konfiguration "muss einen Wert enthalten", so dass theoretisch auch keine Datensätze mit dem Wert NULL angelegt werden können.
Also habe ich weiter getestet und stellte fest, dass die Backend-Funktion bei der automatischen Ausführung im Aufgabenplan wohl aufgrund der folgenden Code-Zeile auf den Fehler läuft (kommentiere ich die Zeile aus, dann wird die Funktion im Scheduler als erfolgreich ausgeführt angezeigt):
UPDATE {acc_contacts}.[task] SET (acc_contacts.task.status) = 1 WHERE (acc_contacts.task.id) = _task_id_integer;
Anmerkung der Redaktion: die Variable _task_id_integer ist zu diesem Zeitpunkt sicher mit einem gültigen Wert initialisiert!
Und nun kommt der Teil, den ich nicht ganz verstehe:
In der oben aufgeführten Code-Zeile greife ich gar nicht auf die Tabelle "task_contributors" zu!
Reaktiviere ich den UPDATE Befehl, läuft die Backend-Funktion im Scheduler - vorhersehbar - wieder auf den genannten Fehler. Führe ich die Backend-Funktion jedoch im Builder über den Button "Ausführen" interaktiv aus, dann läuft die Backend-Funktion fehlerfrei durch, führt das UPDATE auf die Tabelle korrekt aus, und meldet mir auch den Return-Code, welchen ich in der letzten Zeile der Funktion mit "RETURN 0;" zurückgebe, erfolgreich als Anwort zurück.
Frage: was macht den Unterschied, wenn ich eine Backend-Funktion interaktiv im Builder starte zu einer automatischen Ausführung über den Aufgabenplan. Und was kann ich tun, damit die Funktion auch Scheduler nicht auf einen Fehler läuft?