Zitat Zitat von Wissbegierig
Hallo,

ich habe ein Datum mit %Subst zusammengesetzt und muss es nun in ein Feld (8S 0) bringen. Wie konvertiere ich es??? Bin über jeden Tip dankbar.
Hallo,

zunächst einmal eine Frage, wie sieht das zusammengepuzzelte Datum aus?

'JJJJ-MM-DD' oder JJJMMDD oder ....

Abhängig vom Format kann das Datum in ein numerisches Feld konvertiert werden. Die eine Variante sind 2 aufeinanderfolgende MOVE-Befehle, wobei beim ersten MOVE das alphanumerische Feld in ein echtes Datum konvertiert wird.
Beim 2. MOVE wird das Datum in ein numerisches Feld konvertiert. In Faktor 1 wird zunächst das Format des alphanumerischen Feldes (1.MOVE) angegeben. Beim 2. MOVE wird in Faktor2 das Ausgabe-Format in das numerische Feld angegeben. Datums-Werte sind immer als 4Byte Binär-Wert gespeichert und werden nur in RPG konvertiert. Für Berechnungen wird jedoch immer der Binär-Wert herangezogen.

Ansonsten hat man die Möglichkeit mehrere Built-in-Funktionen ineinander zu schachteln. Ab Release V5R3M0 können Datums-Werte direkt über die Funktion %DEC in numerische Felder konvertiert werden.

Anbei einige Beispiele:
PHP-Code:
D MyDate          S               D                     
D MyDate10A       S             10A   inz
('2005-11-29'
D MyDate8A        S              8A   inz('29112005')   
D MyDate6A        S              6A   inz('112905')     
                                                        
D MyDate8N        S              8S 0                   
 
*--------------------------------------------------------
C                   Move      MyDate10A     MyDate      
C                   Move      MyDate        MyDate8N    
C     MyDate8N      Dsply                               
                                                        
C                   clear                   MyDate8N    
C     
*Eur0         Move      MyDate8A      MyDate      
C                   Move      MyDate        MyDate8N    
C     MyDate8N      Dsply                               
                                                        
C                   clear                   MyDate8N    
C                   movel     
'29-11-05'    MyDate8A    
C     
*DMY-         Move      MyDate8A      MyDate      
C                   Move      MyDate        MyDate8N    
C     MyDate8N      Dsply                               
                                                        
C                   clear                   MyDate8N    
C     
*MDY0         Move      MyDate6A      MyDate      
C                   Move      MyDate        MyDate8N    
C     MyDate8N      Dsply                     
 
*--------------------------------------------------------  
 /
Free                                          
 
/If DEFINED (*V5R3M0)                          
   
Clear MyDate8N;                              
   
MyDate8N = %Dec(%Date(MyDate10A: *ISO));     
   
Dsply MyDate8N;                              
                                                
   
Clear MyDate8N;                              
   
MyDate8A '29112005';                       
   
MyDate8N = %Dec(%Date(MyDate8A: *Eur0));     
   
Dsply MyDate8N;                              
                                                
   
Clear MyDate8N;                              
   
MyDate8A '29-11-05';                       
   
MyDate8N = %Dec(%Date(MyDate8A: *DMY-));     
   
Dsply MyDate8N;                              
                                                
   
Clear MyDate8N;                              
   
MyDate8N = %Dec(%Date(MyDate6A: *MDY0));     
   
Dsply MyDate8N;                 
   
//-------------------------------------------------------             
 
/ELSE                                                            
   
Clear MyDate8N;                                                
   
MyDate8N = %Dec(%Char(%Date(MyDate10A: *ISO): *ISO0): 80);   
   
Dsply MyDate8N;                                                
                                                                  
   
Clear MyDate8N;                                                
   
MyDate8A '29112005';                                         
   
MyDate8N = %Dec(%Char(%Date(MyDate8A: *Eur0): *ISO0): 80);   
   
Dsply MyDate8N;                                                
                                                                  
   
Clear MyDate8N;                                                
   
MyDate8A '29-11-05';                                         
   
MyDate8N = %Dec(%Char(%Date(MyDate8A: *DMY-): *ISO0): 80);   
   
Dsply MyDate8N;                                                
                                                                  
   
Clear MyDate8N;                                                
   
MyDate8N = %Dec(%Char(%Date(MyDate6A: *MDY0): *ISO0): 80);   
   
Dsply MyDate8N;  
 /EndIf     
   *
InLR = *ON;                                                      
 /
End-Free 
Nähere Informationen zur Datums- und Zeitrechnung findest Du u.a. in folgendem Redbook Kapitel 9.3:
Modernizing IBM eServer iSeries Application Data Access - A Roadmap Cornerstone