Mandant löschen mittels AL

17. Juni 2020 15:36

Hallo,
ich versuche gerade eine Testumgebung zu automatisieren, mittels
Code:
 CopyCompany(CompanyName, NewCompanyName);
kann ich in AL einen Mandanten kopieren.
Wenn ich aber
Code:
Company.DELETE(true);
ausführe (was in etwa der Aktion im User Interface entspricht, bekomme ich zwar ein True zurück, aber tatsächlich wird nichts gelöscht.
Gibt es eine Möglichkeit den einen Mandanten über AL Code zu löschen?

Re: Mandant löschen mittels AL

17. Juni 2020 17:15

Wie hast du denn die zu löschende Company ausgewählt? Ich nehme an Company.GET() vorher?
Versuchst du vlt. die Company zu löschen in der du gerade noch bist?

Re: Mandant löschen mittels AL

18. Juni 2020 07:32

ein
Code:
Company.Get()
???

es sollte doch
Code:
Company.GET('xyz');
sein wobei XYZ für den zu löschenden Mandanten steht.
ich vermute das Julian das so meinte, aber zur Sicherheit hab ich es mal ergänzt.

Re: Mandant löschen mittels AL

18. Juni 2020 10:17

schon klar, den get auf den entsprechenden Mandanten mache ich vorher. Egal ob company.delete(true) oder company.delete(false) er löscht den Mandanten nicht.
Nur wenn ich wirklich über die Page gehe (die übrigens keine weiteren Trigger beinhaltet), lässt sich der Mandant manuell löschen.

Und nein, es ist nicht die Company in der ich bin. Versuch war es eine Aufgabenwarteschlange zu erstellen, welche täglich einen Mandanten sichert und in TestmandantX umbenennt.
Wenn drei Mandanten erstellt wurden, wird der älteste wieder gelöscht. Ermittlung wird ausgeführt auch ein "if company.delete then..." gibt ein TRUE zurück, tatsächlich macht er aber garnichts.

Re: Mandant löschen mittels AL

18. Juni 2020 10:23

Steini hat geschrieben:ich versuche gerade eine Testumgebung zu automatisieren

Was meinst du eigentlich damit? Wenns dir um die Verwendung des Test Tools geht, dann solltest du nicht per Code neue Mandanten erstellen und löschen (müssen)

Re: Mandant löschen mittels AL

18. Juni 2020 10:56

Der Kunde wünscht in der Anfangsphase eine tägliche Sicherung für interne Schulungs- und Testzwecke. Daher war in diesem Fall die Überlegung dies über Mandantenkopien zu automatisieren. Das Thema ist ziemlich komplex und es werden verschiedene KI Szenarien durchgespielt, daher kann es anfangs auch vorkommen, dass der Hauptmandant verworfen wird und auf dem Testmandanten mit besseren Resultaten weitergearbeitet wird. Daher möchten wir an dieser Stelle auch nicht mit Sandboxumgebungen arbeiten.

Re: Mandant löschen mittels AL

18. Juni 2020 11:00

Kannst du bitte einmal den Quellcode posten?
Deine beiden Zeilen sind für die Analyse nicht ausreichend.

Re: Mandant löschen mittels AL

18. Juni 2020 11:06

Keine Ahnung warum es nicht funktioniert. Ich kann mir vorstellen, dass das ähnlich der Object-Tabelle ist, um Datenverlust zu vermeiden.

Ich habe jedoch noch eine andere Idee: verwende doch Powershell.

Re: Mandant löschen mittels AL

18. Juni 2020 11:10

m_schneider hat geschrieben:Ich habe jedoch noch eine andere Idee: verwende doch Powershell.


in der Cloud?

Re: Mandant löschen mittels AL

18. Juni 2020 11:10

Code:
Company.Reset();
Company.SetRange(Name, NewCompanyName);
if Company.Count > MaxCompanyBackups then begin
  DeleteCompanies := Company.Count - MaxCompanyBackups;
  CompanyNo := 0;
  Company.FindSet();
  repeat
    CompanyNo += 1;
    Company2.get(Company.Name);
    if Company2.Delete(true) then begin
      Company.Next();
      Message(Company.Name + '-> %1', CompanyNo); //für Testzwecke:
                    // Message wird ausgegeben, Mandant noch vorhanden!
    end;
   until CompanyNo = DeleteCompanies;
end;

Re: Mandant löschen mittels AL

18. Juni 2020 11:25

sweikelt hat geschrieben:
m_schneider hat geschrieben:...verwende doch Powershell.


in der Cloud?

Nicht?

Edit: dann eben Automation API

Re: Mandant löschen mittels AL

18. Juni 2020 11:39

@Michael - auf die Automation API hätte ich auch gesetzt :lol:

ich kann defintiv sagen, dass es OnPrem (BC160) ohne Probleme möglich ist, einen Mandanten zu löschen - ich hau jetzt mal meine Löschroutine (lol - 2 Zeilen Code) in meine SaaS Umgebung
PS:

der Code ist ein wenig "wirr"

Code:
      Company.Next();
      Message(Company.Name + '-> %1', CompanyNo); //für Testzwecke:
                    // Message wird ausgegeben, Mandant noch vorhanden!


--> dafuq? klar ist der noch vorhanden - ist ja auch der nächste!

Update -> SaaS funktioniert ebenfalls ohne Probleme

Code:
codeunit 50100 "DeleteComp"
{
    trigger OnRun()
    var
        Comp: Record Company;
    begin
        Comp.GET('CompToDelete');
        Comp.DELETE(true);
    end;
}



wie gesagt, dein Code ist ein bisschen verwirrend.

was mich noch interessieren würde:
Nur wenn ich wirklich über die Page gehe (die übrigens keine weiteren Trigger beinhaltet), lässt sich der Mandant manuell löschen

--> wie kommst du darauf, dass die Page kein Trigger außer anscheinend dem OnDelete hat?

Re: Mandant löschen mittels AL

18. Juni 2020 12:24

Automation API habe ich auch schon gefunden, schön und einfach wäre es halt alles über AL zu erledigen.
Witzigerweise wird der DELETE ja ausgeführt und es gibt TRUE zurück, wenn ich dann aber in die Mandantenauswahl gehe steht er immer noch drin und ich kann in den "gelöschten Mandanten" wechseln.
Die Tabelle Company ist ja nur eine virtuelle Tabelle, aber wenn ich ja über die Page lösche funktioniert es ja auch. Findet man eigentlich irgendwo den Trigger-Code dazu, es öffnen ja mehrere Confirm Fenster beim manuellen löschen.?

Re: Mandant löschen mittels AL

18. Juni 2020 12:28

OK, die Message hab ich schnell reingebastelt. das ist nicht Optimal. Aber ich habe jetzt in drei unterschiedlichen Versionen getestet und selbst wenn es 10 Mandanten gibt und er mit 7x die Löschmessage zeigt, dann sind bei mir danach noch alle Mandanten verfügbar.

Re: Mandant löschen mittels AL

18. Juni 2020 12:37

das mag ja alles sein, aber ich habe es problemlos OnPrem und bei SaaS getestet - dein Codeausschnitt ist wie gesagt "verwirrend".
Ich weiß weder, wann dein Code wie aufgerufen wird, noch was du meinst, dass die Page anscheinend nur den Delete-Trigger hat, noch kenne ich deine Variablen


du machst ein SetRange auf Name mit NewCompanyName -> und dann ein Repeat until....sorry, aber was soll dabei rauskommen?
du willst also den Mandanten Namens String in NewCompanyName löschen?

Re: Mandant löschen mittels AL

18. Juni 2020 12:58

tatsächlich ist es ein SETFILTER(Name,NewCompanyName+'*'
habe versucht den Code vor dem Posten noch etwas zu vereinfachen. Tatsächlich wird der Code ja bei mir ausgeführt, da er ja auch die Message ausgibt.

Re: Mandant löschen mittels AL

18. Juni 2020 13:39

Wir wissen nicht, von wo und wie dein Code aufgerufen wird, wir kennen die Variablen (weder die Deklaration, noch den Inhalt (z.B. NewCompanyName) nicht (klar können wir uns die vorstellen, aber ...nein)
Wir kennen auch den Aufbau eurer Mandantennamen nicht.
Ich hab einen Mandanten jeweils OnPrem sowie SaaS angelegt (Mandant kopieren) und diesen dann ohne Probleme in beiden Systemen gelöscht - den original Code dafür habe ich gepostet (sorry natürlich fehlte die Action, die ich zum ausführen der Codeunit verwendete - den findest du jetzt unten) - klar war der Mandantenname hardcoded, aber ich könnte dir auch eine nicht hardcoded Variante zur Verfügung stellen.

dein
Code:
repeat...until
entspricht nicht wirklich einer Standardimplementierung - dein neuerliches SetFilter ebenfalls nicht.

Der gepostete Code entspricht nicht dem, der ausgeführt wird.
--> Bitte entschuldige, aber was sollen wir nun deiner Meinung nach tun?

Code:
pageextension 50101 "CustDeleteCompBttn" extends "Customer List"
{
    layout
    {
        // Add changes to page layout here
    }

    actions
    {
        addlast("&Customer")
        {
            action(Killer)
            {
                Visible = true;
                ApplicationArea = all;
                trigger OnAction()
                var
                    myCod: Codeunit DeleteComp;
                begin
                    myCod.RUN;
                end;
            }
        }
    }

}