1. IEBGENER — cópia simples

O uso mais comum do IEBGENER é copiar um dataset sequencial (PS) para outro. Com SYSIN DD DUMMY, ele faz uma cópia byte a byte sem nenhuma transformação.

//* Copiar um dataset sequencial para outro //COPIASTEP EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //SYSUT1 DD DSN=USUARIO.FONTE.DADOS,DISP=SHR /* entrada */ //SYSUT2 DD DSN=USUARIO.BACKUP.DADOS, /* saída */ // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(10,5)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920)

💡 DCB na SYSUT2

Quando o dataset de saída é novo, o IEBGENER herda o DCB (RECFM, LRECL, BLKSIZE) do dataset de entrada automaticamente. Você só precisa especificar o DCB na SYSUT2 se quiser modificar algum atributo ou se o dataset de entrada não tiver DCB definido no catálogo.

2. IEBGENER — criando dataset a partir de dados inline

O IEBGENER pode criar um dataset a partir de dados embutidos no próprio JCL, usando SYSUT1 DD *. É útil para criar arquivos de teste ou de configuração:

//* Criar dataset a partir de dados inline //CRIADSET EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //SYSUT1 DD * REGISTRO001JOAO SILVA 00100 REGISTRO002MARIA SANTOS 00250 REGISTRO003PEDRO OLIVEIRA 00075 /* //SYSUT2 DD DSN=USUARIO.TESTE.DADOS, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(1,1)), // DCB=(RECFM=FB,LRECL=46,BLKSIZE=4600)

3. IEBGENER com SYSIN — reformatando registros

Com instruções no SYSIN, o IEBGENER pode reformatar os registros durante a cópia — selecionar campos específicos, reordenar colunas ou mudar o LRECL de saída. As instruções são GENERATE, RECORD e FIELD:

//* Extrair apenas as colunas 1-10 e 21-30 de cada registro //REFORMATA EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=USUARIO.ENTRADA,DISP=SHR //SYSUT2 DD DSN=USUARIO.SAIDA, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(5,2)), // DCB=(RECFM=FB,LRECL=20,BLKSIZE=20000) //SYSIN DD * GENERATE MAXFLDS=2 RECORD FIELD=(10,1,,1), /* col 1-10 entrada → col 1 saída */ FIELD=(10,21,,11) /* col 21-30 entrada → col 11 saída */ /*

Sintaxe do FIELD: FIELD=(comprimento, posição-entrada, conversão, posição-saída). A conversão é opcional — use PZ para packed→zoned, ZP para zoned→packed.

🦕 Analogia — IEBGENER como um SELECT do SQL

Com SYSIN, o IEBGENER funciona como um SELECT col1, col3 FROM tabela — você escolhe quais colunas (campos) extrair e em qual ordem montá-las no registro de saída. É uma transformação simples, sem filtros por valor. Para filtros, o DFSORT é mais adequado.

4. IEBCOPY — copiando membros PDS

O IEBCOPY trabalha com PDS (Partitioned Datasets). Para copiar todos os membros de uma biblioteca para outra, use as instruções COPY INDD= e OUTDD= no SYSIN:

//* Copiar todos os membros de um PDS para outro //COPIPDS EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //PDSENT DD DSN=USUARIO.FONTE.PDS,DISP=SHR /* entrada */ //PDSSAI DD DSN=USUARIO.BACKUP.PDS, /* saída */ // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(20,10,15)), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920) //SYSIN DD * COPY INDD=PDSENT,OUTDD=PDSSAI /*

💡 Nomes de DD no IEBCOPY

No IEBCOPY você nomeia os DDs como quiser (PDSENT, PDSSAI, FONTE, DESTINO...) e referencia esses nomes nas instruções SYSIN com INDD= e OUTDD=. Diferente do IEBGENER, não há a convenção SYSUT1/SYSUT2 — você tem total liberdade nos nomes.

5. IEBCOPY — selecionando e excluindo membros

Para copiar apenas alguns membros, use SELECT MEMBER=. Para copiar tudo exceto alguns, use EXCLUDE MEMBER=:

//* Copiar apenas membros específicos //SYSIN DD * COPY INDD=PDSENT,OUTDD=PDSSAI SELECT MEMBER=((PROG001,,R), /* R = replace se já existir */ (PROG002,,R), (PROG003,,R)) /* //* Copiar tudo exceto membros específicos //SYSIN DD * COPY INDD=PDSENT,OUTDD=PDSSAI EXCLUDE MEMBER=(LIXO001,LIXO002,TEMP999) /*

No SELECT, o formato de cada membro é (nome, novo-nome, R). O novo-nome é opcional — se omitido, mantém o mesmo nome. O R indica replace: sobrescreve o membro se já existir no destino.

Mesclando múltiplos PDS

O IEBCOPY aceita múltiplos DDs de entrada, mesclando todos no destino:

//* Mesclar dois PDS em um //FONTE1 DD DSN=USUARIO.LIB1,DISP=SHR //FONTE2 DD DSN=USUARIO.LIB2,DISP=SHR //DESTINO DD DSN=USUARIO.MERGED,DISP=SHR //SYSIN DD * COPY INDD=((FONTE1,R),(FONTE2,R)),OUTDD=DESTINO /*

6. IEBCOPY — compressão in-place

Um PDS fragmenta seu espaço interno com o tempo — cada vez que um membro é atualizado, a versão antiga fica ocupando espaço inutilizável. A compressão reorganiza o PDS e recupera esse espaço. Sem a compressão periódica, o PDS fica sem espaço no diretório e novos membros não podem ser adicionados.

//* Comprimir PDS in-place (o mesmo DS é entrada e saída) //COMPRESS EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //MINHAPDS DD DSN=USUARIO.MINHA.PDS,DISP=SHR //SYSIN DD * COPY INDD=MINHAPDS,OUTDD=MINHAPDS /*

⚠️ Compressão requer acesso exclusivo

Para comprimir um PDS, o IEBCOPY precisa de acesso exclusivo — nenhum outro job ou usuário pode estar com o dataset aberto. Se houver acesso simultâneo, o step falha com RC=8. Em ambientes de produção, a compressão costuma ser feita em janelas de manutenção ou via ISPF (opção 3.1, comando COMPRESS).

✅ PDSE não precisa de compressão

Datasets do tipo PDSE (Partitioned Dataset Extended) gerenciam o espaço interno automaticamente — nunca fragmentam e não precisam de compressão. Se você tem a opção de usar PDSE em vez de PDS, prefira PDSE e economize esse trabalho de manutenção.