RPG (3 et 4, free), CL, SQL, etc...
			
		
		
			
				
																			
								germor 							 
									
		Messages :  75 Enregistré le :  lun. 06 juin 2011,  08:01:43 
		
						
						
													
							
						
									
						Message 
					 
								par germor  mer. 01 juil. 2015,  10:31:47 
			
			
			
			
			Bonjour,
Sous V7R1,
La conversion du "Tag" RPG en Free pose question.
Code : Tout sélectionner 
 /FREE
 EXEC SQL
 WHENEVER SQLERROR GOTO ERRSQL;
...
 /END-FREE
C     ErrSQL        Tag
 /FREE
 //* action lors de l'erreur sql
  cancel('Erreur SQL : ' + SQLSTT);     
 Existe t'il une astuce pour contourner le fait que Tag n'a aucun remplaçant dans RPG Free ?
 
 Plus globalement, le "WHENEVER SQLERROR" ne doit il pas être abandonné au profit d'une gestion d'erreurs SQL après chaque instruction SQL ?
 
 Merci d'avance pour vos réponses.
 
		 
				
		
		 
	 
	
		
		
			
				
																			
								germor 							 
									
		Messages :  75 Enregistré le :  lun. 06 juin 2011,  08:01:43 
		
						
						
									
						Message 
					 
								par germor  mer. 01 juil. 2015,  12:00:54 
			
			
			
			
			Réponse à moi-même :
Je suis chaque fois toujours plus étonné (c'est mon coté fleur bleue 
 ) de constater que c'est en énonçant puis en écrivant ma question sur le forum, que je trouve la réponse (Cela arrive environ 7 fois sur 10).
Ici, j'opte pour l'abandon de "WHENEVER SQLERROR"   au profit d'un bon :
 
Code : Tout sélectionner 
       if SQLCODE <> 0 and SQLCODE <> 100;
          cancel('SQLCODE= ' + %Char(SQLCODE) + ' SQLSTT= ' + SQLSTT); 
       endif;   
après chaque ordre SQL.
 
		 
				
		
		 
	 
	
		
		
			
				
																			
								cmasse 							 
						Site Admin 			
		Messages :  813 Enregistré le :  mer. 14 févr. 2007,  18:00:03Localisation :  Nantes
				Contact : 
				
			 
				
		 
		
						
						
													
							
						
									
						Message 
					 
								par cmasse  mer. 01 juil. 2015,  12:37:12 
			
			
			
			
			Le problème avec le WHENEVER c'est le GOTO (qui me semble une mauvaise pratique)
la solution proposée me semble être la bonne, on peut aussi utiliser GET DIAGNOSTICS 
Code : Tout sélectionner 
   exec,sql
    GET DIAGNOSTICS CONDITION 1
               message = MESSAGE_TEXT
   exec sql
    GET DIAGNOSTICS CONDITION 1
               etat = DB2_RETURNED_SQLSTATE | DB2_RETURNED_SQLCODE
   exec sql
    CALL procedure;
   exec sql
    GET DIAGNOSTICS valretour = RETURN_STATUS;
   exec sql
        DELETE From fichier Where ...;
   exec sql
    GET DIAGNOSTICS nbrdelignes = ROW_COUNT;
Christian Massé (Volubis.fr)