illy79
Goto Top

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

Content-Key: 76158

Url: https://administrator.de/contentid/76158

Printed on: April 24, 2024 at 16:04 o'clock

Member: Biber
Biber Dec 17, 2007 at 12:59:45 (UTC)
Goto Top
Moin illy,

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
Member: illy79
illy79 Dec 17, 2007 at 13:51:53 (UTC)
Goto Top
Hi,

willkommen im Forum.
Danke

* die Preislisten bekommst Du als
Text-Dateien mit fester Zeilenlänge?
Jepp.

* ohne Trennzeichen zwischen den Feldern?
Genau.

* aber bei jedem Feld hast Du die
Information geht
"VonByte"..."BisByte"?
hab ich. Und wenn nicht erkennt man es auch sofort face-wink

* die Textdateien sind alle in der gleichen
Codepage erstellt bzw. es gibt/es gibt nicht
Sonderzeichen/Umlaute?
Da bin ich nicht sicher was Du meinst. Was meinst mit Codepage? Die Preislisten sind alle anderst aufgebaut. aber dieses abändern sollte ja nicht das Problem sein, oder?

* 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?
Die Importdateien muss ich mir immer herunterladen und entpacken. Je nach Stimmung ges Lieferanten würde ich sagen.

* 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?
Per Knopfdruck, mehr oder weniger. Bei manchen nicht an einem bestimmten Tag sondern wie sie fertig sind.

* die neu erzeugte(n) Excel-Tabellen(n)
überschreiben die alten oder
aktualisieren diese oder sind immer
Monatsweise neu?
Ist mir nicht so wichtig. Die Preislisten sind eigentlich immer neu, aber unser Rechnungsprogramm erkennt ja die Änderungen.

* dein Ziel ist eine Automatisierung aus
Excel heraus (z.B. eine Excel-Funktion
"Datenübernahme" oder eher ein
externes Quelldateien-Aufbereitungstool als
Batch/VBSkript?
ein externes Aufbereitungstool wäre klasse. Aber eine Datenübernahme per Excel in eine MySQL Datenbank wäre natürlich noch besser. Suchte aber eigenlicht nur nach einen Weg dies ohne immer über soviel Zusatzarbeit erledigen zu können.

* der richtige Bereich dafür ist dann,
wenn "OffTopic" nicht mehr so
richtig passt, dann am ehesten...?
Sorry, wenns im falschen Bereich ist, wußte nicht so richtig wohin damit und hatte wohl auch nicht alle Bereiche gesehn

* Dein Rechner/Betriebssystem ist ein
Windows-98/2000/XP/Vi$ta? Office
98/2000/2007?
Win XP, Office XP

Greetz illy
Member: Biber
Biber Dec 17, 2007 at 14:37:19 (UTC)
Goto Top
Moin illy,

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
Member: illy79
illy79 Dec 17, 2007 at 17:38:57 (UTC)
Goto Top
Hi,


* 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.
Aha, also von einem Lieferanten sind sie ohne Umlaute und vom anderen mit. Ja den Slang verstehste richtig.


* 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?
Ja Excel ist nicht nötig. Excel hatte ich genutzt um das gewollte Format bis jetzt zu erhalten. Ist aber natürlich sehr zeitaufwendig, wie gesagt, teilen, excel einlesen, aufschlag, zusammenfügen importieren.
Super wäre es natürlich direkt einen Import in die MySQL Datenbank per Script, aber dies ist wohl zu aufwändig, denke ich.

* 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...
Ja die Formate sind bis jetzt zumidest gleich und denke das werden sie vorläufig auch bleiben.

* Und die ZIEL-Tabellenstruktur auf
mySQL(Feldtypen/Längen) muss bekannt
sein.
?? Da hab ich jetz keine Ahnung was Du damit meinst. Unser Rechnungsprogramm importiert ja die Daten sobald im richtigen CSV Format.

* 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.
Ja klar mach ich.

Lieferant 1:
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
0000001908114GUARNI###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
1-13       Teilenummer
14-63     Benennung italienisch
64-113   Benennung französisch
114-213 Benennung deutsch
214-225 Bruttopreis
226-227 Rabattkennzeichen
228-231 CodCLA
232-238 Gewicht in Gramm
239        TDR
241-253 Ersatz-Artikelnummer
254-257 Mndestmenge
So sollte diese Zeilen aussehen damit sie verarbeitet werden können:
"1908112";"ELEMENTO FILTRO ARIA";"CART.FILTRE AIRE";"AIR FILTER CARTRIDGE @@@@@@@@@@";"PATRONE-LUFTFFILTERPATRONE";"19,20";"9";"AC45";"500";"A";"F";"1"
"1908113";"GUARNI###E PIANA PER CAMBIO";"JOINT BOITE VITESS";"FLAT TRANSMISSION GASKET";"DICHTUNG-FLACHDICHTUNG GETRIEBE";"13,19";"7";"BD20";"39";"C";"F";"1"

Dieses F bei Ersatz-Teilenummer bedeutet ersatzlos ausgelaufen. Die Stelle ist manchmal leer und manchmal wie ne normale Artikelnummer belegt.


Für Lieferant Nr.2 muss ich die Satzbeschreibung erst anfragen. War ich wohl etwas zu vorlaut.

Greetz illy
[Edit Biber] Auf umformatiert. [/Edit]
Member: Biber
Biber Dec 17, 2007 at 19:04:46 (UTC)
Goto Top
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...face-wink
....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
Output:
>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
Member: illy79
illy79 Dec 18, 2007 at 06:51:41 (UTC)
Goto Top
Hi,

Wow das ging schnell. Danke. Werde mal probieren es abzuändern sobald ich Zeit habe.

Vielen Dank schonmal. Man sieht so einfach kanns sein.

Greetz illy
Member: illy79
illy79 Dec 18, 2007 at 08:29:10 (UTC)
Goto Top
HI,

also hab jetzt versucht das abzuändern, aber irgendwie hängt er sich auf.
::---------Snipp MiniBestellKonvert.bat ----
@Echo off & setlocal
Set "ImportDateiHeute=preis.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 "%Teilenummer%";"%BEZ_ITA%";"%BEZ_FRZ%";"%BEZ_ENG%";"%BEZ_DEU%";"%BR_PREIS%";"%RABATTKZ%";"%CodCLA%";"%Gewicht%";"%TDR%";"%ArtNrErsatz%";"%MENGE_MIN%" >preis.csv  
REM Echo BEZ_FRZ [%BEZ_FRZ%] TeileNr [%Teilenummer%]
REM Echo BEZ_ITA [%BEZ_ITA%] 
REM Echo BEZ_ENG [%BEZ_ENG%] 
REM Echo BEZ_DEU [%BEZ_DEU%] 
REM Echo TDR [%TDR%] Gewicht [%Gewicht%]
goto :eof

Sobald ich mit >preis.csv versuche das in eine Datei umzuleiten gehts ewig. Vielleicht liegts auch an der Größe von 30 MB?

Hätte da eh noch 4 Fragen:
1. Hast Du evtl. die Sprungmarke eof vergessesn?
2. Kann man bei der Teilenummer die führenden Nullen irgendwie entfernen?
3. Kann man bei den Teilebezeichungen die Leerstellen entfernen?
4. Ist es möglich eine VK-Formel auf den Bruttopreis anzuwenden? So kleiner 5€ 40%, kleiner 50€ 30% kleiner 50 20%?

Greetz illy
Member: Biber
Biber Dec 18, 2007 at 08:54:27 (UTC)
Goto Top
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.

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 Betriebssystem
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.
Mitglied: 57100
57100 Dec 18, 2007 at 09:27:52 (UTC)
Goto Top
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);
	}
}
?>
Member: illy79
illy79 Dec 18, 2007 at 10:11:32 (UTC)
Goto Top
Hi,

mal sehen, ob wir der Sache näher
kommen.
Da bin ich mir sogar sicher... face-smile

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.
Na jetzt wird mir auch klar warum die Datei so klein, hätt ich auch selber drauf kommen können...

> 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.
Performance ist gut, aber eher unwichtig. Wichtiger ist mir das ich es abändern kann. Außerdem möcht ich Dir natürlich auch nicht zuviel aufwand machen.

Greetz
Member: illy79
illy79 Dec 18, 2007 at 10:17:46 (UTC)
Goto Top
Hi,

MySQL hast Du richtig gehört, aber MySQL ist nur die Datenbank unseres Rechnungsprogrammes. Zu importieren der Preislisten muss ich diese aber erst in ein passendes csv Format umwandeln.

Noch besser wäre der direkt Import in diese Datenbank, aber das wird wohl zu aufwändig werden denke ich.

Was macht dein Script, eigentlich? Sorry bei dem DOS Script kann ich weitgehend folgen, aber bei MySQL oder PHP-Befehlen komm ich nicht nicht mehr mit...

Greetz illy
Member: pacobay
pacobay Dec 18, 2007 at 20:24:10 (UTC)
Goto Top
Hallo illy, hallo Biber

@Biber
Das Script ist als Entlastung für Dich gedacht und als nicht als Konkurenz face-smile

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/
Member: Biber
Biber Dec 19, 2007 at 10:41:44 (UTC)
Goto Top
Moin alle,

na, das fängt ja richtig an Spaß zu machen...face-wink

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. face-wink

Grüße
Biber
Member: illy79
illy79 Dec 19, 2007 at 21:45:25 (UTC)
Goto Top
Hi,

@Biber
Deine Batch ist echt super, liefert klasse Ergebnisse, aber ein kleine Bitte hätte ich noch. Könntest Du mir bitte eine VK-Aufschlagsformel hinzufügen? kleiner 5€ 40%, kleiner 50€ 30% und größer 50€ 20%? Einfach auf den Bruttopreis. Ohne irgendwas mit MwSt abziehen(Diese Formel ist nur für die andere Preisliste gedacht, wenn sie da ist kann ich sie selber ändern und muss euch nicht nervernface-wink )

@pacobay
wie nutzte ich das Script? Datei als .vbs speichern und ausführen? Wenn ichs so mache ist die DOS Variante komischerweise viel schneller. Könntest Du mir bitte auch noch die VK-Formel hinzufügen. Außerdem habe ich bei deiner Version noch ein Problem. Die Formatierung ist nicht ganz korrekt. Sollte So aussehen:

"Art-Nr","Bez"...

Deine sieht so aus:

Art-Nr";"Bez"... - Das " an Anfang fehlt am Anfang und am Schluss.
Hatte versucht es selbst zu änder, kommt aber dann ne Fehlermeldung.

Könntet Ihr mir das noch einfügen. plz...

Greetz
Member: pacobay
pacobay Dec 20, 2007, updated at Oct 18, 2012 at 16:32:50 (UTC)
Goto Top
@Biber hast recht macht immer mehr Spass
@ #intuz# Wo bleibst Du? Du hängst hinterher! Auf Auf face-smile

Hallo illy,

@pacobay
wie nutzte ich das Script?

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


Anpassungen der Feinsteuerung
(Habe das Script so angelegt, daß Du für den aktuellen Fall
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"  
Dies solltest Du entsprechend deinen Erfordernissen anpassen


unter Umständen noch anpassen TZ
Const TZ =";"       'Trennzeichen  
Trennzeichen ist das Zeichen das im Output die Felder voneiander trennt



Der Bereich Feldbeschreibung (INput)
Const P01Bez        = "Teilenummer"                  
Const Part01Start   = 1
Const Part01Ende    = 13
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
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
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

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 face-wink

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;
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
Member: illy79
illy79 Dec 20, 2007 at 09:06:03 (UTC)
Goto Top
Hi,

Das Scipt von #intuz# hilft mir leider momentan nicht weil ich mit php am wenigsten anfangen kann, aber es könnte später mal sehr interessant bei einem autom. Update weden.

@#intuz#
Danke für deinen Ansatz. Bringt mich auf eine Idee vielleicht später einen autom. Update zu integrieren.

Ok offensichtlich doch nicht so einfach
für nicht vbs'ler
Dachte das Ding würde für sich
selbst sprechen.
Schade & Sorry 4U
Doch danke, das Scipt ist sehr einfach und super geschrieben. Nur hatte ich noch nichts mit vbs zu tun und wollte mal nachfragen ob ich das was falsch mache weil ihr gesagt habt wäre schneller. Wobei Performance wie gesagt eher Nebensache.


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
> 
Auch relativ leicht möglich ist es dort
die Reihenfolge der Felder in der
Übergabe anzupassen
Hm interessant. Diese Zeile hatte ich nicht ganz verstanden.


'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 =

Meine Güte, sollte nur ein einfache Script werden un keine Hightech Programm, aber danke das Dich so ins Zeug legst.


Erklärung im Abschnitt Performance

'Thema Verkaufspreis (in V03)

' Formel für
Verkaufspreisfestlegung
'kleiner 5€ 40%, kleiner 50€
30% und größer 50€ 20%

Supi. Danke

Bei kleinem Input ich habe beispielsweise
z.Zt nur 20 Zeilen
dauert der Vorlauf länger als die
Abarbeitung
Komisch. Bei mir gehts irgendwie sehr lange...
Naja egal. Hauptsache hab was face-smile

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
Ja, aber die normale Trennung sollte mit Hochkommas sein und die Datensätze mit "" eingegrenzt. Aber das ist eher unwichtig. Kann ich im Import unseres Programmes umstellen.


Greetz illy
Member: pacobay
pacobay Dec 20, 2007 at 09:20:13 (UTC)
Goto Top
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
Member: illy79
illy79 Dec 20, 2007 at 10:13:20 (UTC)
Goto Top
Hi,


Aber das mit den Hochkommas habe ich immer
noch nicht ganz verstanden

Alle Datensätze in Hochkomma
einschließen?
Nein Datensätze in Anführungszeichen und Trennszeichen Semikolon
"TeilenNr";"BEZ"...

Aber wie gesagt, nicht so schlimm... Kanns im Import ändern.

Greetz
Member: Biber
Biber Dec 20, 2007 at 10:30:05 (UTC)
Goto Top
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
Set "BR_PREIS=%line:~ 214, 10%" && Rem POS 214-225 Bruttopreis
zumindest gedanklich in
Set "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 face-wink
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
Member: pacobay
pacobay Dec 20, 2007, updated at Oct 18, 2012 at 16:32:50 (UTC)
Goto Top
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 face-wink
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 face-wink
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  
Member: illy79
illy79 Dec 20, 2007 at 12:15:35 (UTC)
Goto Top
Hi,

hab noch ein kleines Problem. Zwischen Bezeichnung Eng und Deutsch fehlt Trennzeichen in der Output.

An der OutDNS liegts glaub nicht, aber woran dann???

Greetz
Member: Biber
Biber Dec 20, 2007 at 12:38:49 (UTC)
Goto Top
@illy79
....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. face-wink

Grüße
Biber
Member: illy79
illy79 Dec 20, 2007 at 14:01:18 (UTC)
Goto Top
Hi,

Na da hätt ich auch selber draufkommen können, aber wohl vor lauter Bäumen den Wald nicht gesehen...

Das abändern sollte kein Problem sein.

In diesem Sinne sollte es das gewesen sein. Ihr habt mir hier mächtige Werkzeuge mitgegeben. Vielen Dank an euch alle.

Wünsche euch schöne Weihnachten und eine guten Rutsch.

Greetz illy
Member: bastla
bastla Dec 20, 2007 at 19:04:28 (UTC)
Goto Top
Hallo an alle hier!

Da ich mich nun schon so unverhofft im Copyright wiederfinde, sollte ich vielleicht auch wirklich noch etwas beitragen ... face-wink

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 face-wink, 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  
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.
face-smile Respect face-smile
Member: Biber
Biber Dec 21, 2007 at 08:06:58 (UTC)
Goto Top
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:
  • 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