F4 (löschen) in Report nachahmen

5. Februar 2010 18:03

Hallo,

ich möchte gerne per Report alle gesperrten Artikel (versuchen) zu löschen. Dabei sollten die Standardtrigger wie bei F4 auf der Artikelkarte durchlaufen werden.
Reicht dazu ein
Code:
If Item.Blocked
Item.Delete;
?

Werden dabei die Trigger durchlaufen?
Bricht der Report bei Fehler ab oder geht er zum nächsten Artikel weiter?

Danke,
Gruss
Christian
Zuletzt geändert von Ara am 15. März 2010 15:56, insgesamt 2-mal geändert.

Re: F4 (löschen) in Report nachahmen

5. Februar 2010 18:43

Wenn der Report nur die Aufgabe hat, gesperrte Artikel zu löschen, dann ersetze die Blocked-Abfrage durch eine einfache Filterung des DataItems "Item". Der Report hat dann weniger Artikel zu durchlaufen und läuft schneller.
Verwende allerdings dann im OnAfterGetRecord-Trigger eine lokale Item-Variable, z.B. Item2:
Code:
Item2 := Item;
Item2.DELETE;

Wenn du das nicht tust, könnte der Report schon nach dem ersten Artikel beendet sein, obwohl du noch weitere geblockte Artikel hast - aufgrund des gesetzten Filters.

Ein Blick in die Onlinehilfe (C/SIDE Reference Guide) zum Thema DELETE hätte dir verraten, wie du NAV dazu bringst, den OnDelete-Trigger aufzurufen: Item.DELETE(TRUE); wäre richtig gewesen.

Ebenso steht in diesem Artikel, wie du beeinflussen kannst, ob beim Scheitern von DELETE alles abgebrochen wird oder weiterlaufen soll.

Re: F4 (löschen) in Report nachahmen

5. Februar 2010 19:44

Halt!!!!!!!!!!!!!!!!!!!!!!!

Das auf keinen Fall machen!!!!!
Code:
Item2.DELETE;


Dieser Code löscht den Artikel ohne zu prüfen, ob er auch wirklich gelöscht werden kann!!

Man müsste im Report auf dem OnAfterGetRecord-Trigger den Code der Tabelle 27 nachbilden und prüfen ob der Artikel wirklich gelöscht werden kann.
Dann mit Delete(FALSE) löschen.

Gruss

Re: F4 (löschen) in Report nachahmen

5. Februar 2010 20:45

Oder einfach
Code:
IF Item.DELETE(TRUE) THEN;


So wird versucht, den Artikel zu löschen und durchläuft auch den OnDelete-Trigger.
Eine zweite Record-Variable ist nicht nötig, da der Datensatz zwar in der Datenbank gelöscht wurde, die entsprechenden Werte in der Variablen noch verfügbar sind.
Somit befindet sich der Datensatzzeiger noch weiterhin an der richtigen Position im "RecordSet".

Re: F4 (löschen) in Report nachahmen

5. Februar 2010 22:15

martinst hat geschrieben:Halt!!!!!!!!!!!!!!!!!!!!!!!

Das auf keinen Fall machen!!!!!
Code:
Item2.DELETE;


Dieser Code löscht den Artikel ohne zu prüfen, ob er auch wirklich gelöscht werden kann!!

Meinen Beitrag ruhig zu Ende lesen ;-)

Re: F4 (löschen) in Report nachahmen

8. Februar 2010 11:02

alles klar, vielen Dank für eure Antworten :)

Re: F4 (löschen) in Report nachahmen

15. März 2010 16:04

ich krame den Beitrag nochmal raus da es leider noch nicht so ganz klappt.

Ich habe jetzt folgenden Code im OnAfterGetRecord:
IF NOT Item.DELETE(TRUE) THEN
CurrReport.SKIP;


In den Sections einfach nur Art. Nr. und Beschreibung. Ziel sollte sein dass alle Artikel die gelöscht werden gedruckt werden.
Leider bricht er mir direkt beim ersten Artikel ab dass er nicht gelöscht werden kann. Ist ja auch OK, nur er soll mich mit der Meldung verschonen und den nächsten versuchen ;)
Wie stelle ich das an?

Re: F4 (löschen) in Report nachahmen

15. März 2010 16:53

Hallo ara,
habe es nicht explizit ausprobiert, aber es ist ja so dass eine "ERROR"-Meldung die Verarbeitung abbricht. Und an der Tabelle Item hängen im OnDelete Trigger genügend Error-Meldungen.

Man müsste hier wohl alle zugehörigen Tabellen, die in der Tabelle Item mitgelöscht werden, manuell in den Report nehmen und überprüfen.

Gruß Petra

Re: F4 (löschen) in Report nachahmen

18. März 2010 12:10

Ara hat geschrieben:Ziel sollte sein dass alle Artikel die gelöscht werden gedruckt werden.

Klingt irgendwie unlogisch, oder?

Re: F4 (löschen) in Report nachahmen

18. März 2010 12:19

findest du?
Ich finde es logisch dass man eine Dokumentation haben möchte welche Artikel dieser Report gelöscht hat.
Und das Drucken ist ja soweit ich sehe auch nicht wirklich das Problem, sondern eher die Möglichkeit zu sagen "ich weiss dass Fehler kommen werden, überspring die bitte und versuchs mit dem nächsten".

Re: F4 (löschen) in Report nachahmen

18. März 2010 12:39

Was HattrickHorst vermutlich meinte:
Reports können (normlerweise) nur solche Daten drucken, die in Tabellen stehen - du möchtest aber bereits gelöschte Daten drucken ;-)

Re: F4 (löschen) in Report nachahmen

18. März 2010 12:41

Ah ok, du willst eine Liste der Artikel, die bereits gelöscht wurden (vom gleichen Report). Wenn du vorab eine Liste haben wolltest, dann hättest du ja nur auf die gesperrten filtern müssen.

Also, wenn IF Item.DELETE(TRUE) THEN nicht geht, dann fällt mir spontan nur noch die Lösung mit IF Codeunit.RUN THEN ein.

Re: F4 (löschen) in Report nachahmen

18. März 2010 12:44

Ara hat geschrieben:Und das Drucken ist ja soweit ich sehe auch nicht wirklich das Problem, sondern eher die Möglichkeit zu sagen "ich weiss dass Fehler kommen werden, überspring die bitte und versuchs mit dem nächsten".

Steck den Code zum Löschen doch in eine CU, die du mit "if DeineCU.run(DeinItem)" abfangen kannst.

Re: F4 (löschen) in Report nachahmen

18. März 2010 13:01

Ich hätte es ja anders gemacht, in diesem Report:

DataItem bleibt soweit gleich, aber:
Code:
IF Record.DELETE(TRUE) THEN BEGIN
  TempRec := Record;
  TempRec.INSERT;
END;

Wenn ich mich nicht irre, wrd durch DELETE(TRUE) der Inhalt von Record selbst NICHT gelöscht, kann also noch verwertet werden.

TempRec ist ein als temp. deklarierter Record der gleichen Tabelle.
Dieser wird in einem zweiten DataItem Integer augedruckt (Vorlage: Report 111, der druckt im DataItem Integer auch einen temp. Record).
Die Sections für das bisherige DataItem werden nicht mehr gebraucht; sie sind statt dessen für das neue DataItem anzulegen.

Re: F4 (löschen) in Report nachahmen

18. März 2010 13:06

@McLane: habe leider keinen Zugriff auf CUs :/

Den Tip von Natalie probiere ich heut nachmittag aus, danke :)

Re: F4 (löschen) in Report nachahmen

18. März 2010 13:08

Das Problem ist dann aber, dass dir ein Nicht-Löschen den Report rauserrort.

Re: F4 (löschen) in Report nachahmen

18. März 2010 13:39

Ja, das ist wohl so. Das IF Rec.DELETE(TRUE) THEN fängt keine direkten ERROR-Aufrufe aus dem Delete-Trigger ab. D.h. man hat das Problem dann immer noch, daß der Report beim ersten nicht löschbaren Datensatz abbricht.

Re: F4 (löschen) in Report nachahmen

18. März 2010 13:55

martinst hat geschrieben:Man müsste im Report auf dem OnAfterGetRecord-Trigger den Code der Tabelle 27 nachbilden und prüfen ob der Artikel wirklich gelöscht werden kann.
Dann mit Delete(FALSE) löschen.

Dann bleibt wohl nur diese Variante von martinst. Ein schöner Spaß, gerade bei Artikeln.

P.S. "rauserrort" ist ne ziemlich coole, neue Wortkreation. :wink:

Re: F4 (löschen) in Report nachahmen

18. März 2010 13:59

HattrickHorst hat geschrieben:P.S. "rauserrort" ist ne ziemlich coole, neue Wortkreation. :wink:

Eigentlich eher eine direkte Folge von Schreibfaulheit :wink:

Re: F4 (löschen) in Report nachahmen

18. März 2010 14:29

HattrickHorst hat geschrieben:
martinst hat geschrieben:Man müsste im Report auf dem OnAfterGetRecord-Trigger den Code der Tabelle 27 nachbilden und prüfen ob der Artikel wirklich gelöscht werden kann.
Dann mit Delete(FALSE) löschen.

Dann bleibt wohl nur diese Variante von martinst. Ein schöner Spaß, gerade bei Artikeln.


Mist :( Und an diesen Code komm ich auch nichtmal ran :(
Eigentlich ne Schande dass es sowas nicht schon im Standard gibt, wir sind ja bestimmt nicht die einzigen die regelmässig den Artikelstamm bereinigen wollen ...

Re: F4 (löschen) in Report nachahmen

18. März 2010 16:39

HattrickHorst hat geschrieben:Das IF Rec.DELETE(TRUE) THEN fängt keine direkten ERROR-Aufrufe aus dem Delete-Trigger ab.

Wieso falle ich eigentlich JEDES MAL neu darauf herein???
Aber Lösung war - glaub ich - ja schon genannt worden: Löschung in eine Codeunit auslagern und diese mit IF CODEUNIT.RUN(...) aufrufen.