-
Hallo B.Hauser,
danke für die Antwort. Leider hat mir das nicht weitergeholfen.
Robi hat schon richtig geantwortet:
Oder hast du gar keinen Bildschirm?
dann mußt du, wenn %substr(textfeld250: 51:1 <> ' ')
bei dem Blank davor trennen.
Das mußt du programmieren
Robi
Allerdings frage ich mich, wie ich das mit den 5 Textfeldern lösen soll.
Panther
-
Schätze wir beide werden uns heute nicht mehr einig ! 
Der link von Birgitta ist doch super.
Damit geht das, (was ich glaube das du willst)
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Hallo Panther,
hast du dir den Sourcecode des WrapText-Programms (Link von Birgitta) mal angesehen? Vielleicht ist dir unklar, wie man das Programm verwenden kann. Aus meiner Sicht ist das nach folgendem Prinzip möglich:
Also, du hast 1 großes Textfeld mit 250 Zeichen Länge:
D text S 250A
Als Ergebnis möchtest du den Text in 5 Textfelder von z.B. 78 Zeichen Länge haben, richtig?
D text1 S 78A
D text2 S 78A
D text3 S 78A
D text4 S 78A
D text5 S 78A
Dann musst du dir nur ein großes Ergebnistextfeld definieren (So groß wie alle gewünschten Ergebnistextfelder zusammen (also 5 mal 78):
tempText S 390A
Dann rufst du die WrapText Procedure auf:
tempText = WrapText(text:78);
Jetzt musst du nur noch dein temporäres Ergebnis in deine 5 gewünschten Felder übertragen:
text1 = %subst(tempText:1:78);
text2 = %subst(tempText:79:78);
text3 = %subst(tempText:157:78);
text4 = %subst(tempText:235:78);
text5 = %subst(tempText:313:78);
Fertig!
Die andere im Link beschriebene Möglichkeit, die Procedure WrapText für eine UDTF zu nutzen, geht natürlich auch. Aber so müsste es rein im RPG funktionieren, denke ich.
Gruß,
Dieter
-
Wenn man sich eine Datenstruktur mit den 5 (oder wieviel auch immer) Text-Feldern als Unterfelder (mit fixer Länge definiert), braucht man noch nicht einmal einen %SUBST!
Birgitta
-
Hallo dschroeder,
vielen Dank für die Antwort.
Das ist fast genau das, was ich benötige. 
Mir fehlt hier aber etwas wichtiges; ich Zitiere mich einmal :
Ich habe ein Textfeld von 250 Zeichen. Dieses möchte ich sinnvoll, also leserlich in 5 Textfelder aufteilen.
Mit Sinnvoll meine ich das Wörter nicht getrennt ( abgehackt ) werden.
Panther
-
Code:
D $Von S 10I 0
D $Bis S 10I 0
D $String S 250A
D $I S 10I 0
D $Fld S 50A DIM(5) INZ
/Free
$String =
'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, +
sed diam nonummy nibh euismod tincidunt ut laoreet dolore +
magna aliquam erat volutpat. Ut wisi enim ad minim veniam, +
quis nostrud exerci tation ullamcorper suscipit ex.';
$I = 0;
DoW $String <> *Blanks;
$Von = 1;
$Bis = 51;
DoW %Subst($String:$Bis:1) <> *Blank;
$Bis -= 1;
EndDo;
$I += 1;
$Fld($I) = %Subst($String:$Von:$Bis-$Von);
$String = %Trim(%Subst($String:$Bis));
EndDo;
*InLr = *On;
/End-Free
...fehlt nur noch ein Monitor drumrum, falls mal keine Blanks zu finden sind
-
 Zitat von RobertMack
[CODE]
/Free
$String =
'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, +
sed diam nonummy nibh euismod tincidunt ut laoreet dolore +
magna aliquam erat volutpat. Ut wisi enim ad minim veniam, +
quis nostrud exerci tation ullamcorper suscipit ex.';
Der Römer als solches würde jetzt nur Bahnhof verstehen.
Interessant was es alles so gibt.
GG
-
Kann aber schon sein, dass Du mit deiner Methode u.U. sechs Felder benötigst oder?
Nämlich in dem Fall, wenn Du ein "abgehacktes" Wort auf eine neue Zeile übertragen musst.
kf
-
 Zitat von camouflage
Kann aber schon sein, dass Du mit deiner Methode u.U. sechs Felder benötigst oder?
Nämlich in dem Fall, wenn Du ein "abgehacktes" Wort auf eine neue Zeile übertragen musst.
Ja.
P.S. Es ging um den Ansatz (der Monitor hätte übrigens neben 51stelligen Worthülsen auch $I>5 zum Bahnhof geschickt)
-
Warum wollt Ihr denn partout die Räder neu erfinden!
Kopiert doch einfach den folgenden Source Code, der eine Kopie der Funktionen WRAPTEXT und REPLACE (wird aus WRAPTEXT aufgerufen) von Michael Sansosterra enthält in eine Quelle, wandelt das Ding mit 14 in ein Programm um und führt es aus!
Code:
D WrapText PR 12288
D UnfText 8192 Varying Const Options(*VarSize)
D LineLen 5 0 Const
D LineBreak 10 Varying Const Options(*NoPass)
DReplace PR 8192 Varying
D parmSearchStr 8192 Varying Const Options(*VarSize)
D FindStr 8192 Varying Const Options(*VarSize)
D ReplaceStr 8192 Varying Const Options(*VarSize)
//******************************************************************
D OrigText S 250A Varying
D DSText DS Qualified
D Text1 52A
D Text2 52A
D Text3 52A
D Text4 52A
D Text5 52A
D Text6 52A
D FGText 52A Dim(6) Overlay(DSText)
D Index S 3U 0
//**********************************************************************
/Free
OrigText = 'Wieso sollte die Funktion WRAPTEXT von Michael +
Sansosterra den Erfordernissen nicht entsprechen? +
M.E. ist dies genau was gefordert wurde. +
Man muss dieses Programm, das eine Kopie der +
Funktion enthält umwandeln, ausführen +
und das Ergebnis anschauen!';
DSText = WrapText(OrigText: %Len(DSText.Text1));
For Index = 1 to %Elem(DSText.FGText);
Dsply DSText.FGText(Index);
EndFor;
*InLR = *On;
/END-FREE
//**********************************************************************
P WrapText B
D WrapText PI 12288
D UnfText 8192 Varying Const Options(*VarSize)
D LineLen 5 0 Const
D LineBreak 10 Varying Const Options(*NoPass)
// Work Fields
D WrkText s + 1 Like(UnfText)
D LineText s 12288
D WordText s Like(UnfText)
D FmtText s 12288
D WordLen s 5 0
// Word/Line counters
D Line s 5 0
D Word s 5 0
//-----------------------------------------------------------------------
/Free
WrkText=%TrimL(UnfText)+' ';
If %Parms>=3;
If %Len(LineBreak)>0;
WrkText=Replace(WrkText:LineBreak:' '+LineBreak+' ');
EndIf;
EndIf;
If LineLen<=*Zero Or LineLen>%Size(UnfText);
Return 'INVALID LEN*';
EndIf;
If UnfText=*Blank;
Return '';
EndIf;
Dow %Len(WrkText)>*Zero;
// Find Boundary of word
WordLen=%Scan(' ':WrkText)-1;
If WordLen>*Zero;
// Test if Word length is greater than the wrap length
If WordLen>LineLen ;
WordText=%Subst(WrkText:1:LineLen);
WrkText=%Subst(WrkText:LineLen+1);
Else;
WordText=%Subst(WrkText:1:WordLen);
WrkText=%TrimL(%Subst(WrkText:WordLen+1));
EndIf;
// Test if break was requested
If %Parms=3;
If WordText=LineBreak;
WordText=' ';
ExSr BuildLine;
EndIf;
EndIf;
// If Length of Current Line + Length of the current word
// > than formatted line length, make a new line
If %Len(%TrimR(LineText)) + %Len(WordText)+1>LineLen
And %Len(%TrimR(LineText))>0;
ExSr BuildLine;
EndIf;
// Append Word to current Line
// NOTE: Word will be blank if a line break specified
If WordText<>*Blanks;
Word=Word+1;
If Word=1;
LineText=WordText;
Else;
LineText=%TrimR(LineText)+' '+WordText;
EndIf;
EndIf;
EndIf;
EndDo;
// Build Remaining Line
If LineText<>*blanks;
ExSr BuildLine;
EndIf;
Return FmtText;
// Build Single Line according to the requested format width
BegSr BuildLine;
Word=*Zero;
If Line=*Zero;
FmtText=%Subst(LineText:1:LineLen);
Else;
If LineLen*Line>%Size(FmtText);
LeaveSr;
Else;
FmtText=%Subst(FmtText:1:LineLen*Line) +
%Subst(LineText:1:LineLen);
EndIf;
EndIf;
Line=Line+1;
LineText=*Blank;
EndSr;
/End-Free
P WrapText E
//*******************************************************************
// Find and Replace a string
//*******************************************************************
PReplace B
DReplace PI 8192 Varying
D parmSearchStr 8192 Varying Const Options(*VarSize)
D FindStr 8192 Varying Const Options(*VarSize)
D ReplaceStr 8192 Varying Const Options(*VarSize)
D SearchStr S 8192 Varying Static
D Pos S 5i 0
D SL S 5i 0
D FL S 5i 0
/Free
SearchStr=parmSearchStr;
FL=%Len(FindStr);
Pos=*zero;
Dow pos + fl<=%Len(SearchStr);
SL=pos+1;
Pos=%Scan(FindStr:SearchStr:sl);
// Leave if search string isn't found
If Pos=*Zero;
Leave;
EndIf;
// Build new string with replaced text in the middle
If Pos + fl > %Len(SearchStr);
SearchStr=%Subst(SearchStr:1:Pos-1) + ReplaceStr;
Else;
SearchStr=%Subst(SearchStr:1:Pos-1) + ReplaceStr +
%Subst(SearchStr:Pos + fl);
EndIf;
// Set starting position for search of next occurance
Pos=Pos+%Len(ReplaceStr)-1;
EndDo;
Return SearchStr;
/End-Free
P Replace E
Birgitta
-
 Zitat von B.Hauser
Warum wollt Ihr denn partout die Räder neu erfinden!
@Birgitta,
nicht neu erfinden, nur einfacher...
Siehe hier:
Code:
D $strng s 8192
D $text s 250
D $cvtxt DS 8192 qualified
D Feld1 50A
D Feld2 50A
D Feld3 50A
D Feld4 50A
D Feld5 50A
D Feld6 50A
D $start S 5U 0 inz(1)
D $end S 5U 0
D $len S 5U 0
/free
$text = 'Wieso sollte die Funktion WRAPTEXT von Michael +
Sansosterra den Erfordernissen nicht entsprechen? +
M.E. ist dies genau was gefordert wurde. +
Allerdings geht das einiges einfacher und vor allem +
verständlicher. +
Wieso mit Kanonen auf Spatzen schiessen?';
$strng = $Text;
exsr $Wrap;
... do what ever you want...
*inlr = *on;
// Convert Fliesstext in eine Datenstruktur
begsr $Wrap;
$len = %len($cvtxt.Feld1);
$end = $len;
dow $strng <> *blanks;
dow %subst($strng:$end:1) <> *blank
and $end > 1;
$end -= 1;
enddo;
if $end > $len or $end <= 1; // overflow
$end = $len;
endif;
%subst($cvtxt:$start:$len)=%subst($strng:1:$end);
$strng = %trim(%subst($strng:$end))+' ';
$start += $len;
$end = $len;
enddo;
endsr;
/end-free
Alternativ mit Arrays arbeiten.
@Robert
Gute Idee der Shift - alte Schule, gelernt ist gelernt. ;-)
Just my 2ct's
kf
-
Hallo Zusammen,
erst einmal möchte ich mich bei allen die hier geantwortet haben bedanken.
Ich habe es so wie Birgitta geschrieben hat umgesetzt und es funktioniert.
Nochmals vielen Dank
Similar Threads
-
By USDAVIS in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 19-01-12, 14:03
-
By cicero22 in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 14-10-05, 06:24
-
By c_kinkel in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 15-07-05, 09:16
-
By sim in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 30-08-04, 07:30
-
By JoergHamacher in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 24-08-04, 12:21
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks