Archivieren bei Änderung

Hallo zusammen! Folgendes Situation: Ich habe ein Karten-Formular, dass Bestellungen anzeigt. Dieses hat ein Unterformular, dass in Tabellen-Ansicht alle Positionen der Bestellung anzeigt. Entsprechend gibt es die Tabellen Bestellung und Position. Darüberhinaus gibt es die Tabelle BestellungArchiv und PositionArchiv, in denen bei jeglicher Änderung einer Bestellung oder einer der Positionen, eine Kopie angelegt wird. Von der Struktur her sind die beiden Archiv-Tabellen nahezu gleich mit den entsprechenden Pendants, es gibt lediglich eine weitere Spalte: “Archiv Nr.”. Und das ist mein Problem: Wenn der User im Formular Bestellungen was ändert, wird beim Wechseln zum nächsten Datensatz der aktuelle Stand ins Archiv kopiert. So weit so gut. Wenn jetzt aber der Benutzer eine der Positionen ändert, wird auch ein Archiv-Eintrag erzeugt. Will er nun hintereinander weg bei 5 Positionen z.B. jeweils die Menge erhöhen (sozusagen “in einem Rutsch”), dann werden 5 Archiv-Einträge erzeugt, da ja immer der OnModify-Trigger der Positionen-Tabelle angestossen wird. Ich möchte aber, dass immer nur dann ein Archiv-Eintrag geschrieben wird, wenn der aktuelle Bestellungen-Datensatz verlassen wird (durch Drücken auf einen Datensatznavigations-Pfeil). Wie kann ich dieses Event abfangen? Bin für jeglichen Hinweis sehr dankbar! Gruß, Ole

Hallo Ole, füge die Änderungen in ein Puffer-Tabelle. Erstelle eine Fkt, welche die Änderungen aus der Puffertabelle in die echte Tabelle einfügt. Diese Funktion ruftst Du in den entsprechenden Triggern des Forms auf, z.B. On NextRec, OnClose etc. Denke daran, deine Puffertabelle zu löschen. Gruß Micha

Hallo Micha, eine sehr gute Idee eigentlich, aber immer wenn ich im OnNextRecord oder OnBeforePutRecord Trigger des Formulars eine Änderung an einer “fremden” (d.h. nicht als TableSource angegebenen) Tabelle kommt eine Fehlermeldung: “Sie können an dieser Stelle des Codes keine Änderungen an der Datenbank vornehmen”. und Navision stürzt ab. Auch der Versuch nicht direkt die Änderungen vorzunehmen, sondern eine Funktion der zugrundeliegenden Tabelle (TableSource) aufzurufen, die dann die entsprechenden Änderungen macht, scheitert mit derselben Fehlermeldung. Hast Du eine Erklärung dafür? Wie kann ich aus einem Formular heraus dann Änderungen vornehmen? Gruß, Ole

Hi, Du solltest Dir die Puffertabelle temporär definieren. In die echte Tabelle dann z.B. über den Trigger OnCloseForm schreiben. Solange Du in einem Form direkt auf einem Datensatz stehst, kannst Du keine Schreibaktionen in der DB vornehmen. Du “befindest Dich quasi in einer Schreibaktion”. Erst wenn Du den Datensatz verläßt und nicht gleich einen neuen Satz direkt im Zugriff hast, kannst Du Änderungen vornehmen. Eigentlich sollte Navision trotz der Meldung nicht gleich abstürzen. Gruß Micha

Fast vergessen: sofern Du Englisch kannst, poste Deine Fragen lieber auf Englisch im Developer Forum. Du erhälst schneller Hilfe und andere, die das gleiche Problem haben, freuen sich über die Hilfe. :slight_smile:

Hi Micha, tja, Deine Erklärung leuchtet ja ein, aber ich kann die Daten nicht immer erst beim Verlassen des Formulars schreiben. Stell Dir vor ein User bearbeitet nacheinander 100 Datensätze ohne das Formular zu schließen und beim 101. Datensatz stürzt Navision bzw. das Betriessystem ab. Dann sind alle 101 Änderungen verloren, da sie nur in einer temporären Tabelle gespeichert waren. Da muss ich mir nochmal was anderes überlegen. Warum kann man auch nicht in einem vernünftigen anderen Trigger DB-Zugriffe machen außer OnClose grumpf [V]

quote:


sofern Du Englisch kannst, poste Deine Fragen lieber auf Englisch im Developer Forum. Du erhälst schneller Hilfe und andere, die das gleiche Problem haben, freuen sich über die Hilfe.


Hab ich auch schon versucht, hatte nur leider wenig Erfolg. Das Problem ist halt etwas kompliziert zu beschreiben und die Lösung liegt ja offensichtlich nicht gerade auf der Hand… [:)] Trotzdem danke für Deine Tipps! Gruß, Ole