Ein Script für die Verarbeitung im Script Konverter sieht beispielsweise so aus:
&& Script erstellt am: 04.12.2013 18:53:19 *------------------------------------------------------------------------------------------------------------------------ * Variablen für das Script festlegen *------------------------------------------------------------------------------------------------------------------------ * Quellverzeichnis, wo die ASCII-Daten liegen (Wichtig! Mit Backslash am Ende!) lcImportDir = "C:\Users\mkahlert\Desktop\Daten\" * Datum des Import-Zeitraums (Von-Bis-Datum) * Feste Datumsangabe als: ldDatumVon = DATE(jahr,monat,tag) * Relative Datumsangabe als: ldDatumVon = DATE()-1 (entspricht heutiges Datum minus 1 Tag) ldDatumVon = DATE(2013,10,22) ldDatumBis = DATE(2013,10,22) * Lieferantennummer für den Filter lcLieferant = "00932" * Export-Datei lcExportDatei = "C:\Users\mkahlert\Desktop\Export-" + DTOC(ldDatumVon) + ".txt" *------------------------------------------------------------------------------------------------------------------------ * Debug-Ausgabe für das Logfile *------------------------------------------------------------------------------------------------------------------------ ScriptLogfile("Import-Verzeichnis: "+lcImportDir) ScriptLogfile("Zeitraum: "+DTOC(ldDatumVon)+" - "+DTOC(ldDatumBis)) ScriptLogfile("Lieferantennummer: "+lcLieferant) ScriptLogfile("Export-Datei: "+lcExportDatei) ScriptLogfile("") *------------------------------------------------------------------------------------------------------------------------ * Temporäre Tabellen im Speicher erstellen *------------------------------------------------------------------------------------------------------------------------ CREATE CURSOR c_mart ( artikelnr C(10), af C(2), ean C(13) ) CREATE CURSOR c_mbv ( auftrag C(6), datum D, posnr C(5), artikelnr C(10), af C(2), menge N(10,2), storno C(10), filiale C(2) ) CREATE CURSOR c_maufz ( auftrag C(6), datum D, posnr C(5), artikelnr C(10), af C(2), menge N(10,2), storno C(10), filiale C(2) ) *------------------------------------------------------------------------------------------------------------------------ * Daten aus den ASCII-Dateien importieren *------------------------------------------------------------------------------------------------------------------------ ScriptImportFromShdMhs("c_mart", lcImportDir+"mart.asc", "xyz_mart") ScriptImportFromShdMhs("c_mbv", lcImportDir+"mbv.asc", "xyz_mbv") ScriptImportFromShdMhs("c_maufz", lcImportDir+"maufz.asc", "xyz_maufz") *------------------------------------------------------------------------------------------------------------------------ * Artikelstamm bereinigen: Nur Lieferant aus obigem Filter übernehmen *------------------------------------------------------------------------------------------------------------------------ DELETE FROM c_mart WHERE LEFT(artikelnr,LEN(lcLieferant)) != lcLieferant *------------------------------------------------------------------------------------------------------------------------ * Bewegungsdaten bereinigen: Nur oben definierten Zeitbereich übernehmen *------------------------------------------------------------------------------------------------------------------------ DELETE FROM c_mbv WHERE !BETWEEN(datum, ldDatumVon, ldDatumBis) DELETE FROM c_maufz WHERE !BETWEEN(datum, ldDatumVon, ldDatumBis) *------------------------------------------------------------------------------------------------------------------------ * Bewegungsdaten bereinigen: Nur Lieferant aus obigem Filter übernehmen *------------------------------------------------------------------------------------------------------------------------ DELETE FROM c_mbv WHERE LEFT(artikelnr,LEN(lcLieferant)) != lcLieferant DELETE FROM c_maufz WHERE LEFT(artikelnr,LEN(lcLieferant)) != lcLieferant *------------------------------------------------------------------------------------------------------------------------ * Jetzt alle 3 Tabellen miteinander verknüpfen *------------------------------------------------------------------------------------------------------------------------ ScriptLogfile("Daten aus den temporären Tabellen selektieren") SELECT c_mbv.datum, c_mbv.artikelnr, c_mbv.af, c_mbv.auftrag, c_mart.ean, c_mbv.menge ; FROM c_mbv ; INNER JOIN c_mart ON ALLTRIM(c_mbv.artikelnr) == ALLTRIM(c_mart.artikelnr) AND ALLTRIM(c_mbv.af) == ALLTRIM(c_mart.af) ; WHERE !EMPTY(c_mart.ean) ; UNION ALL ; SELECT c_maufz.datum, c_maufz.artikelnr, c_maufz.af, c_maufz.auftrag, c_mart.ean, c_maufz.menge ; FROM c_maufz ; INNER JOIN c_mart ON ALLTRIM(c_maufz.artikelnr) == ALLTRIM(c_mart.artikelnr) AND ALLTRIM(c_maufz.af) == ALLTRIM(c_mart.af) ; WHERE !EMPTY(c_mart.ean) ; INTO CURSOR c_ergebnis NOFILTER READWRITE ScriptLogfile(ALLTRIM(STR(_TALLY))+" Datensätze für das Ergebnis gefunden") *------------------------------------------------------------------------------------------------------------------------ * Ergebnis als Datei exportieren *------------------------------------------------------------------------------------------------------------------------ ScriptExportAsCSV("c_ergebnis", lcExportDatei, ';', '"') * Alternativ: Tab-getrennte Datei ScriptExportAsCSV("c_ergebnis", lcExportDatei, CHR(9), '') * Alternativ: Excel-Datei ScriptExportAsXLS("c_ergebnis", lcExportDatei) *------------------------------------------------------------------------------------------------------------------------ * Ergebnis per Email versenden *------------------------------------------------------------------------------------------------------------------------ ScriptSendByMail("Betreffzeile", "Nachrichtentext", lcExportDatei, "mkahlert@max-pro.de") *------------------------------------------------------------------------------------------------------------------------ * Ergebnis per FTP hochladen *------------------------------------------------------------------------------------------------------------------------ ScriptUploadByFTP(lcExportDatei, "www.server.de", "benutzername", "kennwort", "_transfer/test.txt") *------------------------------------------------------------------------------------------------------------------------ * Ergebnis am Bildschirm anzeigen *------------------------------------------------------------------------------------------------------------------------ SELECT c_ergebnis BROWSE
Kommentare im Script werden immer eingeleitet durch &&
oder *
:
&& Ich bin ein Kommentar * Ich bin ein Kommentar
Variablen werden definiert durch den Variablennamen, ein Ist-Gleich-Zeichen, und den Inhalt der Variablen:
lcImportDir = "C:\Users\mkahlert\Desktop\Daten\"
Text-Variablen (Strings) werden dabei in Anführungszeichen gesetzt, Zahlen ohne Anführungszeichen.
Ein Datumswert kann auf verschiedene Arten definiert werden:
ldDatum1 = {^2013-10-22} ldDatum2 = DATE(2013, 10, 22) ldDatum3 = DATE()
Letztere Variante mittels DATE()
liefert immer das aktuelle Tagesdatum zurück. Alle Daten können auch + oder - verrechnet werden, beispielsweise DATE() - 1
ist das gestrige Datum, DATE() - 7
ist das Datum vor 7 Tagen.
Auch Texte (Strings) können einfach mit +
verkettet werden:
lcExportDatei = "C:\Users\mkahlert\Desktop\Export-" + DTOC(ldDatumVon) + ".txt"
Ist eine Zeile zu lang, kann diese mit einem ;
am Ende der Zeile umgebrochen werden. Dies kann auch zur besseren Strukturierung der Abfragen genutzt werden.
Aufgrund des ;
weiß die Script-Engine, welche Zeilen zusammengehören.
Um einen Wert in ein Logfile zu schreiben, gibt es den Aufruf
ScriptLogfile("Text") ScriptLogfile("Text " + lcVariable)
Für jeden Script-Lauf wird automatisch ein Logfile erzeugt und im Unterverzeichnis \logs des Installationsverzeichnisses abgelegt.
Eine Tabelle wird mit dem Befehl CREATE CURSOR
erstellt:
CREATE CURSOR c_mart ( artikelnr C(10), af C(2), ean C(13) )
c_mart
= Name der temporären Tabelleartikelnr
, af
, ean
)C(10)
= Textfeld (Character) mit 10 Zeichen LängeN(10,2)
= Numerisches Feld mit 10 Stellen, davon 2 Stellen nach dem Komma (9999999,99)D
= DatumsfeldEin Textfeld kann immer nur maximal die Datenmenge aufnehmen, die in der Länge definiert ist. Alle Zeichen, die über diese Länge hinausgehen, werden beim Import abgeschnitten.
Zum Import der Daten steht ein eigener Befehl zur Verfügung:
ScriptImportFromShdMhs("c_mart", lcImportDir+"mart.asc", "xyz_mart")
„c_mart“
ist der Name der temporären Ziel-TabellelcImportDir
und dem Dateinamen „mart.asc“
Analoge Befehle gibt es auch für SHD Ecoro (ScriptImportFromShdEcoro
), Ametras MOEVE Enterprise (ScriptImportFromAmetrasMoeve
), Ametras MOEVE Smart (ScriptImportFromCblTrend
), CBL Warenwirtschaft (ScriptImportFromCbl
) und Bewidata MöbelPilot (ScriptImportFromBewidata
).
Siehe auch Konverter-Einstellungen (amt2txt, cbl2txt, tre2txt, etc.)
Diese temporären Tabellen können nun mit Befehlen nach SQL Syntax bearbeitet und verändert werden.
Der folgende Befehl beispielsweise löscht alle Daten, bei denen die Artikelnummer nicht mit der gewünschten Lieferantennummer beginnt.
DELETE FROM c_mart WHERE LEFT(artikelnr,LEN(lcLieferant)) != lcLieferant
Ähnliches kann auch für den Zeitraum verwendet werden:
DELETE FROM c_mbv WHERE !BETWEEN(datum, ldDatumVon, ldDatumBis)
Mit Hilfe eines SQL SELECT Befehls können nun die einzelnen temporären Tabellen zusammengeführt werden:
SELECT c_mbv.datum, c_mbv.artikelnr, c_mbv.af, c_mbv.auftrag, c_mart.ean, c_mbv.menge ; FROM c_mbv ; INNER JOIN c_mart ON ALLTRIM(c_mbv.artikelnr) == ALLTRIM(c_mart.artikelnr) AND ALLTRIM(c_mbv.af) == ALLTRIM(c_mart.af) ; WHERE !EMPTY(c_mart.ean) ; UNION ALL ; SELECT c_maufz.datum, c_maufz.artikelnr, c_maufz.af, c_maufz.auftrag, c_mart.ean, c_maufz.menge ; FROM c_maufz ; INNER JOIN c_mart ON ALLTRIM(c_maufz.artikelnr) == ALLTRIM(c_mart.artikelnr) AND ALLTRIM(c_maufz.af) == ALLTRIM(c_mart.af) ; WHERE !EMPTY(c_mart.ean) ; INTO CURSOR c_ergebnis NOFILTER READWRITE
Also: Verknüpfe die Barverkäufe (c_mbv
) mit dem Artikelstamm (c_mart
) über Artikelnummer und Ausführung, und filtere dabei nur die Datensätze heraus, bei denen eine EAN angegeben ist (!EMPTY(ean)
). Die gleiche Abfrage wird nun ebenfalls auf die Kaufverträge ausgeführt, und dann mittels UNION ALL
in ein Gesamtergebnis zusammengeführt.
Am Ende wird das neue Ergebnis mittels INTO CURSOR c_ergebnis
in eine neue temporäre Tabelle gespeichert (diese muss nicht vorher mittels CREATE CURSOR
erzeugt werden, sondern wird aufgrund der Abfrage automatisch generiert).
Dieses Ergebnis kann nun verwendet werden, um daraus eine CSV-, Text- oder Excel-Datei zu erzeugen:
ScriptExportAsCSV("c_ergebnis", lcExportDatei, ';', '"', .F.)
Hiermit wird einfach die Tabelle c_ergebnis
in die Datei, deren Dateiname in der Variablen lcExportDatei
definiert ist, exportiert, dazu gilt das Spaltentrennzeichen „;“ und das Texttrennzeichen als Anführungszeichen.
Das Ergebnis sieht also in etwa so aus:
"22.10.2013";"0093206078";" ";"O19715";"4003683489571";"6"
Das Texttrennzeichen (also die Anführungszeichen) können auf weggelassen werden:
ScriptExportAsCSV("c_ergebnis", lcExportDatei, ';', '', .F.)
Daraus ergibt sich:
22.10.2013;0093206078; ;O19715;4003683489571;6
Wird als Spaltentrenner ein Tabulator gewünscht, so kann dieser nicht eingetippt werden, sondern muss stattdessen mittels CHR(9)
(ASCII-Code 9) angegeben werden.
ScriptExportAsCSV("c_ergebnis", lcExportDatei, CHR(9), '', .F.)
Der letzte Parameter (ein logischer Wert, .T. steht für „true“, .F. für „false“) gibt an, ob in der CSV-Datei auch Spaltenüberschriften mit ausgegeben werden sollen.
Für Excel-Dateien lautet der Aufruf:
ScriptExportAsXLS("c_ergebnis", lcExportDatei)
Diese Ergebnisdatei kann nun einfach per Email versendet werden:
ScriptSendByMail("Betreffzeile", "Nachrichtentext", lcExportDatei, "mkahlert@max-pro.de")
Also: Sende eine Email mit dem Betreff „Betreffzeile“ und dem Text „Nachrichtentext“ und dem Dateianhang der Variablen lcExportDatei
an den Empfänger „mkahlert@max-pro.de“. Bei dem Empfänger können auch mehrere Email-Adressen komma-getrennt angegeben werden.
Die Einstellungen zum Email-Versand (also SMTP-Server) finden Sie hier Email-Einstellungen
Schlägt ein Email-Versand fehl, erfolgt keine automatische Wiederholung. In der Logdatei wird eine entsprechende Fehlermeldung mit Details ausgegeben.
Auf ähnliche Art und Weise kann die exportierte Datei auch per FTP verschickt werden:
ScriptUploadByFTP(lcExportDatei, "www.server.de", "benutzername", "kennwort", "verzeichnis/datei.txt")
Also: Nimm die Datei aus der Variablen lcExportDatei
und lade diese auf den Server www.server.de
hoch. Zur Authentifizierung dienen benutzername
und kennwort
, und auf dem Zielserver soll die Datei verzeichnis/datei.txt
heißen.
Das heißt, die Datei kann/darf auf dem FTP-Server einen anderen Dateinamen haben als auf dem lokalen Rechner. Mit Angabe eines Verzeichnisses kann die Datei dabei auch in ein Unterverzeichnis geschoben werden, dieses Verzeichnis kann aber auf Wunsch auch weggelassen werden.
WICHTIG: Auf FTP-Server gilt als Trennzeichen zwischen Verzeichnis und Datei ein Schrägstrich /
, und kein Backslash \
wie unter Windows!
Schlägt ein FTP-Upload fehl, erfolgt keine automatische Wiederholung. In der Logdatei wird eine entsprechende Fehlermeldung mit Details ausgegeben.
Das Script beendet sich automatisch, wenn alle Befehle abgearbeitet sind. Ein besonderer Befehl zum Abschluss ist nicht notwendig.