Artikel routiniert löschen

9. Mai 2008 10:16

Hallo,

hat jmd. von euch zufällig einen Report, mit dem man nach Eingabe bestimmter Filter Artikel, auf denen keine Posten sind, routiniert löschen kann?

9. Mai 2008 10:46

Das nicht, aber solch ein Report ist doch schon nach 2 Minuten geschrieben (hoffentlich auch in 2.xx) :-)

9. Mai 2008 11:21

Ich schreib sowas leider nicht in 2 Minuten :-( Nicht einmal in nem Tag...

9. Mai 2008 12:38

OK, du hast also die Lizenz zum Töten, äh, Reportschreiben?
Dann erzähl doch mal, woran es hakt und wir schubsen dich ein wenig in die richtige Richtung ;-)

Aber vielleicht vorweg: Die notwendigen Prüfungen befinden sich bereits kopierfertig irgendwo im OnDelete-Trigger der Artikeltabelle. Hast du darauf Zugriff?

Und wie genau soll der Report laufen(evtl. Fehlermeldungen, Druck ...)?

9. Mai 2008 13:07

Ja ich muss gestehen, ich wüsst net mal wie anfangen! Ich bin eine Null im Report schreiben! :oops:

Ich hab Zugriff auf alles - also sozusagen die Lizenz zum töten!

Ich würd halt gern nen Report haben, der Artikel löscht, die keine Posten haben. Als Filtermöglichkeit in dem Report möchte ich Zugriff auf alle Kriterien eines Artikels haben. Eine Ausgabe benötige ich nicht!

9. Mai 2008 13:22

Wenn ein Artikel nicht gelöscht werden kann, weil Posten vorhanden sind - was soll dann (nicht) passieren?

Die erste und einfachste Version des Reports sieht so aus:
Rufe die Report-Eigenschaften aus und Stelle die Eigenschaft ProcessingOnly auf Ja (falls die Eigenschaft in 2.xx anders heißt, suche etwas Sinngemäßes).
Erstelle in deinem neuen Report ein DataItem für die Tabelle Artikel.
Drücke nun F9 und schreibe in den OnAfterGetRecord-Trigger einfach nur
Code:
DELETE(TRUE);


Speichere den Report und führe ihn aus: Du kannst nun Filterkriterien auswählen. Filtere mal zum Test auf EINE bestimmte Artikelnummer (wichtig, sonst hast du ggf. viel Wartezeit vor dir) und lass den Report laufen - ist das Ergebnis das, was du erwarten würdest?

16. Mai 2008 09:54

Ok danke! Report funktioniert soweit! Natürlich bricht er jetzt ab, wenn auf dem Artikel Posten sind. Um was muss ich den Report erweitern, dass er diese Artikel einfach überspringt?

16. Mai 2008 10:12

Den Fehler könntest Du z.B. per
Code:
IF DELETE(TRUE) THEN;

abfangen.

16. Mai 2008 10:18

Also so:


IF DELETE(TRUE) THEN;
DELETE(TRUE);

16. Mai 2008 10:20

dann wuerde der zweimal loeschen

in der Abfrage
IF Delete(TRUE) Then;

fuehrt er schon den Befehl aus und gibt zurueck ob es geklappt hat.

Gruß Matthias

16. Mai 2008 10:37

Also ich hab jetzt im "OnAfterGetRecord-Trigger" lediglich "IF DELETE(TRUE) THEN;" stehn, aber er meckert immernoch, wenn Posten & Aufträge vorhanden sind!

16. Mai 2008 11:07

Also ich hab jetzt im "OnAfterGetRecord-Trigger" lediglich "IF DELETE(TRUE) THEN;" stehn, aber er meckert immernoch, wenn Posten & Aufträge vorhanden sind!


Das ist klar. Du musst den Code aus dem OnDelete-Trigger der Tabelle 27 in den Report integrieren.
Etwa so:
Code:

[B]Artikel - OnAfterGetRecord[/B]
Lagerposten.LOCKTABLE;

Lagerposten.RESET;
Lagerposten.SETCURRENTKEY("Artikelnr.");
Lagerposten.SETRANGE("Artikelnr.",Artikel.Nummer);
BuchhaltPeriode.SETRANGE(Abgeschlossen,FALSE);
IF BuchhaltPeriode.FIND('-') THEN
  Lagerposten.SETFILTER(Buchungsdatum,'>=%1',BuchhaltPeriode.Startdatum);
IF Lagerposten.FIND('-') THEN
  CurrReport.skip;

Lagerposten.RESET;
IF NOT Lagerposten.SETCURRENTKEY("Artikelnr.",Variantencode,Offen) THEN
  Lagerposten.SETCURRENTKEY("Artikelnr.");
Lagerposten.SETRANGE("Artikelnr.",Artikel.Nummer);
Lagerposten.SETRANGE(Offen,TRUE);
IF Lagerposten.FIND('+') THEN
  CurrReport.Skip;

IF Artikel."EP Berechnungsmethode" = Artikel."EP Berechnungsmethode"::Durchschnitt THEN BEGIN
  Lagerposten.SETRANGE(Offen,FALSE);
  Lagerposten.SETRANGE("Lagerwert ist definitiv",FALSE);
  IF Lagerposten.FIND('-') THEN
    CurrReport.Skip;
END;

Artikel.Delete(TRUE);

16. Mai 2008 11:18

Also so:???????????????????????????????????????????

Code:
IF DELETE(TRUE) THEN;

PostenUmbenennen.ArtikelPostenUmbenennen(Rec);

BemerkZeile.SETRANGE(Tabellenname,BemerkZeile.Tabellenname::Artikel);
BemerkZeile.SETRANGE("Nr.","Nr.");
BemerkZeile.DELETEALL;

ArtLief.SETRANGE("Artikelnr.","Nr.");
ArtLief.DELETEALL;

ArtVKPreis.SETRANGE("Artikelnr.","Nr.");
ArtVKPreis.DELETEALL;

ArtÜbersetzung.SETRANGE("Artikelnr.","Nr.");
ArtÜbersetzung.DELETEALL;

ArtikelEinheit.SETRANGE("Artikelnr.","Nr.");
ArtikelEinheit.DELETEALL;

ArtVariante.SETRANGE("Artikelnr.","Nr.");
ArtVariante.DELETEALL;

StücklKomp.SETRANGE("Stücklistennr.","Nr.");
StücklKomp.DELETEALL;

TextBauSteinKopf.SETRANGE(Tabellenname,TextBauSteinKopf.Tabellenname::Artikel);
TextBauSteinKopf.SETRANGE("Nr.","Nr.");
TextBauSteinKopf.DELETEALL(TRUE);

BestZeile.SETCURRENTKEY(Belegart,Art,"Nr.");
BestZeile.SETRANGE(Belegart,BestZeile.Belegart::Bestellung);
BestZeile.SETRANGE(Art,BestZeile.Art::Artikel);
BestZeile.SETRANGE("Nr.","Nr.");
IF BestZeile.FIND('-') THEN
  ERROR(
    'Sie können %1 %2 nicht löschen, da noch Bestellungen vorhanden sind.',
    TABLENAME,"Nr.");

AuftragZeile.SETCURRENTKEY(Belegart,Art,"Nr.");
AuftragZeile.SETRANGE(Belegart,AuftragZeile.Belegart::Auftrag);
AuftragZeile.SETRANGE(Art,AuftragZeile.Art::Artikel);
AuftragZeile.SETRANGE("Nr.","Nr.");
IF AuftragZeile.FIND('-') THEN
  ERROR(
    'Sie können %1 %2 nicht löschen, da noch Aufträge vorhanden sind.',
    TABLENAME,"Nr.");

FAZeile.SETCURRENTKEY("Artikelnr.");
FAZeile.SETRANGE("Artikelnr.","Nr.");
IF FAZeile.FIND('-') THEN
  ERROR(
    'Sie können %1 %2 nicht löschen, da noch offene Fertigungsaufträge, die diesen Artikel enthalten, vorhanden sind.',
    TABLENAME,"Nr.");

FAKomponente.SETCURRENTKEY("Artikelnr.");
FAKomponente.SETRANGE("Artikelnr.","Nr.");
IF FAKomponente.FIND('-') THEN
  ERROR(
    'Sie können %1 %2 nicht löschen, da noch Fertigungsauftragskomponentenzeilen, die diesen Artikel enthalten, vorhanden sind. ',
    'mit einer Restmenge, welche nicht 0 ist.',
    TABLENAME,"Nr.");

// - 02:TG2.00 --------------------------------------------------------------------
ArtEAN.SETRANGE(Tabellenname,ArtEAN.Tabellenname::" ");
ArtEAN.SETRANGE(ArtEAN."Artikelnr.","Nr.");
ArtEAN.DELETEALL;

ArtKatalog.SETRANGE(Tabellenname,ArtKatalog.Tabellenname::" ");
ArtKatalog.SETRANGE("Artikelnr.","Nr.");
ArtKatalog.DELETEALL;

AlternativArt.SETRANGE("Artikelnr.","Nr.");
AlternativArt.DELETEALL;

ArtVKPreilZeile.SETRANGE("Artikelnr.","Nr.");
ArtVKPreilZeile.DELETEALL;

DebArtKond.SETCURRENTKEY("Artikelnr.","Debitorennr.","Lief. an Code",Startdatum,Priorität,"Konditionsnr.");
DebArtKond.SETRANGE("Artikelnr.","Nr.");
DebArtKond.DELETEALL;

KredArtKond.SETCURRENTKEY("Artikelnr.","Kreditorennr.",Startdatum,Priorität,"Konditionsnr.");
KredArtKond.SETRANGE("Artikelnr.","Nr.");
KredArtKond.DELETEALL;

IF ArtSuchText.GET("Nr.") THEN
  ArtSuchText.DELETE;

DebArtNr.SETCURRENTKEY("Artikelnr.","Debitorennr.");
DebArtNr.SETRANGE("Artikelnr.","Nr.");
DebArtNr.DELETEALL;

KassenPreis.SETRANGE("Artikelnr.","Nr.");
KassenPreis.DELETEALL;

ArtLagerort.SETRANGE("Artikelnr.","Nr.");
ArtLagerort.DELETEALL;
// + 02:TG2.00 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// @1, -sw
ÄnderungsprotokollKasse.DatensatzEinfügen(1,2,"Nr.",'',0);
// +sw
// - TG2.01::01 -------------------------------------------------------------------
KassenExpÄndTab.ArtikelÄnderung(Rec,KassenExpÄndTab.Art::Delete);
KassenExpÄndTab.ArtikelEANLöschen("Nr.");

Etikettendruckvorschlagszeile.SETCURRENTKEY("Artikelnr.");
Etikettendruckvorschlagszeile.SETRANGE("Artikelnr.",Rec."Nr.");
Etikettendruckvorschlagszeile.DELETEALL(TRUE);
// + TG2.01::01 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

16. Mai 2008 11:25

martinst hat dir doch schon eben den (richtigen) Code zur Verfügung gestellt. Das DELETE erfolgt ganz am Ende.
Erfolgt es zuerst, dann hilft es dir gar nichts, weil dir das Programm noch immer um die Ohren fliegt.

16. Mai 2008 11:40

Also ich nimm mal stark an, dass ich natürlich meinen Code aus Table27 in den Report kopieren muss! Ja und dann alles aus meinem "OnDelete-Trigger"? Dann muss ich doch aber noch Variablen vergeben,oder?

16. Mai 2008 12:48

Was meinst du mit "deinen Code aus Table27"?
Entscheidend ist der Inhalt des OnDelete-Triggers, in dem die Posten durchsucht werden.
Neben dem eigentlichen Code musst du natürlich auch die Variablen hieraus in den Report kopieren.

16. Mai 2008 13:17

Und dann mäckert er, dass Variablen doppelt vergeben sind...... :oops:
Ich gebs auf....ist einfach nicht meine Welt!