1. JCL para o SORT — SORTIN, SORTOUT e SYSIN

O DFSORT usa DDs com nomes diferentes dos outros utilitários. Os principais:

DD NamePapel
SORTINDataset de entrada a ser ordenado
SORTOUTDataset de saída com os registros ordenados
SYSINInstruções de controle do SORT
SYSOUTMensagens e estatísticas (pode ser SYSOUT=*)
SYSPRINTAlternativa ao SYSOUT para mensagens
SORTWK01..06Work datasets (gerados automaticamente se omitidos)
//* Estrutura básica do JCL para DFSORT //ORDENAR EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=USUARIO.ENTRADA,DISP=SHR //SORTOUT DD DSN=USUARIO.SAIDA, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(10,5)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920) //SYSIN DD * SORT FIELDS=(1,5,CH,A) /*

💡 PGM=SORT ou PGM=DFSORT?

Nas instalações IBM, o programa se chama DFSORT, mas quase sempre há um alias chamado SORT. Se sua instalação usa SYNCSORT (um produto de terceiros), também responde por SORT. Na prática, PGM=SORT funciona em qualquer ambiente.

2. SORT FIELDS — ordenando registros

A instrução SORT FIELDS define as chaves de ordenação. Cada chave tem quatro parâmetros:

SORT FIELDS=(posição,comprimento,tipo,ordem) posição = coluna inicial do campo no registro (contando do 1) comprimento = tamanho do campo em bytes tipo = formato do dado (CH, ZD, PD, BI...) ordem = A (ascendente) ou D (descendente)

Exemplos práticos:

/* Ordenar pelo campo na posição 1, 5 bytes, caractere, crescente */ SORT FIELDS=(1,5,CH,A) /* Ordenar por dois campos: primeiro por filial (pos 6, 3 bytes), depois por nome (pos 1, 30 bytes) dentro de cada filial */ SORT FIELDS=(6,3,CH,A,1,30,CH,A) /* Ordenar por data numérica descendente (mais recente primeiro) */ SORT FIELDS=(51,8,ZD,D)

🦕 Analogia — SORT FIELDS como ORDER BY do SQL

SORT FIELDS=(6,3,CH,A, 1,30,CH,A) é o equivalente de ORDER BY filial ASC, nome ASC. Cada par de parâmetros a mais é como adicionar mais um campo no ORDER BY. A diferença é que no SORT você trabalha com posições de byte, não com nomes de coluna.

3. Tipos de dado — CH, ZD, PD, BI

TipoNomeQuando usar
CH Character Texto, alfanumérico, datas no formato AAAAMMDD (como string)
ZD Zoned Decimal Números em formato DISPLAY do COBOL (PIC 9), sem sinal ou com sinal trailing
PD Packed Decimal Números em formato COMP-3 do COBOL (PIC 9 COMP-3)
BI Binary Números binários — COMP/COMP-4 do COBOL (PIC 9 COMP)
FI Fixed-point Binário com sinal (COMP com valor negativo possível)
FS Floating Signed Números com sinal separado — PIC S9 com SIGN LEADING SEPARATE

💡 CH para datas no formato AAAAMMDD

Datas no formato AAAAMMDD (ex.: 20261231) ordenam corretamente com tipo CH porque a ordem alfabética coincide com a ordem cronológica. Para datas em outros formatos (DDMMAAAA, MMDDAAAA), você precisaria de uma conversão antes de ordenar.

4. INCLUDE e OMIT — filtrando registros

Com INCLUDE você define quais registros devem aparecer na saída. Com OMIT você define quais devem ser descartados. Só um dos dois pode ser usado por vez.

/* Incluir apenas registros onde a posição 10 (1 byte) = 'A' */ SORT FIELDS=(1,5,CH,A) INCLUDE COND=(10,1,CH,EQ,C'A') /* Omitir registros onde código (pos 20, 2 bytes) = '99' */ SORT FIELDS=(1,5,CH,A) OMIT COND=(20,2,CH,EQ,C'99') /* Múltiplas condições com AND/OR */ INCLUDE COND=(10,1,CH,EQ,C'A',AND, 15,4,ZD,GT,1000)

Operadores de comparação disponíveis: EQ (igual), NE (diferente), GT (maior), GE (maior ou igual), LT (menor), LE (menor ou igual).

Para valores numéricos, use o número diretamente. Para valores literais de texto, use C'texto'. Para valores hexadecimais, use X'hex'.

/* Exemplos de constantes em INCLUDE/OMIT */ INCLUDE COND=(1,3,CH,EQ,C'ABC') /* literal texto */ INCLUDE COND=(5,2,ZD,GE,10) /* número */ INCLUDE COND=(8,1,CH,EQ,X'40') /* espaço em hexadecimal */

5. OUTREC — reformatando a saída

O OUTREC FIELDS define como o registro de saída deve ser construído — quais campos incluir, em qual ordem e com quais literais adicionados:

/* Saída com apenas as colunas 1-10 e 21-30, nessa ordem */ SORT FIELDS=(1,5,CH,A) OUTREC FIELDS=(1,10,21,10) /* Adicionar literal fixo entre os campos */ OUTREC FIELDS=(1,10,C';',21,10,C';',31,8) /* Preencher com espaços até 80 bytes */ OUTREC FIELDS=(1,10,21,10,60X) /* 60X = 60 bytes de espaço */

💡 OUTREC muda o LRECL de saída

Se você usar OUTREC para construir um registro menor ou maior que o de entrada, o LRECL do SORTOUT precisa refletir o novo tamanho. O DFSORT informa o LRECL calculado no SYSOUT — confira se bate com o DCB do seu SORTOUT.

6. SORT FIELDS=COPY — copiar sem ordenar

Quando você quer apenas filtrar ou reformatar registros sem ordenar, use SORT FIELDS=COPY. Isso evita o overhead da ordenação e é muito mais rápido para arquivos grandes:

/* Filtrar registros sem ordenar */ SORT FIELDS=COPY INCLUDE COND=(5,2,CH,EQ,C'SP') /* Reformatar sem ordenar */ SORT FIELDS=COPY OUTREC FIELDS=(1,10,C'|',11,20)

🦕 Analogia — SORT FIELDS=COPY como SELECT + WHERE sem ORDER BY

SORT FIELDS=COPY com INCLUDE e OUTREC é como um SELECT col1, col2 FROM tabela WHERE condição sem ORDER BY. Você filtra e projeta, mas não ordena. Use quando a ordenação não for necessária — o ganho de performance em arquivos grandes é significativo.