Zitat Zitat von Rainer Ross Beitrag anzeigen
Ich werfe aufgrund der Anregung von Baldur noch eine Idee für "total" und "fully" free in den Hut
Code:
               ctl-opt main(main) dftactgrp(*no) option(*nounref);                                                            
      //------------------------------------------------------------------//                                            
      //                                                                  //                                            
      // Convert Zoned to Packed from String                              //                                            
      //                                                                  //                                            
      //-----------------                                                 //                                            
      // R.Ross 06.2017 *                                                 //                                            
      //------------------------------------------------------------------//                                            
      // Main                                                             //                                            
      //------------------------------------------------------------------//                                            
         dcl-proc Main;                                                                                                 
                                                                                                                        
         dcl-s   LocString   varchar(30);             // String                                                         
         dcl-s   LocNumber   packed(11:2);            // Number                                                         
                                                                                                                        
           LocString = '000005843M';                                                                                    
           LocNumber = cvtZonedToPacked(LocString:2);                                                                   
                                                                                                                        
         end-proc;                                                                                                      
      //------------------------------------------------------------------//                                            
      // Convert Zoned to Packed from String                              //                                            
      //------------------------------------------------------------------//                                            
         dcl-proc cvtZonedToPacked;                                                                                     
         dcl-pi *n           like(LocNumber);                                                                           
                 PiString    varchar(30) const options(*varsize:*trim);                                                 
                 PiDecimals  uns(5)      const options(*nopass);                                                        
         end-pi;                                                                                                        
                                                                                                                        
         dcl-ds  PsString    qualified;                                                                                 
                  String     char(30);                                                                                  
                  Number     zoned(30) pos(01);                                                                         
         end-ds;                                                                                                        
                                                                                                                        
         dcl-s   LocNumber   packed(30:9);            // Number                                                         
                                                                                                                        
           evalr PsString.String = PiString;                                                                            
           LocNumber = PsString.Number;                                                                                 
                                                                                                                        
           if %parms >= %parmnum(PiDecimals);         // Decimals                                                       
              LocNumber /= 10 ** PiDecimals;          // Decimals                                                       
           endif;                                                                                                       
                                                                                                                        
           return LocNumber;                          // Number                                                         
                                                                                                                        
         end-proc;                                                                                                      
      //------------------------------------------------------------------//
Bist du sicher, dass das geht? Wenn dein varying - Input-Parameter kürzer als 30 Zeichen ist, würden in der Datenstruktur doch zunächst Leerzeichen und am Ende deine gezonte Ziffernfolge stehen, oder? Wird das dann zu einer 30 Stelligen-Zahl? Der evalr würde doch das Feld zunächst mit Blanks initialisieren und dann rechtsbündig deinen (ggf. kürzeren) String reinpacken. Müssen da keine Vornullen rein?