[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Jan 2013
    Beiträge
    6
    Keine Ausgabe im BS, sondern nur eine interne Lösung in einem Programm ist gemeint.

    Panther

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hilft Dir vielleicht der folgende Link weiter:
    Wrapping Free Form Text

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Jan 2013
    Beiträge
    6
    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

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    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!)

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Jan 2013
    Beiträge
    6
    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

  8. #8
    Registriert seit
    Jan 2003
    Beiträge
    759
    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

  9. #9
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Zitat Zitat von RobertMack Beitrag anzeigen
    [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

  10. #10
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    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

  11. #11
    Registriert seit
    Jan 2003
    Beiträge
    759
    Zitat Zitat von camouflage Beitrag anzeigen
    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)

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. iSeries Navigator - Verbindung trennen
    By USDAVIS in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 19-01-12, 14:03
  2. SQL -- trennen von Vorname Nachname
    By cicero22 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-10-05, 06:24
  3. Verbindung PC zu AS/400 trennen!
    By c_kinkel in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 15-07-05, 09:16
  4. SQL CLI Apis: Datenbankverindung trennen
    By sim in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 30-08-04, 07:30
  5. Mehrzeiliges Textfeld
    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
  •