IngramMicro Artikelimport
IngramMicro Artikelimport
Section titled “IngramMicro Artikelimport”Beschreibung
Section titled “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
Section titled “Voraussetzung”Auftragsverwaltung ab Version 11.12.1
Ablauf des Skripts
Section titled “Ablauf des Skripts”- Automatischer Download der Datenbank bei IM
- Entpacken der Datenbank und einlesen der Artikel
- Suchen vorhandener Artikel zur Preisaktualisierung und einfügen neuer Artikel
- Bereinigung der heruntergeladenen Dateien
Installation
Section titled “Installation”- Passen Sie die Parameter “<IhreKDNr>” und “<IhrKennwort>” an.
- Öffnen Sie den Skript über die erweiterte Im- und Export Funktion
Skript
Section titled “Skript”Imports Microsoft.VisualBasicImports SystemImports System.Collections.GenericImports System.LinqImports Styletronix.AuftragsverwaltungV2.CommonImports Styletronix.AuftragsverwaltungV2Namespace AdvancedImportClass DynamicCode'Funktion, die beim start des Skripts aufgerufen wird.Public Shared Sub DoWork(ByRef e As Styletronix.AuftragsverwaltungV2.ImportAssistent.frm_AdvancedImport.ScriptParams)'ParameterDim DownloadURL = "http://www.ingrammicro.de/cgi-bin/scripts/get_PL.pl"Dim Kundennummer As String = "<IhreKDNr>" 'Hier Ihre Kundennummer eintragenDim Kennwort As String = "<IhrKennwort>" 'Hier Ihr Kennwort eintragen'Datei herunterladene.ProgressDelegate.Invoke(0, "Datei herunterladen...")Dim DataStream = DownloadFile(DownloadURL, Kundennummer, Kennwort)'Temprärordner bereinigen und erstellene.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 entpackene.ProgressDelegate.Invoke(0, "Datenbank extrahieren...")DataStream.Position = 0ExtractFile(DataStream, TempFolder)'Mit IM Datenbank verbindene.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 abrufene.ProgressDelegate.Invoke(0, "Import bereit.")'Abfrage für ArtikeldatenDim 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 ArtikelDim dBaseCommand2 As New System.Data.OleDb.OleDbCommand("SELECT COUNT(*) FROM mac_dbf", dBaseConnection)Dim Anzahl As int64 = dBaseCommand2.ExecuteScalar'Verbindung zur Datenbank der Auftragsverwaltung herstellenDim dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)'Counter für Statistik und StatusDim count As Int64Dim NeueArtikel As int64'Artikel importierenWhile dBaseDataReader.Readcount += 1Dim art As Common.tbl_ArtikelDim ArtNr As String = dBaseDataReader("ARTIKEL_Nr").ToString'Fortschritt anzeigenDim Progress As int64 = count / Anzahl * 100e.ProgressDelegate.Invoke(Progress, "Importiere Artikel...")'Vorhandenen Artikel suchenart = (From a In dc.tbl_Artikel Where a.Artikelnummer = ArtNr).FirstOrDefault'Neuen Artikel anlegen, falls kein vorhandener Artikel gefunden wurde.If art Is Nothing Thenart = New tbl_Artikeldc.tbl_Artikel.InsertOnSubmit(art)art.Artikelnummer = ArtNrNeueArtikel += 1End If'Daten zum Artikel hinzufügen / aktualisierenart.IstAuslaufartikel = Falseart.Gruppe1 = dBaseDataReader("GRUPPE1").ToStringart.Gruppe2 = dBaseDataReader("GRUPPE2").ToStringart.Gruppe3 = dBaseDataReader("GRUPPE3").ToStringart.Artikelnummer5 = dBaseDataReader("HERSTELLER").ToStringart.Artikelnummer2 = dBaseDataReader("HSTNUMMER").ToStringart.Artikelnummer3 = dBaseDataReader("EANCODE").ToStringart.Artikelnummer4 = dBaseDataReader("CATALOGUEI").ToStringart.VK = dBaseDataReader("EVP").ToStringart.EK = dBaseDataReader("HEK").ToStringart.Name = art.Artikelnummer5 & " " & dBaseDataReader("ARTIKEL1").ToString & vbCrLf & dBaseDataReader("ARTIKEL2").ToString'Bild herunterladenDim imgURL = dBaseDataReader("PICTUREFIL").ToStringIf art.Thumb Is Nothing AndAlso Not String.IsNullOrWhiteSpace(imgURL) Thene.LogMessageDelegate.Invoke("Importiere Bild " & imgURL)imgURL = "http://ec.ingrammicro.de/jpg/" & imgURLTryDim img = Styletronix.Imaging.Utils.GetImageFromURL(imgURL)If Not img Is Nothing Thenart.Bild = Styletronix.Imaging.Utils.GetImageFromBinary(img)End IfCatch ex As Exceptione.LogMessageDelegate.Invoke("Fehler:" & ex.Message)End TryEnd If'Änderungen am Artikel speicherndc.SubmitChanges()'Datenblatt herunterladenDim docURL As String = dBaseDataReader("DATENBLATT").ToStringIf Not String.IsNullOrWhiteSpace(docURL) ThenDim LocalFile = Gemeinsam.Artikel.GetDocumentFolder(art.ID) & "\" & docURLDim RemoteFile = "http://ec.ingrammicro.de/pdf/" & docURLIf Not IO.File.Exists(LocalFile) Thene.LogMessageDelegate.Invoke("Importiere Datenblatt " & docURL)TryDownloadFile(RemoteFile, LocalFile)Catch ex As Exceptione.LogMessageDelegate.Invoke("Fehler:" & ex.Message)End TryEnd IfEnd If'Auf Abbruch durch Benutzer reagierenIf e.GetCancelDelgate.Invoke Thene.LogMessageDelegate.Invoke("Abbruch durch Benutzer.")Exit WhileEnd IfEnd While'Zusammenfassung am Ende des Imports anzeigene.LogMessageDelegate.Invoke("Neue Artikel: " & NeueArtikel)e.LogMessageDelegate.Invoke("Artikel Gesamt: " & count)'Datenbankverbindungen schließene.LogMessageDelegate.Invoke("Verbindung zu Datenbanken beenden...")dBaseConnection.Close()dc.Dispose()'Temporärdateien löschene.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 / HTTPsPrivate Shared Function DownloadFile(ByVal URL As String, ByVal Benutzer As String, ByVal Kennwort As String) As IO.MemoryStreamDim wc As New Net.WebClientwc.Credentials = New System.Net.NetworkCredential(Benutzer, Kennwort)Dim data As Byte() = wc.DownloadData(URL)Dim DataStream As New IO.MemoryStreamDataStream.Write(data, 0, data.Length)Return DataStreamEnd Function'Funktion zum Herunterladen von Dateien von einem Server per HTTP / HTTPsPrivate Shared Sub DownloadFile(ByVal URL As String, ByVal TargetFile As String)Dim wc As New Net.WebClientDim 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-ArchivPrivate 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.ZipEntryobjEntry = strmZipInputStream.GetNextEntry()Do While Not IsNothing(objEntry)If objEntry.IsFile ThenDim 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 ByteDim size = strmZipInputStream.Read(buff, 0, buff.Length)Dim pos As Int64 = 0Do While size > 0file.Write(buff, 0, size)size = strmZipInputStream.Read(buff, 0, buff.Length)pos += sizeLoopfile.Close()End IfobjEntry = strmZipInputStream.GetNextEntry()LoopstrmZipInputStream.Close()End SubEnd ClassEnd NamespaceQuelle
Section titled “Quelle”- Ursprungsdatei: ingrammicro_artikelimport.htm