Recherche-Remplace en ADELIA

Cette macro-instruction reçoit 3 paramètres =>

— Une chaine de caractère qui doit être déclarée en tant que variable caractère d’une longueur maxi de 9999.

— La chaine recherchée qui doit être définie dans une variable d’une longueur exactement égale à  la chaine recherchée ou exprimée sous forme littérale.

— La chaine de remplacement qui doit être définie dans une variable d’une longueur exactement égale à  la chaine recherchée ou exprimée sous forme littérale.

Exemple d’utilisation

Pour remplacer dans W_A9999 (une variable texte de 9999 de long)
« Monsieur » par « M. »


&RECHERCHE_REMPLACE(W_A9999;'Monsieur';'M.')

Code source

      
* ---------------------------------------------------------------- * 
* Serge GOMES  
* Attention :02 et :03 doivent être des variables alphanumériques    
* de longueur précise :                                              
* ex :02 = 'Mr'          devra être déclaré en 2A                    
*    :03 = 'Monsieur'    devra être déclaré en 8A                    
* OU des littéraux ('Mr';'Monsieur')                                 
*  :1     CHAINE  (MAXI 9999A)  Déclaration en tant que variable obligatoire 
*  :2     CHAINE RECHERCHà‰E                                           
*  :3     CHAINE DE REMPLACEMENT                                     
* ---------------------------------------------------------------- * 
DECLARER_TAB MITXRS;MI_WT_RESX  5;0 9999                             
DECLARER_TAB MI9999;MI_WT_9999  1   9999                             
DECLARER MIWRI;MI_IND_RES 4;0                                        
DECLARER MIIXF;MI_IND_FIN 4;0                                        
DECLARER MIX999;MI_X9999  9999                                       
DECLARER MIY999;MI_Y9999  9999                                       
DECLARER MIZ999;MI_Z9999  9999        
DECLARER MIXDEP;MI_XDEP   4;0                                          
DECLARER MIXFIN;MI_XFIN   4;0                                          
DECLARER MIXPOS;MI_XPOS   4;0                                          
DECLARER MIXLNG;MI_XLNG   4;0                                          
DECLARER MIWXB;MI_BLKX    1                                            
DECLARER MIWXL1;MI_LNG_X1 4;0                                          
DECLARER MIWXL2;MI_LNG_X2 4;0                                          
DECLARER MIWXL3;MI_LNG_X3 4;0                                          
* Calcul longueur variable passée (pour :02 et :03)                    
MI_X9999   = '#' // :02 // '#'                                         
MI_LNG_X2  = &LONGUEUR_CHAINE(MI_X9999)                                
MI_BLKX    = &EXTRACTION(MI_X9999;2;1)                                 
SI MI_BLKX  = ''''                                                     
  * La longueur varie selon que l'on passe une variable ou un littéral   
  MI_LNG_X2  = MI_LNG_X2 - 4                                           
SINON                                                                  
  MI_LNG_X2  = MI_LNG_X2 - 2                                           
FIN                                                    
MI_X9999   = *BLANK                                    
MI_X9999   = '#' // :03 // '#'                         
MI_LNG_X3  = &LONGUEUR_CHAINE(MI_X9999)                
MI_BLKX    = &EXTRACTION(MI_X9999;2;1)                 
SI MI_BLKX = ''''                                      
  MI_LNG_X3  = MI_LNG_X3 - 4                           
SINON                                                  
  MI_LNG_X3  = MI_LNG_X3 - 2                           
FIN                                                    
MI_X9999   = *BLANK                                    
MI_Z9999   = *BLANK                                    
MI_Z9999   = :01                                       
MI_LNG_X1  = &LONGUEUR_CHAINE(MI_Z9999)                
* /fin calcul longueur                                                                                     
MI_IND_FIN = 1                                         
MI_IND_RES    = 1                                                
MI_XDEP = 1                                                      
MI_WT_RESX = &RECHERCHE(MI_Z9999;:02)                            
MI_XPOS = MI_WT_RESX(MI_IND_RES)                                 
TANT_QUE MI_XPOS > 0 ET MI_XPOS <= MI_LNG_X1                     
  MI_XLNG = MI_XPOS - MI_XDEP                                    
  MI_X9999   = *BLANK                                            
  MI_X9999   = &EXTRACTION(MI_Z9999;MI_XDEP;MI_XLNG)             
  PLACER_TABLE MI_X9999 MI_WT_9999(MI_IND_FIN)                   
  MI_IND_FIN = MI_IND_FIN + MI_XLNG                              
  PLACER_TABLE :03 MI_WT_9999(MI_IND_FIN)                        
  MI_IND_FIN = MI_IND_FIN + MI_LNG_X3                            
  MI_XDEP = MI_XPOS + MI_LNG_X2                                  
  * Nécessaire pour le cas où on recherche de caractères doublés 
  * &RECHERCHE_REMPLACE(WVAR;'AA';'A')                           
  TANT_QUE MI_XPOS < MI_XDEP ET MI_XPOS <> 0                     
    MI_IND_RES = MI_IND_RES + 1                                  
    MI_XPOS = MI_WT_RESX(MI_IND_RES)                           
  REFAIRE                                                      
REFAIRE                                                        
SI MI_IND_FIN > 0                                              
  * On ajoute le dernier fragment                              
  MI_XLNG = MI_LNG_X1 - MI_XDEP + 1                            
  MI_X9999   = *BLANK                                          
  MI_X9999   = &EXTRACTION(MI_Z9999;MI_XDEP;MI_XLNG)           
  PLACER_TABLE MI_X9999 MI_WT_9999(MI_IND_FIN)                 
  MI_X9999 = *BLANK                                            
  PLACER_TABLE MI_WT_9999 MI_X9999                             
  :01 = MI_X9999                                               
FIN           
Print Friendly, PDF & Email