Kommentiertes Script-Beispiel

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

Kommentare im Script werden immer eingeleitet durch && oder *:

&& Ich bin ein Kommentar
* Ich bin ein Kommentar

Variablen

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"

Lange Zeilen

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.

Logfile-Ausgaben

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.

Erstellen einer temporären Tabelle

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 Tabelle
  • In Klammern dahinter komma-getrennt die definierten Spalten (artikelnr, af, ean)
  • Die Spaltennamen dürfen nur Buchstaben und Zahlen enthalten, und müssen mit einem Buchstaben anfangen
  • Hinter dem Spaltennamen steht der Datentyp
    • C(10) = Textfeld (Character) mit 10 Zeichen Länge
    • N(10,2) = Numerisches Feld mit 10 Stellen, davon 2 Stellen nach dem Komma (9999999,99)
    • D = Datumsfeld

Ein 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.

Import einer Datei aus der Warenwirtschaft

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-Tabelle
  • Es folgt der Dateiname der Quelldatei, hier zusammengesetzt aus dem Importverzeichnis lcImportDir und dem Dateinamen „mart.asc“
  • Als letztes ist der Abschnitt aus der Datei „shd2txt.ini“ angegeben, der für die Konvertierung gelten soll

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 :sieheauch: Konverter-Einstellungen (amt2txt, cbl2txt, tre2txt, etc.)

Datenbereinigung

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)

Daten zusammenführen

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).

Export in eine Text-Datei

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.

Export in eine Excel-Datei

Für Excel-Dateien lautet der Aufruf:

ScriptExportAsXLS("c_ergebnis", lcExportDatei)

Versand via Email

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 :sieheauch: Email-Einstellungen

Schlägt ein Email-Versand fehl, erfolgt keine automatische Wiederholung. In der Logdatei wird eine entsprechende Fehlermeldung mit Details ausgegeben.

Upload per FTP

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.

Ende

Das Script beendet sich automatisch, wenn alle Befehle abgearbeitet sind. Ein besonderer Befehl zum Abschluss ist nicht notwendig.

tools/scriptkonverter/beispielscript-1.txt · Zuletzt geändert: 03.11.2020 02:03 von mkahlert · 2008 Zugriffe bisher