Beschreibung
Das folgende Skript wird über die Funktion "erweiterter Im-/ Export" ausgeführt und importiert alle Artikel und Preise von IngramMicro in die Auftragsverwaltung.
Hinweis
Dieses Skript funktioniert nur in der 32bit Version von WWS MaX, da der Datenbanktreiber für die Ingram-Datenbank nur als 32 bit verfügbar ist.
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 zur Preisaktualisierung und einfügen neuer Artikel
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 DownloadURL = "http://www.ingrammicro.de/cgi-bin/scripts/get_PL.pl"
Dim Kundennummer As String = "<IhreKDNr>" 'Hier Ihre Kundennummer eintragen
Dim Kennwort As String = "<IhrKennwort>" 'Hier Ihr Kennwort eintragen
'Datei herunterladen
e.ProgressDelegate.Invoke(0, "Datei herunterladen...")
Dim DataStream = DownloadFile(DownloadURL, Kundennummer, Kennwort)
'Temprärordner bereinigen und erstellen
e.ProgressDelegate.Invoke(0, "Temporärer Ordner vorbereiten...")
Dim TempFolder = My.Computer.FileSystem.SpecialDirectories.Temp & "\AuftrV2_IMdb"
If IO.Directory.Exists(TempFolder) Then IO.Directory.Delete(TempFolder, True)
IO.Directory.CreateDirectory(TempFolder)
'Datei entpacken
e.ProgressDelegate.Invoke(0, "Datenbank extrahieren...")
DataStream.Position = 0
ExtractFile(DataStream, TempFolder)
'Mit IM Datenbank verbinden
e.ProgressDelegate.Invoke(0, "Verbinde mit IM Datenbank...")
Dim ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TempFolder & ";Extended Properties=dBase III"
Dim dBaseConnection As New System.Data.OleDb.OleDbConnection(ConnectionString)
dBaseConnection.Open()
'Daten aus IM DB abrufen
e.ProgressDelegate.Invoke(0, "Import bereit.")
'Abfrage für Artikeldaten
Dim dBaseCommand As New System.Data.OleDb.OleDbCommand("SELECT * FROM mac_dbf", dBaseConnection)
Dim dBaseDataReader As System.Data.OleDb.OleDbDataReader = dBaseCommand.ExecuteReader(System.Data.CommandBehavior.Default)
'Abfrage für Gesamtzahl der Artikel
Dim dBaseCommand2 As New System.Data.OleDb.OleDbCommand("SELECT COUNT(*) FROM mac_dbf", dBaseConnection)
Dim Anzahl As int64 = dBaseCommand2.ExecuteScalar
'Verbindung zur Datenbank der Auftragsverwaltung herstellen
Dim dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)
'Counter für Statistik und Status
Dim count As Int64
Dim NeueArtikel As int64
'Artikel importieren
While dBaseDataReader.Read
count += 1
Dim art As Common.tbl_Artikel
Dim ArtNr As String = dBaseDataReader("ARTIKEL_Nr").ToString
'Fortschritt anzeigen
Dim Progress As int64 = count / Anzahl * 100
e.ProgressDelegate.Invoke(Progress, "Importiere Artikel...")
'Vorhandenen Artikel suchen
art = (From a In dc.tbl_Artikel Where a.Artikelnummer = ArtNr).FirstOrDefault
'Neuen Artikel anlegen, falls kein vorhandener Artikel gefunden wurde.
If art Is Nothing Then
art = New tbl_Artikel
dc.tbl_Artikel.InsertOnSubmit(art)
art.Artikelnummer = ArtNr
NeueArtikel += 1
End If
'Daten zum Artikel hinzufügen / aktualisieren
art.IstAuslaufartikel = False
art.Gruppe1 = dBaseDataReader("GRUPPE1").ToString
art.Gruppe2 = dBaseDataReader("GRUPPE2").ToString
art.Gruppe3 = dBaseDataReader("GRUPPE3").ToString
art.Artikelnummer5 = dBaseDataReader("HERSTELLER").ToString
art.Artikelnummer2 = dBaseDataReader("HSTNUMMER").ToString
art.Artikelnummer3 = dBaseDataReader("EANCODE").ToString
art.Artikelnummer4 = dBaseDataReader("CATALOGUEI").ToString
art.VK = dBaseDataReader("EVP").ToString
art.EK = dBaseDataReader("HEK").ToString
art.Name = art.Artikelnummer5 & " " & dBaseDataReader("ARTIKEL1").ToString & vbCrLf & dBaseDataReader("ARTIKEL2").ToString
'Bild herunterladen
Dim imgURL = dBaseDataReader("PICTUREFIL").ToString
If art.Thumb Is Nothing AndAlso Not String.IsNullOrWhiteSpace(imgURL) Then
e.LogMessageDelegate.Invoke("Importiere Bild " & imgURL)
imgURL = "http://ec.ingrammicro.de/jpg/" & imgURL
Try
Dim img = Styletronix.Imaging.Utils.GetImageFromURL(imgURL)
If Not img Is Nothing Then
art.Bild = Styletronix.Imaging.Utils.GetImageFromBinary(img)
End If
Catch ex As Exception
e.LogMessageDelegate.Invoke("Fehler:" & ex.Message)
End Try
End If
'Änderungen am Artikel speichern
dc.SubmitChanges()
'Datenblatt herunterladen
Dim docURL As String = dBaseDataReader("DATENBLATT").ToString
If Not String.IsNullOrWhiteSpace(docURL) Then
Dim LocalFile = Gemeinsam.Artikel.GetDocumentFolder(art.ID) & "\" & docURL
Dim RemoteFile = "http://ec.ingrammicro.de/pdf/" & docURL
If Not IO.File.Exists(LocalFile) Then
e.LogMessageDelegate.Invoke("Importiere Datenblatt " & docURL)
Try
DownloadFile(RemoteFile, LocalFile)
Catch ex As Exception
e.LogMessageDelegate.Invoke("Fehler:" & ex.Message)
End Try
End If
End If
'Auf Abbruch durch Benutzer reagieren
If e.GetCancelDelgate.Invoke Then
e.LogMessageDelegate.Invoke("Abbruch durch Benutzer.")
Exit While
End If
End While
'Zusammenfassung am Ende des Imports anzeigen
e.LogMessageDelegate.Invoke("Neue Artikel: " & NeueArtikel)
e.LogMessageDelegate.Invoke("Artikel Gesamt: " & count)
'Datenbankverbindungen schließen
e.LogMessageDelegate.Invoke("Verbindung zu Datenbanken beenden...")
dBaseConnection.Close()
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