| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für EPLAN | | |  | Eplan präsentiert in Hannover erste Einblicke in erweiterte Service-App , eine Pressemitteilung
|
Autor
|
Thema: Eplan 2023 Scripting: Artikeldaten mit ERP-Daten abgleichen (1507 mal gelesen)
|
fency Mitglied Eplan Konstrukteur
 
 Beiträge: 208 Registriert: 15.07.2011
|
erstellt am: 10. Aug. 2023 18:05 <-- editieren / zitieren --> Unities abgeben:         
Aus Ansporn aus dem Beitrag von RMLIF heraus, habe ich mich selbt mal mit dem Thema befasst. https://ww3.cad.de/foren/ubb/Forum467/HTML/014714.shtmlIch hatte schon lange vor, dass ich die aktuellen Preise für Artikel aus unserem ERP-System, sprich einer SQL Datenbank, ins Eplan importiere um hier Preiskalkulationen zu vereinfachen. Zu V2.9 Zeiten dachte ich noch, ich mache das easy direkt am SQL Server, einfach zwischen den Datenbanken, aber zum Glück hat Eplan darauf geachtet, es nicht zu leicht zu machen und aus unerfindlichen Gründen, dieses unleserliche Format für die Artikeldatenbank gewählt. Naja ist eben so. Nach einigem Herumtüffteln habe ich die einzelnen Schritte auch erstmal einzeln programmiert: 1. Alle Artikel die eine ERP Nummer haben, aus der Eplan-Datenbank die ERP-Nummern in eine .txt-Datei exportieren 2. in einem seperaten Skript, anhand dieser ERP-Nummern, die Preise in der SQL Datenbank suchen und eine weitere .txt-Datei erstellen in dem für jeden Artikel die ERP-Nummern und Preise als String gespeichert werden, das ganze mit einem : getrennt um es später leicht zuordnen und trennen zu können. 3. diese Datei lesen und dann für jede ERP-Nummer den Preis in der Feld ARTICLE_SALESPRICE_1 einzutragen. Das ganze habe ich dann ein Skript gepackt, wo ich zuerst Schritt 1 ausführe, dann das Schritt 2 als .exe ausführe und warte bis es abgearbeitet wurde und dann mache ich mit Schritt 3 wieder weiter. Soweit so gut. Beim testen habe ich nun aber unerwartete Fehlermeldungen die nur manchmal auftreten. 1. Fehlermeldung: Popup "interner Fehler" 2. Fehlermeldung: Popup "Es wurde versucht, eine Transaktion zu bestätigen, die zuvor nicht gestartet wurde." 3. Fehler: Eplan ist auch ohne Fehlermeldung einfach abgestürzt und hat sich geschlossen. Dann kann ich aber teilweise das Skript wieder mehrere Male problemlos ausführen. Ich würde jetzt für mich selbst sagen, da ich das Skript ja nicht stündlich ausführe, es ok ist, dennoch würde ich gerne meinen Fehler finden. Weiters dachte ich mir, vielleicht haben die Skript-Profis noch Ideen, wie das besser, eleganter, stabiler funktionieren kann. Weiters ist es ja vielleicht jemanden eine Hilfe bzw. eine Inspiration für ein anderes Skript. Code: using System; using System.IO; using System.Diagnostics; using System.Windows.Forms; using System.Threading; using Eplan.EplApi.ApplicationFramework; using Eplan.EplApi.Base; using Eplan.EplApi.Scripting; using Eplan.EplApi.MasterData; namespace StandardScripts { /// <summary> /// Skript um die Preise in der Eplan Artikeldatenbank zu aktualisieren. /// Ablauf: /// Schritt 1: /// Es wird aus Eplan eine Hilfsdatei "EplanOutput.txt" in den Eplan-Stammdaten Ordner "NGR\Benutzer\ScriptTemp\Artikeldaten" geschrieben. /// Schritt 2: /// Es wird das Programm "InventurpreisAbrufen.exe" ausgeführt. Dieses liest die Artikelnummern aus "EplanOutput.txt", /// ruft die dazugehörigen Preise aus dem Applus ab und schreibt diese dann im Format "ERP-Nummer:Inventurpreis" in die Hilfsdatei /// "ApplusOutputMitPreisen.txt" in den Eplan-Stammdaten Ordner "NGR\Benutzer\ScriptTemp\Artikeldaten". /// Schritt 3: /// Eplan ließt die Informationen aus "ApplusOutputMitPreisen.txt" und schreibt die Preise in die Artikeldatenbank. /// Artikel bei denen im Applus kein Preis gefunden wurde, werden übersprungen um eventuell händisch hinterlegte Preise nicht zu überschreiben. /// </summary> internal class UpdateArticelPrices { /// <summary> /// Gibt den Dateipfad zu dem TempVerzeichnis an, in das die Hilfsdateien exportiert werden /// </summary> static string strFolderPath { get { //ließt den angemeldeten Windows-Benutzernamen aus string strCurrentUser = Environment.UserName; string strEplanNGRPath = @"\\ngr-file\01-NGR-AUT\Office\EPLAN\Data\NGR\"; string strFolder = @"\ScriptTemp\Artikeldaten\"; string strExportPath = strEplanNGRPath + strCurrentUser + strFolder; return strExportPath; } } static string strErpNummernAusEplanArtikelstamm { get { return strFolderPath + @"EplanOutput.txt"; } } static string strApplusOutputMitPreisen { get { return strFolderPath + @"ApplusOutputMitPreisen.txt"; } } static string strScriptsPath { get { return PathMap.SubstitutePath("$(MD_SCRIPTS)" + @"\"); } } static string strInventurpreiseAbrufenExe { get { return strScriptsPath + @"NGR\InventurpreisAbrufen\bin\Debug\InventurpreisAbrufen.exe"; } }
[Start] public void Start() { //Progressbar erstellen Progress progress = new Progress("SimpleProgress"); progress.SetAllowCancel(true); progress.SetAskOnCancel(true); progress.SetNeededSteps(3); progress.SetTitle("Preis in Artikeldatenbank aktualisieren."); progress.ShowImmediately(); try { if (!progress.Canceled()) { //ließt aus Eplan alle Artikel aus und schreibt sie in eine Hilfsdatei progress.SetActionText("Die Artikelnummern werden aus der Eplan Artikeldatenbank gelesen \nund in die Hilfsdatei geschrieben."); progress.Step(1); ReadEplanDatabaseWriteAllArticelsInFile(); Thread.Sleep(1000); } if (!progress.Canceled()) { progress.SetActionText("Die aktuellen Preise werden aus dem Applus abgerufen \nund in eine Hilfsdatei geschrieben."); progress.Step(2); Process p = Process.Start(strInventurpreiseAbrufenExe); p.WaitForExit(); Thread.Sleep(1000); } if (!progress.Canceled()) { progress.SetActionText("Die Preise werden aus der Hilfsdatei gelesen \nund in die Eplan Artikeldatenbank geschrieben."); progress.Step(3); WriteFromFileInEplanDatabase(strApplusOutputMitPreisen); Thread.Sleep(1000); } if (progress.Canceled()) { MessageBox.Show("Vorgang wurde durch Benutzer abgebrochen!", "Benutzerabbruch", MessageBoxButtons.OK, MessageBoxIcon.Error); } } finally { progress.EndPart(true); } MessageBox.Show("Vorgang abgeschlossen.", "Preis in Artikeldatenbank aktualisieren.", MessageBoxButtons.OK, MessageBoxIcon.Information); //MessageBox.Show("Fencer du bist a Traum", "Wer braucht schon den Norbert für ein Skript?!", MessageBoxButtons.OK, MessageBoxIcon.Information); } /// <summary> /// Liest in der Artikeldatenbank und gibt für alle Artikel mit ERP-Nummer die Artikelnummer zurück. /// </summary> public void ReadEplanDatabaseWriteAllArticelsInFile() { MDPartsManagement mdPartsManagement = new MDPartsManagement(); MDPartsDatabase database = mdPartsManagement.OpenDatabase(); var parts = database.Parts; // Überprüfe, ob der Speicherort existiert, und erstelle ihn, falls nicht if (!Directory.Exists(strFolderPath)) { Directory.CreateDirectory(strFolderPath); } // Lösche die ApplusAbfrage.txt, wenn sie bereits existiert if (File.Exists(strErpNummernAusEplanArtikelstamm)) { File.Delete(strErpNummernAusEplanArtikelstamm); } if (database.IsOpen) { foreach (MDPart part in parts) { string strErpNumber = part.Properties.ARTICLE_ERPNR.ToString(); if (!string.IsNullOrEmpty(strErpNumber)) { // StreamWriter zum Schreiben in die Datei "EplanOutput.txt" using (StreamWriter writer = new StreamWriter(strErpNummernAusEplanArtikelstamm, true)) { // Schreibe die Daten in die ApplusAbfrage.txt writer.WriteLine(strErpNumber); } } } } database.Dispose(); database.Close(); } /// <summary> /// Ließt in der Datei "ApplusOutputMitPreisen.txt" Zeile für Zeile die Werte aus. /// </summary> public void WriteFromFileInEplanDatabase(string strApplusOutputMitPreisen) { MDPartsManagement mdPartsManagement = new MDPartsManagement(); MDPartsDatabase database = mdPartsManagement.OpenDatabase(); //öffnet den Streamreader und ließt in der Datei "ApplusOutputMitPreisen.txt" Zeile für Zeile die Werte aus. StreamReader reader = new StreamReader(strApplusOutputMitPreisen); string line; while ((line = reader.ReadLine()) != null) { // String anhand des Doppelpunkts aufteilen string[] stringparts = line.Split(':'); //teilt den string bei dem Doppelpunkt in 2 strings auf string strpartERP = stringparts[0].Trim(); //string für die ERP-Nummer string strpartPreis = stringparts[1].Trim(); //string für den Preis //sollte kein Preis aus dem Applus abgerufen worden sein, wird der Artikel übersprungen, um eventuell händisch im Eplan hinterlegte Preise nicht zu überschreiben. if (!string.IsNullOrEmpty(strpartPreis)) { if (database.IsOpen) { //öffnet für jeden einzelnen Artikel die "parts"-Database und schreibt dann den Preis in das Feld "ARTICLE_SALESPRICE_1" var parts = database.GetPartVariantsByERPNumber(strpartERP); foreach (MDPart part in parts) { part.Properties.ARTICLE_SALESPRICE_1 = strpartPreis; } } } } reader.Close(); database.Dispose(); database.Close(); } /// <summary> /// Liest in der Artikeldatenbank, sucht nach der ERP-Nummer, in diesem Fall, nach Teilen davon /// und gibt die Artikelnummer zurück. /// </summary> public void ReadEplanDatabaseWriteSpecificArticelsInFile(string strPartOfErpNumber) { MDPartsManagement mdPartsManagement = new MDPartsManagement(); MDPartsDatabase database = mdPartsManagement.OpenDatabase(); var parts = database.Parts; // Überprüfe, ob der Speicherort existiert, und erstelle ihn, falls nicht if (!Directory.Exists(strFolderPath)) { Directory.CreateDirectory(strFolderPath); } // Lösche die ApplusAbfrage.txt, wenn sie bereits existiert if (File.Exists(strErpNummernAusEplanArtikelstamm)) { File.Delete(strErpNummernAusEplanArtikelstamm); } if (database.IsOpen) { foreach (MDPart part in parts) { string strErpNumber = part.Properties.ARTICLE_ERPNR.ToString(); if (strErpNumber.Contains(strPartOfErpNumber)) { // StreamWriter zum Schreiben in die Datei (Append-Modus) using (StreamWriter writer = new StreamWriter(strErpNummernAusEplanArtikelstamm, true)) { // Schreibe die Daten in die ApplusAbfrage.txt writer.WriteLine(strErpNumber); } } } } database.Dispose(); database.Close(); } } }
------------------ Eplan P8 2.9 SP1 [Diese Nachricht wurde von fency am 10. Aug. 2023 editiert.] [Diese Nachricht wurde von fency am 10. Aug. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ThMue Ehrenmitglied V.I.P. h.c. M.Sc. Wirtschaftsingeneurswesen, B.Eng. Elektro- und Automatisierungstechnik
     
 Beiträge: 2411 Registriert: 22.10.2013 EPLAN Electric P8 - Professional 2.9/2022/2024/2025 + alle Addons
|
erstellt am: 11. Aug. 2023 06:22 <-- editieren / zitieren --> Unities abgeben:          Nur für fency
"Ich hatte schon lange vor, dass ich die aktuellen Preise für Artikel aus unserem ERP-System, sprich einer SQL Datenbank, ins Eplan importiere um hier Preiskalkulationen zu vereinfachen." ohne jetzt alles gelesen zu haben -> Den Workflow kenn ich jetzt bei euch nicht, aber ich kenn das so und wurde schon ein paar mal so implementiert. Schnittstelle CAE <-> ERP - sprich EPLAN mit Sage OfficeLine/SAP usw. anschließend werden Projektgenau die Artikeldaten ins ERP System dem Projekt zugeordnet und dort findet die Kalkulation statt. Dafür ist das ERP System auch da. überleg einfach mal logisch. Heute Preis 100, morgen 107 in 2 monaten bekommt der Einkauf ein Angebot 97 und dann steigt der Preis auf 112 Euro. Du hast innerhalb weniger Monate 4 verschiedene Artikel - sind die aber wirklich anders? Jegliche Projekte die auf diese Thematik "Preise in EPLAN" gestartet wurden sind gescheitert die ich kenn. Allerdings hab ich einen Denkanstoß den ich schonmal umgesetzt habe der ganz gut ankam und heute noch eingesetzt wird.
Aktueller Preis aus dem Einkauf + 10% Aufschlag für eine preisliche Grobkalkulation. WENN sich der Artikel ändern sollte z.b. neue Aderfarben, neue Anschlussbezeichnungn usw. ändert sich technisch auch der Artikel. Dann wird der aktuelle Preis nochmal geprüft und ebenfalls mit 10% aufschlag eingetragen. ------------------ Vorlesungen machen den Verstand träge. Sie zerstören das Potenzial für authentische Kreativität! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ThMue Ehrenmitglied V.I.P. h.c. M.Sc. Wirtschaftsingeneurswesen, B.Eng. Elektro- und Automatisierungstechnik
     
 Beiträge: 2411 Registriert: 22.10.2013 EPLAN Electric P8 - Professional 2.9/2022/2024/2025 + alle Addons
|
erstellt am: 11. Aug. 2023 09:09 <-- editieren / zitieren --> Unities abgeben:          Nur für fency
Und vielleicht noch ergänzend. Hattte 3-4 mal implmentiert, dass man ein übergrordnertes System (Klassifizierungssystem wie ECLASS) in Kombination mit PDM/PLM System die Datensätze pflegt und die Systeme (ERP, CAD, CAE, ...) die Daten bei Anlage einmalig abgleicht und bei Änderungen diese neu "verfiziert" ob es änderungen gegeben hat. Vielleicht auch als Denkanstoß
------------------ Vorlesungen machen den Verstand träge. Sie zerstören das Potenzial für authentische Kreativität! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
apps4eplan Mitglied freier Entwickler
 
 Beiträge: 130 Registriert: 26.11.2020 EEC Professional in allen Versionen
|
erstellt am: 13. Aug. 2023 16:27 <-- editieren / zitieren --> Unities abgeben:          Nur für fency
@ThMue: aber eine Antwort darauf, dass fency in einem Ablauf einen Fehler hat und diesen Fehler weg haben möchte, ist das nicht gerade, oder hab ich da jetzt die Pointe überlesen --> ich hab nicht alles gelesen ;-) !! ------------------ sind doch alles nur Nuller und Einser :-) !!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fency Mitglied Eplan Konstrukteur
 
 Beiträge: 208 Registriert: 15.07.2011
|
erstellt am: 15. Aug. 2023 11:01 <-- editieren / zitieren --> Unities abgeben:         
ThMue, danke für die Antwort, auch wenn sie mir nicht weiterhilft. Weiters verstehe ich auch nicht warum du sagen kannst, dass das so nicht klappt. Es geht hier um die grobe Kalkulation eines kleinen Zusatz, zum Beispiel wenn der Kunde kurzfristig noch einen Motorabgang will, dann kann ich so schnell sagen, dass das ... Euro sind. Ob ich das im ERP System -> hier fehlt mir die Schnittstelle, oder im Eplan mache, ist aus meiner Sicht absolut irrelevant. ------------------ Eplan P8 2.9 SP1 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
F.S. Moderator
    
 Beiträge: 1924 Registriert: 23.04.2003 EPLAN Electric P8 2025 Prof.
|
erstellt am: 18. Aug. 2023 07:52 <-- editieren / zitieren --> Unities abgeben:          Nur für fency
Hallo, ich habe mit deinem Code etwas rumprobiert, in meiner Testumgebung trat dabei kein Fehler auf. So ist es schwierig etwas zu sagen, ich würde die Problematik im bereich database.Dispose(); vermuten, entweder weglasssen oder ein using beim Öffnen der Datenbank einfügen. ------------------ grüße FrankS Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| Dipl.-Ing./M./BA/Techniker Elektro-Konstrukteur (m/w/d) | Die Hinterkopf GmbH ist ein inhabergeführtes, mittelständisches Unternehmen in zweiter Generation mit Sitz in Eislingen/Fils bei Göppingen (BaWü), das 1962 gegründet wurde. Das Familienunternehmen hat es bei der Entwicklung und Herstellung von großen Maschinen und Produktionslinien zur Herstellung und Dekoration zylindrischer Hohlkörper zur Weltmarkt- und Technologieführerschaft geschafft.... | Anzeige ansehen | Feste Anstellung |
|
fency Mitglied Eplan Konstrukteur
 
 Beiträge: 208 Registriert: 15.07.2011
|
erstellt am: 22. Aug. 2023 17:43 <-- editieren / zitieren --> Unities abgeben:         
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |