segunda-feira, dezembro 29, 2025

Natural - Aspas Duplas

Em alguns cenários de programação no Natural, principalmente quando o programa precisa montar comandos de sistema, parâmetros externos ou trechos de JCL, é necessário utilizar aspas duplas dentro de uma string. Isso acontece porque alguns ambientes — como JCL, FTP, utilities de sistema e scripts — exigem que determinados valores estejam entre aspas duplas para que sejam interpretados corretamente. No Natural, as constantes de texto normalmente são definidas com aspas simples. Por isso, quando precisamos incluir aspas duplas dentro da string, devemos escrevê-las como parte do conteúdo. A forma mais simples é incluir o caractere de aspas duplas normalmente dentro da string delimitada por aspas simples, por exemplo:

//AACCDCSA JOB (AACS,SCH),CLAUD,CLASS=S,MSGCLASS=A   
//*UQ ALLOW                                                                     
//* ---------------------------------------------------------------             
//*                     BACKUP DO INFOPRINT                                     
//* ---------------------------------------------------------------             
//AOPBATCH EXEC PGM=AOPBATCH,PARM='/pidu -c "export //DD:INVENT;"'  
//INVENT   DD   DSN=AOP.INV.BACKUP(+1),                             
//         DISP=(NEW,CATLG),                                        
//         DCB=(RECFM=VB,LRECL=32756,BLKSIZE=32760),                
//         UNIT=SYSDA,SPACE=(CYL,(11,10),RLSE),                                 
//         VOL=SER=PRD902                                                       
//STDOUT   DD   SYSOUT=*                                            
//STDERR   DD   SYSOUT=*                                            
//STDENV   DD   *                                                   
//* ---------------------------------------------------------------             
//*           REFRESH NO FILE 492 PARA FAZER UMA NOVA CARGA                     
//* ---------------------------------------------------------------             
//ADADBS   EXEC AAFAU240                                                        
//DDCARD   DD *                                                                 
//DDKARTE  DD *                                                                 
//* ---------------------------------------------------------------- 

O Natural depende do valor da opção do compilador TQMARK, como o Natural interpreta as " (aspas duplas). Execute o comando COMPOPT em uma linha de comando e você verá suas opções do compilador.

TQMARK=ON: Cada aspa dupla dentro de uma constante de texto é exibida como um apóstrofo simples. Este é o valor padrão.
TQMARK=OFF: Aspas duplas dentro de uma constante de texto não são traduzidas; elas são geradas como aspas duplas.

Se a opção do compilador deve ser aplicada a todo o programa:

DEFINE DATA LOCAL                       
1 #STRING       (A10) INIT <'ABC"DEF'>  
END-DEFINE                              
**
OPTIONS TQMARK=OFF
**
WRITE #STRING                           
*                                       
END 

Outra possibilidade é traduzir o apóstrofo simples para aspas duplas:

DEFINE DATA LOCAL                        
1 #STRING       (A10) INIT <'ABC"DEF'>   
END-DEFINE                               
*                                        
WRITE #STRING                            
EXAMINE #STRING FOR H'7D' REPLACE H'7F'  
WRITE #STRING                            
*                                        
END

Foi utilizado a primeira opção no programa abaixo

                                                                                
 >                                       > +  Program     INFO0108 Lib NATURAL 
        ....+....1....+....2....+....3....+....4....+....5....+....6....+....7..
   0610 1 #CSA (A80) INIT <'//AOPBATCH EXEC PGM=AOPBATCH,PARM='>                
   0620 1 #CSB (A80) INIT <'/pidu -c '>                                         
   0630 1 #CSC (A80) INIT <'export //DD:INVENT;'>                               
   0640 1 #CSE (A80) INIT <'/pidu -c "export //DD:INVENT;"'>                    
   0650 1 #1-QUOTE (A1)                                                         
   0660 1 #2-QUOTE (A1) /* INIT <'"'>                                           
   0670 END-DEFINE                                                              
   0680 * ==================================================================== *
   0690 FORMAT KD=ON                                                            
   0700 SET KEY                                                                 
   0710 PF3  = PGM  NAMED 'EXIT'                                                
   0720 OPTIONS TQMARK=OFF                                                      
   0730 * ==================================================================== *
   0740 MOVE "'" TO #1-QUOTE                                                    
   0750 MOVE '"' TO #2-QUOTE                                                    
   0760 REPEAT                                                                  
   0770 * ==================================================================== *
   0780   COMPRESS                                                              
   0790     #CSA                                                                
   0800     #1-QUOTE                                                            
   0810     #CSB                                                                
   0820     #2-QUOTE                                                            
   0830     #CSC                                                                
   0840     #2-QUOTE                                                            
   0850     #1-QUOTE                                                            
   0860     INTO #C06                                                           
   0870     LEAVING NO                                                          
   0880 * ==================================================================== *
   0890 * COMPRESS #CSA '"' #CSB '|'  #CSC '|' '"' INTO #C06     LEAVING NO     
   0900   COMPRESS '//STEP01   EXEC NATURAL,PARM1='                             
   0910     "'SYS=P,MT=0,STACK=(LOG NATURAL)'"                                 
   0920     INTO #C28   LEAVING NO                                              
   0930 * ==================================================================== *
   0940   COMPUTE #TOT = 33 * 80                                                
   0950   CALL 'RJE' #RC #C01 #TOT                                              
   0960   CALL 'GETJOB' #JOBNUM #CALLER                                         
   0970 * ==================================================================== *
   0980   FORMAT KD=OFF                                                         
   0990   DEFINE WINDOW NUMJOB                                                  
   1000     SIZE 08 * 50    BASE 07/17   TITLE ' NUMERO DO JOB ' 
        ....+....1....+....2....+....3....+....4....+....5....+... S 110  L 61  

0 comentários:

Enviar um comentário