[Gelöst] (CC) Löschreport Modulweise

18. Juli 2012 13:47

Hallo Forum,

Ich versuche gerade einen Report zu schreiben, der Anhand einer Tabelle, wo Modul und Nummernkreis hinterlegt sind, das gewünschte Modul komplett leert. Also alle Werte aus den Tabellen löscht.
Meine Idee ist es, die Objekt-Tabelle auf den Nummernkreis zu filtern und zusätzlich auf Tabellen. Somit hätte ich alle Tabellen, die zu dem Modul gehören.

Jetzt stehe ich nur vor einem kleinem Problem. Ich habe jetzt die Objekt-Tabelle gefiltert und habe beispielweise die Tabelle 5050 an erster Stelle der gefilterten Tabelle. Wie kann ich denn jetzt die Werte daraus löschen?
Ich habe zwar Nr, Name usw. aber habe diese Tabelle ja nicht im Zugriff, kann also kein DELETE auf diese Tabelle ausführen. Wie kann ich das jetzt am besten angehen?

Gruß
Lukas
Zuletzt geändert von Gnozo am 19. Juli 2012 13:05, insgesamt 1-mal geändert.

Re: (CC) Löschreport Modulweise

18. Juli 2012 13:57

Da helfen dir Record-Referenzen.

Re: (CC) Löschreport Modulweise

18. Juli 2012 15:21

Super, das hat geholfen!

Jetzt stehe ich vor einem anderem Problem. Das Löschen soll Mandanten-übergreifend geschehen. Soweit ich jetzt herausgefunden habe, kann man kein CHANGECOMPANY auf ein RecordRef anwenden. Gibt es eine Möglichkeit per C/AL den Mandanten komplett zu wechseln, also nicht nur explizit für eine Tabelle?

Re: (CC) Löschreport Modulweise

18. Juli 2012 15:50

Nein, das geht nicht. Meines Wissens ist dafür die Beste Lösung: Lösch-Auftrag in eine Liste für den jeweiligen Mandanten schreiben und diese Liste per NAS (der läuft ja für jeweils einen Mandanten) ausführen lassen.

Re: (CC) Löschreport Modulweise

18. Juli 2012 15:56

Gnozo hat geschrieben:Das Löschen soll Mandanten-übergreifend geschehen. Soweit ich jetzt herausgefunden habe, kann man kein CHANGECOMPANY auf ein RecordRef anwenden. Gibt es eine Möglichkeit per C/AL den Mandanten komplett zu wechseln, also nicht nur explizit für eine Tabelle?

RecordRef kennt zwar nicht den Befehl CHANGECOMPANY, jedoch kann beim RecordRef.GETTABLE der Mandantenname als Parameter mitgegeben werden.

Re: (CC) Löschreport Modulweise

18. Juli 2012 16:13

Nicht dem Open? :roll:

Re: (CC) Löschreport Modulweise

18. Juli 2012 16:14

Timo Lässer hat geschrieben:
Gnozo hat geschrieben:Das Löschen soll Mandanten-übergreifend geschehen. Soweit ich jetzt herausgefunden habe, kann man kein CHANGECOMPANY auf ein RecordRef anwenden. Gibt es eine Möglichkeit per C/AL den Mandanten komplett zu wechseln, also nicht nur explizit für eine Tabelle?

RecordRef kennt zwar nicht den Befehl CHANGECOMPANY, jedoch kann beim RecordRef.GETTABLE der Mandantenname als Parameter mitgegeben werden.


Das wäre auch eine Möglichkeit. Habe es jetzt folgendermaßen gelöst:
Code:
Company.RESET;
Company.FINDFIRST;

Object.RESET;
Object.SETRANGE(Type,Object.Type::Table);
Object.SETFILTER(ID,"Range of Numbers");
REPEAT
  Object.FINDFIRST;
  REPEAT
    TableRef.OPEN(Object.ID,FALSE,Company.Name);
    TableRef.DELETEALL;
  UNTIL Object.NEXT = 0;
UNTIL Company.NEXT = 0;


Sollte funktionieren, wie ich es brauche. Mache mich mal ans testen, was wohl etwas dauern kann.....

Re: (CC) Löschreport Modulweise

19. Juli 2012 07:57

OK, warum meine Aussage "das geht nicht": in der Regel möchte man ja nicht nur die Artikel löschen, sondern auch die angehängten Daten und die Geschäftslogik von NAV zu durchlaufen (kein Löschen von Artikeln mit offenen Posten etc.) ist auch keine schlechte Idee. Aber für deine Anforderung eines generellen Leerens von bestimmten Tabellen ist es sicher OK, man sollte nur wissen was man da tut. Also insofern: ja, es ist möglich. Für "sterile" Testszenarien denkbar, für den Echtbetrieb undenkbar!

Re: (CC) Löschreport Modulweise

19. Juli 2012 08:30

McClane hat geschrieben:Nicht dem Open? :roll:

:oops: Wenn ich nicht gerade im C/AL-Editor stehe verwechsel ich die beiden Befehle immer gerne ;-)

Re: (CC) Löschreport Modulweise

19. Juli 2012 08:32

Hätte ja sein können, dass sich das geändert hat.

Re: (CC) Löschreport Modulweise

19. Juli 2012 13:05

Man sollte das CLOSE aber nach dem RecordRef nicht vergessen.
Der Report funktioniert super und arbeitet auch schnell. Gut ist es, wenn man einem Kunden eine aktuelle Kopie der Entwicklungsdatenbank zur Verfügung stellt, der aber nur bestimmte Module darin testen darf.
Somit werden alle anderen Module des Testmandanten geleert und der Kunde kann ordentlich arbeiten ohne das er Berechtiungsfehler bekommt, weil Werte in Tabellen drinstehen, worauf er keinen Zugriff hat.

Danke hier nochmal an Euch!