@dropshipout natürlich !
Vorweg, ich übernehme keine Haftung für evtl. Schäden an der Datenbank oder dergleichen! Das Script wird derzeit auf einem Rechner mit Windows 7 und SQL Server 2014 mit aktueller
WaWi 1.2.2.2 ausgeführt. Ob das ganze mit einer älteren Windows-Version läuft kann ich nicht sagen.
// Was benötigen wir?
Damit die das ganze auch funktioniert, muss jede Bestellung in einer separaten XML nach Schema lokal in einem Ordner abgelegt werden.
Von dort aus muss jede einzelne *.xml in die eazybusiness Datenbank in die Spalte tXMLBestellImport übertragen werden.Die restlichen Arbeitsschritte übernimmt der JTL-
Worker !
// DaWanda API
In meinem Fall, hole ich meine Bestelldaten über die DaWanda API via cURL "zerlege" die XML von DaWanda und gebe diese im JTL-Schema erneut als XML wieder auf dem Webspace aus. Damit ich nur Bestellungen ausgebe, welche "neu" und noch nicht im System sind wird eine Logdatei angelegt. So vermeide ich bereits vorab, doppelte Auftragsimporte in die WaWi ( ! Beim Import über die Tabelle tXMLBestellimport wird nicht geprüft, ob evtl ein Kunde/Auftrag bereits angelegt ist ! ). Man könnte das ganze auch vor dem INSERT in SQL nochmal überprüfen, allerdings bin ich dazu in SQL nicht fit genug.
// Daten via FTP abholen
Um jede XML-Datei als Einzelbestellung vom FTP Server abzuholen nutze ich ebenfalls CMD. Anschließend wird die abgeholte *.XML Datei vom Server gelöscht um Ressourcen zu sparen. Hier kommt dann unser zuvor erstelltes Logfile zum Einsatz - denn ohne dieses Logfile würde die bereits abgeholte und nun gelöschte *.XML auf dem Webspace beim nächsten abgleich erneut ausgegeben werden -> Doppel-Import! Entsprechende snippets hierzu findet man im Netz - ist schnell gebastelt. Wer Hilfe hierzu benötigt, einfach melden.
// Übertragung in die Datenbank "eazybusiness"
Hier fingen meine Probleme an. Eine einzelne Datei zu übergeben war nicht das Problem, einen ganzen Ordner davon, anhand unterschiedlicher Dateinamen dann schon. Meine Dateinamen einzelner XML-Dateien setzen sich wie folgt zusammen:
dawanda_order_<DAWANDA BESTELLNUMMER>.xml - Um nun jede Datei aus einem bestimmten Verzeichnis zu holen und in die Datenbank zu übertragen nutzen wir sqlcmd!
// Verzeichnisstruktur
An meinem Rechner habe ich folgende Verzeichnisstruktur. Beachtet, dass die in der config.ini angegebenen Verzeichnis existent sein müssen, andernfalls funktioniert das script nicht!
c:\XML\ <- Hauptverzeichnis ( config.ini & import.bat )
c:\XML\sql\ <_ SQL Verzeichnis ( xml_import.sql )
c:\XML\temp <- Verzeichnis für XML-Dateien ( Bestellungen )
c:\XML\backup <- Verzeichnis in welches die XML-Dateien nach dem INSERT abgelegt werden.
// Script
Wir beginnen mit einer
config.ini in welcher unsere "variablen" gespeichert sind. Diese Datei beinhaltet unsere Zugangsdaten für die Datenbank der WaWi, als auch die Pfade zu den einzelnen Verzeichnissen, in welchem die XML-Dateien liegen, bzw. nach dem INSERT die *.XML-Dateien als Backup hinverschoben werden. Grundlegend habe ich ein Verzeichnis "XML" auf Laufwerk c: angelegt -> c:\XML.
In dieses Verzeichnis legen wird die config.ini mit folgendem Inhalt ab:
------------------- config.ini ---------------------
db_server = COMPUTERNAME\JTLWAWI
db_username=sa
db_passwort=sa04Tj14
db_plattform=5
db_rechnung=0
xml_verzeichnis=c:\XML\temp
xml_backupverzeichnis=c:\XML\backup\
------------------- config.ini ---------------------
Als nächstes benötigen wir die
import.bat im Verzeichnis c:\XML\.
Kurz Erklärt: In dem *.bat File holen wir uns aus der config.ini die nötigen variablen und füllen damit das sqlcmd Kommando. Man könnte die Daten auch direkt im *.bat File Einpflegen allerdings ist das ganze in einer config.ini etwas übersichtlicher und schneller erledigt. Ich möchte trotzdem anmerken, das die Zugangsdaten in dieser Datei für jeden einsehbar sind!
Wichtig!! Im xml_verzeichnis Pfad dürfen nur XML-Dateien mit Einzelbestellungen abgelegt werden! Andernfalls crasht der Worker und ihr müsst die Tabelle von Hand via Microsoft SQL Server Management Studio wieder leeren!
------------------- import.bat ---------------------
@echo off
for /f "tokens=*" %%a in ('type "config.ini"') do set %%a
for f "%xml_verzeichnis%" %%i in (*.xml) do (
sqlcmd -U %db_username% -P %db_password% -S %db_server -v filepath="%%i" plattform="%db_plattform%" rechnung="%db_rechnung%" -i c:\XML\sql\xml_import.sql
move "%%i" "%xml_backupverzeichnis%" )
exit
------------------- import.bat ---------------------
In der import.bat wird via sqlcmd das sql-script
xml_import.sql aufgerufen. Zusätzlich werden die values der variablen
filepath,
plattform und
rechnung an das script übergeben! Nur so kann das script für jede xml-Datei einen separaten INSERT vornehmen.
------------------- xml_import.sql ---------------------
INSERT INTO eazybusiness.dbo.tXMLBestellImport(cText,nPlattform,nRechnung)
SELECT CAST(CONVERT(XML,x.BulkColumn,2) AS archer(max)),$(plattform),$(rechnung)
FROM OPENROWSET (BULK '$(filepath)', SINGLE_BLOB) AS x
------------------- xml_import.sql ---------------------
Fertig! Zumindest fast...! Nun fehlt nur noch der Eintrag im Microsoft Aufgabenplaner, wie oft / wann der INSERT erfolgt.
Hierzu gibt es zumindest von meiner Seite ein paar Hinweise welche ich so nicht im Netz gefunden habe.
Wer sich von dem sich immer wieder kurz aufblickenden CMD-Fenster gestört fühlt ( sofern DB & WaWi Client auf einem Rechner ) sollte für das Ausführen des *.bat scripts einen weiteren User anlegen etwa -> JTL. Damit diese Aufgabe auch ausgeführt wird, wenn man mit einem anderen Nutzer angemeldet ist, muss bei der Aufgabe lediglich der Haken bei "Unabhängig von der Benutzeranmeldung ausführen" gesetzt sein. Der Trigger kann frei gewählt werden, die Aktion muss wie folgt übergeben werden.
Programm/Skript
C:\Windows\SYSWOW64\cmd.exe
Achtung, dies gilt nur für 64-Bit Betriebssysteme, andernfalls muss hier
C:\Windows\system32\cmd.exe
eingetragen werden.
Als Argument müssen wir mit übergeben:
/c start"" "c:/XML/import.bat"
Worker starten... und auf Aufträge hoffen! Sofern gewünscht kann ich all diese Dateien auch als *.zip bereitstellen - so müsste lediglich die config.ini angepasst werden.
NACHTRAG! ACHTUNG - Das Script importiert jegliche im Ordner liegende Bestellung, auch wenn diese bereits in der Datenbank exisitert!