Beschreibung
Das folgende Skript wird über die Funktion "erweiterter Im-/ Export" ausgeführt und importiert die Zubehör - Liste von IngramMicro in die Auftragsverwaltung. Allen Artikeln wird dadurch das entsprechende Zubehör zugeordnet. Führen Sie vor dem Import der Zubehörliste den Import der Artikel durch.
Voraussetzung
Auftragsverwaltung ab Version 11.12.1
Ablauf des Skripts
1. Automatischer Download der Datenbank bei IM
2. Entpacken der Datenbank und einlesen der Artikel
3. Suchen vorhandener Artikel und hinzufügen des passenden Zubehörs.
4. Bereinigung der heruntergeladenen Dateien
Installation
• Passen Sie die Parameter "<IhreKDNr>" und "<IhrKennwort>" an.
• Öffnen Sie den Skript über die erweiterte Im- und Export Funktion
Skript
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports Styletronix.AuftragsverwaltungV2.Common
Imports Styletronix.AuftragsverwaltungV2
Namespace AdvancedImport
Class DynamicCode
'Funktion, die beim start des Skripts aufgerufen wird.
Public Shared Sub DoWork(ByRef e As Styletronix.AuftragsverwaltungV2.ImportAssistent.frm_AdvancedImport.ScriptParams)
'Parameter
Dim Kundennummer As String = "<IhreKdNr>"
Dim Kennwort As String = "<IhrKennwort>"
'Temprärordner bereinigen und neu erstellen
Dim TempFolder = My.Computer.FileSystem.SpecialDirectories.Temp & "\AuftrV2_IMdb"
e.ProgressDelegate.Invoke(0, "Temporärer Ordner vorbereiten... (" & TempFolder & ")")
If IO.Directory.Exists(TempFolder) Then IO.Directory.Delete(TempFolder, True)
IO.Directory.CreateDirectory(TempFolder)
'Datei herunterladen
Dim DownloadURL = "http://www.ingrammicro.de/cgi-bin/scripts/get_file.pl?NAME=ZUBEHOER.zip"
e.ProgressDelegate.Invoke(0, "Datei herunterladen... (" & DownloadURL & ")")
Dim DataStream = DownloadFile(DownloadURL, Kundennummer, Kennwort)
'Datei entpacken
e.ProgressDelegate.Invoke(0, "Daten extrahieren...")
DataStream.Position = 0
ExtractFile(DataStream, TempFolder)
'Verbindung zur Datenbank der Auftragsverwaltung herstellen
Dim dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)
'Textdatei lesen
Dim EOLStrings As String() = IO.File.ReadAllLines(TempFolder & "\ZUBEHOER.txt")
Dim Anzahl As int64 = EOLStrings.length
Dim IsFirstRow As Boolean = True
Dim count As int64
Dim artID1 As Int64
Dim artID2 As Int64
Dim LastArtikelNr As String = ""
For Each row As String In EOLStrings
If IsFirstRow Then
'Überspringe erste Zeile mit Überschrift
IsFirstRow = False
Else
'Fortschritt anzeigen
count += 1
Dim Progress As int64 = count / Anzahl * 100
e.ProgressDelegate.Invoke(Progress, "Prüfe Artikel...")
'Nummer splitten
Dim Nummern As String() = row.Split(vbTab)
Dim Artikelnummer As String = Nummern(0).Trim
Dim ZubehörNummer As String = Nummern(1).Trim
'Artikel IDs suchen
'Vermeide mehrfaches abrufen des Stammartikels bei aufeinanderfolgendem Vorkommen in der Liste
If Not LastArtikelNr = Artikelnummer Then
artID1 = (From a In dc.tbl_Artikel Where a.Artikelnummer = Artikelnummer Select a.ID).FirstOrDefault
LastArtikelNr = Artikelnummer
End If
artID2 = (From a In dc.tbl_Artikel Where a.Artikelnummer = ZubehörNummer Select a.ID).FirstOrDefault
If artID1 > 0 And artID2 > 0 Then
'Auf vorhandes Zubehör prüfen
Dim Zubehör = (From a In dc.tbl_Artikel_Zubehörs Where a.ArtikelID = artID1 And a.Artikel2ID = artID2).FirstOrDefault
'Neues Zubehör hinzufügen
If Zubehör Is Nothing Then
'e.LogMessageDelegate.Invoke("Neues Zubehör: " & Artikelnummer & " | " & ZubehörNummer )
Dim Zubeh = New tbl_Artikel_Zubehör With {.ArtikelID = artID1, _
.Artikel2ID = artID2}
dc.tbl_Artikel_Zubehörs.InsertOnSubmit(Zubeh)
dc.SubmitChanges()
End If
'else
'e.LogMessageDelegate.Invoke("Artikel nicht gefunden: " & Artikelnummer & " | " & ZubehörNummer )
End If
End If
'Auf Abbruch durch Benutzer reagieren
If e.GetCancelDelgate.Invoke Then
e.LogMessageDelegate.Invoke("Abbruch durch Benutzer.")
Exit For
End If
Next
'Datenbankverbindungen schließen
e.LogMessageDelegate.Invoke("Verbindung zu Datenbanken beenden...")
dc.Dispose()
'Temporärdateien löschen
e.LogMessageDelegate.Invoke("Temporäre Daten löschen...")
IO.Directory.Delete(TempFolder, True)
e.LogMessageDelegate.Invoke("Beendet")
End Sub
'Funktion zum Herunterladen von Dateien von einem Server per HTTP / HTTPs
Private Shared Function DownloadFile(ByVal URL As String, ByVal Benutzer As String, ByVal Kennwort As String) As IO.MemoryStream
Dim wc As New Net.WebClient
wc.Credentials = New System.Net.NetworkCredential(Benutzer, Kennwort)
Dim data As Byte() = wc.DownloadData(URL)
Dim DataStream As New IO.MemoryStream
DataStream.Write(data, 0, data.Length)
Return DataStream
End Function
'Funktion zum Herunterladen von Dateien von einem Server per HTTP / HTTPs
Private Shared Sub DownloadFile(ByVal URL As String, ByVal TargetFile As String)
Dim wc As New Net.WebClient
Dim data As Byte() = wc.DownloadData(URL)
Dim oFileStream = New System.IO.FileStream(TargetFile, System.IO.FileMode.Create)
oFileStream.Write(data, 0, data.Length)
oFileStream.Close()
End Sub
'Funktion zum Extrahieren von Dateien aus ZIP-Archiv
Private Shared Sub ExtractFile(ByRef DataStream As IO.MemoryStream, ByVal TargetFolder As String)
Dim strmZipInputStream = New ICSharpCode.SharpZipLib.Zip.ZipInputStream(DataStream)
Dim objEntry As ICSharpCode.SharpZipLib.Zip.ZipEntry
objEntry = strmZipInputStream.GetNextEntry()
Do While Not IsNothing(objEntry)
If objEntry.IsFile Then
Dim TargetName = IO.Path.Combine(TargetFolder, objEntry.Name)
Dim Folder = IO.Path.GetDirectoryName(TargetName)
If Not IO.Directory.Exists(Folder) Then IO.Directory.CreateDirectory(Folder)
If IO.File.Exists(TargetName) Then IO.File.Delete(TargetName)
Dim file = New IO.FileStream(TargetName, IO.FileMode.Create)
Dim buff(2048) As Byte
Dim size = strmZipInputStream.Read(buff, 0, buff.Length)
Dim pos As Int64 = 0
Do While size > 0
file.Write(buff, 0, size)
size = strmZipInputStream.Read(buff, 0, buff.Length)
pos += size
Loop
file.Close()
End If
objEntry = strmZipInputStream.GetNextEntry()
Loop
strmZipInputStream.Close()
End Sub
End Class
End Namespace