Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  EPLAN Electric P8
  Eplan 2023 Scripting: Artikeldaten mit ERP-Daten abgleichen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für EPLAN
Autor Thema:  Eplan 2023 Scripting: Artikeldaten mit ERP-Daten abgleichen (905 mal gelesen)
fency
Mitglied
Eplan Konstrukteur


Sehen Sie sich das Profil von fency an!   Senden Sie eine Private Message an fency  Schreiben Sie einen Gästebucheintrag für fency

Beiträge: 185
Registriert: 15.07.2011

erstellt am: 10. Aug. 2023 18:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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.shtml

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.
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


Sehen Sie sich das Profil von ThMue an!   Senden Sie eine Private Message an ThMue  Schreiben Sie einen Gästebucheintrag für ThMue

Beiträge: 2385
Registriert: 22.10.2013

EPLAN Electric P8 - Professional 2.9/2022 + alle Addons

erstellt am: 11. Aug. 2023 06:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für fency 10 Unities + Antwort hilfreich

"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


Sehen Sie sich das Profil von ThMue an!   Senden Sie eine Private Message an ThMue  Schreiben Sie einen Gästebucheintrag für ThMue

Beiträge: 2385
Registriert: 22.10.2013

EPLAN Electric P8 - Professional 2.9/2022 + alle Addons

erstellt am: 11. Aug. 2023 09:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für fency 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von apps4eplan an!   Senden Sie eine Private Message an apps4eplan  Schreiben Sie einen Gästebucheintrag für apps4eplan

Beiträge: 101
Registriert: 26.11.2020

erstellt am: 13. Aug. 2023 16:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für fency 10 Unities + Antwort hilfreich

@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


Sehen Sie sich das Profil von fency an!   Senden Sie eine Private Message an fency  Schreiben Sie einen Gästebucheintrag für fency

Beiträge: 185
Registriert: 15.07.2011

erstellt am: 15. Aug. 2023 11:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von F.S. an!   Senden Sie eine Private Message an F.S.  Schreiben Sie einen Gästebucheintrag für F.S.

Beiträge: 1815
Registriert: 23.04.2003

EPLAN Electric P8
2023 Prof.

erstellt am: 18. Aug. 2023 07:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für fency 10 Unities + Antwort hilfreich

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

fency
Mitglied
Eplan Konstrukteur


Sehen Sie sich das Profil von fency an!   Senden Sie eine Private Message an fency  Schreiben Sie einen Gästebucheintrag für fency

Beiträge: 185
Registriert: 15.07.2011

erstellt am: 22. Aug. 2023 17:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke Frank,

ich werde mir das nach meinem Urlaub nochmal mit dem Dispose ansehen.
Danke auf jeden Fall.

LG

------------------
Eplan P8 2.9 SP1

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz