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();
}
}
}