# Wir basteln einen String und füllen Lücken



## Bernd87 (3 September 2021)

Hallo,

ich will einen Dateinamen mit Datum und Uhrzeit erstellen jetzt fehlt mir der letzte Schritt.
Eine DB mit allen benötigten Teilen habe ich befüllt mit Komponenten des "RD_SYS_T".
Die Länge habe ich begrenzt mit bsp. Jahr String[4]; Montant String[2] usw. 
Verknüpft habe ich alles mit CONCAT zu: "2021 9 3 820"
Jetzt habe ich den Status 8090 was soviel heißt wie "unzulässiger Dateiname"
Die Leerzeichen sollten die Schuldigen sein. Denk ich! 

Wie zur HÖLLE bekomme ich die Leerzeichen mit Nullen aufgefüllt?
Ich hab absolut keinen Einfall und Google ist momentan nicht mein Freund!
Danke im Voraus!


----------



## JSEngineering (3 September 2021)

Moin Bernd,

entweder prüfst Du die Zahl vor der Wandlung in String auf <10 und fügst eine Null in den String davor.
Oder Du prüfst den String auf Länge = 1 bzw. das erste Zeichen auf Zeichen 32 (Leerzeichen) und hängst dann eine Null davor.

Du kannst natürlich auch per Schleife durch alle Zeichen des fertigen Strings gehen und alle "32"er-Zeichen durch Nullen ersetzen.

Gruß
    Jens


----------



## PN/DP (3 September 2021)

Achtung, anstatt den Leerzeichen kein Null-Zeichen (16#00) sondern das Zeichen '0' (16#30).
Wenn schon Leerzeichen ' ' (16#20) (angeblich?) unzulässig sind, dann dürften Null-Zeichen erst recht unzulässig sein.

In welchem Programmiersystem bekommst Du bei welcher Anweisung den Fehlerstatus 8090?

Harald


----------



## PN/DP (3 September 2021)

Bernd87 schrieb:


> Verknüpft habe ich alles mit CONCAT zu: "2021 9 3 820"


Wie entstehen bei Dir die hier als Leerzeichen gezeigten Zeichen?

Harald


----------



## Heinileini (3 September 2021)

PN/DP schrieb:


> Wie entstehen bei Dir die hier als Leerzeichen gezeigten Zeichen?


Vermutlich bei der Wandlung von INT(?) in STRING. Die "vorflaufenden Nullen" werden dann üblicherweise durch Blanks ersetzt.

Um die (alle!) Blanks in einem String, der ansonsten nur Ziffern enthält, in '0' zurückzuwandeln:
zu allen Bytes (ASCII-Zeichen) 16#10 dazuODERn.
Abzufragen, ob ein Byte ' ' enthält und nur in diesem Fall '0' reinzuschreiben, ist dann nicht nötig.


----------



## Bernd87 (3 September 2021)

Wo bekomme ich das her:






Ich gehe davon aus dass bei der Konvertierung ein Leerzeichen entsteht wenn ich eine einstellige Datums-/ Zeitanzeige hab.


----------



## JSEngineering (3 September 2021)

Heinileini schrieb:


> Vermutlich bei der Wandlung von INT(?) in STRING. Die "vorflaufenden Nullen" werden dann üblicherweise durch Blanks ersetzt.


Das muß ja wieder eine Siemens-Spezialität sein...
Entweder erwarte ich im ersten Zeichen ein Vorzeichen oder aber die Zahl, aber warum soll da bitte schön ein Leerzeichen auftauchen, wenn ich eine Zahl konvertiere? Vor allem: Wer entscheidet denn, wie viele führenden Nullen ich haben soll?

@Bernd87: Was ich in Deinem Bild sehe: Das Format der Zahl ist ein USInt, Du konvertierst aber einen UInt. Möglicherweise kann das die Funktion verwirren.


----------



## Windoze (3 September 2021)

JSEngineering schrieb:


> Das muß ja wieder eine Siemens-Spezialität sein...
> Entweder erwarte ich im ersten Zeichen ein Vorzeichen oder aber die Zahl, aber warum soll da bitte schön ein Leerzeichen auftauchen, wenn ich eine Zahl konvertiere? Vor allem: Wer entscheidet denn, wie viele führenden Nullen ich haben soll?
> 
> @Bernd87: Was ich in Deinem Bild sehe: Das Format der Zahl ist ein USInt, Du konvertierst aber einen UInt. Möglicherweise kann das die Funktion verwirren.


Das ist bei der Siemens-Funktion so. Wenn du führende Nullen haben möchtest, musst du die Leerzeichen nachträglich ersetzen oder eine eigene Wandlungsfunktion schreiben.

Zitat aus der Hilfe:


> Bei der Konvertierung eines numerischen Werts in eine Zeichenkette werden die ersten Zeichen der Zeichenkette mit Leerzeichen aufgefüllt. Die Anzahl der Leerzeichen ist abhängig von der Länge des numerischen Werts.


----------



## Bernd87 (3 September 2021)

JSEngineering schrieb:


> Das Format der Zahl ist ein USInt, Du konvertierst aber einen UInt. Möglicherweise kann das die Funktion verwirren.


Das stimmt! Ich hätte jetzt aber eigentlich erwartet das mich SIEMENS bezüglich diese Fauxpas ermahnt!!! 
Das Probiere ich...am Montag! Schönen WE


----------



## Windoze (3 September 2021)

Bernd87 schrieb:


> Das stimmt! Ich hätte jetzt aber eigentlich erwartet das mich SIEMENS bezüglich diese Fauxpas ermahnt!!!
> Das Probiere ich...am Montag! Schönen WE


Du siehst an den Bausteinen, wo das der Fall ist, vorne ein kleines Quadrat. Das gibt den Hinweis das die Datentypen nicht übereinstimmen aber intern Konvertiert werden. Die Leerzeichen wirst du aber in jedem Fall haben (siehe mein vorheriger Beitrag).


----------



## Heinileini (3 September 2021)

Wir wissen (noch) nicht, ob es die Leerzeichen sind, die bemeckert werden.
Irgendwo gab es doch mal die Regel, dass Namen mit einem Buchstaben (oder Unterstrich) beginnen müssen ...



Windoze schrieb:


> ... oder eine eigene Wandlungsfunktion schreiben.


... oder eine eigene ReplaceFunktion schreiben, die wie "Replace" in VBA oder 'Wechseln" (Excel, ArbeitsBlattFunktion) alle Vorkommnisse eines Zeichens/Strings durch ein anderes Zeichen bzw. einen anderen String ersetzt.


----------



## JSEngineering (3 September 2021)

Windoze schrieb:


> Das ist bei der Siemens-Funktion so. Wenn du führende Nullen haben möchtest, musst du die Leerzeichen nachträglich ersetzen oder eine eigene Wandlungsfunktion schreiben.
> 
> Zitat aus der Hilfe:


Das Zitat aus der Hilfe verstehe ich nicht...  


> Die Anzahl der Leerzeichen ist abhängig von der Länge des numerischen Werts.



Wenn ich "9" in einen String wandel, ist mein numerischer Wert 1 Zeichen lang... wo sollen da Leerzeichen her kommen?
Oder meinen die die Länge des Datentyps? Dann würde ich aber zwei Leerzeichen erwarten, da USInt einen Wertebereich von 0..255 hat.

Ich verstehe auch nicht, warum eine Wandlung "0" einen String mit der Länge 6 erzeugt, auch das steht in der Hilfe...


----------



## Windoze (3 September 2021)

JSEngineering schrieb:


> Das Zitat aus der Hilfe verstehe ich nicht...
> 
> 
> Wenn ich "9" in einen String wandel, ist mein numerischer Wert 1 Zeichen lang... wo sollen da Leerzeichen her kommen?
> ...


Es geht über den Datentyp. Die Länge 6 ist bei Int, da ist der Wertebereich -32768 .. 32767 also werden 6 Zeichen benötigt um den kleinsten Wert inkl. Vorzeichen darzustellen. Das hier nur ein Leerzeichen ist, liegt daran, dass er den String nur als STRING[2] deklariert hat.


----------



## JSEngineering (3 September 2021)

Windoze schrieb:


> Es geht über den Datentyp. Die Länge 6 ist bei Int, da ist der Wertebereich -32768 .. 32767 also werden 6 Zeichen benötigt um den kleinsten Wert inkl. Vorzeichen darzustellen. Das hier nur ein Leerzeichen ist, liegt daran, dass er den String nur als STRING[2] deklariert hat.


Wer lesen kann, ist klar im Vorteil   Danke!
Wieder typisch S...


----------

