Artikel komplett löschen

2. Oktober 2015 09:48

Guten Morgen!

Aktuell sollen aus unserem Navision 2009 R2 eine ganze Menge alter Artikel vollständig gelöscht werden.
Leider konnte ich nirgends (auch nicht in diesem super Forum) eine genauere Anleitung für einen Report zum löschen der Artikeldaten finden.
Basierend auf einer Info von Natalie in einem anderen Beitrag habe ich mich der Inhalte des OnDelete Trigger der Artikeltabelle 27 bedient.
Hier nun der entstandene Report und die Bitte um Feedbacks ob das so korrekt ist und/oder was man verbessern könnte.
Möchte erst Eure Meinungen hören bevor ich den Report im ECHT System verwende. Im Test ist mir kein Fehler aufgefallen.
Evtl. hilfts ja dem ein oder anderen der auch mal einen solchen Report benötigt.


Vielen Dank bereits im Voraus!
Fuige

Code:

Item - OnPreDataItem()
LastFieldNo := FIELDNO("No.");


recArtikel := GETFILTER(Item."No.");
IF recArtikel = '' THEN
ERROR('Bitte geben Sie ein Filterkriterium auf ArtikelNr. an');

Item - OnAfterGetRecord()
BOMComp.RESET;
BOMComp.SETCURRENTKEY(Type,"No.");
BOMComp.SETRANGE(Type,BOMComp.Type::Item);
BOMComp.SETRANGE("No.","No.");
IF BOMComp.FIND('-') THEN
  ERROR(Text023,TABLECAPTION,"No.",BOMComp.TABLECAPTION);

ItemJnlLine.SETRANGE("Item No.","No.");
IF ItemJnlLine.FIND('-') THEN
  ERROR(Text023,TABLECAPTION,"No.",ItemJnlLine.TABLECAPTION);

RequisitionLine.SETCURRENTKEY(Type,"No.");
RequisitionLine.SETRANGE(Type,RequisitionLine.Type::Item);
RequisitionLine.SETRANGE("No.","No.");
IF NOT RequisitionLine.ISEMPTY THEN
  ERROR(Text023,TABLECAPTION,"No.",RequisitionLine.TABLECAPTION);

PurchOrderLine.SETCURRENTKEY(Type,"No.");
PurchOrderLine.SETRANGE(Type,PurchOrderLine.Type::Item);
PurchOrderLine.SETRANGE("No.","No.");
IF PurchOrderLine.FIND('-') THEN
  ERROR(Text000,TABLECAPTION,"No.",PurchOrderLine."Document Type");

SalesOrderLine.SETCURRENTKEY(Type,"No.");
SalesOrderLine.SETRANGE(Type,SalesOrderLine.Type::Item);
SalesOrderLine.SETRANGE("No.","No.");
IF SalesOrderLine.FIND('-') THEN
  ERROR(Text001,TABLECAPTION,"No.",SalesOrderLine."Document Type");

IF ProdOrderExist THEN
  ERROR(Text002,TABLECAPTION,"No.");

ProdOrderComp.SETCURRENTKEY(Status,"Item No.");
ProdOrderComp.SETFILTER(Status,'..%1',ProdOrderComp.Status::Released);
ProdOrderComp.SETRANGE("Item No.","No.");
IF ProdOrderComp.FIND('-') THEN
  ERROR(Text014,TABLECAPTION,"No.");

// >> :DMW13.71:1:02
ConstructionHeader.SETCURRENTKEY("Item No.","Variant Code","Location Code","Bin Code","Shipment Date","Order Tracking Relevance");
ConstructionHeader.SETRANGE("Item No.","No.");
IF ConstructionHeader.FINDFIRST THEN BEGIN
  ERROR(Text5013630,TABLECAPTION,"No.");
END;

ConstructionLine.SETCURRENTKEY(Type,"No.");
ConstructionLine.SETRANGE(Type,ConstructionLine.Type::Item);
ConstructionLine.SETRANGE("No.","No.");
IF ConstructionLine.FINDFIRST THEN BEGIN
  ERROR(Text5013631,TABLECAPTION,"No.");
END;

DocumentBOM.SETCURRENTKEY(Type,"No.");
DocumentBOM.SETRANGE(Type,DocumentBOM.Type::Item);
DocumentBOM.SETRANGE("No.","No.");
IF DocumentBOM.FINDFIRST THEN BEGIN
  ERROR(Text5013559,TABLECAPTION,"No.");
END;

MasterBOMLine.SETCURRENTKEY(Type,"No.");
MasterBOMLine.SETRANGE(Type,MasterBOMLine.Type::Item);
MasterBOMLine.SETRANGE("No.","No.");
IF MasterBOMLine.FINDFIRST THEN BEGIN
  ERROR(Text5013551,TABLECAPTION,"No.");
END;

// << :DMW13.71:1:02

TransLine.SETCURRENTKEY("Item No.");
TransLine.SETRANGE("Item No.","No.");
IF TransLine.FIND('-') THEN
  ERROR(Text016,TABLECAPTION,"No.");

ServInvLine.RESET;
ServInvLine.SETCURRENTKEY(Type,"No.");
ServInvLine.SETRANGE(Type,ServInvLine.Type::Item);
ServInvLine.SETRANGE("No.","No.");
IF ServInvLine.FIND('-') THEN
  ERROR(Text017,TABLECAPTION,"No.",ServInvLine."Document Type");

ProdBOMLine.RESET;
ProdBOMLine.SETCURRENTKEY(Type,"No.");
ProdBOMLine.SETRANGE(Type,ProdBOMLine.Type::Item);
ProdBOMLine.SETRANGE("No.","No.");
IF ProdBOMLine.FIND('-') THEN
  REPEAT
    IF ProdBOMHeader.GET(ProdBOMLine."Production BOM No.") AND
       (ProdBOMHeader.Status = ProdBOMHeader.Status::Certified)
    THEN
      ERROR(Text004,TABLECAPTION,"No.");
  UNTIL ProdBOMLine.NEXT = 0;

ServiceContractLine.RESET;
ServiceContractLine.SETRANGE("Item No.","No.");
IF ServiceContractLine.FIND('-') THEN
  ERROR(Text023,TABLECAPTION,"No.",ServiceContractLine.TABLECAPTION);

ServiceItem.RESET;
ServiceItem.SETRANGE("Item No.","No.");
IF ServiceItem.FIND('-') THEN
  REPEAT
    ServiceItem.VALIDATE("Item No.",'');
    ServiceItem.MODIFY(TRUE);
  UNTIL ServiceItem.NEXT = 0;

MoveEntries.MoveItemEntries(Item);

ItemBudgetEntry.SETCURRENTKEY("Analysis Area","Budget Name","Item No.");
ItemBudgetEntry.SETRANGE("Item No.","No.");
ItemBudgetEntry.DELETEALL(TRUE);

ItemSub.RESET;
ItemSub.SETRANGE(Type,ItemSub.Type::Item);
ItemSub.SETRANGE("No.","No.");
ItemSub.DELETEALL;

ItemSub.RESET;
ItemSub.SETRANGE("Substitute Type",ItemSub."Substitute Type"::Item);
ItemSub.SETRANGE("Substitute No.","No.");
ItemSub.DELETEALL;

SKU.RESET;
SKU.SETCURRENTKEY("Item No.");
SKU.SETRANGE("Item No.","No.");
SKU.DELETEALL;

NonstockItemMgt.NonstockItemDel(Item);
CommentLine.SETRANGE("Table Name",CommentLine."Table Name"::Item);
CommentLine.SETRANGE("No.","No.");
CommentLine.DELETEALL;

ItemVend.SETCURRENTKEY("Item No.");
ItemVend.SETRANGE("Item No.","No.");
ItemVend.DELETEALL;

SalesPrice.SETRANGE("Item No.","No.");
SalesPrice.DELETEALL;

SalesLineDisc.SETRANGE(Type,SalesLineDisc.Type::Item);
SalesLineDisc.SETRANGE(Code,"No.");
SalesLineDisc.DELETEALL;

SalesPrepmtPct.SETRANGE("Item No.","No.");
SalesPrepmtPct.DELETEALL;

PurchPrice.SETRANGE("Item No.","No.");
PurchPrice.DELETEALL;

PurchLineDisc.SETRANGE("Item No.","No.");
PurchLineDisc.DELETEALL;

PurchPrepmtPct.SETRANGE("Item No.","No.");
PurchPrepmtPct.DELETEALL;

ItemTranslation.SETRANGE("Item No.","No.");
ItemTranslation.DELETEALL;

ItemUnitOfMeasure.SETRANGE("Item No.","No.");
ItemUnitOfMeasure.DELETEALL;

ItemVariant.SETRANGE("Item No.","No.");
ItemVariant.DELETEALL;

ExtTextHeader.SETRANGE("Table Name",ExtTextHeader."Table Name"::Item);
ExtTextHeader.SETRANGE("No.","No.");
ExtTextHeader.DELETEALL(TRUE);

ItemAnalysisViewEntry.SETRANGE("Item No.","No.");
ItemAnalysisViewEntry.DELETEALL;

ItemAnalysisBudgViewEntry.SETRANGE("Item No.","No.");
ItemAnalysisBudgViewEntry.DELETEALL;

PlanningAssignment.SETRANGE("Item No.","No.");
PlanningAssignment.DELETEALL;

BOMComp.RESET;
BOMComp.SETRANGE("Parent Item No.","No.");
BOMComp.DELETEALL;

TroubleshSetup.RESET;
TroubleshSetup.SETRANGE(Type,TroubleshSetup.Type::Item);
TroubleshSetup.SETRANGE("No.","No.");
TroubleshSetup.DELETEALL;

ResSkillMgt.DeleteItemResSkills("No.");
DimMgt.DeleteDefaultDim(DATABASE::Item,"No.");

ItemIdent.RESET;
ItemIdent.SETCURRENTKEY("Item No.");
ItemIdent.SETRANGE("Item No.","No.");
ItemIdent.DELETEALL;

ServiceItemComponent.RESET;
ServiceItemComponent.SETRANGE(Type,ServiceItemComponent.Type::Item);
ServiceItemComponent.SETRANGE("No.","No.");
ServiceItemComponent.MODIFYALL("No.",'');

BinContent.SETCURRENTKEY("Item No.");
BinContent.SETRANGE("Item No.","No.");
BinContent.DELETEALL;


// Begin#NAV20100:A1004 02.05.07 TECTURA.SE
IF QualityMgtSetup.GET THEN
  QMStdInt.T27OnDelete(Item);
// End#NAV20100:A1004 02.05.07 TECTURA.SE
MobSalesMgt.ItemOnDelete(Item);

// >> :DMW13.60.01:1:01
VariableAttributeMgt.DeleteItemAttributes(Item);
MasterBOMMgt.DeleteItemToMaster(Item);
// << :DMW13.60.01:1:01
// >> :DMW13.60.02:1:01
ItemDrawing.SETRANGE("Item No.","No.");
ItemDrawing.DELETEALL(TRUE);
// >> :DMW14.00:1:99
// ChecklistRelation.SETRANGE("Table ID",27);
ChecklistRelation.SETFILTER("Table ID",'%1|%2',ChecklistRelation."Table ID"::Item,ChecklistRelation."Table ID"::"Item/Vendor");
// << :DMW14.00:1:99
ChecklistRelation.SETRANGE(Code,"No.");
ChecklistRelation.DELETEALL(TRUE);
ItemSearchCharacteristic.SETRANGE(Item,"No.");
ItemSearchCharacteristic.DELETEALL(TRUE);
// << :DMW13.60.02:1:01
// >> KANBAN:DMW15.02:28:01
KANBAN.SETRANGE("Item No.","No.");
KANBAN.DELETEALL(TRUE);
// << KANBAN:DMW15.02:28:01

// >> #TMW1600:A1201  24.11.09 TECTURA.AM
LicPermission.GET(LicPermission."Object Type"::Codeunit, CODEUNIT::"Text Module Delete");
IF LicPermission."Execute Permission" = LicPermission."Execute Permission"::Yes THEN BEGIN
// << #TMW1600:A1201  24.11.09 TECTURA.AM
  // Begin#TMW16.00:A1000  16.03.09 TECTURA.FB
  TMDelete.DeleteTM(DATABASE::Item, Item);
  // End#TMW16.00:A1000  16.03.09 TECTURA.FB
// >> #TMW1600:A1201  24.11.09 TECTURA.AM
END;
// << #TMW1600:A1201  24.11.09 TECTURA.AM


// Artikel LÖSCHEN
Item.DELETE;

Item - OnPostDataItem()

ProdOrderExist()
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Artikel komplett löschen

2. Oktober 2015 09:54

Hallo,

was möchtest du denn in Zukunft nicht mehr auswerten können?

Gruß Fiddi

Re: Artikel komplett löschen

2. Oktober 2015 12:30

Für die aktuell betroffenen Artikel soll in Zukunft keinerlei Auswertung erfolgen.
Sie wurden falsch im System angelegt und bereits Bestände zu gebucht, die wir inzwischen wieder abgebucht haben.

Es wird wie gesagt keinerlei Info zu diesen Artikeln mehr benötigt.

Re: Artikel komplett löschen

2. Oktober 2015 13:02

Nun eigentlich sollte ein "Item.Delete(true)" reichen.

Wenn NAV sich dann quer stellt, sollte man das so hinnehmen, weil in NAV ja noch ein wenig mehr passiert, als Artikelstammdaten anlegen und wieder löschen. :wink:
Das ganze könnte dir z.B. beim berechnen eines Inventur-Buchblattes um die Ohren fliegen, weil Artikel- Bewegungen da sind, aber keine Artikel. Was die Lagerregulierung anstellt, wenn der Artikel fehlt ist auch nicht sicher. Und ob deine ganzen NAV- Erweiterungen ohne Artikel leben können, sei mal dahingestellt.

Ich habe damit bisher keine guten Erfahrungen gemacht, Artikel zu löschen, wenn Buchungen drauf sind.

Gruß Fiddi

Re: Artikel komplett löschen

2. Oktober 2015 13:44

Zuerst einmal vielen Dank für Deine Stellungnahme zu meiner Frage!

Lösche ich einen Artikel in Navision über Aktionen --> Löschen, so sollte doch der von mir als Grundlage verwendete Code des OnDelete Trigger der Artikeltabelle verwendet werden. Oder?
Wenn Microsoft die Möglichkeit des Löschens in System anbietet und diesen Code zum abprüfen der verschiedensten Einträge verwendet, so sollte man doch davon ausgehen können das damit dann keine späteren Probleme im System entstehen.

Bei einem "Item.Delete(true)" würde nur der Artikeleintrag in der Tabelle Item (27) gelöscht. Verstehe ich das richtig?

Re: Artikel komplett löschen

2. Oktober 2015 14:06

Bei einem "Item.Delete(true)" würde nur der Artikeleintrag in der Tabelle Item (27) gelöscht. Verstehe ich das richtig?


Nein genau das Gegenteil ist der Fall. Bei Delete(True) wird der Trigger der Artikeltabelle durchlaufen, der wiederum dafür sorgen sollte, das alle Abhängigkeiten geprüft/angepasst/gelöscht werden, und erst danach wird auch der Artikel wirklich gelöscht.

Aber wie schon gesagt, ein gelöschter Artikel kann dir in ein paar Wochen höllischen Ärger bereiten.

Gruß Fiddi

Re: Artikel komplett löschen

5. Oktober 2015 08:04

Vielen Dank für die Info!

Bin nun etwas verunsichert und muss mir überlegen ob ich die Artikel wirklich lösche.


Gruß
Fuige

Re: Artikel komplett löschen

5. Oktober 2015 23:31

Vor dem Löschen der Artikel sollte auf jeden Fall geprüft werden ob für diese die Lagerregulierung gelaufen ist bzw. ob diese für alle gebuchten Posten (oder für keine) gelaufen ist. Keinesfalls sollte z. B. nur der Zugang reguliert sein, der Abgang aber nicht, sonst bleiben die Bestände auf dem Bilanzkonto stehen.

Wenn alles bedacht und geprüft wurde kann man die Artikel schon löschen. Andererseits genügt es doch auch sie einfach zu sperren.

Re: Artikel komplett löschen

6. Oktober 2015 08:33

enh hat geschrieben:Wenn alles bedacht und geprüft wurde kann man die Artikel schon löschen.


Das stimmt schon. :wink:

Aber was ist mit den Programmen, die nicht darauf ausgelegt sind, das Artikel gelöscht werden könnten, einfach ein Item.GET machen, und sich darauf verlassen, dass da ein Artikel gelesen wird, der im Artikelposten oder einer Rechnungszeile hinterlegt ist.

Es wird nämlich immer wieder gerne von uns Programmierern vergessen das zu berücksichtigen. :roll:

Gruß Fiddi

Re: Artikel komplett löschen

6. Oktober 2015 13:45

fiddi hat geschrieben:Es wird nämlich immer wieder gerne von uns Programmierern vergessen das zu berücksichtigen. :roll:


Stimmt allerdings...

Re: Artikel komplett löschen

15. Oktober 2015 16:01

Hallo Ihr zwei,

bei den betroffenen Artikeln gab es da sie während der Einrichtung des ECHT System falsch konfiguriert wurden lediglich einen Artikel Buchungsposten als Zugang und einen als Abgang.
Es wurden keine Wertposten, Lieferungen, Rechnungen, usw. verbucht.

Der Fehler viel ziemlich schnell auf und es wurden lediglich die bereits über ein Artikelbuchblatt zugebuchten Bestände wieder abgebucht. Weiter Posten existieren nicht.

Gruß
Fuige

Re: Artikel komplett löschen

16. Oktober 2015 10:46

Wenn du Artikel über Artikelbuchblatt zugebucht hast, dann gibt es auch Wertposten, sonst stimmt da was nicht.
Hast du direkt in die Posten geschrieben, dann :evil: :evil: :evil: :evil: :evil: :evil: :evil:
Gruß Fiddi

Re: Artikel komplett löschen

27. Oktober 2015 15:30

Ne, ne, ich habe brav das Artikelbuchblatt verwendet. :wink:

Re: Artikel komplett löschen

27. Oktober 2015 17:07

fuige hat geschrieben:Ne, ne, ich habe brav das Artikelbuchblatt verwendet. :wink:

Durch Fehlkonfiguration alleine kann man den Standard normalerweise nicht dazu bringen, bei einem Zugang keine Wertposten zu erzeugen. Selbst wenn der Artikel auf "Ohne Lagerbewertung" steht, wird ein Wertposten erzeugt, nur eben mit Nullwert. Entweder wurde der Quellcode geändert oder es wurden schon Posten gelöscht.