[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Oct 2004
    Beiträge
    53

    gepacktes num.Feld in ein Alphafeld umsetzen

    Ich vesuch verzweifelt ein gepacktes numerisches Feld in ein Alphafeld umzusetzen. jedoch bisher ohne erfolg.

    hab schon diverse Versuche gestartet aber das was in meinem Alphafeld ankommt ist immer der Inhalt des gepackten Feldes.

    Hat das jemand schonmal gemacht und kann mir einen tip geben. Dr.Google hat auch nichts produktives hervorgebracht.

    Danke im Vorraus.

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von Souljumper
    Ich vesuch verzweifelt ein gepacktes numerisches Feld in ein Alphafeld umzusetzen. jedoch bisher ohne erfolg.

    hab schon diverse Versuche gestartet aber das was in meinem Alphafeld ankommt ist immer der Inhalt des gepackten Feldes.

    Hat das jemand schonmal gemacht und kann mir einen tip geben. Dr.Google hat auch nichts produktives hervorgebracht.

    Danke im Vorraus.
    Hallo,

    ich gehe davon aus, dass, wenn in dem gepackten Feld x'12345F' steht, Du in Deinem Alpha-Feld 12345 sehen willst.

    Der einzige Weg sicher zustellen, dass numerische Felder in RPG gezont verwendet werden, ist, sie in eine Datenstruktur einzubinden.

    Du definierst also eine Datenstruktur mit einem gezonten numerischen Feld, überlagerst dieses durch Dein Alpha-Feld.
    Anschliessend füllst Du den gepackten numerischen Wert in das gezonte Feld (mit EVAL).

    Alternativ könnten auch die Built-in-Funktionen %CHAR oder %EDITC verwendet werden.

    Beispiel:
    PHP-Code:
    D DSAlpha         DS                                   
    D  Numer                        10S 0                  
    D  Alpha                        10A   overlay
    (Numer)   
                                                           
    D Packed          S              5P 0 inz(12345)       
     *----------------------------------------------
     /
    Free                    
       Numer 
    Packed;        
       
    Dsply   Alpha;      

       
    EvalR Alpha = %TrimR(%Char(Packed));        
       
    Dsply   Alpha;  
                                
       
    EvalR Alpha = %TrimR(%EditC(Packed'Z'));  
       
    Dsply   Alpha;                              
       
       *
    InLR = *On;           
     /
    End-Free 
    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
    Oct 2004
    Beiträge
    53
    Danke für die Antwort.

    Ich hab allerdings das Problem das ich die Information per %subst aus einer anderen Datenstruktur abgreifen muss. das heist ich muss es ja erst in einem alphafeld zwischenspeichern, da der compiler sonst einen Abbruchfehler bringt wenn ich per %subst in ein numerisches Feld kopieren möchte.

    Schiebe ich dann das Alphafeld per move befehl wieder in gepacktes feld steht in dem gepackten feld '000000' drin.

    Ich komme also gar nicht so weit ihren Löschungsschritt auszuprobieren da ich mir den Wert schon vorher zerschoßen hab.

    Code:
     c				   evalr	 wpack2 = %subst(csdta:cspos:cslen)  
     c				   move	  wpack2		packed				
     c				   eval	  nummer = packed					 
     c				   evalR	 Alpha = %trimR(%char(packed))	   
     c				   evalR	 Alpha = %trimR(%editc(packed:'Z'))
    wpack2 ist alpahnumerisch.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wie im obigen Beispiel definiere ein gep. Feld in entsprechender Größe und überlageres es mit dem Alpha-Feld:

    d ds
    d Num 11p 2
    d Alp 6 overlay(Num)

    eval Alp = %subst(...)

    In "Num" steht dein Wert (falls der Inhalt auch korrekt ist).
    Dies sind eher "verbotene" Methoden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von Souljumper
    Ich hab allerdings das Problem das ich die Information per %subst aus einer anderen Datenstruktur abgreifen muss.
    Hallo,

    wenn der numerische Wert immer an der gleichen Stelle steht, dann lege einfach eine Datenstruktur an, in der der numerische Wert als gepacktes Feld definiert wird:
    (Du brauchst Dich nicht mit irgendwelchen SUBSTRINGS herumzuärgern)

    Beispiel:
    PHP-Code:
    D MyDS            DS                                                     
    D   Anfang                       5A                                      
    D   Packed                       5P 0                                    
    D   Ende                         5A                                      
                                                                             
    D   Text          S             13A   inz
    (x'E7E7E7E7E712345FE7E7E7E7E7'
     *------------------------------------------------------
     /
    Free
        MyDS 
    Text;
        
    Dsply Packed;
        *
    InLR = *On;
     /
    End-Free 
    Wenn die Start-Position und Länge variabel sind wird es komplizierter. Am einfachsten ist, man konvertiert den String in eine Hexadezimale Darstellung und greift dann die numerischen Werte ab. Die Konvertierung in Hex-Werte ist am einfachsten mit der SQL-Funktion HEX.

    Beispiel:
    PHP-Code:
    D Packed          S             11P 0                                   
                                                                            
    D   Text          S             13A   inz
    (x'E7E7E7E7E712345FE7E7E7E7E7')
    D   AlphaHex      S             26A                                     
    D   AlphaNum      S             26A                                     
                                                                            
    D   Start         S              3U 0                                   
    D   StartHex      S              3U 0                                   
    D   Len           S              3U 0                                   
    D   LenHex        S              3U 0                                   
    D   Sign          S              1A        
     
    *---------------------------------------------------------
    C/Exec SQL                                                    
    C
    Set :AlphaHex Hex(:Text)                                 
    C/End-Exec                                                    
     
    /Free                                                        
        Start    
    6;                                             
        
    Len      3;                                             
        
    StartHex Start 1;                                 
        
    LenHex   Len 2;                                       
        
    AlphaNum = %Subst(AlphaHexStartHexLenHex 1);        
        
    Packed   = %Dec(%Trim(AlphaNum): 110);                  
        
    Sign     = %Subst(AlphaHexStartHex LenHex 11);    
        If 
    Sign  'D';                                           
           
    Packed -= Packed;                                      
        Endif;
        
    Dsply Packed;                                                    
        *
    InLR    = *On;                                           
     /
    End-Free 
    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

  6. #6
    Registriert seit
    Oct 2004
    Beiträge
    53
    Zitat Zitat von Fuerchau
    Wie im obigen Beispiel definiere ein gep. Feld in entsprechender Größe und überlageres es mit dem Alpha-Feld:

    d ds
    d Num 11p 2
    d Alp 6 overlay(Num)

    eval Alp = %subst(...)

    In "Num" steht dein Wert (falls der Inhalt auch korrekt ist).
    Dies sind eher "verbotene" Methoden.
    Danke, das hat mir schon etwas weiter geholfen, allerdings renn ich jetzt immer auf einen Dezimaldatenfehler, hier der code:
    Code:
    d zoned		   ds								 
    d nummer						30p 0				
    d alpha						 14A   overlay(nummer)
    Hat es einen bestimmten Grund warum mich der compiler zwingt da Alphafeld maximal halb so groß wie das gepackte Feld sein zu lassen?!

    Code:
    c	 d420		  begsr									   
    c				   eval(h)   wcslen = cslen / 2				
    c				   evalR	 alpha = %subst(csdta:cspos:wcslen) /*Bis hierher alles ok*/
    c				   evalR	 Alpha = %trimR(%char(nummer))	 /*dezimaldatenfehler*
    c				   evalR	 Alpha = %trimR(%editc(nummer:'Z'))
    Zum dedzimaldat. fehler siehe Anhang.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    SO einfach ist es nun auch wieder nicht !
    Der evalR füllt nach links mit x'40' auf !!!
    Dann "30p 0" belegt 16 Bytes !!!

    Mach dir ein Hilfsfeld:
    d Hex0 16 inz(*loval)

    Dann mach den
    evalR = Hex0 + %subst(.....)
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Oct 2004
    Beiträge
    53
    Ahhhh, ok danke. es klappt jetzt!

    Vielen Dank an alle die mir geholfen haben .

Similar Threads

  1. Umlaute umsetzen
    By MKl. in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 14-12-06, 15:43
  2. A3 nach A4 umsetzen
    By TARASIK in forum NEWSboard Drucker
    Antworten: 2
    Letzter Beitrag: 14-12-06, 12:14
  3. CHAR in Zoned umsetzen RPG
    By Wissbegierig in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 29-11-05, 13:11
  4. Alphafeld in Dezimalfeld RPG
    By mgraskamp in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 22-09-05, 15:27
  5. RPGIII: Alphafeld hochzählen
    By seth in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 28-10-04, 19:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •