IngramMicro Artikelimport

Navigation:  Skripts > Programmerweiterungen > Beispiele > IngramMicro >

IngramMicro Artikelimport

Previous pageReturn to chapter overviewNext page

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