[Gelöst]Report ausführen wenn Daten in Tabele geändrt wurden

1. März 2010 18:00

Hallo,

ich habe einen Report, der jede Nacht ausgeführt wird. Allerdings soll die Ausführung nur dann gestartet werden, wenn sich die Werte in einer anderen Tabelle geändert haben.

Um genauer zu werden:
Ich habe eine Tabelle mit Postleitzahlen und Straßen. Wenn in dieser Tabelle eine PLZ geändert wird, eine dazukommt oder gelöscht wird, dann soll der Programmcode in meinem Report einmal ausgeführt werden, bis die Daten erneut geändert werden.

Ist das in Navision möglich?

Wie würdet Ihr das machen?
Zuletzt geändert von ralf5 am 2. März 2010 17:28, insgesamt 1-mal geändert.

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 09:20

Hallo Ralf,

klar sollte möglich sein, wenn du ein zusätzliches Feld einfügst mit dem Datum der letzten Änderung, was im OnInsert- bzw. OnModify-Trigger auf das aktuelle Datum gesetzt wird. Das kannst du dann ja in dem Report abfragen nach dem Motto "wenn letzte Änderung = gestern dann ausführen".

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 09:45

Wieso nicht gleich mit OnInsert/OnModify/OnDelete arbeiten, und damit die Daten sofort abgleichen? Oder TableRelations benutzen?

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 12:06

Danke für die Antworten,

@CaddyM
klar sollte möglich sein, wenn du ein zusätzliches Feld einfügst mit dem Datum der letzten Änderung, was im OnInsert- bzw. OnModify-Trigger auf das aktuelle Datum gesetzt wird. Das kannst du dann ja in dem Report abfragen nach dem Motto "wenn letzte Änderung = gestern dann ausführen".


Die Idee finde ich gut. Ich möchte aber nicht alle Datensätze in der Tabelle durchlaufen. Ist es möglich, dass ich am Objekt selbst (an der Tabelle) ablesen kann wann die Daten zuletzt geändert wurden?


@McClane
Wieso nicht gleich mit OnInsert/OnModify/OnDelete arbeiten, und damit die Daten sofort abgleichen?


Ich kann nicht bei jeder Änderung Daten sofort abgleichen, da der 'Job' ca. 15 Minuten dauert.

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 12:17

ralf5 hat geschrieben:Ich kann nicht bei jeder Änderung Daten sofort abgleichen, da der 'Job' ca. 15 Minuten dauert.

Ist das dieselbe Geschichte wie letztens, als du die Lieferscheine aktualisiert hast?

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 12:38

Hallo Ralf,

hier mein Vorschlag:
In deiner Tabelle (für PLZ/Straßen) setzt du im OnModify-Trigger ein Häkchen "Geändert" (ggfls. neues Feld).
In deinem Report (der nur nachts läuft) filterst du auf Geändert=Ja.
Findet er nichts, ist der Report sofort wieder beendet. Laufzeit: < 1 Sekunde ;-)
Findet er geänderte Datensätze, so braucht er sich nur um die tatsächlich geänderten kümmern.
Nachdem der Report einen Datensatz abgearbeitet hat (also die Daten in die anderen Tabellen "synchronisiert" hat), entfernt er das Häkchen in dem Datensatz.

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 13:36

@McClane
Ist das dieselbe Geschichte wie letztens, als du die Lieferscheine aktualisiert hast?


Es ist der selbe Bericht aber ein anderes Problem.

@Timo
Das scheint mir die wohl vernünftigste Lösung.

Trotzdem nochmal die Frage: Ist es möglich, dass ich am Objekt selbst (an der Tabelle) ablesen kann wann die Daten zuletzt geändert wurden?

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 13:41

ralf5 hat geschrieben:Es ist der selbe Bericht aber ein anderes Problem.

Dir ist aber schon klar, dass man gebuchte Belege besser nicht ändert?

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 14:13

@McClane
Dir ist aber schon klar, dass man gebuchte Belege besser nicht ändert?


Ja, ist schon klar. Aber der Bericht ist ja vom Partner und läuft schon seit 6 Jahren.

Actus non facit reum nisi mens sit rea. ("Keine Schuld ohne Bewusstsein der Schuld") :-)

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 14:24

ralf5 hat geschrieben:
Dir ist aber schon klar, dass man gebuchte Belege besser nicht ändert?

Ja, ist schon klar. Aber der Bericht ist ja vom Partner und läuft schon seit 6 Jahren.
Wieso sollte man eine/n gebuchte/n Lieferschein/Rechnung/Gutschrift nach 5 Jahren mit einer neuen Adresse versehen, nur weil der Debitor vor 1 Woche umgezogen ist?
Zum Zeitpunkt der Lieferung/Rechnung/Gutschrift hat er nunmal an der im Beleg genannten Adresse seinen Betrieb gehabt.

ralf5 hat geschrieben:Actus non facit reum nisi mens sit rea. ("Keine Schuld ohne Bewusstsein der Schuld") :-)
Die deutsche Rechtsprechung lautet da leider anders:
"Unwissenheit schützt vor Strafe nicht."

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 14:39

Auch ein interressantes Thema :-)

Dass Unwissenheit nicht vor Strafe schützt, ist eine alte Volksweisheit, der aus rechtlicher Sicht nur teilweise zuzustimmen ist.

Gem. §15 StGB, sind nur vorsätzliches und ggf. fahrlässiges Handeln Strafbar. Bezieht sich die Unwissenheit des Täters auf Tatbestandsmerkmale (sogenannter Tatbestandsirrtum § 16) dann fehlt ihm der Vorsatz . Hat er auch nicht fahrlässig gehandelt, oder wird fahrlässiges Handeln nicht bestraft, dann schützt ihn diese Unwissenheit vor Strafe. :mrgreen:

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 14:47

@Timo

Um wieder beim Thema zu bleiben, es wird ja nicht die Adresse geändert, sondern lediglich das Bundesland hinzugefügt, wenn es fehlt. Dies wird für Auswertungen benötigt.

Warum das Bundesland fehlt? Würde ich auch gerne wissen. Was sich unser Partner dabei gedacht hat? Naja, werde das wohl nie erfahren.

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 14:48

Zurück zum Thema:
ralf5 hat geschrieben:Trotzdem nochmal die Frage: Ist es möglich, dass ich am Objekt selbst (an der Tabelle) ablesen kann wann die Daten zuletzt geändert wurden?
Nein, an der Tabelle kannst du nur erkennen, wann das Objekt selbst (jedoch nicht die darin enthaltenen Daten) zuletzt geändert wurden.

Du brauchst also auf jeden Fall ein weiteres Feld innerhalb deiner Tabelle.
Entweder Datum/Uhrzeit der letzten Änderung oder eben das von mir genannte Boolean-Feld.
In beiden Fällen würde das Feld durch den OnModify-Trigger mit dem entsprechenden Wert gefüllt und müsste dann vom Report ausgewertet werden.

Re: Report nur ausführen wenn Daten in Tabelle geändert wurden

2. März 2010 17:27

Ja, so werde ich das dann machen.


@Alle

Vielen Dank für die Hilfe

Re: [Gelöst]Report ausführen wenn Daten in Tabele geändrt wurden

3. März 2010 16:31

Hallo,

eine Verständnisfrage:
@ Timo - wenn ich den Wert im OnModify setze, wird der dann nicht automatisch wieder gesetzt wenn ich den Wert nach Durchlauf des Reports ändere? Ok, ich kann natürlich Modify(false) benutzen, das wäre, da es ja ehe ein unwichtiger Wert ist, kein Problem ...

Re: [Gelöst]Report ausführen wenn Daten in Tabele geändrt wurden

3. März 2010 16:42

CaddyM hat geschrieben:@ Timo - wenn ich den Wert im OnModify setze, wird der dann nicht automatisch wieder gesetzt wenn ich den Wert nach Durchlauf des Reports ändere?

Du hast die einzig richtige Antwort schon selber gefunden:
CaddyM hat geschrieben:Ok, ich kann natürlich Modify(false) benutzen, das wäre, da es ja ehe ein unwichtiger Wert ist, kein Problem ...

Re: [Gelöst]Report ausführen wenn Daten in Tabele geändrt wurden

3. März 2010 16:51

Timo Lässer hat geschrieben:Du hast die einzig richtige Antwort schon selber gefunden:

Veto!
Falls es doch mal erforderlich ist, den OnModify-Trigger zu durchlaufen und nur bestimmte Teile daraus nicht auszuführen (so wie hier der Aufruf der Update-Funktionalität), so definiert man in der Zieltabelle eine globale boolean-Variable (z.B. SuspendUpdateData). Dann erstellt man eine Funktion, die diese globale Variable setzt (je nach Paramter TRUE oder FALSE), z.B. SetSuspendUpdateData.
Nun versieht man den OnModify-Trigger mit
Code:
IF NOT SuspendUpdateData THEN BEGIN ....

Damit das Ganze funktioniert, muss die neue Funktion SuspendUpdateData zu einem passenden Zeitpunkt und auf der gleichen Recordvariable wie beim MODIFY(TRUE) aufgerufen werden.

Wer ein Beispiel im Standard braucht: Tabelle 37, Funktion SetSuspendStatusCheck samt der dort verwendeten Variable.
Den Aufruf der Funktion habe ich leider spontan nicht mehr im Kopf :roll: