Änderungsverfolgung auf Formular-Ebene - unlösbar?

8. Mai 2007 13:14

Mir liegt folgende Kundenanforderung vor, die ich auf den ersten Blick für nicht umsetzbar halte:

In meiner tabellarischen Form werden mehrere zusammen gehörige Zeilen angezeigt. Die Form hat Buttons und wurde selber per RUNMODAL aus einer anderen Form aufgerufen. Also alles so wie wir es kennen.

Nun möchte man, dass beim Verlassen der Datensätze eine Funktion ausgeführt wird (Version speichern), wenn der Benutzer seit dem Öffnen des Formulars Daten geändert hat.

Das heißt konkret:

A) Die Funktion soll einmalig am Ende angestoßen werden, und nicht schon, wenn man gerade ein Feld geändert hat und man sich noch immer in den Datensätzen befindet.

B) "beim Verlassen der Datensätze" heißt:
1. beim Schließen des Formulars,
2. beim Klick auf einen der Buttons,
3. beim Aufruf eines beliebigen weiteren Objektes (z.B. aus dem Haupt-Menü heraus).

C) Beim Eintreten von B) muss ich also alle Zeilen mit ihrem Ursprungszustand vergleichen. Geht das überhaupt? Müsste ich dafür den Ursprungszustand über temp. Records bereit halten? Oder/Und mit Flags arbeiten?

Ich finde, das ist nicht machbar... Was meint ihr?

8. Mai 2007 13:30

Ich denke machbar ist das schon, schliesslich könntest du wirklich mit einer Temp. Tabelle arbeiten und diese beim Eintreten von B und einer Nachfrage
in die Ursprungstabelle schreiben (also umgekehrt wie du es vorgeschlagen hast)

Wobei du natürlich beachten musst, was innerhalb der temporären Tabelle für Trigger beim bearbeiten angesprochen werden. Das kann leicht sehr sehr aufwändig werden, wenn andere Tabellen
ebenfalls angesprochen werden.

8. Mai 2007 13:30

Hallo,

ich weiss nicht was für eine Tabelle das ist und wie viele Datensätze diese hat. Vielleicht könntest Du die zu bearbeitenden Datensätze vor dem Aufruf der Form in eine Temp. Tabelle kopieren und die Änderungen hieran vornehmen lassen. Über ein zusätzliches Boolean-Feld in der Tabelle merkst Du dir, ob der Datensatz geändert wurde.

Im Trigger OnDeactivateForm könntest Du dann abfragen, ob die Änderungen übertragen werden sollen und schreibst dann die geänderten Daten in die eigentliche Tabelle.

Du kannst natürlich auch die Änderungen an der Ursprungstabelle vornehmen und im OnModifyRecord-Trigger der Form den xRec in eine Temp.-Tabelle speichern. Soll dann nicht gespeichert werden, überträgst Du die Datensätze aus der Temp.-Tabelle zurück. Dies ist sicherlich die einfachere Variante, sorgt aber dafür, dass andere Anwender Daten sehen, die evtl. wieder zurückgenommen werden.

Unlösbar ist die Aufgabe sicherlich nicht - aber auch nicht gerade einfach und nicht mit dem Bedienkonzept von Navision vereinbar. Aber das interessiert den Kunden ja selten.

Gruß
Frank

8. Mai 2007 15:38

kannst du denn dass nicht mit dem Änderungsprotokoll abdecken?
da wird doch genau mit User und Datum Zeit alter Stand und neuer Stand gespeichert.
Alternativ könnte der rec und xrec im Modify trigger auf zwei Recordrefs gespeichert werden, und diese in einer Funktion deren Fieldrefs vergleichen. Aber genau das macht auch das Änderungsprotokoll.

8. Mai 2007 19:07

Nunja, lösbar ist das schon recht einfach. Wegen Punkt B3 fällt eine temporäre Tabelle im NAV Sinne mit gleicher Objektnummer aus. Es sei denn der Kunde läßt sich entsprechend "beraten" darauf zu verzichten. Dann funktioniert das ganze mit einer Tabelle als Objekt, ansonsten halt eine Buffer Tabelle mit gleichem Aufbau wie das Original aber mit z.B. USERID im Primärschlüssel und Änderungskennzeichen am Ende.

Datenabgleich ist sowohl temp. als auch mit der Buffer-Lösung grundsätzlich ein 5-10 Zeiler. Und die Konformität: Ein längerer Benutzergesteuerter Batch-Lauf mit einem COMMIT am Ende.

Re: Änderungsverfolgung auf Formular-Ebene - unlösbar?

8. Mai 2007 19:46

Danke bis hierhin!
Leider konzentriert ihr euch bei eurer Beantwortung auf

Natalie hat geschrieben:C) Beim Eintreten von B) muss ich also alle Zeilen mit ihrem Ursprungszustand vergleichen. Geht das überhaupt? Müsste ich dafür den Ursprungszustand über temp. Records bereit halten? Oder/Und mit Flags arbeiten?


Ich verstehe aber noch immer nicht, wie ich dies hier abfangen kann:

A) Die Funktion soll einmalig am Ende angestoßen werden, und nicht schon, wenn man gerade ein Feld geändert hat und man sich noch immer in den Datensätzen befindet.

B) "beim Verlassen der Datensätze" heißt:
3. beim Aufruf eines beliebigen weiteren Objektes (z.B. aus dem Haupt-Menü heraus).


Die Erstellung einer Version ist in dieser Form eine Standardfunktionalität. Der Kunde will die Funktion nicht manuell anstoßen müssen.

Die Frage ist nur, wie ich die o.g. Zeitpunkte abfangen kann.

9. Mai 2007 00:43

das hat schon einer geschrieben hier:
Im OnDeaktivateForm Trigger für das Aufrufen eines anderen Objekts, das ja dann den Fokus erhält, im OnCloseForm für das Schließen und im OnPush-Trigger der Buttons für ein Betätigen derselben rufst du jeweils die Vergleichs- und Rückschreibe-Funktion auf.

9. Mai 2007 09:10

Danke euch!!