abeisema
Goto Top

VBS randomize Problem

Hallo, VBS ist ja möglicherweise nicht mehr State of the Art, hilft mir aber trotzdem. Das unten beschriebene Script erzeugt mir eine Datei mit variabler Zeilenanzahl, bestehend aus 2 Zahlenblöcken. So weit,so gut, der linke Bereich tut auch das was er soll, aber in den rechten schleichen sich Kommata ein. Was mache ich falsch.

Option Explicit
Const ForReading = 1
Const ForWriting = 2
DIM Shell,FSO,File,Zeile
DIM i,Lesen,Line,Lines
DIM Eingabe,Eingabe1,Eingabe2

Set Shell=CreateObject("WScript.Shell")  
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set Lesen = FSO.OpenTextFile("c:\Temp\PrepaidImport.txt", ForReading, True)  
Eingabe = InputBox ("Hier Namen eingeben", "Anbieter eingeben")  
Eingabe1 = InputBox ("Hier Wert eingeben", "Wertangabe")  
Eingabe2 = InputBox ("Hier Menge angeben","Mengenangabe")  

Set Lesen = FSO.OpenTextFile("c:\Temp\PrepaidImport.txt", ForWriting, True)  

Generate_Head

i = 0
For i = 1 to Eingabe2
i = i
'Randomize  
Zeile = "01708" & CStr(int((99999 - 23456 + 1) * RND + 23456)) & vbTab & "99" & CStr(int(999999999999999 - 23456 - 1) * RND - 23456)  
Zeile = Zeile '& vbNewLine  
Lesen.WriteLine Zeile
Next

Set Lesen = FSO.OpenTextFile("c:\Temp\PrepaidImport.txt", ForReading, True)  
'MsgBox SchreibeInDatei  

Function Generate_Head
Dim Line1,Line2,Line3,Line4,Line5,Line6,Line7
Line1 = "*Customer:" & "Telekom" 'Eingabe   'Name per InputBox, alternate fixed input   
Line2 = "*date-generated:" & Now 'AktuellesDatum/Zeit  
Line3 = "*date-valid-until:" & dateserial(2015-1,12-2,22-11)   
Line4 = "*Logo:DOMINO50-OrdNum:001" 'fixed input  
Line5 = "*batchnummer:1708"      'or InputBox  
Line6 = "*value:" & "50" 'Eingabe1	 'or fixed input  
Line7 = "*quantity:" & Eingabe2  'or fixed input  
Eingabe = Line1 & vbNewLine & _
Line2 & vbNewLine & _
Line3 & vbNewLine & _
Line4 & vbNewLine & _
Line5 & vbNewLine & _
Line6 & vbNewLine & _
Line7 & vbNewLine
Lesen.WriteLine Eingabe
End Function

Function SchreibeInDatei
SchreibeInDatei = Lesen.ReadAll
End Function

Function AktuellesDatum
   ' FormatDateTime formatiert das Datum als langes Datumsformat.  
   AktuellesDatum = FormatDateTime(Date, 2)
End Function
Lesen.close
WScript.quit

Der resultierende rechte Zahlenblock MUSS 17 Zeichen beinhalten und sollte in der Ausgabedatei so aussehen:
-Links- -rechts-
0170836622 99290290474861398
0170889964 99733959436375954
0170829462 99101430773709211

statt dessen steht dort, wenn oben CStr(int(99999999999999999 ...
als Ausgabe:

0170889127 1,38709664318077E+16

oder, wenn ich die Zahlenreihe verkürze und einen Teil wie oben, mit "99" dazwischenhänge
0170890159 9956236863111516,3

Wie bekomme ich die Kommata da weg. Was mache ich falsch?

Content-Key: 192311

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

Ausgedruckt am: 28.03.2024 um 17:03 Uhr

Mitglied: Dani
Dani 05.10.2012 um 20:34:12 Uhr
Goto Top
Moin,
ich bin grad nicht sicher, aber gibts in VBS auch Datentypen. Denn dann würde ich als Typ für "Zeile" -> "Currency" versuchen.


Grüße,
Dani
Mitglied: bastla
bastla 05.10.2012 aktualisiert um 22:00:40 Uhr
Goto Top
@ Dani
In VBS sind alle Variablen vom Typ "Variant" und können auch nicht anders deklariert werden (und außerdem wäre für "Zeile" hier nur "String" angebracht face-wink) ...
Mit der folgenden Zeile sollte "Zeile" dann eher passen (obwohl damit natürlich auch keine 17 Stellen für den rechten Block garantiert sind):
Zeile = "01708" & Int((99999 - 23456 + 1) * RND + 23456) & vbTab & "99" & Int((999999999999999 - 23456 + 1) * RND + 23456)
"CStr()" ist unnötig, aber "Int()" muss natürlich auch bei der zweiten Berechnung auf das Ergebnis (zumindest der Multiplikation) angewendet werden, damit es keine Dezimalstellen geben kann.

Eine Subtraktion von 23456 nach der Multiplikation könnte zu negativen Ergebnissen führen (und war vermutlich auch nicht so gemeint, daher von mir korrigiert) ...
Eine sicher 17-stellige Kombination aus den Ziffern 0 bis 9 unter Verwendung der Pseudo-Random-Funktion in VBS ließe sich so erhalten:
Rechts = ""  
For i = 1 To 17
    Rechts = Rechts & Int(Rnd * 10)
Next
Um eine führende Null auszuschließen, kann natürlich die erste Stelle mit
Rechts = Int(Rnd * 9) + 1
vorbelegt und dann noch um 16 weitere Stellen nach obigem Muster ergänzt werden.

Grüße
bastla
Mitglied: Dani
Dani 05.10.2012 um 21:58:30 Uhr
Goto Top
@bastla
Arr, hab ich das mit VB verwechselt? Sorry für die Fehlinfo.


Grüße,
Dani
Mitglied: abeisema
abeisema 06.10.2012 um 22:06:27 Uhr
Goto Top
Hallo bastla,

vielen Dank für die schnelle Hilfe.

gruss
Andreas
Mitglied: Biber
Biber 07.10.2012 aktualisiert um 00:59:35 Uhr
Goto Top
[OT]

Moin bastla,

Zitat von @bastla:
Rechts = ""  
 For i = 1 To 17
     Rechts = Rechts & Int(Rnd * 10)
 Next
Um eine führende Null auszuschließen, kann natürlich die erste Stelle mit
Rechts = Int(Rnd * 9) + 1
vorbelegt und dann noch um 16 weitere Stellen nach obigem Muster ergänzt werden.

Ja, das Ergebnis geht in die richtige Richtung...
Aber mit dem "Links" und "Rechts" solltest du noch mal überdenken face-wink
Lass es uns lieber neutral formulieren.
strDigits = Int(Rnd * 9) + 1
For i = 1 To 16
    strDigits = strDigits & Int(Rnd * 10)
next

Sorry, aber die selbstdokumentierende Zeile "Rechts = Rechts & Int(Rnd * 10)" konnte ich nicht so stehen lassen.

Grüße
Biber
[/OT]
Mitglied: bastla
bastla 07.10.2012 um 10:09:33 Uhr
Goto Top
[OT] Hallo Biber!

Hast ja recht - das war zu stark verkürzt; eigentlich hätte die Variable besser "RechterZahlenblock" (oder vielleicht "RechterTeilDerZeileNachDemTab" face-wink) heißen sollen ...

Grüße
bastla
[/OT]