Preislisten umwandeln
Hallo Leute,
Bin neu hier habe ein größeres Problem beim Umwandeln einer Preisliste damit sie in unser Rechnungsprogramm importiert werden kann. Bin durch ne Suche auf euch gestoßen und hoffe Ihr könnt mir ein paar Tipps geben um mein Problem in Zukunft einfacher zu lösen.
Die Datensätze sehen in etwas so aus:
0001902138 Bezeichnung-italiensich BEZ-eng Bez-Deutsch EK-Preis
Daraus weden sollte:
"1902138";"BEZ-Ita";"BEZ-ENG";"BEZ-DEU";"EK-PREIS";"EK+20%Aufschlag"
Die Formatierung der originalen Preisliste ist nur über eine feste Breite. Momentan löse ich das Problem indem ich die Dateien 4-teile (wegen der größe) und dann in excel importiere, exportiere und wieder zusammenfügen.
Dies muss ich mehr oder weniger bei 4 anderen Lieferanten wiederholen und ist schon etwas lästig.
Kann mir irgendjemand einen Rat geben?
Greetz illy
Bin neu hier habe ein größeres Problem beim Umwandeln einer Preisliste damit sie in unser Rechnungsprogramm importiert werden kann. Bin durch ne Suche auf euch gestoßen und hoffe Ihr könnt mir ein paar Tipps geben um mein Problem in Zukunft einfacher zu lösen.
Die Datensätze sehen in etwas so aus:
0001902138 Bezeichnung-italiensich BEZ-eng Bez-Deutsch EK-Preis
Daraus weden sollte:
"1902138";"BEZ-Ita";"BEZ-ENG";"BEZ-DEU";"EK-PREIS";"EK+20%Aufschlag"
Die Formatierung der originalen Preisliste ist nur über eine feste Breite. Momentan löse ich das Problem indem ich die Dateien 4-teile (wegen der größe) und dann in excel importiere, exportiere und wieder zusammenfügen.
Dies muss ich mehr oder weniger bei 4 anderen Lieferanten wiederholen und ist schon etwas lästig.
Kann mir irgendjemand einen Rat geben?
Greetz illy
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 76158
Url: https://administrator.de/contentid/76158
Ausgedruckt am: 20.11.2024 um 06:11 Uhr
25 Kommentare
Neuester Kommentar
Moin illy,
willkommen im Forum.
Lass uns mal klein anfangen, ein paar Infos fehlen ja noch...
Grüße
Biber
willkommen im Forum.
Lass uns mal klein anfangen, ein paar Infos fehlen ja noch...
Die Formatierung der originalen Preisliste ist nur über eine feste Breite.
Jaaaa... das bedeutet genauer gesagt:- die Preislisten bekommst Du als Text-Dateien mit fester Zeilenlänge?
- ohne Trennzeichen zwischen den Feldern?
- aber bei jedem Feld hast Du die Information geht "VonByte"..."BisByte"?
- die Textdateien sind alle in der gleichen Codepage erstellt bzw. es gibt/es gibt nicht Sonderzeichen/Umlaute?
- die Dateinamen folgen einer bestimmten Konvention oder sind jeweils im selben "Import"-Verzeichnis bei Beginn der Aktion oder werden die einzeln ausgewählt je nach Stimmungslage?
- und sollen hinterher verschoben oder umbenannt oder gelöscht werden?
- Import/Datenübernahme ist immer per Knopfdruck oder wenn genau 4 Lieferantendateien vorhanden sind oder immer am 3. des Monats?
- die neu erzeugte(n) Excel-Tabellen(n) überschreiben die alten oder aktualisieren diese oder sind immer Monatsweise neu?
- dein Ziel ist eine Automatisierung aus Excel heraus (z.B. eine Excel-Funktion "Datenübernahme" oder eher ein externes Quelldateien-Aufbereitungstool als Batch/VBSkript?
- der richtige Bereich dafür ist dann, wenn "OffTopic" nicht mehr so richtig passt, dann am ehesten...?
- Dein Rechner/Betriebssystem ist ein Windows-98/2000/XP/Vi$ta? Office 98/2000/2007?
Grüße
Biber
Moin illy,
an ein paar Stellen sehe ich jetzt klarer,an einigen anderen hast Du mich nun doch eher verwirrt.
Grüße
Biber
an ein paar Stellen sehe ich jetzt klarer,an einigen anderen hast Du mich nun doch eher verwirrt.
- Umlaute/Codepages: Ich meinte damit, ob z.B in der "BEZ-DEU", also soweit ich diese Slang-Ausdrücke deuten kann, der "Artikelbezeichnung (deutsch)", ob da auch Umläute enthalten sind/sein dürfen und wenn ja, ob wir uns auf ein ASCII-"ü" oder ein ANSI-ü /DOS oder Windows oder whatever-Zeichensatz einstellen müssen.
- Manuelle und spontane Konvertierung auf Knopfdruck bei Bedarf... okay, dann skripten wir.
- Wenn ich es richtig sehe - das hatte ich vorher nicht so verstanden- ist Excel in dem Prozess gar nicht erforderlich? Die Ziel-Tabellen sollen in myAQL verwaltet werden?
- und den Satz hier habe ich gar nicht verstanden: "Die Preislisten sind alle anderst aufgebaut. aber dieses abändern sollte ja nicht das Problem sein, oder?" Ähhmm... jeder Lieferant liefert ein eigenes Format... ? Ist ja auch okay... aber ist das Format je Lieferant wenigstens konstant von Monat zu Monat? Sonst solltet ihr lieber schnell auf XML-Format umsteigen...
- Und die ZIEL-Tabellenstruktur auf mySQL(Feldtypen/Längen) muss bekannt sein.
- Nett wäre es, wenn Du mal 5 oder 6 Beispielzeilen einer heutigen Textdatei in den Beitrag stellst. Natürlich mit ArtNr "000123456" und nicht mit echten Preisen... aber vom Format erkennbar.
Grüße
Biber
So illy,
damit wir mal einen Anfang haben, hier mal der billigste Ansatz: Batch.
Kann nach dreimaligem Lesen auch ohne jegliche Programmiervorkenntnisse gepflegt und gewartet werden werden.
Da ich heute etwas in Eile bin, werfe ich hier nur schnell eine Skizze und deren Output vor die Füße und lass Dich da alleine dran knabbern...
....also, nicht an den Füßen knabbern, sondern an diesen kryptischen Zeilen...
Stehe aber morgen gerne für Rückfragen bereit.
Output:
Also: es lässt sich mit Batch zerlegen und wie-auch-immer anders formatiert anzeigen.
Grüße
Biber
damit wir mal einen Anfang haben, hier mal der billigste Ansatz: Batch.
Kann nach dreimaligem Lesen auch ohne jegliche Programmiervorkenntnisse gepflegt und gewartet werden werden.
Da ich heute etwas in Eile bin, werfe ich hier nur schnell eine Skizze und deren Output vor die Füße und lass Dich da alleine dran knabbern...
....also, nicht an den Füßen knabbern, sondern an diesen kryptischen Zeilen...
Stehe aber morgen gerne für Rückfragen bereit.
::---------Snipp MiniBestellKonvert.bat ----
@Echo off & setlocal
Set "ImportDateiHeute=E:\lief1dez07.txt"
If not exist "%ImportdateiHeute%" (
echo "%ImportdateiHeute%" existiert nicht. Ich brech gleich ab hier...oder ins Essen.
goto :eof
)
REM Später echo Teilenummer Benennung (ital) Benennung (franz.) Bez. deutsch, ....
:::
for /f "delims=" %%i in (%ImportDateiHeute%) do @set "line=%%i" & call :gibbetAusKommaJetrennt
goto :eof
:gibbetAusKommaJetrennt
REM Entweder so : echo "%line:~ 0,13%"; "%line:~13,50%"; "%line:~63,50%"; "%line:~113,50%"; "%line:~163,50%";"%line:~213,10%" )
REM Oder so:
Set "Teilenummer=%line:~ 0, 13%" && Rem POS 1- 13 Teilenummer
Set "Bez_ITA=%line:~ 13, 50%" && Rem POS 14- 63 Benennung italienisch
Set "BEZ_FRZ=%line:~ 63, 50%" && Rem POS 64-113 Benennung französisch
Set "Bez_ENG=%line:~113, 50%" && Rem POS 114-163 Benennung englisch
Set "BEZ_DEU=%line:~163, 50%" && Rem POS 164-213 Benennung deutsch
:: ########114-213 Benennung deutsch glaub ich nicht
Set "BR_PREIS=%line:~ 214, 10%" && Rem POS 214-225 Bruttopreis
Set "RABATTKZ=%line:~ 226, 2%" && Rem POS 226-227 Rabattkennzeichen
Set "CodCLA=%line:~ 227, 4%" && Rem POS 228-231 CodCLA
Set "Gewicht=%line:~ 231, 7%" && Rem POS 232-238 Gewicht in Gramm
Set "TDR=%line:~ 238, 2%" && Rem POS 239 240 TDR
Set "ArtNrErsatz=%line:~ 240, 13%" && Rem POS 241 253 Ersatz-Artikelnummer
Set "MENGE_MIN=%line:~ 253, 4%" && Rem POS 254-257 Mndestmenge
Echo BEZ_FRZ [%BEZ_FRZ%] TeileNr [%Teilenummer%]
Echo BEZ_ITA [%BEZ_ITA%]
Echo BEZ_ENG [%BEZ_ENG%]
Echo BEZ_DEU [%BEZ_DEU%]
Echo TDR [%TDR%] Gewicht [%Gewicht%]
goto :eof
>e:\minibestellkonvert
BEZ_FRZ [CART.FILTRE AIRE ] TeileNr [0000001908112]
BEZ_ITA [ELEMENTO FILTRO ARIA ]
BEZ_ENG [AIR FILTER CARTRIDGE @@@@@@@@@@]
BEZ_DEU [PATRONE-LUFTFFILTERPATRONE ]
TDR [AF] Gewicht [0000500]
BEZ_FRZ [JOINT BOITE VITESS ] TeileNr [0000001908113]
BEZ_ITA [GUARNI###E PIANA PER CAMBIO ]
BEZ_ENG [FLAT TRANSMISSION GASKET ]
BEZ_DEU [DICHTUNG-FLACHDICHTUNG GETRIEBE ]
TDR [CF] Gewicht [0000039]
BEZ_FRZ [JOINT ] TeileNr [0000001908114]
BEZ_ITA [GUARNI###E ]
BEZ_ENG [GASKET ]
BEZ_DEU [DICHTUNG-DICHTUNG ]
TDR [C ] Gewicht [0000008]
BEZ_FRZ [SUPPORT/APPUI ] TeileNr [0000001908117]
BEZ_ITA [SUPPORTO ]
BEZ_ENG [SUPPORT ]
BEZ_DEU [STUETZE-STUETZE ]
TDR [C ] Gewicht [0000550]
BEZ_FRZ [JEU DE RIDEAU ACC. ] TeileNr [0000001908121]
BEZ_ITA [SERIE TENDINE (ACCESSORI)]
BEZ_ENG [CURTAINS SET (ACCESSORY)]
BEZ_DEU [SATZ-VORHANGSATZ (ZUBEHOER)]
TDR [X ] Gewicht [0001920]
Also: es lässt sich mit Batch zerlegen und wie-auch-immer anders formatiert anzeigen.
Grüße
Biber
Moin illy,
mal sehen, ob wir der Sache näher kommen.
Im Moment ist es ja nur eine "Gucken, ob's so geht"-Skizze (neudeutsch: Proof-of-Concept).
An Geschwindigkeit (wenn das ein Kriterieum sein sollte) können wir noch viel basteln oder auch mit der gleichen Strategie auf ein schnelleres Werkzeug wechseln (z.B. VBSkript).
Einen Fehler hast Du drin, nämlich die Umleitung.
Dort schreibst Du jetzt mit ">preis.csv" immer einer neue Datei "preis.csv".
Wenn Du jeweils die neue Zeile anhängen willst, musst Du ">>preis.csv" schreiben.
Und irgendwo ganz am Anfang "if exist preis.csv del preis.csv", damit Du nicht die Datei vom letzten Import weiter aufblähst.
Lass uns da erstmal die Wichtigkeit der Verarbeitungsgeschwindigkeit klären vorher.
Bitte vorrangig erstmal klären, ob wir bei diesem Bord-Werkzeug "Batch" bleiben, oder ob z.B. VBS eine (erlaubte) Alternative wäre.
Abzuwägen sind, was die in Deiner Situation relevanten Kriterien sind.
Bei Batch, was sicherlich 20x langsamer ist als VBS, ist das Charmante, dass es überall einsetzbar und von Nicht-Programmierern anpassbar ist.
Du kannst es ändern, pflegen, warten. Weil es ja auch nun einen noch kleineren Wortschatz hat als Hansi Hinterseer. Und letzten Endes nur eine Handvoll Zeilen sind.
Und wenn es läuft, läuft es eben auch unbeaufsichtigt und im Hintergrund - dann sollte es zweitrangig sein, ob es 30 Sekunden oder 30 Minuten braucht.
Aber klären musst Du es erstmal für Dich.
Grüße
Biber
P.S. Und erzeuge Dir bitte mal eine 100-Zeilen-Testdatei "Preis100.txt" aus der Original "Preis.txt", bis wir etwas Stabiles er-testet haben.
mal sehen, ob wir der Sache näher kommen.
Im Moment ist es ja nur eine "Gucken, ob's so geht"-Skizze (neudeutsch: Proof-of-Concept).
An Geschwindigkeit (wenn das ein Kriterieum sein sollte) können wir noch viel basteln oder auch mit der gleichen Strategie auf ein schnelleres Werkzeug wechseln (z.B. VBSkript).
Einen Fehler hast Du drin, nämlich die Umleitung.
Dort schreibst Du jetzt mit ">preis.csv" immer einer neue Datei "preis.csv".
Wenn Du jeweils die neue Zeile anhängen willst, musst Du ">>preis.csv" schreiben.
Und irgendwo ganz am Anfang "if exist preis.csv del preis.csv", damit Du nicht die Datei vom letzten Import weiter aufblähst.
Hätte da eh noch 4 Fragen:
1. Hast Du evtl. die Sprungmarke eof vergessesn?
Nein. Das "goto :eof" ist eine Standardfloskel, die die CMD.exe versteht auch ohne Sprungmarke. Bedeutet soviel wie "RETURN" (zum Aufrufer oder zum Betriebssystem1. Hast Du evtl. die Sprungmarke eof vergessesn?
2. Kann man bei der Teilenummer die führenden Nullen irgendwie entfernen?
Ja. Aber das ist im Batch auch nicht soooooo schnell wie mit VBSkript o.ä.Lass uns da erstmal die Wichtigkeit der Verarbeitungsgeschwindigkeit klären vorher.
3. Kann man bei den Teilebezeichungen die Leerstellen entfernen?
Ja. Siehe 2.4. Ist es möglich eine VK-Formel auf den Bruttopreis anzuwenden? So kleiner 5€ 40%, kleiner 50€ 30% kleiner 50 20%?
Auch ja, und auch das kostet Zeit.Bitte vorrangig erstmal klären, ob wir bei diesem Bord-Werkzeug "Batch" bleiben, oder ob z.B. VBS eine (erlaubte) Alternative wäre.
Abzuwägen sind, was die in Deiner Situation relevanten Kriterien sind.
Bei Batch, was sicherlich 20x langsamer ist als VBS, ist das Charmante, dass es überall einsetzbar und von Nicht-Programmierern anpassbar ist.
Du kannst es ändern, pflegen, warten. Weil es ja auch nun einen noch kleineren Wortschatz hat als Hansi Hinterseer. Und letzten Endes nur eine Handvoll Zeilen sind.
Und wenn es läuft, läuft es eben auch unbeaufsichtigt und im Hintergrund - dann sollte es zweitrangig sein, ob es 30 Sekunden oder 30 Minuten braucht.
Aber klären musst Du es erstmal für Dich.
Grüße
Biber
P.S. Und erzeuge Dir bitte mal eine 100-Zeilen-Testdatei "Preis100.txt" aus der Original "Preis.txt", bis wir etwas Stabiles er-testet haben.
Da ich irgendwie auch Mysql gehört habe passt ja eigentlich im idealfall PHP dazu:
<?
$str = "0000001908112ELEMENTO FILTRO ARIA CART.FILTRE AIRE AIR FILTER CARTRIDGE @@@@@@@@@@PATRONE-LUFTFFILTERPATRONE 000000019,20 9AC450000500AF 0001
0000001908113GUARNI###E PIANA PER CAMBIO JOINT BOITE VITESS FLAT TRANSMISSION GASKET DICHTUNG-FLACHDICHTUNG GETRIEBE 000000013,19 7BD200000039CF 0001
0000001908114GUAR/IZ.IO-E JOINT GASKET DICHTUNG-DICHTUNG 000000004,06 5BB990000008C 0001
0000001908117SUPPORTO SUPPORT/APPUI SUPPORT STUETZE-STUETZE 000000015,32 5MC990000550C 0001
0000001908121SERIE TENDINE (ACCESSORI)JEU DE RIDEAU ACC. CURTAINS SET (ACCESSORY)SATZ-VORHANGSATZ (ZUBEHOER)000000156,16 2YB060001920X 0001";
$arraystring=explode("\n",$str);
echo $str;
foreach($arraystring as $v){
if(eregi("([0-9]{13})([-/\.@\(\)[:alpha:] ]{50})([-/\.@\(\)[:alpha:] ]{50})([-/\.@\(\)[:alpha:] ]{50})([-/\.@\(\)[:alpha:] ]{50})([0-9,]{12}) ([0-9]{1})([A-Z0-9]{4})([0-9]{7})([A-Z]{1})([A-Z ]{1}).*([0-9]+)",$v,$regs)){
/*
[1] => 0000001908112
[2] => ELEMENTO FILTRO ARIA
[3] => CART.FILTRE AIRE
[4] => AIR FILTER CARTRIDGE @@@@@@@@@@
[5] => PATRONE-LUFTFFILTERPATRONE
[6] => 000000019,20
[7] => 9
[8] => AC45
[9] => 0000500
[10] => A
[11] => F
[12] => 1
*/
print_r($regs);
}
}
?>
Hallo illy, hallo Biber
@Biber
Das Script ist als Entlastung für Dich gedacht und als nicht als Konkurenz
Und natürlich als die möglicherweise schnellere Alternative für illy.
Wobei durch die gewünschten Konvertierungen das Teil wohl etwas ausgebremst wird.
Aber dass wäre als batch ja auch so.
@illy&Biber
Habe das Script so geschrieben,
dass ein Nicht-VBSler das Ding in den Grundzügen verstehen kann
Und wahrscheinlich auch anpassen&warten kann
Hoffe ich zumindest!
Alle weiteren Info's im Script
@illy
Egal wie Gut das Ding läuft.
Normalerweise sollte man das Teil noch um diverse Prüfungen ergänzen.
z.B. Vorkommen des gewünschten Trennzeichens im Input.
Ich würde immer noch mal ein Auge auf den Output werfen.
Insbeondere auf die letzten Zeilen.
Innerhalb eurer DB würde ich ein Inputtable schaffen,
aus dem erst NACH der Überprüfung des Imports
die Daten in die eigentlichen Tables geschrieben werden.
Insbesondere da ich mich irgendwie des Eindruckes nicht verwehren kann,
dass dieser Lieferant gerade kein ein DB-Crack ist.
Backup der DB vor solchem Massenimport wäre auch keine so schlechte Idee.
Im Script sind noch ein paar Fragen offen bzgl. Deines Verkaufspreises
Habe ihn zur Zeit einfach gleich Ek gesetzt und am ende der Datensätze hinzugefügt
Also erst anpassen
Solltest Du noch Fragen haben einfach melden
ciao pacobay
@illy habe Dir noch orginale Testumgebung als Zip gesendet
Die automatische Formatierung der Beiträge zerstört manchmal die Übersichtlichkeit
viel Erfolg
By the way ich verwende den Freeware Codeeditor PSPAD
macht das VBS-Leben leicher !
http://www.pspad.com/de/
@Biber
Das Script ist als Entlastung für Dich gedacht und als nicht als Konkurenz
Und natürlich als die möglicherweise schnellere Alternative für illy.
Wobei durch die gewünschten Konvertierungen das Teil wohl etwas ausgebremst wird.
Aber dass wäre als batch ja auch so.
@illy&Biber
Habe das Script so geschrieben,
dass ein Nicht-VBSler das Ding in den Grundzügen verstehen kann
Und wahrscheinlich auch anpassen&warten kann
Hoffe ich zumindest!
Alle weiteren Info's im Script
@illy
Egal wie Gut das Ding läuft.
Normalerweise sollte man das Teil noch um diverse Prüfungen ergänzen.
z.B. Vorkommen des gewünschten Trennzeichens im Input.
Ich würde immer noch mal ein Auge auf den Output werfen.
Insbeondere auf die letzten Zeilen.
Innerhalb eurer DB würde ich ein Inputtable schaffen,
aus dem erst NACH der Überprüfung des Imports
die Daten in die eigentlichen Tables geschrieben werden.
Insbesondere da ich mich irgendwie des Eindruckes nicht verwehren kann,
dass dieser Lieferant gerade kein ein DB-Crack ist.
Backup der DB vor solchem Massenimport wäre auch keine so schlechte Idee.
Im Script sind noch ein paar Fragen offen bzgl. Deines Verkaufspreises
Habe ihn zur Zeit einfach gleich Ek gesetzt und am ende der Datensätze hinzugefügt
Also erst anpassen
Solltest Du noch Fragen haben einfach melden
ciao pacobay
' VB Script Document
'Erstellt als helptesk 4 Thread
'[content:76158]
'18.12.2007 19:44:39
'pacobay
'testet on XPP / WSH 5.7 für XP
'target
' Umwandlung von Daten aus einer txtdatei (mit feste Feldgroesse)
' in eine txtdatei von Datensätze mit Trennzeichen
' diverse Feldumwandlungen Trim etc
' Code soll möglichst für Nicht- VBSler zu warten sein
' Nicht- VBSler müssen lediglich die Konstanten (Const) anpassen
' Die Aufteilung der Datensätze in Parts soll es ihm ermöglichen
' die Anzahl der Parts beliebig zu verändern
' via del or copy&paste+laufende Nr anpassen UND OUTPUTSTRING (OutDS)
' unter Umständen Bereich Headline scharfmachen
' Datenkonvertierungen sind ggf. löschenbar
'*********************************************************************
'
Option Explicit
'
'Deklaration der Objekte
Dim WshShell
Set WshShell = Wscript.CreateObject("Wscript.Shell")
'---------------------------
Dim FSO, FileIn, FileOut
Set FSO = CreateObject("Scripting.FileSystemObject")
'---------------------------
'
'Ein paar Variablen für meine Art der Popup Messages
'
DIM strTITELs ' Meldungstitel im Script festgelegt [InBox & PopUp]
DIM strMSGs ' Meldungstexte für Messages [PopUp]
DIM numShowTimeS ' im Script festgelegte Anzeigezeit in sec [PopUp]
DIM numBtnCodeR ' ReturnCode Wert des geklickten Buttons [PopUp]
'
'---------------------------
'
' Diesen Abschnitt(Pfad&Dateiname)ensprechend anpassen
'
Const Input = "C:\just4Test\InputSupp01.txt"
Const Output = "C:\just4Test\OutputSupp01.txt"
'
'---------------------------
' Das Trennzeichen in dem Output definieren ggf. anpassen
'
Const TZ =";" 'Trennzeichen
'---------------------------
Dim AZDs 'Anzahl der verarbeiteten Datensätze
'---------------------------
'
Dim InDS 'InputDatensatz
Dim OutDS 'OutputDatensatz
'---------------------------
'
' Aus Deinem Posting geht hervor:
' 1-13 Teilenummer
' 14-63 Bezeichnung italienisch
' 64-113 Bezeichnung französisch
' 114-213 Bezeichnung deutsch
' 214-225 Bruttopreis
' 226-227 Rabattkennzeichen
' 228-231 CodCLA
' 232-238 Gewicht in Gramm
' 239-240 TDR
' 241-253 Ersatz-Artikelnummer
' 254-257 Mindestmenge
'
'---------------------------
'
'
'
DIM Part01
Const P01Bez = "Teilenummer" 'vgl Exkurs Headline
Const Part01Start = 1
Const Part01Ende = 13
'
DIM Part02
Const P02Bez = "Bezeichnung italienisch"
Const Part02Start = 14
Const Part02Ende = 63
'
DIM Part03
Const P03Bez = "Bezeichnung französisch"
Const Part03Start = 64
Const Part03Ende = 113
'
DIM Part04
Const P04Bez = "Bezeichnung deutsch"
Const Part04Start = 114
Const Part04Ende = 213
'
DIM Part05
Const P05Bez = "Bruttopreis"
Const Part05Start = 214
Const Part05Ende = 225
'
DIM Part06
Const P06Bez = "Rabattkennzeichen"
Const Part06Start = 226
Const Part06Ende = 227
'
DIM Part07
Const P07Bez = "CodCLA"
Const Part07Start = 228
Const Part07Ende = 231
'
DIM Part08
Const P08Bez = "Gewicht in Gramm"
Const Part08Start = 232
Const Part08Ende = 238
'
DIM Part09
Const P09Bez = "TDR"
Const Part09Start = 239
Const Part09Ende = 240
'
DIM Part10
Const P10Bez = "Ersatz-Artikelnummer"
Const Part10Start = 241
Const Part10Ende = 253
'
DIM Part11
Const P11Bez = "Mindestmenge"
Const Part11Start = 254
Const Part11Ende = 257
'
'
'Davon ausgehend, dass Lieferant Nettobreise in Euro liefert
' benötigen man u.U. zur Berechnung des Bruttoverkaufspreises noch
'
Const MwStSatz=19 'der Mehrwertsteuersatz
DIM bVKP 'BruttoVK
'
'Diese Berechnung ist bedingt durch fehlende Infos noch nicht ausgeführt
'
'*********************************************************************
'Ende der Deklaration
'*********************************************************************
'
'
'Einige Hilfsprozeduren
'
'Für Funktion Ersetze
dim SuchString, Suchmuster, ErsatzMuster
' Aufrufbeispiel:
' SuchString= "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern."
' Suchmuster="Taxi"
' ErsatzMuster="Auto"
' WScript.echo Ersetze(SuchString,Suchmuster, ErsatzMuster)
'
'
Function Ersetze(SuchString,Suchmuster, ErsatzMuster)
'
Dim regAusdr ' Variablen erstellen.
Set regAusdr = New RegExp ' Erstellt einen regulären Ausdruck.
regAusdr.Pattern = Suchmuster ' Legt das Suchmuster fest.
regAusdr.IgnoreCase = True ' Ignoriert die Groß-/Kleinschreibung.
regAusdr.Global = True ' Legt globales Anwenden fest.
'
' Führe nun die Ersetzung durch und weise es als Funktionswert zu.
Ersetze=regAusdr.Replace(SuchString,ErsatzMuster)
End Function
'
'-------------------------------------------------------------------
'
SUB CheckInFile
' Püfen ob Inputdatei gefunden werden kann
' if yes then öffnen als Vorbereitung zur weiteren Verarbeitung
' If not Info & Abbruch
'
If fso.FileExists(Input) then
Set FileIn = FSO.OpenTextFile( Input, 1, true)
else
'
numShowTimeS = 0
strTITELs ="Input-Fehler"
strMSGs =+_
"Folgende Datei konnte nicht gefunden werden!" &chr(13)&chr(13)&+_
Input &chr(13)&chr(13)&+_
"Das Script wird abgebrochen"&chr(13)&chr(13)&chr(9)&"Pls check:"&chr(9)&chr(9)&"Inputfile-Konstante (in the script)"&chr(13)&chr(9)&"or:" &chr(9)&chr(9)&"The Input-File himself"
'
WshShell.popup strMSGs,numShowTimeS,strTITELs,16+4096
'
Wscript.Quit
end if
'
END SUB 'CheckInFile
'
'-------------------------------------------------------------------
'
SUB CheckOutFile
'
' Prüfen ob Outputdatei bereits vorhanden ist
' if not weiter mit öffnen der Datei als Vorbereitung zur weiteren Verarbeitung
'
' if there then: Abfrage ob diese gelöscht werden kann Optionen: Ok oder Abbruch
'Option: OK
' dann halt löschen und weiter mit
' öffnen der Datei als Vorbereitung zur weiteren Verarbeitung
'
'Option: Abbrechen
'Abbruch
'
'
If fso.FileExists(Output) then
numShowTimeS = 0
strTITELs ="Check 4 OutputFile"
strMSGs =+_
"Die vorgesehene Output Datei ist bereitsvorhanden!" &chr(13)&chr(13)&+_
Output &chr(13)&chr(13)&+_
"Kann die Datei gelöscht werden?"&chr(13)&chr(13)&chr(9)&"OK:"&chr(9)&chr(9)&"delete and go on"&chr(13)&chr(9)&"Abbrechen:" &chr(9)&"Scriptende"
'
numBtnCodeR=WshShell.popup(strMSGs,numShowTimeS,strTITELs,1+32+4096)
'
'
'Auswertung des Geklickten
'
SELECT CASE numBtnCodeR
CASE 1 ' OK
fso.DeleteFile(Output)
Wscript.sleep 5000 'gibt dem Script etwas Zeit
Wscript.echo "file should be killed"
'
CASE 2 ' Abbrechen
Wscript.echo "Abbruch durch Anwender"
Wscript.Quit
END SELECT
'
else
' Na dann gehts einfach weiter
end if
'
' öffnen der Datei als Vorbereitung zur weiteren Verarbeitung
'
Set FileOut = fso.OpenTextFile( output,8,true)
'
'---------------------------
'
'Exkurs
'Unter bestimmten Umständen kann eine Feldbezeichnungskopfzeile gewünscht werden
'Diese wird hier zwar erstellt aber nicht umgesetzt da im Thread nicht benötigt
'Einfach als Vorgriff für allgemeine Verwendbarkeit
' Daher zur Zeit auskommentiert
' Achtung als 12ter Wert ist noch der BruttoVerkaufspreis (bVKP) angefügt
' DIM HEADLINE
' HEDLINE=P01Bez&TZ&P02Bez&TZ&P03Bez&TZ&P04Bez&TZ&P05Bez&TZ&P06Bez&TZ&P07Bez&TZ&P08Bez&TZ&P09Bez&TZ&P10Bez&TZ&P11Bez&TZ&"bVKP"&TZ
' FileOut.WriteLine(HEADLINE) 'schreibt OutDs in Outputfile
'
'
END SUB 'CheckInFile
'-------------------------------------------------------------------
'-------------------------------------------------------------------
'-------------------------------------------------------------------
'Der eigentliche ArbeitsSUB
'-------------------------------------------------------------------
SUB DoTheWork
'Der InputFile (FileIn) wurde schon unter CheckInFile geöffnet
' bis InputFile zu Ende ist, immer weiter machen
Do While Not (FileIn.atEndOfStream)
InDS = FileIn.Readline ' eine Zeile lesen und als Datensatz DS verwenden
'----------------------
'NUN wir der jeweilige inDS in seine Bestandteile (parts01 bis 11) zerlegt
' Die Ergebnisse habe ich zumeist zusätzlich "getrimmt"
' TRIM
' gibt eine Kopie einer Zeichenfolge zurück, die keine führenden Leerzeichen
' (LTrim), keine nachgestellten Leerzeichen (RTrim) oder weder führende noch
' nachgestellte Leerzeichen (Trim) enthält.
part01 = trim (right(Left(inDS,part01Ende),part01ENDE-part01Start+1))
'__________
' Part01 fertig aber gleich noch die gewünschte Veränderung des Inhaltes.
'Kann man bei der Teilenummer die führenden Nullen irgendwie entfernen?
'Ja wie folgt:
Do until Left(part01,1)<>"0"
part01=right(part01,len(Part01)-1)
loop
'__________
'__________
'Weiter mit den nächsten Parts
part02 = trim (right(Left(inDS,part02Ende),part02ENDE-part02Start+1))
part03 = trim (right(Left(inDS,part03Ende),part03ENDE-part03Start+1))
part04 = trim (right(Left(inDS,part04Ende),part04ENDE-part04Start+1))
'__________
' Wieder gleich noch die gewünschte Veränderung des Inhaltes.
' Kann man bei den Teilebezeichungen die Leerstellen entfernen?
' schönen Gruß an den Hersteller seine Datenübergabe ist sch...
' Aber klagen hilft wohl nichts und daher Rückgriff auf die Funktion Ersetze
Suchmuster = chr(32)&chr(32) ' zwei Leerstellen
ErsatzMuster = chr(32) ' eine Leerstellen
Dim i
i=0
Do until i=50
part02= Ersetze(part02,Suchmuster, ErsatzMuster)
part03= Ersetze(part03,Suchmuster, ErsatzMuster)
part04= Ersetze(part04,Suchmuster, ErsatzMuster)
i=i+1
loop
'__________
'__________
'Bruttopreis (Einkauf)
'Abweichend kein Trim sondern CCur-Funktion
'Gibt einen Ausdruck zurück, der in einen Wert vom Typ Variant
'mit Untertyp Currency konvertiert wurde.
part05 = CCur (right(Left(inDS,part05Ende),part05ENDE-part05Start+1))
'__________
'Thema Verkaufspreis
' Wscript.echo part05 'nur zu Testzwecken
'Deine Frage war: Ist es möglich eine VK-Formel auf den Bruttopreis anzuwenden? So kleiner 5€ 40%, kleiner 50€ 30% kleiner 50 20%?
' Habe verstanden Du wolltest auch noch einen Verkaufspreis in Abhängigkeit des EKpreises berechnen
' zur Umsetzung Zusatzinformationen notwendig
' Einkauspreise wirklich brutto ungewöhlich but if so: enthaltender MwStsatz?
' Verkaufswert Brutto or netto or beides
' Formel für Verkaufspreisfestlegung
'zur Zeit einfach
bVKP = part05
' Nur als Beispielsansatz wie mit diesen Infos weitergearbeitet würde
'Beispiele für allg. SELECT CASE
'SELECT CASE bVKP
' ' ist BruttoVK = 5?
' CASE 5
'bVKP=part05
' ' ist bVKP zwischen 5 und 10?
' ' Die kleinere Zahl muss zuerst angegeben werden
' CASE 5 TO 10
' ' ist bVKP größer als 5?
' CASE IS > 5
' END SELECT
'
'__________
'
'
part06 = trim (right(Left(inDS,part06Ende),part06ENDE-part06Start+1))
part07 = trim (right(Left(inDS,part07Ende),part07ENDE-part07Start+1))
part08 = trim (right(Left(inDS,part08Ende),part08ENDE-part08Start+1))
part09 = trim (right(Left(inDS,part09Ende),part09ENDE-part09Start+1))
part10 = trim (right(Left(inDS,part10Ende),part10ENDE-part10Start+1))
'
'
'__________
'
part11 = trim (right(Left(inDS,part11Ende),part11ENDE-part11Start+1))
'
'__________
'
'Die Mindestbestellmenge hat wie Teilenummer führenden Nullen
' also auch weg damit
Do until Left(part11,1)<>"0"
part11=right(part11,len(Part11)-1)
loop
'__________
'__________
'
'
' Nun erfolgt Die Zusammenstellung des Übergabestrings
'
' Der Übergabesrting habbe ich in recht primitiver Form zusammengestellt
' Aber durch diese Art der Übergabe kannst Du auch als Nicht-Vbsler
' die Reihenfolge leicht anpassen.
' Je nachdem in welcher Reihenfolge Sie für den Import verwendet werden sollen
' Auf die Verbindung mit TZ dem Trennzeichen achten!
'
' Achtung als 12ter Wert ist noch der BruttoVerkaufspreis angefügt
'
OutDS=part01&TZ&part02&TZ&part03&TZ&part04&TZ&part05&TZ&part06&TZ&part07&TZ&part08&TZ&part09&TZ&part10&TZ&part11&TZ&bVKP&TZ
'
'Und wegschreiben
FileOut.WriteLine(outDS) 'schreibt OutDs in Outputfile
'
'_______________
'
'Noch die Anzahl um eins erhöhen rein zu Statistikzwecken
AzDs=AZDs+1
'
'_______________
'
loop ' und weiter zur und dann auf zur nächsten Input-Zeile
'
'
END SUB 'DoTheWork
'
'-------------------------------------------------------------------
'-------------------------------------------------------------------
'
'
' Noch ein kleiner HilfSUB Um das Ende anzuzeigen
'
SUB Fertig
WScript.Echo "Ich habe fertig!" &Chr(13)&Chr(13)&+_
"Anzahl der verarbeiteten Zeilen: "&AzDs
END SUB 'Fertig
'
'
'-------------------------------------------------------------------
'
'Ein MainSUB um die einzelnen SUBs aufzurufen
'
SUB MAIN
CheckInFile
CheckOutFile
DoTheWork
Fertig
END SUB
'
'-------------------------------------------------------------------
'
'Der letzendliche Aufruf des ganzen Tralala
'
MAIN
'
'-------------------------------------------------------------------
'
' EOF
@illy habe Dir noch orginale Testumgebung als Zip gesendet
Die automatische Formatierung der Beiträge zerstört manchmal die Übersichtlichkeit
viel Erfolg
By the way ich verwende den Freeware Codeeditor PSPAD
macht das VBS-Leben leicher !
http://www.pspad.com/de/
Moin alle,
na, das fängt ja richtig an Spaß zu machen...
Dann haben bald richtig viele gute Lösungsskizzen, die ja durchaus ihren eigenen Charme haben.
Wäre schade, wenn die Skizze von #intuz# unter den Tisch fällt, nur weil pacobays und meine viel länger und beeindruckender aussehen.
Eher der Vollständigkeit möchte ich auch noch die Batch-Variante ergänzen um zwei Rand-Funktionen, nämlich um die Entfernung der trailing blanks bei den "Teilebezeichnungen" und die Entfernung der leading blanks der Teilenummer.
Wenn etwas Schnelleres als Batch verwendet werden kann, würde ich natürlich das nehmen.
Grüße
Biber
na, das fängt ja richtig an Spaß zu machen...
Dann haben bald richtig viele gute Lösungsskizzen, die ja durchaus ihren eigenen Charme haben.
Wäre schade, wenn die Skizze von #intuz# unter den Tisch fällt, nur weil pacobays und meine viel länger und beeindruckender aussehen.
Eher der Vollständigkeit möchte ich auch noch die Batch-Variante ergänzen um zwei Rand-Funktionen, nämlich um die Entfernung der trailing blanks bei den "Teilebezeichnungen" und die Entfernung der leading blanks der Teilenummer.
::---------Snipp MiniBestellKonvert.bat ----
@Echo off & setlocal
Set "ImportDateiHeute=preise.txt"
If not exist "%ImportdateiHeute%" (
echo "%ImportdateiHeute%" existiert nicht. Ich brech gleich ab hier...oder ins Essen.
goto :eof
)
REM Später echo Teilenummer Benennung (ital) Benennung (franz.) Bez. deutsch, ....
:::
for /f "delims=" %%i in (%ImportDateiHeute%) do @set "line=%%i" & call :gibbetAusKommaJetrennt
goto :eof
:gibbetAusKommaJetrennt
REM Entweder so : echo "%line:~ 0,13%"; "%line:~13,50%"; "%line:~63,50%"; "%line:~113,50%"; "%line:~163,50%";"%line:~213,10%" )
REM Oder so:
Set "Teilenummer=%line:~ 0, 13%" && Rem POS 1- 13 Teilenummer
Set "Bez_ITA=%line:~ 13, 50%" && Rem POS 14- 63 Benennung italienisch
Set "BEZ_FRZ=%line:~ 63, 50%" && Rem POS 64-113 Benennung französisch
Set "Bez_ENG=%line:~113, 50%" && Rem POS 114-163 Benennung englisch
Set "BEZ_DEU=%line:~163, 50%" && Rem POS 164-213 Benennung deutsch
:: ########114-213 Benennung deutsch glaub ich nicht
Set "BR_PREIS=%line:~ 214, 10%" && Rem POS 214-225 Bruttopreis
Set "RABATTKZ=%line:~ 226, 2%" && Rem POS 226-227 Rabattkennzeichen
Set "CodCLA=%line:~ 227, 4%" && Rem POS 228-231 CodCLA
Set "Gewicht=%line:~ 231, 7%" && Rem POS 232-238 Gewicht in Gramm
Set "TDR=%line:~ 238, 2%" && Rem POS 239 240 TDR
Set "ArtNrErsatz=%line:~ 240, 13%" && Rem POS 241 253 Ersatz-Artikelnummer
Set "MENGE_MIN=%line:~ 253, 4%" && Rem POS 254-257 Mndestmenge
:: Nebenrechnung I: die BEZ_xxx-Felder RTrimmen
For %%i in (BEZ_ITA BEZ_FRZ BEZ_ENG BEZ_DEU) do call :Char50ToVarChar %%i
::Nebenrechnung II - Führende Nullen der Teilenummer entfernen
call :CutLeadingZeros Teilenummer
:: Echo "%Teilenummer%";"%BEZ_ITA%";"%BEZ_FRZ%";"%BEZ_ENG%";"%BEZ_DEU%";"%BR_PREIS%";"%RABATTKZ%";"%CodCLA%";"%Gewicht%";"%TDR%";"%ArtNrErsatz%";"%MENGE_MIN%" >preis.csv
Echo BEZ_FRZ [%BEZ_FRZ%] TeileNr [%Teilenummer%]
Echo BEZ_ITA [%BEZ_ITA%]
Echo BEZ_ENG [%BEZ_ENG%]
Echo BEZ_DEU [%BEZ_DEU%]
Echo TDR [%TDR%] Gewicht [%Gewicht%]
goto :eof
:Char50ToVarchar Parameter1ist der Name der Variablen z.B BEZ_FRZ
Setlocal enableDelayedExpansion
Set "Charvar=!%1!" & Set "len="
for /L %%i in (1,1,50) do if "!Charvar:~-%%i,1!" NEQ " " if not defined len set /a len=51-%%i
if defined len Set "Charvar=!Charvar:~0,%len%!"
endlocal & set "%1=%Charvar%"
goto :eof
:CutLeadingZeros
Setlocal enableDelayedExpansion
Set "Charvar=!%1!" & Set "Start="
For /L %%i in (0,1,13) do if "!Charvar:~%%i,1!" NEQ "0" if not defined Start set /a start=%%i
if defined Start Set "Charvar=!Charvar:~%start%!"
endlocal & set "%1=%Charvar%"
goto :eof
Wenn etwas Schnelleres als Batch verwendet werden kann, würde ich natürlich das nehmen.
Grüße
Biber
@Biber hast recht macht immer mehr Spass
@ #intuz# Wo bleibst Du? Du hängst hinterher! Auf Auf
Hallo illy,
Ok offensichtlich doch nicht so einfach für nicht vbs'ler
Dachte das Ding würde für sich selbst sprechen.
Schade & Sorry 4U
Code mit Copy &paste in einen einfachen editor einfügen
Dann eventuell notwendige Anpassungen an deine Umgebung machen
(Was und Wie wird gleich noch in "Anpassungen der Feinsteuerung" beschrieben)
Wenn Du die Anpassungen gemacht hast, dann das Script einfach abspeichern.
(beipielsweise unter WandelPreislisteV0x.vbs
V03 steht für Version drei des scriptes (kommende Version))
Ablageort praktisch egal
In der Nähe von Input/output wäre aber sinnvoll
Aber mehr unter dem Gesichtspunkt übersichtlichkeit
Innerhalb des Scriptes gibt es am Anfang einen Bereich Deklaration
innerhalb dieses Bereiches findest Du
Dies solltest Du entsprechend deinen Erfordernissen anpassen
unter Umständen noch anpassen TZ
Trennzeichen ist das Zeichen das im Output die Felder voneiander trennt
Der Bereich Feldbeschreibung (INput)
und folgende P02 ff ist entsprechend Deinen Vorgaben umgesetzt.
Exkurs
Vorbereitung für andere Lieferanten
Habe ich versucht sehr übersichtlich zu gestalten,
damit Du später einmal es relativ einfach auf einen anderen Lieferanten
anpassen kannst.
Wenn es mehr oder weniger Felder geben sollte,
dann wäre sogar durch einfaches auskommentieren bzw. mit Cut&Paste plus lfdNr ändern
recht schnell Anpassungen möglich.
Zusätzlich wäre natürlich entsprechend der Output (HEADLINE & OutDS) anzupassen
vgl.: die Zeilen im Script
Auch relativ leicht möglich ist es dort die Reihenfolge der Felder in der Übergabe anzupassen
ENDE EXKURS
Neu hinzugefügt habe ich in V03 der neuen Variante (kommt noch)
'Soll eine Headline ausgegeben werden JA = 1 Nein = 0
Const HeadlineYesNo = 0
der Defaultwert ist 0 also keine 1. Zeile mit den Feldnammen
Habe auch neu in V03 eingefügt:
'Sollen Leerstellen in den Teilebeschreibungen entfernt werden
Const LSdeleteYN = 0 'JA = 1 Nein = 0
Erklärung im Abschnitt Performance
'Thema Verkaufspreis (in V03)
' Formel für Verkaufspreisfestlegung
'kleiner 5€ 40%, kleiner 50€ 30% und größer 50€ 20%
'Habe hierfür einen Sub geschrieben damit Du es einfacher anpassen kannst
Bitte einmal überprüfen ob umgesetzt wie gewünscht. ggf ändern
Bzgl. Performance
Ist langsamer als Biber's Batch
Das geht natürlich ganz und gar nicht!
Aber habe einiges mehr an Prüfungen und Feldanpassungen integriert
Beispielsweise prüft das script erstmal ob input-datei gefunden wird
Dann ob Outputfile schon vorhanden ist, wenn dann Abfrage obgelöscht werden kann
während des löschens warte ich 5 sec damit die datei sicher gelöscht wurde
dann erst wird die neue outputdatei geöffnet und das Thema Headline wird abgehandelt
erst dann folgt die eigentliche Arbeit im SUB DoTheWork
Bei kleinem Input ich habe beispielsweise z.Zt nur 20 Zeilen
dauert der Vorlauf länger als die Abarbeitung
Die eigentliche Arbeit wird innerhalb des SUB DoTheWork gemacht.
Dieser wird durch die Umwandlung der Felder etwas abgebremst
(führende Nullen bei Teilenummer etc)
Aber das eigentliche Problem ist das entfernen der Leerzeichen
innerhalb der Teilebeschreibung
Die ist suboptimal bzgl. Performance
Habe diesbezüglich eine Thread eröffnet der hoffentlich eine schneller Alternative bringt
vgl.:
doppelte Leerstellen innerhalb einem string entfernen VBS
'---------------------------
Habe mal gerade ausgetestet mit 1000 zeilen 1:45 mit Leerstellen entfernen
einfacher client also rund 10 DS /sec
Dagegen ohne Leerstellen praktisch direkt jeweils gemessen nach file killed ok
Bei bei 10 Tsd DS ohne Leerstellen unter 2 sec @Biber Meep Meep
Habe daher in V03 eingefügt:
'Sollen Leerstellen in den Teilebeschreibungen entfernt werden
Const LSdeleteYN = 0 'JA = 1 Nein = 0
Und somit die Entfernung der Leerstellen erstmal per default auf No gestellt
Kannst Du also selber steuern ob ja oder nein
'---------------------------
Bzgl:Die Formatierung ist nicht ganz korrekt
Verstehe ich nicht?
Mir zumindest zur Zeit noch unerkärlich, denn normalerweise sind da gar keine Hochkomma vorhanden
aktuell in output bei mir z.B.
Könnte es sein, dass im Input Hochkomma sind?
'---------------------------
Soweit zum aktuellen Sachstand
ciao pacobay
PS das Script V03 will ich nochmal etwas später durchlesen
Ist so eine Angewohnheit erstmal etwas Abstand und dann nochmal drüberschauen
Natürlich werde ich es dann dann sofort mailen
PSPS wie man unschwer erkennen kann habe ich mich mal an den Formatierungen versucht.
und dies wenig glücklich
sorry hoffe es ist trotzdem lesbar
PSPSPS YEAH Bastla Hat gerade eine Antwort bzgl. Leerstellen geantwortet werde ich direkt umsetzten das kann nur gut sein
@ #intuz# Wo bleibst Du? Du hängst hinterher! Auf Auf
Hallo illy,
Ok offensichtlich doch nicht so einfach für nicht vbs'ler
Dachte das Ding würde für sich selbst sprechen.
Schade & Sorry 4U
Denn mal einige zusätzliche Erklärungen:
(Aktuell liegt im Thread die Version V02 des sriptes vor)
Code mit Copy &paste in einen einfachen editor einfügen
Dann eventuell notwendige Anpassungen an deine Umgebung machen
(Was und Wie wird gleich noch in "Anpassungen der Feinsteuerung" beschrieben)
Wenn Du die Anpassungen gemacht hast, dann das Script einfach abspeichern.
(beipielsweise unter WandelPreislisteV0x.vbs
V03 steht für Version drei des scriptes (kommende Version))
Ablageort praktisch egal
In der Nähe von Input/output wäre aber sinnvoll
Aber mehr unter dem Gesichtspunkt übersichtlichkeit
Aufruf einfach mit Doppelklick
alternativ via start /ausführen mit
C:\WINDOWS\system32\wscript.exe "C:\just4Test\WandelPreislisteV02.vbs"
zumeist geht auch
wscript.exe "C:\just4Test\WandelPreislisteV02.vbs"
Natürlich Pfade entsprechend deiner Ablage anpassen
alternativ via start /ausführen mit
C:\WINDOWS\system32\wscript.exe "C:\just4Test\WandelPreislisteV02.vbs"
zumeist geht auch
wscript.exe "C:\just4Test\WandelPreislisteV02.vbs"
Natürlich Pfade entsprechend deiner Ablage anpassen
Anpassungen der Feinsteuerung
(Habe das Script so angelegt, daß Du für den aktuellen Fall
nur einige wenige Konstanten (Const) ändern mußt.)
nur einige wenige Konstanten (Const) ändern mußt.)
Innerhalb des Scriptes gibt es am Anfang einen Bereich Deklaration
innerhalb dieses Bereiches findest Du
Const Input = "C:\just4Test\InputSupp01.txt"
Const Output = "C:\just4Test\OutputSupp01.txt"
Const TZ =";" 'Trennzeichen
Der Bereich Feldbeschreibung (INput)
Const P01Bez = "Teilenummer"
Const Part01Start = 1
Const Part01Ende = 13
Exkurs
Vorbereitung für andere Lieferanten
Habe ich versucht sehr übersichtlich zu gestalten,
damit Du später einmal es relativ einfach auf einen anderen Lieferanten
anpassen kannst.
Wenn es mehr oder weniger Felder geben sollte,
dann wäre sogar durch einfaches auskommentieren bzw. mit Cut&Paste plus lfdNr ändern
recht schnell Anpassungen möglich.
Zusätzlich wäre natürlich entsprechend der Output (HEADLINE & OutDS) anzupassen
vgl.: die Zeilen im Script
HEADLINE=P01Bez&TZ&P02Bez&TZ&P03Bez&TZ&P04Bez&TZ&P05Bez&TZ&P06Bez&TZ&P07Bez&TZ&P08Bez&TZ&P09Bez&TZ&P10Bez&TZ&P11Bez&TZ&"bVKP"&TZ
OutDS=part01&TZ&part02&TZ&part03&TZ&part04&TZ&part05&TZ&part06&TZ&part07&TZ&part08&TZ&part09&TZ&part10&TZ&part11&TZ&bVKP&TZ
ENDE EXKURS
Neu hinzugefügt habe ich in V03 der neuen Variante (kommt noch)
'Soll eine Headline ausgegeben werden JA = 1 Nein = 0
Const HeadlineYesNo = 0
der Defaultwert ist 0 also keine 1. Zeile mit den Feldnammen
'Sollen Leerstellen in den Teilebeschreibungen entfernt werden
Const LSdeleteYN = 0 'JA = 1 Nein = 0
Erklärung im Abschnitt Performance
'Thema Verkaufspreis (in V03)
' Formel für Verkaufspreisfestlegung
'kleiner 5€ 40%, kleiner 50€ 30% und größer 50€ 20%
'Habe hierfür einen Sub geschrieben damit Du es einfacher anpassen kannst
SUB createbVKP
bVKP=part05
if bVKP <5 then bVKP = CCur (bVKP * 1.4)
if bVKP >= 5 and bVKP < 50 then bVKP = CCur (bVKP * 1.3)
if bVKP >= 50 then bVKP = CCur (bVKP * 1.2)
END SUB 'createbVKP
Bitte einmal überprüfen ob umgesetzt wie gewünscht. ggf ändern
So das ist alles was du in diesem Script drehen kannst solltest
Ende der notwendigen bzw. möglichen Änderungen im Script
Bzgl. Performance
Ist langsamer als Biber's Batch
Das geht natürlich ganz und gar nicht!
Aber habe einiges mehr an Prüfungen und Feldanpassungen integriert
Beispielsweise prüft das script erstmal ob input-datei gefunden wird
Dann ob Outputfile schon vorhanden ist, wenn dann Abfrage obgelöscht werden kann
während des löschens warte ich 5 sec damit die datei sicher gelöscht wurde
dann erst wird die neue outputdatei geöffnet und das Thema Headline wird abgehandelt
erst dann folgt die eigentliche Arbeit im SUB DoTheWork
Bei kleinem Input ich habe beispielsweise z.Zt nur 20 Zeilen
dauert der Vorlauf länger als die Abarbeitung
Die eigentliche Arbeit wird innerhalb des SUB DoTheWork gemacht.
Dieser wird durch die Umwandlung der Felder etwas abgebremst
(führende Nullen bei Teilenummer etc)
Aber das eigentliche Problem ist das entfernen der Leerzeichen
innerhalb der Teilebeschreibung
Die ist suboptimal bzgl. Performance
Habe diesbezüglich eine Thread eröffnet der hoffentlich eine schneller Alternative bringt
vgl.:
doppelte Leerstellen innerhalb einem string entfernen VBS
'---------------------------
Habe mal gerade ausgetestet mit 1000 zeilen 1:45 mit Leerstellen entfernen
einfacher client also rund 10 DS /sec
Dagegen ohne Leerstellen praktisch direkt jeweils gemessen nach file killed ok
Bei bei 10 Tsd DS ohne Leerstellen unter 2 sec @Biber Meep Meep
Habe daher in V03 eingefügt:
'Sollen Leerstellen in den Teilebeschreibungen entfernt werden
Const LSdeleteYN = 0 'JA = 1 Nein = 0
Und somit die Entfernung der Leerstellen erstmal per default auf No gestellt
Kannst Du also selber steuern ob ja oder nein
'---------------------------
Bzgl:Die Formatierung ist nicht ganz korrekt
Verstehe ich nicht?
Mir zumindest zur Zeit noch unerkärlich, denn normalerweise sind da gar keine Hochkomma vorhanden
aktuell in output bei mir z.B.
Teilenummer;Bezeichnung italienisch;Bezeichnung französisch;Bezeichnung deutsch;Bruttopreis;Rabattkennzeichen;CodCLA;Gewicht in Gramm;TDR;Ersatz-Artikelnummer;Mindestmenge;bVKP;
1908112;ELEMENTO FILTRO ARIA;CART.FILTRE AIRE;AIR FILTER CARTRIDGE @@@@@@@@@@PATRONE-LUFTFFILTERPATRONE;19,2;9;AC45;0000500;AF;;1;24,96;
'---------------------------
Soweit zum aktuellen Sachstand
ciao pacobay
PS das Script V03 will ich nochmal etwas später durchlesen
Ist so eine Angewohnheit erstmal etwas Abstand und dann nochmal drüberschauen
Natürlich werde ich es dann dann sofort mailen
PSPS wie man unschwer erkennen kann habe ich mich mal an den Formatierungen versucht.
und dies wenig glücklich
sorry hoffe es ist trotzdem lesbar
PSPSPS YEAH Bastla Hat gerade eine Antwort bzgl. Leerstellen geantwortet werde ich direkt umsetzten das kann nur gut sein
Warte noch einen kleinen Moment
setzte die Infos aus dem anderen Thread gerade um
das Ding von Bastla läuft super performant
Aber das mit den Hochkommas habe ich immer noch nicht ganz verstanden
Alle Datensätze in Hochkomma einschließen?
Alle Felder zusätzlich in Hochkomma??
wäre technisch kein Problem
Aber i.A. steht das beim dem Inport für handelt sich um stringwerte (Text)
Keine Unterscheidung zwischen beispielsweise:
integer ganzahl (Mindestbestellmenge TeileNummer)
string text z.B. teilebezeichnungen
Preise Cur Währung also besondere Zahl ??
Gibt da sonst häufig Probleme Komma bzw Punkt 1.25 € oder 1,25 €
aber wie auch immer
Dein Script ist gleich fertig
muß aber noch testen und dann Testteile rausnehmen
15-bis 30 min
ciao pacobay
setzte die Infos aus dem anderen Thread gerade um
das Ding von Bastla läuft super performant
Aber das mit den Hochkommas habe ich immer noch nicht ganz verstanden
Alle Datensätze in Hochkomma einschließen?
Alle Felder zusätzlich in Hochkomma??
wäre technisch kein Problem
Aber i.A. steht das beim dem Inport für handelt sich um stringwerte (Text)
Keine Unterscheidung zwischen beispielsweise:
integer ganzahl (Mindestbestellmenge TeileNummer)
string text z.B. teilebezeichnungen
Preise Cur Währung also besondere Zahl ??
Gibt da sonst häufig Probleme Komma bzw Punkt 1.25 € oder 1,25 €
aber wie auch immer
Dein Script ist gleich fertig
muß aber noch testen und dann Testteile rausnehmen
15-bis 30 min
ciao pacobay
Moin illy,
diese Brutto-Aufschlagsformel lässt sich im der Batch-Variante auch schmerzfrei nachrüsten.
Dazu folgendes (sinngemäß) im Batch nachrüsten:
Erst einen Bugfix: Ändere Zeile
...denn insgesamt hätte dieses "Feld" ja 12 Stellen Länge, nicht 10
Den lassen wir aber ganz weg
Wir zerlegen diesen Zahlen-als-Text-mit-führenden Nullen in 2 Zahlen (vor dem Komma und Nachkommastellen).
Ist nötig, da im Batch nicht mit Nachkommastellen gearbeitet werden kann.
Diese Werte BR_inCent und BR_MitAufschlag kannst Du dann weiterreichen an die CSV-Datei.
Entweder als Zahlen oder wieder zerlegt in VK/NK-Stellen
Grüße
Biber
diese Brutto-Aufschlagsformel lässt sich im der Batch-Variante auch schmerzfrei nachrüsten.
Dazu folgendes (sinngemäß) im Batch nachrüsten:
Erst einen Bugfix: Ändere Zeile
Set "BR_PREIS=%line:~ 214, 10%" && Rem POS 214-225 Bruttopreis
zumindest gedanklich inSet "BR_PREIS=%line:~ 214, 12%" && Rem POS 214-225 Bruttopreis
...denn insgesamt hätte dieses "Feld" ja 12 Stellen Länge, nicht 10
Den lassen wir aber ganz weg
Wir zerlegen diesen Zahlen-als-Text-mit-führenden Nullen in 2 Zahlen (vor dem Komma und Nachkommastellen).
Ist nötig, da im Batch nicht mit Nachkommastellen gearbeitet werden kann.
:: Ganz oben bei den allgemeinen SETs
SET /a OneBillion=1000000000
....
:: Neu statt der Zeile SET BR_PREIS= ..." oben:
SET "BR_VK=1%line:~ 214, 9%"
SET "BR_NK=1%line:~ 224, 2%"
:: dann sieht der Wert %BR_VK% so aus: "1000000015" bei einem Eintrag "000000015,32"
set /a br_vk=br_vk-onebillion
SET /a br_nk=br_nk-100
:: jetzt hat br_vk den Wert 15 (als Zahl) und br_nk den Wert 32 als Zahl
Set /a BR_inCent=(100*br_vk) + br_nk
:. jetzt hat br_inCent den Wert 1532
::Standard-Aufschlag 40%....
Set /a Aufschlag=140
if BR_incent GEQ 500 set /a "Aufschlag=130"
if BR_incent GEQ 5000 set /a "Aufschlag=120"
Set /a Br_MitAufschlag=(br_incent*Aufschlag) / 100
:: ergibt bei einem Wert von 1532--> (1532*130)/100 = 1991
:. ...
Diese Werte BR_inCent und BR_MitAufschlag kannst Du dann weiterreichen an die CSV-Datei.
Entweder als Zahlen oder wieder zerlegt in VK/NK-Stellen
Grüße
Biber
Hallo Leute,
hat doch etwas länger gedauert hatte zwischenzeitlich Mist gebaut.
Aber nun glaube ich: Ich habe fertig!
Hat mir bisher viel Spass gemacht und habe auch was dabei gelernt!
'-------------------------------------------------------------------
Nun werden durch den SUB DoTheWork
10 TSd Datensätze in unter 10 sekunden verarbeitet meep meep :-)
Bastla sei Dank
'--------------
Daher auch folgende Änderung:
'Sollen Leerstellen in den Teilebeschreibungen entfernt werden
Const LSdeleteYN = 1 'JA = 1 Nein = 0
' Ist auf default ja (1) gesetzt da nun kein Problem mehr
' Im Prinzip benötigen wir den Schalter nicht mehr
' Aber wo er schon mal da ist
'-------------------------------------------------------------------
Das mit den Hochkommas habe ich gelassen
By the way
Datensatz steht i.A. für die ganze Datenzeile
der aus verschiedenen Feldern Feldern besteht.
'-------------------------------------------------------------------
'-------------------------------------------------------------------
@illy
Meine Güte, sollte nur ein einfache Script werden un keine Hightech Programm, aber danke das Dich so ins Zeug legst.
Danke für die Blumen!
Aber von wegen einfaches Script, hier wird nur Qualität geliefert
Und deshalb Just 4 fun auch noch ein GNU-Copyright beigefügt
in der Art:
Copyright (C) 2007 by
bastla, biber, illy79, pacobay
You can find us @administrator.de
We wrote this for educational purpose and just 4 fun
Now we distributed it in the hope that it will be useful for You
It is distributed under the terms of the GNU General Public License
blabla
Kannst Du unter Main einfach auskommentieren
Viel Spass & Erfolg
pacobay
PS. Sollte noch Fragen vorhanden sein und Tread geschlossen auch PM möglich
Denke da an Anpassung für andere Lieferanten
Aber kann ich nichts versprechen, verfüge leider nicht immer über soviel Zeit
'-------------------------------------------------------------------
Aktuelles Script ist WandelPreislisteV06.vbs
(V03+V04+04 werden nicht mehr veröffentlicht sind veraltet)
'-------------------------------------------------------------------
' VB Script Document
'Erstellt als helptesk 4 Thread
'[content:76158]
'ergänzender Tread
' [content:76371]
'20.12.2007 11:35:05
'pacobay
'testet on XPP / WSH 5.7 für XP
'target
' Umwandlung von Daten aus einer txtdatei (mit feste Feldgroesse)
' in eine txtdatei von Datensätze mit Trennzeichen
' diverse Feldumwandlungen Trim etc
' Code soll möglichst für Nicht- VBSler zu warten sein
' Nicht- VBSler müssen lediglich die Konstanten (Const) anpassen
' Die Aufteilung der Datensätze in Parts soll es ihm ermöglichen
' die Anzahl der Parts beliebig zu verändern
' via del or copy&paste+laufende Nr anpassen UND OUTPUTSTRING (OutDS)
' unter Umständen Bereich Headline scharfmachen
' Datenkonvertierungen sind ggf. löschenbar
'*********************************************************************
'
Option Explicit
'
'Deklaration der Objekte
Dim WshShell
Set WshShell = Wscript.CreateObject("Wscript.Shell")
'---------------------------
Dim FSO, FileIn, FileOut
Set FSO = CreateObject("Scripting.FileSystemObject")
'---------------------------
'
'Ein paar Variablen für meine Art der Popup Messages
'
DIM strTITELs ' Meldungstitel im Script festgelegt [InBox & PopUp]
DIM strMSGs ' Meldungstexte für Messages [PopUp]
DIM numShowTimeS ' im Script festgelegte Anzeigezeit in sec [PopUp]
DIM numBtnCodeR ' ReturnCode Wert des geklickten Buttons [PopUp]
'objCRPopUp
'---------------------------
'
' Diesen Abschnitt(Pfad&Dateiname)ensprechend anpassen
'
Const Input = "C:\just4Test\InputSupp10000.txt"
Const Output = "C:\just4Test\OutputSupp01.txt"
'
'---------------------------
' Das Trennzeichen in dem Output definieren ggf. anpassen
'
Const TZ =";" 'Trennzeichen
'---------------------------
Dim Headline
'Soll eine Headline ausgegeben werden JA = 1 Nein = 0
Const HeadlineYesNo = 1
'Thema: Headline
'Unter bestimmten Umständen kann eine Kopfzeile mit den Feldbezeichnungen gewünscht werden
' Achtung als 12ter Wert ist noch der BruttoVerkaufspreis (bVKP) angefügt
'
'---------------------------
'Sollen Leerstellen in den Teilebeschreibungen entfernt werden
Const LSdeleteYN = 1 'JA = 1 Nein = 0
' Ist auf default ja (1) gesetzt da nun kein Problem mehr dank Bastla
' Im Prinzip benötigen wir den Schalter nicht mehr
' Aber wo er schon mal da ist
'---------------------------
Dim AZDs 'Anzahl der verarbeiteten Datensätze
'---------------------------
'
Dim InDS 'InputDatensatz
Dim OutDS 'OutputDatensatz
'---------------------------
'
' Aus Deinem Posting geht hervor:
' 1-13 Teilenummer
' 14-63 Bezeichnung italienisch
' 64-113 Bezeichnung französisch
' 114-213 Bezeichnung deutsch
' 214-225 Bruttopreis
' 226-227 Rabattkennzeichen
' 228-231 CodCLA
' 232-238 Gewicht in Gramm
' 239-240 TDR
' 241-253 Ersatz-Artikelnummer
' 254-257 Mindestmenge
'
'---------------------------
'
'
'
DIM Part01
Const P01Bez = "Teilenummer"
Const Part01Start = 1
Const Part01Ende = 13
'
DIM Part02
Const P02Bez = "Bezeichnung italienisch"
Const Part02Start = 14
Const Part02Ende = 63
'
DIM Part03
Const P03Bez = "Bezeichnung französisch"
Const Part03Start = 64
Const Part03Ende = 113
'
DIM Part04
Const P04Bez = "Bezeichnung deutsch"
Const Part04Start = 114
Const Part04Ende = 213
'
DIM Part05
Const P05Bez = "Bruttopreis"
Const Part05Start = 214
Const Part05Ende = 225
'
DIM Part06
Const P06Bez = "Rabattkennzeichen"
Const Part06Start = 226
Const Part06Ende = 227
'
DIM Part07
Const P07Bez = "CodCLA"
Const Part07Start = 228
Const Part07Ende = 231
'
DIM Part08
Const P08Bez = "Gewicht in Gramm"
Const Part08Start = 232
Const Part08Ende = 238
'
DIM Part09
Const P09Bez = "TDR"
Const Part09Start = 239
Const Part09Ende = 240
'
DIM Part10
Const P10Bez = "Ersatz-Artikelnummer"
Const Part10Start = 241
Const Part10Ende = 253
'
DIM Part11
Const P11Bez = "Mindestmenge"
Const Part11Start = 254
Const Part11Ende = 257
'
'
DIM bVKP ' BruttoVK ist im Output zusäzlich als
' letzter Wert hinzugefügt
'
'
'*********************************************************************
'Ende der Deklaration
'*********************************************************************
'Thema Verkaufspreis
' Formel für Verkaufspreisfestlegung
'kleiner 5€ 40%, kleiner 50€ 30% und größer 50€ 20%
'Habe hieefür einen Sub geschrienen damit Du es einfacher anpassen kannst
SUB createbVKP
bVKP=part05
if bVKP <5 then bVKP = CCur (bVKP * 1.4)
if bVKP >= 5 and bVKP < 50 then bVKP = CCur (bVKP * 1.3)
if bVKP >= 50 then bVKP = CCur (bVKP * 1.2)
END SUB 'createbVKP
'*********************************************************************
'
'Einige Hilfsprozeduren
'
'für Funktion Ersetze
dim objRA, SuchString, Suchmuster, ErsatzMuster
Suchmuster = " +" ' zwei Leerstellen
ErsatzMuster = " " ' eine Leerstellen
Function Ersetze(SuchString,Suchmuster, ErsatzMuster)
'
SET objRA = new RegExp
objRA.pattern = Suchmuster ' Legt das Suchmuster fest.
objRA.Global = True ' Legt globales Anwenden fest.
'
' Führe nun die Ersetzung durch und weise es als Funktionswert zu.
Ersetze=objRA.Replace(SuchString,ErsatzMuster)
End Function
'
'-------------------------------------------------------------------
'
SUB CheckInFile
' Püfen ob Inputdatei gefunden werden kann
' if yes then öffnen als Vorbereitung zur weiteren Verarbeitung
' If not Info & Abbruch
'
If fso.FileExists(Input) then
Set FileIn = FSO.OpenTextFile( Input, 1, true)
else
'
numShowTimeS = 0
strTITELs ="Input-Fehler"
strMSGs =+_
"Folgende Datei konnte nicht gefunden werden!" &chr(13)&chr(13)&+_
Input &chr(13)&chr(13)&+_
"Das Script wird abgebrochen"&chr(13)&chr(13)&chr(9)&"Pls check:"&chr(9)&chr(9)&"Inputfile-Konstante (in the script)"&chr(13)&chr(9)&"or:" &chr(9)&chr(9)&"The Input-File himself"
'
WshShell.popup strMSGs,numShowTimeS,strTITELs,16+4096
'
Wscript.Quit
end if
'
END SUB 'CheckInFile
'
'-------------------------------------------------------------------
'
SUB CheckOutFile
'
' Prüfen ob Outputdatei bereits vorhanden ist
' if not weiter mit öffnen der Datei als Vorbereitung zur weiteren Verarbeitung
'
' if there then: Abfrage ob diese gelöscht werden kann Optionen: Ok oder Abbruch
'Option: OK
' dann halt löschen und weiter mit
' öffnen der Datei als Vorbereitung zur weiteren Verarbeitung
'
'Option: Abbrechen
'Abbruch
'
'
If fso.FileExists(Output) then
numShowTimeS = 0
strTITELs ="Check 4 OutputFile"
strMSGs =+_
"Die vorgesehene Output Datei ist bereitsvorhanden!" &chr(13)&chr(13)&+_
Output &chr(13)&chr(13)&+_
"Kann die Datei gelöscht werden?"&chr(13)&chr(13)&chr(9)&"OK:"&chr(9)&chr(9)&"delete and go on"&chr(13)&chr(9)&"Abbrechen:" &chr(9)&"Scriptende"
'
numBtnCodeR=WshShell.popup(strMSGs,numShowTimeS,strTITELs,1+32+4096)
'
'
'Auswertung des Geklickten
'
SELECT CASE numBtnCodeR
CASE 1 ' OK
fso.DeleteFile(Output)
Wscript.sleep 5000 'gibt dem Script etwas Zeit
Wscript.echo "file should be killed"
'
CASE 2 ' Abbrechen
Wscript.echo "Abbruch durch Anwender"
Wscript.Quit
END SELECT
'
else
' Na dann gehts einfach weiter
end if
'
' öffnen der Datei als Vorbereitung zur weiteren Verarbeitung
'
Set FileOut = fso.OpenTextFile( output,8,true)
'
'---------------------------
'
END SUB 'CheckInFile
'
'-------------------------------------------------------------------
SUB WriteHead
if HeadlineYesNo = 1 then
'
HEADLINE=P01Bez&TZ&P02Bez&TZ&P03Bez&TZ&P04Bez&TZ&P05Bez&TZ&P06Bez&TZ&P07Bez&TZ&P08Bez&TZ&P09Bez&TZ&P10Bez&TZ&P11Bez&TZ&"bVKP"&TZ
FileOut.WriteLine(HEADLINE) 'schreibt OutDs in Outputfile
'
else
WScript.echo "No Headline"
END IF
END SUB 'WriteHead
'-------------------------------------------------------------------
'-------------------------------------------------------------------
'Der eigentliche ArbeitsSUB
'-------------------------------------------------------------------
SUB DoTheWork
'Der InputFile (FileIn) wurde schon unter CheckInFile geöffnet
' bis InputFile zu Ende ist, immer weiter machen
Do While Not (FileIn.atEndOfStream)
InDS = FileIn.Readline ' eine Zeile lesen und als Datensatz DS verwenden
'----------------------
'NUN wir der jeweilige inDS in seine Bestandteile (parts01 bis 11) zerlegt
' Die Ergebnisse habe ich zumeist zusätzlich "getrimmt"
' TRIM
' gibt eine Kopie einer Zeichenfolge zurück, die keine führenden Leerzeichen
' (LTrim), keine nachgestellten Leerzeichen (RTrim) oder weder führende noch
' nachgestellte Leerzeichen (Trim) enthält.
part01 = trim (right(Left(inDS,part01Ende),part01ENDE-part01Start+1))
'__________
' Part01 fertig aber gleich noch die gewünschte Veränderung des Inhaltes.
'Kann man bei der Teilenummer die führenden Nullen irgendwie entfernen?
'Ja wie folgt:
Do until Left(part01,1)<>"0"
part01=right(part01,len(Part01)-1)
loop
'__________
'__________
'Weiter mit den nächsten Parts
part02 = trim (right(Left(inDS,part02Ende),part02ENDE-part02Start+1))
part03 = trim (right(Left(inDS,part03Ende),part03ENDE-part03Start+1))
part04 = trim (right(Left(inDS,part04Ende),part04ENDE-part04Start+1))
'__________
' Wieder gleich noch die gewünschte Veränderung des Inhaltes.
' Kann man bei den Teilebezeichungen die Leerstellen entfernen?
'__________
if LSdeleteYN=1 then
part02= Ersetze(part02,Suchmuster, ErsatzMuster)
part03= Ersetze(part03,Suchmuster, ErsatzMuster)
part04= Ersetze(part04,Suchmuster, ErsatzMuster)
END IF
'__________
'
'Bruttopreis (Einkauf)
'Abweichend kein Trim sondern CCur-Funktion
'Gibt einen Ausdruck zurück, der in einen Wert vom Typ Variant
'mit Untertyp Currency konvertiert wurde.
'
part05 = CCur (right(Left(inDS,part05Ende),part05ENDE-part05Start+1))
'
'__________
'
'Thema Verkaufspreis
'
createbVKP 'ruft den SUB createbVKP auf
'
'__________
'
'
part06 = trim (right(Left(inDS,part06Ende),part06ENDE-part06Start+1))
part07 = trim (right(Left(inDS,part07Ende),part07ENDE-part07Start+1))
part08 = trim (right(Left(inDS,part08Ende),part08ENDE-part08Start+1))
part09 = trim (right(Left(inDS,part09Ende),part09ENDE-part09Start+1))
part10 = trim (right(Left(inDS,part10Ende),part10ENDE-part10Start+1))
'__________
'
part11 = trim (right(Left(inDS,part11Ende),part11ENDE-part11Start+1))
'
'__________
'
' Die Mindestbestellmenge hat wie Teilenummer führenden Nullen
' also auch weg damit
Do until Left(part11,1)<>"0"
part11=right(part11,len(Part11)-1)
loop
'__________
'__________
'
'
' Nun erfolgt Die Zusammenstellung des Übergabestrings
'
' Der Übergabesrting habbe ich in recht primitiver Form zusammengestellt
' Aber durch diese Art der Übergabe kannst Du auch als Nicht-Vbsler
' die Reihenfolge leicht anpassen.
' Je nachdem in welcher Reihenfolge Sie für den Import verwendet werden sollen
' Auf die Verbindung mit TZ dem Trennzeichen achten!
'
' Achtung als 12ter Wert ist noch der BruttoVerkaufspreis angefügt
'
OutDS=part01&TZ&part02&TZ&part03&TZ&part04&TZ&part05&TZ&part06&TZ&part07&TZ&part08&TZ&part09&TZ&part10&TZ&part11&TZ&bVKP&TZ
'
'Und wegschreiben
FileOut.WriteLine(outDS) 'schreibt OutDs in Outputfile
'
'_______________
'
'Noch die Anzahl um eins erhöhen rein zu Statistikzwecken
AzDs=AZDs+1
'
'_______________
'
loop ' und weiter zur und dann auf zur nächsten Input-Zeile
'
'
END SUB 'DoTheWork
'
'-------------------------------------------------------------------
'-------------------------------------------------------------------
'
'
' Noch ein kleiner HilfSUB Um das Ende anzuzeigen
'
SUB Fertig
WScript.Echo "Ich habe fertig!" &Chr(13)&Chr(13)&+_
"Anzahl der verarbeiteten Zeilen: "&AzDs
END SUB 'Fertig
'
'
'-------------------------------------------------------------------
'
'Ein MainSUB um die einzelnen SUBs aufzurufen
'
SUB MAIN
Copyright
CheckInFile
CheckOutFile
WriteHead
DoTheWork
Fertig
END SUB
'Der letzendliche Aufruf des ganzen Tralala
'
MAIN
'
'-------------------------------------------------------------------
' Just 4 fun auch noch ein Copyright
' Kannst Du einfach unter Main auskommentieren
SUB Copyright
DIM objCRPopUp 'Das ja notwendige Objekt
set objCRPopUp = WScript.CreateObject("WScript.Shell")
Dim msg
' ------------------------------------------------------------------------
msg= chr(9) & "Copyright (C) 2007 by" & chr(13)&chr(9)& "bastla, biber, illy79, pacobay" & chr(13) & +_
chr(9) & "You can find us @administrator.de" & chr(13) & chr(13) +_
"We wrote this for educational purpose and just 4 fun. " & chr(13) &+_
"Now we distributed it in the hope that it will be useful for You." & chr(13)& chr(13) +_
chr(9) & chr(9) & " ____________"& chr(13)& chr(13)& chr(13) +_
"It is distributed under the terms of the GNU General Public License." & chr(13) & chr(13) +_
"And under those terms You have a royalty-free right to use, modify,"& chr(13) +_
"reproduce and distribute the Files (and/or any modified version) in" &chr(13)+_
"any way You find useful!" & chr(13)& chr(13) +_
"Provided that in doing so, You agree that we gives no warranty," & chr(13) +_
"or has any obligations or liability. Even without the implied warranty of" & chr(13) +_
"merchantability or fitness for a particular purpose." & chr(13)& chr(13) +_
chr(9) & chr(9) & " ____________"& chr(13)& chr(13)& chr(13) +_
"See the GNU General Public License for more details published by the Free" & chr(13) +_
"Software Foundation; either version 2 of the License, or (at your option)" & chr(13) +_
"any later version."& chr(13)& chr(13)+_
"You should have received a copy of the GNU General Public License" & chr(13) +_
"along with this program; if not, write to the Free Software Foundation," & chr(13) +_
"Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA."
' ------------------------------------------------------------------------
objCRPopUp.Popup msg,0,"Copyright",64+4096
END SUB 'Copyright
'
'-------------------------------------------------------------------
'
' EOF
@illy79
Nach Deiner Beschreibung gibt es nicht eine BEZ_ENG in Länge 50 und eine BEZ_DEU in Länge 50, sondern nur eine BEZ_DEU in Länge 100.
Siehe die Zeile mit "glaub ich nicht" in meinen Batch-Varianten.
Und pacobay hat den Fehler extra dringelassen, um zu prüfen, ob Du den Code verstanden hast und selbst anpassen kannst.
Grüße
Biber
....Eng und Deutsch fehlt Trennzeichen in der Output.
Könnte daran liegen, dass sich pacobay an Deine Input-Format-Spezifikation gehalten hat und ich nicht. Bei pacobay gibt es kein "englisch".Nach Deiner Beschreibung gibt es nicht eine BEZ_ENG in Länge 50 und eine BEZ_DEU in Länge 50, sondern nur eine BEZ_DEU in Länge 100.
Siehe die Zeile mit "glaub ich nicht" in meinen Batch-Varianten.
Und pacobay hat den Fehler extra dringelassen, um zu prüfen, ob Du den Code verstanden hast und selbst anpassen kannst.
Grüße
Biber
Hallo an alle hier!
Da ich mich nun schon so unverhofft im Copyright wiederfinde, sollte ich vielleicht auch wirklich noch etwas beitragen ...
In der aktuellen Fassung des "SUB createbVKP" fehlt mir das Abtrennen der einzelnen Preisstufen, wodurch der etwas unschöne Effekt entstehen könnte, dass etwa bei einem EPreis von EUR 40,00 ein VPreis von EUR 62,40 ermittelt würde - Erklärung dafür: Nach dem Aufschlag von 30 % (auf EUR 40,00) beträgt der Wert der Variablen bVKP 52 (und ist somit > 50), daher kommen dann ganz fröhlich nochmals 20 % dazu - kein Problem, wenn's der Markt hergibt , ansonsten aber vielleicht besser
oder (wie bei Biber) nur den Zuschlagsatz anhand der Preisstufe festlegen und die Preisberechnung danach ausführen.
Noch als Anmerkung: Wenn's nicht VBS wäre, hätte ich natürlich für ein "Select Case" plädiert, aber leider...
Grüße
bastla
P.S.: @pacobay - Was Du da treibst, fällt definitiv nicht unter meine persönliche Definition von "Scripting" (da kommen ua Merkmale wie "quick" und "dirty" vor) - insofern ist der Thread völlig zu Recht vorausschauend unter "Entwicklung" erstellt worden.
Respect
Da ich mich nun schon so unverhofft im Copyright wiederfinde, sollte ich vielleicht auch wirklich noch etwas beitragen ...
In der aktuellen Fassung des "SUB createbVKP" fehlt mir das Abtrennen der einzelnen Preisstufen, wodurch der etwas unschöne Effekt entstehen könnte, dass etwa bei einem EPreis von EUR 40,00 ein VPreis von EUR 62,40 ermittelt würde - Erklärung dafür: Nach dem Aufschlag von 30 % (auf EUR 40,00) beträgt der Wert der Variablen bVKP 52 (und ist somit > 50), daher kommen dann ganz fröhlich nochmals 20 % dazu - kein Problem, wenn's der Markt hergibt , ansonsten aber vielleicht besser
SUB createbVKP
bVKP=part05
If bVKP <5 Then
bVKP = CCur (bVKP * 1.4)
ElseIf bVKP < 50 Then
bVKP = CCur (bVKP * 1.3)
Else
bVKP = CCur (bVKP * 1.2)
End If
END SUB 'createbVKP
Noch als Anmerkung: Wenn's nicht VBS wäre, hätte ich natürlich für ein "Select Case" plädiert, aber leider...
Grüße
bastla
P.S.: @pacobay - Was Du da treibst, fällt definitiv nicht unter meine persönliche Definition von "Scripting" (da kommen ua Merkmale wie "quick" und "dirty" vor) - insofern ist der Thread völlig zu Recht vorausschauend unter "Entwicklung" erstellt worden.
Respect
Guten Morgen alle,
nun will ich doch auch noch ein paar allgemeine Anmerkungen zu diesem Thread loswerden.
Erstens: ein sehr schöner Thread - ich denke, der könnte einigen anderen nützen.
Vor allem, weil es hier mehr um schrittweise Annäherung und Auflösung eines erstmal komplexen Sachverhalts geht - eben um Entwicklung.
Weil ich auch so einen Verlauf vermutete, habe ich damals diesen Thread von "Off Topic" hierher verschoben.
Sehr schön finde auch illy79s letzten Kommentar, den ich frei übersetzen möchte mit:
"Vielen Dank, bitte nicht weiter dran Perfektionieren - ich habe jetzt einen Lösungsansatz und damit ist es gut."
@illy79
Noch drei Punkte, die ich in der Praxis nie, nie, nie tun würde:
Aber wie es bei uns Entwicklern so schön heißt: "Das kommt im nächsten Release."
Also nochmals: allen Beteiligten vielen Dank für diesen Thread.
Grüße
Biber
nun will ich doch auch noch ein paar allgemeine Anmerkungen zu diesem Thread loswerden.
Erstens: ein sehr schöner Thread - ich denke, der könnte einigen anderen nützen.
Vor allem, weil es hier mehr um schrittweise Annäherung und Auflösung eines erstmal komplexen Sachverhalts geht - eben um Entwicklung.
Weil ich auch so einen Verlauf vermutete, habe ich damals diesen Thread von "Off Topic" hierher verschoben.
Sehr schön finde auch illy79s letzten Kommentar, den ich frei übersetzen möchte mit:
"Vielen Dank, bitte nicht weiter dran Perfektionieren - ich habe jetzt einen Lösungsansatz und damit ist es gut."
@illy79
Noch drei Punkte, die ich in der Praxis nie, nie, nie tun würde:
- nie würde ich zu importierende Daten manipulieren (von Zeichensatz-Konvertierung oder nötigen Feldtyp-Anpassungen, z.B. Datumswerten abgesehen). Sowohl die Inhalts-Änderung der Bezeichnungsfelder, also das Herausnehmen von Leerzeichen zwischen einzelnen Worten wie auch das Dazumogeln des "VK_mit_Aufschlag" mit einem eigenen Algorithmus - gehört für mich definitiv nicht zu einem Prozessschritt "Übernahme/Import von Fremd-Daten".
- ebenfalls niemals würde ich, wenn denn doch eine Datenbank dahinterhängt, irgendwelche "Berechne VK als EK *Aufschlag"-Berechnungen mit einem Skript machen lassen. Genau für solche Aufgaben habe ich den Krams doch in einer Datenbank, damit ich nicht eine Textdatei analysieren, interpretieren und in pro Zeile in 20 Hilfsvariablen packen muss.
- und ich würde niemals die Inputdatei-Struktur, die Feldbeschreibungen/Feldoffsets hart verdrahtet im Sourcecode halten, sondern diese Daten aus einer "Importfile-Strukturdatei" lesen. So dass der Code auch weiterverwendbar ist, wenn mal ein anderer/geänderter Satzaufbau verarbeitet wird.
Aber wie es bei uns Entwicklern so schön heißt: "Das kommt im nächsten Release."
Also nochmals: allen Beteiligten vielen Dank für diesen Thread.
Grüße
Biber