[Gelöst] Fehler bei DELETE in einer Funktion

21. Mai 2008 16:04

Hallo zusammen,

ich würde gerne wenn ein Artikel auf der Artikelkarte als gelöscht markiert wird, Datensätze in einer Tabelle löschen. Hierfür habe ich in einer CodeUnit eine Funktion geschrieben die ich dann aufrufe.
Jedoch erhalte ich, egal ob mit Tabelle.DELETE oder Tabelle.DELETE(FALSE), folgenden Fehler:

Sie können keine Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.


Michael Schumacher hatte mal ein ähnliches Problem ( http://www.msdynamics.de/viewtopic.php?t=1957 ) und hat dies mit einem Report gelöst. Geht das nur mit einem Report? Kann ich nicht meine Funktion in der CodeUnit verwenden?

Ich wollte erst hier einmal fragen ob jemand Erfahrungen damit hat bevor ich anfange hier wild rum zu experimentieren.
Zuletzt geändert von Heike Bennerscheid am 23. Mai 2008 15:21, insgesamt 1-mal geändert.

21. Mai 2008 16:19

Nicht ohne Grund werden Löschtransaktionen durch Löschen eines Datensatzes nicht in einer Codeunit ausgeführt, sondern auf der Löschtabelle selbst, siehe OnDelete-Trigger von verschiedenen Tabellen.

Du solltest du dich bei solchen Programmierungen möglichst an den Standard halten, damit dir diese "Überraschungen" erspart bleiben und später jemand anderes leichter deinen Quelltext verstehen (bzw. erst einmal finden) kann.

21. Mai 2008 16:35

Die CodeUnit macht ja eigentlich nichts anderes als den Delete Trigger der Tabelle auszuführen oder irre ich mich da? Tabelle.DELETE in der CodeUnit = OnDelete Trigger aufruf der Tabelle, oder nicht?

Ist der Umweg über die CodeUnit für Navision zu viel? Kann ich den Delete Trigger der Tabelle überhaupt aus der Artikelkarte aufrufen?

21. Mai 2008 17:51

Wieso rufst du die Codeunit nicht über den OnDelete-Trigger (in der Tabelle!) auf?

23. Mai 2008 09:50

Ich glaub wir reden aneinander vorbei :-?

Also ich habe die Artikelkarte mit meinem Artikel. Dort gibt es 2 Felder. Einmal ein Checkbox Feld Gesperrt und ein Option-Feld Lieferbar.
Wenn das Checkbox Feld angehakt ist und/oder das Option-Feld auf "Gelöscht" gesetzt wird soll in einer anderen Tabelle namens "Artikel_Verwandt" dort geschaut werden ob es dort Einträge mit der auf "Gelöscht" gesetzen Artikelnummer gibt. Wenn ja dann sollen diese Einträge gelöscht werden. Aber das bekomme ich irgendwie nicht hin. Ich habe bisher immer nur den kompletten Inhalt von Tabellen gelöscht um diese dann neu zu füllen.. aber einzelne Datensätze irgendwie noch nicht.

Jemand nen Tipp oder nen Schupser in die richtige Richtung?

23. Mai 2008 09:54

In welchem Trigger erfolgt dein Codeunitaufruf? Wie sieht dein Quelltext aus?

23. Mai 2008 10:01

Der Aufruf erfolgt entweder im OnNextRecord Trigger oder im OnCloseForm Trigger.

Artikelkarte:
Code:
IF (Artikel.Blocked = TRUE) OR (Artikel.Lieferbar = 6) THEN BEGIN
EquiFunction.DeleteCrossLink(Rec);
END;


Funktion:
Code:
r_Artikel_Verwandt.RESET;
r_Artikel_Verwandt.SETRANGE(ArtNr,Rec."No.");
IF r_Artikel_Verwandt.FINDFIRST THEN BEGIN
   REPEAT
      r_Artikel_Verwandt.DELETE; //bzw. DELETE(FALSE) hatte ich auch schon ausprobiert
   UNTIL r_Artikel_Verwandt.NEXT = 0;
END;

23. Mai 2008 10:11

Wieso arbeitest du nicht mit den Validate-Triggern der beiden Felder Gesperrt und Lieferbar? Dann wäre das Transaktionsproblem auch keines mehr.

23. Mai 2008 13:17

Der Code im OnValidate Trigger der Felder funktioniert.

Jedoch versteht ich nicht ganz was diesen Transaktionsfehler ausgelöst hat. Würde mich freuen wenn mir das einer erklären könnte (falls bekannt).

23. Mai 2008 13:48

Heike Bennerscheid hat geschrieben:Der Code im OnValidate Trigger der Felder funktioniert.

Jedoch versteht ich nicht ganz was diesen Transaktionsfehler ausgelöst hat. Würde mich freuen wenn mir das einer erklären könnte (falls bekannt).


Schwer zu erklären (aber auch zu verstehen): Wann immer du als Benutzer etwas in Navision eingibst, änderst oder löschst, löst dies eine Transaktion aus. Wenn du nun hier per Quelltext eingreifst, ist das für Navision OK und du erhältst keinen Fehler.

Wenn du jedoch ohne Transaktionsbeginn etwas laufen lassen möchtest (wie hier dein Codeunit), dann lässt das Navision einfach nicht zu. Ich erkläre es mir so: Wir dürfen per Quelltext keine Transaktion beginnen. Diese Transaktion wird eben vorausgesetzt. Ob dies an der Speicherverwaltung von NAV liegt oder an den internen der Strukturen der Datenbank ... keine Ahnung.

23. Mai 2008 15:20

Ah ok. Ich glaube das habe ich verstanden. Dann werde ich mir das für die Zukunft merken. Danke Natalie.