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?
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?
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.
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.
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)
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.
18. Juni 2020 11:00
Kannst du bitte einmal den Quellcode posten?
Deine beiden Zeilen sind für die Analyse nicht ausreichend.
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.
18. Juni 2020 11:10
m_schneider hat geschrieben:Ich habe jedoch noch eine andere Idee: verwende doch
Powershell.
in der Cloud?
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;
18. Juni 2020 11:25
sweikelt hat geschrieben:m_schneider hat geschrieben:...verwende doch
Powershell.
in der Cloud?
Nicht?
Edit: dann eben
Automation API
18. Juni 2020 11:39
@Michael - auf die Automation API hätte ich auch gesetzt
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?
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.?
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.
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?
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.
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;
}
}
}
}
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.