# protool string archivieren?



## pascal (21 Januar 2008)

Moin!

stehe gerade vor dem Problem das ich gerne eine 13 Stellige Zahlenkette mit Protool in einer Excel Datei archivieren möchte.. auf der Siemens SupportSeite wird darauf verwiesen das man das ganze mit einem VisualBasic Script lösen müsste.
Gibt es da keine bessere Möglichkeit? Kenne mich mit visual basic kein Stück aus..

gruß


----------



## sps-concept (21 Januar 2008)

*Archive*

Hallo,

eine Protool Runtime auf einem PC? Oder ein Panel? Da könntest du das Archiv auf Datenbank einstellen und mit den Einstellungen Datenquellen (ODBC) in der PC-Systemsteuerung direkt in Excel schreiben.

André


----------



## pascal (21 Januar 2008)

das ganze läuft auf einem pc, in der zahlenfolge sind verschiedene infos enthalten.
Anhand dieser Infos möchte ich verschiedene Rezepte auswählen und zusätzlich soll der Code wie ich eingangs schon sagte in einer Datei abgespeichert werden. (erstmal egal ob excel oder access)

Mein Problem ist es das ich bis jetzt nur IntegerZahlen in die Excel-Datei schreiben kann, denn wenn ich in den Eigenschaften der Variable "Typ String" auswähle kann ich in der Registerkarte Archiv nichtsmehr auswählen..
Ich hab auch irgendwie überhaupt keinen Ansatzpunkt und stocher hier nur im dustern, wäre klasse wenn mir da einer weiterhelfen könnte, oder auf Unterlagen verweisen würde wo man solche Sachen nachlesen kann


----------



## Larry Laffer (21 Januar 2008)

Hallo,
ein STRING wird genau wie ein INT an Excel geschrieben - wie Excel das in der Zelle behandelt liegt an der Zellen-Formatierung. Es gibt da keine andere Möglichkeit als über das VB-Script zu gehen. Das ist aber hinzubekommen. Im Bereich FAQ hier im Forum gibt es zu dem Thema auch von Volker einen guten Beitrag, der sehr viel erklärt.

Ansonsten stellt doch vielleicht mal dein Script hier ein - dann kann man ja mal sehen.

Gruß
LL


----------



## Larry Laffer (21 Januar 2008)

hier wäre übrigens auch der FAQ :
http://www.sps-forum.de/showthread.php?t=15348


----------



## pascal (21 Januar 2008)

ich bin mir nicht ganz sicher ob wir uns nicht vielleicht doch falsch verstehen..

Ich habe ja in protool die möglichkeit ein eingabefeld zu beschreiben, dieses verknüpfe ich dann mit einer variable die ich dann archiviere.

Bisher habe ich diesen Ablauf mit integer gemacht (ganz normal in protool eingestellt OHNE vb)
das Problem an integer ist, das ich nur 5 Ziffern zur Verfügung habe, daraufhin habe ich das ganze mit Dword ausprobiert und kam immerhin auf 9 Stellen, fehlen nur noch 4! (habe ja nen 13 stelligen code)

Und das geht jetzt nurnoch über vb? :???:


----------



## Larry Laffer (21 Januar 2008)

Hallo,
was hast du denn wirklich vor ?
Ich denke, du hast ein Problem mit den Variablen-Typen.
Ein INT hat 16 Bit - das ergibt als maximale Zahl +/- 32000 und 'nen Keks.
Ein DINT hat 32 Bit - das ergibt als maximale Zahl +/- 2.000.000.000 und 'nen Keks.
Ein STRING ist eine Zeichenkette mit (bei Siemens) einer maximalen Länge von 254 Zeichen. Ein STRING kann Zahlen, wie auch Buchstaben oder Zeichen beinhalten.

Schreib vielleicht doch mal, was du machen willst ...

Gruß
LL


----------



## vladi (21 Januar 2008)

*Archivieren*

Hi,
also dein Problem ist: wenn du mit INT arbeitest, kann Protool die Variable
selber archivieren. Jetzt mußt du auf String umstellen, und das archiviert
das Programm nicht mehr automatisch.
Lösung: auf String umstellen, und die Variable dann mittels VB Script
auf der Platte speichern; in dem o.g. Beitrag vom Volker steht drin ganz klar, wie es geht. Wann du das Script triggerst, ist auch eine Frage.

Gruss: Vladi


----------



## pascal (21 Januar 2008)

das wird wohl das beste sein 

ich habe folgendes vor; ich möchte an meinen panelpc einen barcodescanner anschließen.
Dadurch das der Scanner in das Tastaturkabel eingeschliffen werden kann bilde ich mir ein das ich nach dem Scannen den Barcode in Form eines 13stelligen codes in meinem Eingabefeld habe.

Nun soll ich verschiedene Bauteile prüfen: 
in dem Code ist enthalten um welche BauteilSERIE es sich handelt, dementsprechend muss ich mit Unterschiedlichen Parametern prüfen, die ich dann in einem Rezept ablegen will.

Wenn die Prüfung dann abgeschlossen ist soll die Seriennummer zusammen mit dem Prüfergebnis in einer Datei gespeichert werden, die dann hinterher genutzt werden soll um genau nachzuvollziehen WANN WELCHES Bauteil geprüft worden ist und ob die prüfung POSITIV oder NEGATIV verlaufen ist.

Ich fühl mich im moment so Ansatzlos


----------



## vladi (21 Januar 2008)

*Scanner*

Hi,
ja Ansätze gibt es einige. Z.B.:
-Bauteil scannen
-STRING auswerten, um zu sehen was für Bauteil
-passende Rezeptur laden
-prüfen
-speichern
-warten auf neuen Scann..
Auswertung kann in der SPS oder in VB erfolgen, was ist aufwendiger???
Was für SPS?

V.


----------



## pascal (21 Januar 2008)

vladi schrieb:


> Hi,
> 
> Lösung: auf String umstellen, und die Variable dann mittels VB Script
> auf der Platte speichern; in dem o.g. Beitrag vom Volker steht drin ganz klar, wie es geht. Wann du das Script triggerst, ist auch eine Frage.
> ...



Aber wieso wird einem das ganze dann in Protool angeboten im Register "funktionen" ? hab mal nen screenshot gemacht und angehängt..
wusste gerade nicht wie ich die datei passend klein kriege..

Gruß

Pascal


----------



## pascal (21 Januar 2008)

vladi schrieb:


> Hi,
> ja Ansätze gibt es einige. Z.B.:
> -Bauteil scannen
> -STRING auswerten, um zu sehen was für Bauteil
> ...



So in etwa sollte das ganze auch aussehen, das Programm ist soweit auch schon fertig, wir verwenden warscheinlich eine S7 300 die wir dann über mpi an den panelpc anschließen wollen. Um die Kosten für eine CP zu sparen wollten wir das ganze in das Tastaturkabel einschleifen und über Protool aufnehmen --> und dann in der SPS verarbeiten


----------



## vladi (21 Januar 2008)

*Ansatz ok..*

Hi,
ja, klingt gut. Nur:
Stringverarbeitung ist halt in Step7 ein wenig blöd, es sei denn man verwendet SCL und entspr. Bibliotheken, z.B. Oscat.
Aber auch so geht es, ich nehme an, das z.B. die Produktsorte immer an der selben Stelle im gescannten String steht(wegen umwandeln und vergleichen).

V.


----------



## Larry Laffer (21 Januar 2008)

... ähnlich wie der Vorschlag von Vladi würde ich, da du den Barcode ja sinnvollerweise über die Visu einscannst, die Auswertung desselben auch dort machen und entsprechend die Betriebs-Parameter anwählen (vielleicht auch von HD laden) und an die Steuerung weitergeben. Ein andere Alternative wäre, ein Bit für das Betriebs-Programm zu setzen und die Parameter-Auswahl in der Steuerung machen. Das erste wäre aber vom Handling her einfacher und auch schöner ... 

Ein bißchen VB-Script-Wissen musst du dir da natürlich aneignen, aber das ist eigentlich kein Problem und hier im Forum gibt es (auch zu dem Thema) auch Hilfe und Beispiele.

Gruß
LL

Ach ja, String-Verarbeitung ist natürlich mit VB-Script auch sehr viel einfacher als in Step7 ...


----------



## pascal (21 Januar 2008)

Ja ich merk schon, ich werde da wohl nicht drumherum kommen mich mal mit dem thema vb-script zu beschäftigen  

Wenn ich mich hier mal so umgucke frage ich mich auch mal wieder wieso man in der Technikerausbildung wieder alles macht, nur nicht das was man später gebrauchen kann. Visual Basic scheint in der Beziehung ja unabdingbar zu sein, daher frage ich mich wieso genau das nicht behandelt wird :twisted: 

Muss mich jetzt halt mal damit beschäftigen, by the way: hat das irgendwas zu sagen das dem Beitrag von Volker "wince" steht? bei uns wird wohl xp laufen..


----------



## vladi (21 Januar 2008)

*Scripts*

Hi,
ja, da hast du Recht mit der Technikerausbildung.
Heute ist es schwierig ohne ein wenig C++, VB (Script), Netzwerkwissen
und PC Basics überhaupt.

*WinCE* sind die embedded Systeme, z.B. auf Touchpanels(TP170 o.ä.). 

Gruss: V.


----------



## Larry Laffer (21 Januar 2008)

... und als Ergänzung zu dem, was Vladi schon geschrieben hat :
SCL innerhalb der SPS ...

Vielleicht noch eine Anmerkung: Die VB-Script-Geschichte ist auch keine vertane Zeit, denn falls du irgendwann auf WinCC-Flex umsteigst, dann kannst du das allermeißte dort auch wieder einsetzen ...

Gruß
LL


----------



## pascal (22 Januar 2008)

so, hab mal versucht mich ein wenig schlau zu machen! 

-Ich brauche also Vb-Script, das scheint ja wohl ein ableger von vb zu sein, aber wie ist das jetzt zu verstehen? Unterscheiden die sich in der Syntax oder ist es ein und das selbe? Sonst würd es ja Sinn machen das ich mir nen Buch für vb ausleihe..
 -oder das ganze in C versuche, da kenne ich mich etwas besser aus

-Wie wird so eine Verarbeitung im allgemeinen angestoßen? So wie es aussieht läuft das Script ja völlig extern von protool, d.h. die Schnittstelle beim Lesen, sowie beim Schreiben scheint ja eine Datei im .csv Format zu sein..
Gibt es da eine Möglichkeit für einen Datenaustausch (zwischen protool und vbs) oder wird das über eine statische Zeit "ständig" aufgerufen? dann könnte man es ja irgendwie absichern, so daß es nur aktiv wird wenn sich die werte verändert haben oder so ähnlich..

-das problem mit protool bleibt dann natürlich erstmal bestehen (das ich den String nicht eingelesen bekomme)


----------



## vladi (22 Januar 2008)

*Vb*

Hi,
also es sieht so aus:
VB ist eine Programmierumgebung, man muss sie kaufen und installieren.
VB Script ist in Windows integriert, im Hintergrund läuft der Scripting Host als sozusagen Compiler, und wenn man eine Datei in Windows anklickt, die
die Endung .vbs hat(Textdatei), so wird die ausgeführt. Und wenn in der Datei VBS Befehle mit der richtigen Syntax stehen, dann läuft was.
Und die VBS Geschichte unterstützt auch Protool, und WinCC...
Die csv Datei ist keine "Schnittstelle", da wird einfach reingeschrieben.
Kann auch eine andere Datei sein. 
Die VBS "Befehle"(es sind Funktionen) führt Windows aus.
Also bei dem passenden Ereignis führt Protool dein Script aus, da werden die Daten ausgewählt usw., und fertig. Und wenn die SPS sagt:ready(Bit), dann speicherst du die Sachen mit einem zweiten Script. Irgendwie so.


> "das problem mit protool bleibt dann natürlich erstmal bestehen (das ich den String nicht eingelesen bekomme)"


Verstehe ich nicht ganz genau.

Vladi


----------



## pascal (22 Januar 2008)

vladi schrieb:


> Hi,
> 
> Also bei dem passenden Ereignis führt Protool dein Script aus, da werden die Daten ausgewählt usw., und fertig. Und wenn die SPS sagt:ready(Bit), dann speicherst du die Sachen mit einem zweiten Script. Irgendwie so.
> 
> Vladi



Und ich dachte das geht nicht, deswegen meine Frage mit der "Schnittstelle" dachte das Script wäre über protool nicht steuerbar --> daher hab ich gedacht dass das script praktisch die ganze zeit durchläuft und in die datei reinschreibt und protool holt sich dann quasi die datei ab (also das die beiden quasi keine Connection untereinander haben)

Dann muss ich mal sehen wie ich das hinkriege, hab schon meine erste Datei geschrieben


----------



## Larry Laffer (22 Januar 2008)

Innerhalb von ProTool werden Aktionen nur Ereignis-bezogen ausgeführt. Du hast die Möglichkeit, ein VB-Script z.B. bei Wert-Änderung oder bei Tasten-Drücken auszuführen. 
Der Unterschied von VB-Script zu VB ist einfach gesagt, dass innerhalb von ProTool nicht alles machbar ist. Das Aufrufen von Funktionen in externen DLL's geht z.B. nicht.
Als Datei-Formate kannst du (sonfern installiert) auch z.B. Excel benutzen und dort direkt in von dir gewünschte Zellen schreiben.

Gruß
LL


----------



## pascal (22 Januar 2008)

Larry Laffer schrieb:


> Innerhalb von ProTool werden Aktionen nur Ereignis-bezogen ausgeführt. Du hast die Möglichkeit, ein VB-Script z.B. bei Wert-Änderung oder bei Tasten-Drücken auszuführen.
> LL



Habs gerade gefunden in Protool!  
So langsam kommt etwas Licht ins Dunkle.. :-D


----------



## pascal (23 Januar 2008)

Soo, bin jetzt soweit das ich den String schonmal einlesen und testweise verarbeiten konnte mit vbs, im moment hakt es daran die tabelle zu erstellen bzw einen zweiten datensatz reinzuschreiben... gestern abend lief alles 100%ig, dann hab ich ein bischen rumgespielt und jetzt finde ich den Fehler nicht.. beim ersten Durchlauf läuft alles super, beim zweiten durchlauf erhalte ich eine Fehlermeldung, alle programmabschnitte für sich laufen (habs auskommentiert) nur im zusammenspiel geht nichts.. jedes mal bekomme ich ne fehlermeldung das in zeile 22 ein objekt erforderlich wäre.. vielleicht hab ich auch nur wieder nen brett vorm kopf und seh den wald vor lauter bäumen nicht.. hier mal das script

Dim fso,fs,datei,textfile1,Barcode,str_Ergebnis 'Eine Art Variablendeklaration
Barcode = 123                     'hier wird den variablen nen wert bzw string zugewiesen
str_Ergebnis      = "positiv"
Set fso = CreateObject("Scripting.FileSystemObject")       'ein objekt erstellen
Set fs = CreateObject("WScript.Shell")
datei="E:\Testvbs\testcsv.csv"

If Not fso.FolderExists("E:\Testvbs") Then fso.CreateFolder("E:\Testvbs")

If Not fso.FileExists (datei) Then 
    Set TextFile1 = fso.CreateTextFile(datei, true)
    textfile1.WriteLine "Datum;"&"Uhrzeit;"&"Barcode;"&"Ergebnis"
    textfile1.WriteLine 
End If
textfile1.Close
If fso.FileExists (datei) Then 
    Set TextFile1 = fspenTextFile(datei, 8)
    textfile1.WriteLine Date&";"&Time&";"&Barcode&";"&str_Ergebnis
End If
textfile1.Close


----------



## Larry Laffer (23 Januar 2008)

Hallo Pascal,
ich sehe im Moment nicht wo Zeile 22 ist, aber als Anmerkung vielleicht :
Die FileExists-Geschichte würde ich als IF .. THEN .. ELSE machen ... also :

```
If Not fso.FileExists (datei) Then 
   Set TextFile1 = fso.CreateTextFile(datei, true)
   textfile1.WriteLine "Datum;"&"Uhrzeit;"&"Barcode;"&"Ergebnis"
   textfile1.WriteLine 
[COLOR=red][B]ELSE[/B][/COLOR]
[COLOR=red][B]' End If                 <- Diesen Zeile sind über
' textfile1.Close      <- diese ist vermutlich der Fehler
' If fso.FileExists (datei) Then 
[/B][/COLOR]   Set TextFile1 = fso.OpenTextFile(datei, :cool:
   textfile1.WriteLine Date&";"&Time&";"&Barcode&";"&str_Ergebnis
End If
textfile1.Close
```
 
Versuch das mal ...
Gruß
LL


----------



## volker (23 Januar 2008)

mir fällt kein fehler auf. aber wieso zeile 22 der code oben enthält weniger zeilen.

wenn du das mit *else* machst, dann musst du aber vor dem else noch 
textfile1.WriteLine Date&";"&Time&";"&Barcode&";"&str_Ergebnis
einfügen.
denn sonst würdest du die erste datenzeile verlieren wenn die datei nicht existiert und trotzdem daten geschrieben werden sollen.


----------



## pascal (23 Januar 2008)

*Aller Anfang ist schwer..*

Erstmal danke für den guten Support!

Ich habe mich entschlossen etwas weiter unten anzusetzen, aber selbst da hapert es gewaltig.. weil ich manche Zeilen garnicht verstehe


Set fs    = CreateObject("WScript.Shell")

Was passiert hier genau? hab mir jetzt das VBScript-Tutorium zugelegt, da sind die meisten Sachen ja ganz gut erklärt aber das Wscript.Shell konnte ich da jetzt nicht finden..

Habs jetzt durch Trial and Error hinbekommen... es lag daran das ich in diesem Teil:
If Not fso.FileExists(datei)  Then 
fso.CreateTextfile(datei)        'Datei erstellen falls noch nicht da

Set MeineTextDatei = fso.CreateTextFile (datei,true)
MeineTextDatei.Writeline "Datum;"&"Uhrzeit;"&"Barcode;"&"Ergebnis"
MeineTextDatei.Writeline

hinter dem Then direkt weiter geschrieben hab, nach einem Absatz ging es.. ist das Normal?
Dem Compiler ist es doch wurscht ob das jetzt dahinter oder 10 Zeilen darunter steht!? 
So kenne ich es aus C, oder hängt es vielleicht damit zusammen das in Basic keine Semikolons verwendet werden? (mal so eine Vermutung)

Gruß

Pascal


----------



## volker (23 Januar 2008)

pascal schrieb:


> hinter dem Then direkt weiter geschrieben hab, nach einem Absatz ging es.. ist das Normal?
> Dem Compiler ist es doch wurscht ob das jetzt dahinter oder 10 Zeilen darunter steht!?


nee, das ist nicht egal.

wenn hinter dem then direkt was steht, wird dies ausgeführt
es darf kein end if folgen

wenn mit zeilenumbruch, wird alles ausgeführt bis zum end if

if blabal = 1 then nur dies = 1 'das ist ok
und diese = 1 'wird immer, unabhängig von der if-anweisung ausgeführt
end if '<- dies produziert einen fehler da if bereits 'beendet'

oder so 

if blabal = 1 then 
nur dies = 1
und diese = 1
end if 'so gehts


----------



## Larry Laffer (24 Januar 2008)

pascal schrieb:


> oder hängt es vielleicht damit zusammen das in Basic keine Semikolons verwendet werden? (mal so eine Vermutung)


 
Hallo Pascal,
das ";" von "Pascal" (und "C" ?) ist in "Basic" ein ":". Das könntest du auch machen - sieht aber unübersichtlich aus. Ein Zeilenumbruch bewirkt das gleiche.

Mit "CreateObject" teilst du der Datei-Ausgabe mit, was du da eigentlich erstellen willst. Das hat auch nichts mit Basic zu tun, sondern kommt ursächlich von Windows. Du könntest anstelle einer "WScript.Shell" z.B. auch eine "Excel.Application" erstellen (also auf ein Excel-Sheet schreiben wollen).

Vielleicht hier noch ein Beispiel :
	
	



```
[SIZE=2][COLOR=#0000ff]
Const[/COLOR][/SIZE][SIZE=2] ForReading = 1, ForWriting = 2, ForAppending = 8
 
Verzeichnis = "c:\Mess-Daten\Monat[/SIZE][SIZE=2]\" 
Datei = "Messung[/SIZE][SIZE=2].csv"
Ziel = Verzeichnis + Datei
[/SIZE][SIZE=2] 
[/SIZE][SIZE=2][COLOR=#008000]' Ziel-Verzeichnis schon vorhanden ?
' ... wenn nein, dann erst erzeugen ...
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Set[/COLOR][/SIZE][SIZE=2] fs = CreateObject("Scripting.FileSystemObject")
[/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][SIZE=2] fs.FolderExists (Verzeichnis) [/SIZE][SIZE=2][COLOR=#0000ff]Then
[/COLOR][/SIZE][SIZE=2]fs.CreateFolder (Verzeichnis)
[/SIZE][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] 
[/SIZE][SIZE=2][COLOR=#008000]' Ziel-Datei schon vorhanden ?
' ... wenn nein, dann erst erzeugen ...
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][SIZE=2] fs.FileExists (Ziel) [/SIZE][SIZE=2][COLOR=#0000ff]Then
[/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff]Set[/COLOR][/SIZE][SIZE=2] f = fs.OpenTextFile(Ziel , ForWriting, [/SIZE][SIZE=2][COLOR=#0000ff]true[/COLOR][/SIZE][SIZE=2])
f.WriteLine "Messdaten Anlage 198"
[/SIZE][SIZE=2][COLOR=#0000ff]Else
[/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff]Set[/COLOR][/SIZE][SIZE=2] f = fs.OpenTextFile(Ziel , ForAppending)
[/SIZE][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] 
[/SIZE]
```
Danach wird dann geschrieben und anschlißend ge-"closed". Das kennst du ja schon ...

Gruß
LL


----------



## pascal (24 Januar 2008)

Larry Laffer schrieb:


> Hallo Pascal,
> 
> Mit "CreateObject" teilst du der Datei-Ausgabe mit, was du da eigentlich erstellen willst. Das hat auch nichts mit Basic zu tun, sondern kommt ursächlich von Windows. Du könntest anstelle einer "WScript.Shell" z.B. auch eine "Excel.Application" erstellen (also auf ein Excel-Sheet schreiben wollen).
> 
> LL


 
Muss Excel dafür installiert sein?
Ich habs jetzt soweit fertig das ich die Sachen abspeichern kann mit Uhrzeit, Datum , Artikelnummer und Ergebnis, Ziel ist eine csv-Datei, das sollte eigentlich reichen.

Ist es bei Protool eigentlich nicht möglich nach fertigstellung des Scripts noch weitere Parameter mit reinzunehmen? habs bis jetzt immer so gemacht das ich das script neu angelegt habe, aber das kann ja keine Lösung sein wenn man am Testen ist..  

Gruß

Pascal


----------



## Larry Laffer (24 Januar 2008)

Hallo Pascal,
wenn du nach Excel schreiben willst, dann muß Excel auch installiert sein.

Das Script kannst du beliebig oft ändern. Du must es nicht jedesmal neu schreiben. Es muss halt dann "nur" als ProTool-Projekt auf deinen Visualisierungs-Rechner.

Gruß
LL


----------



## pascal (24 Januar 2008)

aber der Button "Hinzufügen" in der Registerkarte "Allgemein" ist dann "grau" so daß  man ihn nicht anwählen kann


----------



## Larry Laffer (24 Januar 2008)

... du brauchst auch dann den Button "Übernehmen" oder "OK" in dem Register "Script Text". Du musst es ja nicht hinzufügen, es ist ja schon da ...

Gruß
LL


----------



## pascal (25 Januar 2008)

Moin, da bin ich mal wieder!
Läuft jetzt alles ganz gut, jetzt stellt sich mir die Frage wie ich aus einem String einzelne character rausziehen kann. Hab da die Read Funktion im Auge, mit der sich ja eine definierte Anzahl an Charactern aus dem String ziehen lassen..
Aber die Read-Funktion kann sich ja nicht merken bis wohin sie gelesen hat.. von daher ist das ganze doch unbrauchbar für mich, seh ich das so richtig?


----------



## Larry Laffer (25 Januar 2008)

Hallo,
den ganzen String einlesen und dann mit MID (oder LEFT oder RIGHT) zerpflücken. Lies dir die Befehle mal in der "Visual Basic Hilfe" durch.

Gruß
LL


----------



## pascal (25 Januar 2008)

genau das hab ich gesucht (und nicht gefunden) besten dank!


----------



## pascal (11 Februar 2008)

Moin Jungs! Ich brauch nochmal eure Hilfe, und zwar sieht es folgendermaßen aus. Ich habe jetzt eine csv-Datei in der Verschiedene Daten hinterlegt sind; eine Materialnummer mit der der Prüfling Identifiziert wird und eine dazugehörige Rezeptnummer die dann dass passende Rezept laden soll, leider bekomme ich es nicht auf die Reihe eine "999" zurückzugeben wenn keine passende Materialnummer vorhanden ist, ich hänge mal den Quelltext an, dann wird es etwas klarer.
Sobald ich das "else" mit reinnehme gibt er mir nurnoch die 999 zurück..

Gruß

Pascal


----------



## volker (11 Februar 2008)

bekommst du denn ein Auftragsnr_verarbeiten wert ohne das else?
poste mal eine zeile aus der Zuordnung.csv


----------



## pascal (11 Februar 2008)

Ja, es funktioniert alles einwandfrei. Das ist es ja gerade..
Ohne Else gibt er den passenden Wert (rezeptnr) zurück und sobald ich das else einsetze bekomm ich ausschließlich die 999

so sieht das aus

Gehäuseart;1234567890;007


----------



## volker (11 Februar 2008)

der code ist ok. auch das mit dem else. sollte eigentlich funzen.

sonst machs so

```
Auftragsnr_verarbeiten = 999
If InStr(1,Stringzeile,Mat_nr) <> 0  Then     
  position = InStr(1,Stringzeile,Mat_nr)         'Rückgabe des Startposition der Übereinstimmung
  position = position+11                         'vorrücken bis zur Rezeptnummer    
  Auftragsnr_verarbeiten = Mid(Stringzeile, position)  'Rückgabe  Rezeptnummer         
End If
```


----------



## pascal (11 Februar 2008)

Läuft aber nicht, habs gerade nochmal durchprobiert, beim alten(mit else) sowie beim neuen bekomme ich jetzt bei "1111111111" und bei "2222222222" ne 999 zurück.
in der dritten und letzten Zeile funktionierts, da bekomm ich die 7 zurück.. 
Was fürn scheiss Fehler, hab mal die original csv mit in den anhang geschrieben.. wär super wenn du dir das nochmal angucken könntest und evtl. ne Idee hast womit das zusammenhängen könnte


Was mir aber noch aufgefallen ist und ich mir nicht erklären kann ist folgendes Problem:
Wenn ich das ganze If und Else zeugs rausnehme zählt er nichtmehr richtig und gibt mir nen textfragment zurück was vor der materialnummer liegt.. fand ich schon sehr komisch..

So hätte hatte ich das heute morgen geschrieben:

Do While Not f.AtEndOfStream
Stringzeile = f.ReadLine()
Position = Instr(1,Stringzeile,Mat_Nr)
Position = Position+11
Auftragsnr_verarbeiten = Mid(Stringzeile,position)


----------



## Larry Laffer (11 Februar 2008)

Hallo Pascal,
wenn ich das richtig verstanden habe, dann suchst du einen Eintrag (einer Zeile). Die nächste Zeile stimmt doch dann wieder nicht mehr überein ...
Bau doch mal die Anweisung Exit Loop ein, wenn du die gewünschte Zeile gefunden hast ...


----------



## pascal (11 Februar 2008)

Ja richtig, jede Zeile wird (sollte) eingelesen werden, dann hol ich mir die position an der, in diesem Fall die 10stellige Materialnummer anfängt, wander 11 Stellen nach vorne (Materialnummer + Semikolon) und lass mir die darauf folgende Rezeptnummer wiedergeben.

Verstehe jetzt aber nicht ganz was du genau meinst..
Ich habe mich schon gefragt wo diese Rückgabe des Strings aufhört, aber da es ohne murren funktioniert hat habe ich mich nicht weiter damit beschäftigt.. Vielleicht kannst du nochmal kurz anschneiden wie du das meinst

edit:
ich beziehe mich doch immer nur auf eine Zeile, eben die Zeile die ich gerade eingelesen hab, also sollte es doch eigentlich laufen, in dem Fall würde ich von Anfang de Rezeptnummer lesen bis zum Ende des Strings

edit edit:
ich guck mir derweil mal die Geschichte mit der ExitLoop funktion an!

edit edit edit:
Bist nen Schatz 
Ein exit unter die "normale" Rückgabe und die Kiste läuft!
Kann aber trotzdem nicht nachvollziehen warum, vielleicht könnteste noch ein zwei Worte darüber verlieren!

Gruß

Pascal


----------



## Larry Laffer (11 Februar 2008)

"Exit Loop" solltest du in dem IF .. THEN -Abschnitt mit einbauen ...

Das heißt :
Wenn gefunden was gesucht wurde, dann Abbruch ... sonst weitersuchen und wenn am Ende nicht gefunden dann "999" ausgeben ...


----------



## pascal (11 Februar 2008)

habs jetzt so:

If .... then
position = instr(1,Stringzeile,Mat_nr)
position = position+11

Auftragsnr_verarbeiten = Mid(Stringzeile, position)
Exit Do

Else
Auftragsnr_verarbeiten = 999

End If

Optimal ist das natürlich auch nicht (wenn auch ohne Folgen), jetzt würde ja bei jedem mal wo es nicht gefunden würde ne 999 in die Variable geschrieben und beim letzten Durchgang dann die Tatsächliche Rezeptnummer bzw. die 999 bleibt stehen wenn nichts gefunden wird


----------



## volker (11 Februar 2008)

soll denn nicht 999 drin stehen wenn nix gefunden wird?

aber wie LF schon schreibt muss da natürlich der exit rein (da hatte ich gar nicht drauf geachtet :???, denn die else anweisung wird ja immer ausgeführt wenn die mat_nr nicht gefunden wurde.
also klappt das ohne das exit nur, wenn die richtige mat_nr in der letzten zeile steht.

edit:


> jetzt würde ja bei jedem mal wo es nicht gefunden würde ne 999 in die Variable geschrieben


lass den else-teil weg und weise der var *vor* der loop-schleife 999 zu


----------



## pascal (11 Februar 2008)

Oh man ich hatte die ganze Zeit nen Brett vorm Kopf, wollte gerade eigentlich meine Frage zum Abbruch schreiben, da ist mir klar geworden wieso es nur in der letzten Zeile funktionieren konnte... 

edit:

halbe stunde zu spät, danke Volker


----------



## pascal (12 Februar 2008)

Eine Frage hätte ich aber noch:

Mal angenommen die Übereinstimmung wird in Zeile 5 gefunden, das würde doch dann heissen das 4mal die 999 zurückgegeben wird und am Schluss erst die richtige Rezeptnummer oder?

Das Script ist jetzt so gekoppelt das wenn eine 999 in die Rezeptvariable geschrieben wird, eine Fehlermeldung generiert wird.
Folgerichtig müssten ja dann eigentlich 4 Fehlermeldungen auftauchen, tun sie aber nicht..

Ist zwar schön das es Funktioniert, aber könnte es da nicht eventuell zu unvorhergesehenen Fehlern kommen?


----------



## Larry Laffer (12 Februar 2008)

... wenn du gemäß Volker's Beispiel weitergemacht hast, dann wird zwar deine Variable zunächst mit 999 initialisiert, dein Script ist aber erst abgearbeitet, wenn die Schleife zu Ende ist (entweder wirklich Ende oder über Exit). Hast du im Script keine Übereinstimmung gefunden, dann bleibt der Init-Wert erhalten, ansonsten der gefundene Eintrag.
Du must dir da also m.E. keine Sorgen machen ...:-D 

Gruß
LL


----------

