1. Funções básicas — LENGTH, SUBSTR, POS
| Função | O que faz | Exemplo | Resultado |
|---|---|---|---|
LENGTH(s) | Comprimento da string | LENGTH('ABC') | 3 |
SUBSTR(s,n,len) | Extrai substring | SUBSTR('ABCDE',2,3) | BCD |
POS(sub,s) | Posição de substring | POS('B','ABCD') | 2 |
LASTPOS(sub,s) | Última ocorrência | LASTPOS('.','a.b.c') | 4 |
INDEX(s,sub) | Alias de POS | INDEX('ABCD','BC') | 2 |
COPIES(s,n) | Repete string n vezes | COPIES('-',20) | -------------------- |
/* Exemplos práticos */
DSN = 'USUARIO.DADOS.CLIENTES'
/* Extrair o HLQ (tudo antes do primeiro ponto) */
PONTO = POS('.', DSN)
HLQ = SUBSTR(DSN, 1, PONTO - 1)
SAY HLQ /* Saída: USUARIO */
/* Extrair o último qualificador */
ULTIMO_PONTO = LASTPOS('.', DSN)
ULTIMO = SUBSTR(DSN, ULTIMO_PONTO + 1)
SAY ULTIMO /* Saída: CLIENTES */
/* Verificar se dataset começa com prefixo */
IF POS('PROD.', DSN) = 1 THEN SAY 'É dataset de produção'
2. Transformação — STRIP, TRANSLATE, REVERSE
| Função | O que faz | Exemplo | Resultado |
|---|---|---|---|
STRIP(s) | Remove espaços iniciais e finais | STRIP(' AB ') | AB |
STRIP(s,'L') | Remove só à esquerda | STRIP(' AB ','L') | AB |
STRIP(s,'T') | Remove só à direita | STRIP(' AB ','T') | AB |
TRANSLATE(s) | Converte para maiúsculo | TRANSLATE('abc') | ABC |
TRANSLATE(s,out,in) | Substitui caracteres | TRANSLATE('a-b','_','-') | a_b |
REVERSE(s) | Inverte a string | REVERSE('ABCD') | DCBA |
SPACE(s,n) | Normaliza espaços entre palavras | SPACE('A B C') | A B C |
/* Casos de uso comuns */
/* Normalizar entrada do usuário */
PULL ENTRADA
ENTRADA = STRIP(ENTRADA) /* remove espaços extras */
/* Substituir pontos por hífens num nome de dataset */
DSN_NORM = TRANSLATE(DSN, '-', '.')
/* 'USUARIO.DADOS.SEQ' → 'USUARIO-DADOS-SEQ' */
/* Linha separadora decorativa */
SAY COPIES('=', 50)
3. Funções de palavras — WORD, WORDS, WORDPOS
O REXX trata strings como sequências de palavras separadas por espaços. Esse modelo é especialmente útil para processar saída de comandos TSO, que costuma vir em formato de texto com palavras separadas por espaços:
| Função | O que faz | Exemplo | Resultado |
|---|---|---|---|
WORDS(s) | Número de palavras | WORDS('A B C') | 3 |
WORD(s,n) | n-ésima palavra | WORD('A B C',2) | B |
WORDPOS(w,s) | Posição de uma palavra | WORDPOS('B','A B C') | 2 |
SUBWORD(s,n,len) | Extrai n palavras a partir da posição n | SUBWORD('A B C D',2,2) | B C |
DELWORD(s,n,len) | Remove palavras da string | DELWORD('A B C',2,1) | A C |
/* Processar linha de status de job TSO:
"JOB CALCJOB (JOB01234) ON OUTPUT QUEUE" */
LINHA = 'JOB CALCJOB (JOB01234) ON OUTPUT QUEUE'
JOBNOME = WORD(LINHA, 2) /* CALCJOB */
JOBID = WORD(LINHA, 3) /* (JOB01234) */
STATUS = SUBWORD(LINHA, 4) /* ON OUTPUT QUEUE */
SAY 'Job:' JOBNOME 'Status:' STATUS
4. Alinhamento — LEFT, RIGHT, CENTER
Funções de alinhamento são essenciais para gerar relatórios formatados com colunas alinhadas:
SAY LEFT('NOME', 20)||RIGHT('VALOR', 12)
SAY COPIES('-', 32)
SAY LEFT('Maria Santos', 20)||RIGHT('4500.00', 12)
SAY LEFT('João Silva', 20)||RIGHT('3200.00', 12)
/* Saída:
NOME VALOR
--------------------------------
Maria Santos 4500.00
João Silva 3200.00 */
/* CENTER — centralizar título */
SAY CENTER('RELATÓRIO MENSAL', 60, '=')
/* Saída: ===================RELATÓRIO MENSAL=================== */
5. Data e hora — DATE, TIME
| Chamada | Resultado exemplo | Formato |
|---|---|---|
DATE() | 17 Jun 2026 | Padrão (DD Mmm YYYY) |
DATE('S') | 20260617 | Sorted (AAAAMMDD) |
DATE('U') | 06/17/26 | USA (MM/DD/AA) |
DATE('E') | 17/06/26 | European (DD/MM/AA) |
DATE('O') | 26/06/17 | Ordered (AA/MM/DD) |
TIME() | 14:35:22 | HH:MM:SS |
TIME('S') | 52522 | Segundos desde meia-noite |
/* Gerar nome de arquivo com timestamp */
DATAHORA = DATE('S') || TRANSLATE(TIME(), '', ':')
DSN_LOG = 'USUARIO.LOG.D' || DATAHORA
SAY DSN_LOG /* Ex: USUARIO.LOG.D20260617143522 */
/* Calcular diferença de tempo (em segundos) */
INICIO = TIME('S')
/* ... processamento ... */
FIM = TIME('S')
SAY 'Duração:' FIM - INICIO 'segundos'
6. Funções numéricas — DATATYPE, FORMAT, ABS
| Função | O que faz | Exemplo | Resultado |
|---|---|---|---|
DATATYPE(s) | Retorna 'NUM' ou 'CHAR' | DATATYPE('123') | NUM |
DATATYPE(s,'N') | Verifica se é numérico (1=sim) | DATATYPE('12X','N') | 0 |
ABS(n) | Valor absoluto | ABS(-42) | 42 |
MAX(a,b,...) | Maior valor | MAX(3,7,2) | 7 |
MIN(a,b,...) | Menor valor | MIN(3,7,2) | 2 |
FORMAT(n,b,a) | Formata número com casas | FORMAT(3.1415,4,2) | 3.14 |
/* Validar entrada numérica antes de operar */
SAY 'Digite um valor:'
PULL VALOR
IF \DATATYPE(VALOR, 'N') THEN DO
SAY 'Erro: valor não numérico'
EXIT 8
END
SAY 'Valor formatado:' FORMAT(VALOR, 10, 2)