Você está na página 1de 37

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

SISTEMA OPERACIONAL OS/390 JCL E UTILITRIOS

QUADRO OS/390

LINGUAGEN S DE PROGRAMA O Cobol Natural Pl/I

BASES DE DADOS Vsam Sequenci al Particion ado

BANCOS EDITOR UTILITR DE ES IOS DADOS Adabas DB2 IMS/DBD C Roscoe Tso Idcams Icegener Adrdssu Sort

SEGURA NA Racf TopSecret

ENDUSER Cics

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

DEFINIES SOBRE SISTEMA CONSIDERAES 2

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

Sistema um conjunto de programas, softwares, aplicativos e utilitrios que relacionam-se dentro de um mesmo assunto. Ex.: Programas de folha de ponto, imposto de renda, seguros, frias, 13o. salrio referem-se ao sistema de Folha de pagamento. Programas de balano, balancete, saldos, dbitos crditos, referem-se ao sistema de Contabilidade. O Analista de Sistemas o profissional responsvel pela implantao de um sistema. Ele faz o levantamento na rea a ser informatizada, com base nos controles manuais existentes e das necessidades do negcio. Ele deve estar atento s legislaes e deve procurar conhecer ao mximo o setor, e ter a sensibilidade para que o sistema ser implantado atenda s necessidades do negcio. No dever ser crtico nem se deixar levar pelo gosto pessoal. Depois de ter todo o mapeamento necessrio, faz uma prvia do vir a ser o sistema a ser implantado. Depois de exaustivas apresentaes, reunies e brain-stormings, o sistema comea ento a ser implantado. a que entra a figura do Programador. Ele dever atender s necessidades levantadas pelo Analista e ento os programas desenvolvidos comearo a ser testados um a um. Chega ento a fase crucial que a da montagem do sistema, como se fosse um quebra-cabeas. Os programadores envolvidos quase nunca sabem ou conhecem todo o processo. Geralmente cumprem as especificaes determinadas pelo Analista de Sistemas. COMO MONTAR UM SISTEMA Imaginemos um sistema em fase de implantao. O Analista obviamente saber a ordem em que os programas devero ser executados. Com base nestas seqncias ele ento montar o fluxo do sistema, que ser um dos documentos a serem enviados para a produo.

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

Fluxo hipottico:

PROG001

PROG003

PROG004

PROG009

PROG011

PROG008

PROG021 PROG012 PROG010

PROG022

Fig. 01

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

Com base no fluxo da fig. 01 podemos fazer algumas constataes: Se o PROG001 no processar ok, nenhum outro programa poder processar. Quando o PRG009 terminas ok, 2 outros programas podero processar. O PROG022 depende do fim ok de 2 outros programas. Repare nas seqncias: PROGR001 + PROGR003 + PROG009 PROGR011 + PROGR021 Com base nestas informaes, poderemos montar 2 pacotes de programas que processaro numa mesma seqncia lgica. A este pacote denominamos JOB. Tambm poderemos montar um outro JOB com PROGR008 + PROG010 ou PROGR008 + PROGR012. COMPONENTES DO SISTEMA OPERACIONAL CATLOGO DO SISTEMA OPERACIONAL x VTOC Imagine a cena: voc chega a um hotel onde ir encontrar-se com algum hospedado. Voc no sabe onde ele se encontra. Voc se identifica recepo do hotel que consulta um catlogo. Aps encontrar o hspede que que voc procura, a recepcionista ento te indica pegar um elevador e se dirigir ao 15o. andar, no apartamento 1506. Voc se encaminha e ao tocar a campainha voc cumpriu seu roteiro. Catlogo do hotel ---> catlogo do sistema operacional. Elevador ---> canal Numerao dos apartamentos ---> VTOC Campainha ---> Header do arquivo. CATLOGO POOL DE DISCOS

VTOC

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

O catlogo do sistema contm a informao de todos os arquivos existentes no sistema. Ele recebe a solicitao do vinda do carto DD, procura o arquivo no catlogo, encontra o disco onde est o arquivo. Chegando no disco, procura pela VTOC onde h um catlogo interno contendo todas as informaes daquele volume com o endereo fsico do registro dentro do disco. O sistema ento l o registro em blocos para a memria do computador.

ESTRUTURA DE ARQUIVOS O mainframe trabalha bsicamente com 3 tipos de arquivos que j vem embutido quando se adquire o sistema operacional: sequencial, VSAM e particionado. Opcionalmente uma empresa pode tambm trabalhar com banco de dados como ADABAS, DB2 e IMS/DB. Antes porm, vamos a uma pequena analogia. Quando voc almoa, voc usa um garfo, certo ? Repare que o garfo tem um tamanho anatmico que permitir que voc coma tranquilo e no tempo certo. Se voc tentasse comer enfiando o prato de uma s vez na boca no conseguiria. Se voc usasse palito para alcanar os gros de arroz levaria horas para almoar, certo ? A mesma coisa acontece no mainframe. O sistema para ser bem aproveitado 'engole' de uma s vez 6

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

uma quantidade de registros do tamanho da sua capacidade de transmisso do canal que leva os dados do disco at a memria. Isto chamamos de blocagem. ARQUIVO SEQUENCIAL Pode ser fixo ou varivel. REGISTRO FIXO O registro fixo possui a mesma quantidade campos e bytes em todo o registro com o mesmo lay-out. Veja o exemplo: 129398547ADELMO 3.730,002M 637374839MARIA SERPENTINA 340,000F 283747487SERGIO BRAGANA 320,001M O lay-out do arquivo : 1 10 = cdigo do funcionrio 11 49 = nome do funcionrio 50 76 = salrio 77 = quantidade de dependentes 78 = sexo Percebemos que um arquivo fixo pois o lay-out o mesmo para todos os registros. A blocagem vai ser calculada pelo sistema. Neste caso temos um arquivo de 78 posies. A blocagem ideal fica sempre em torno de 32.000 bytes. Portanto quanto maior o tamanho do registro, menor a quantidade de registros a serem enviados para a memria. Mas a quantidade de dados ser a mesma. Detalhe: o sistema no quebra registros. REGISTRO VARIVEL Imaginemos os seguintes registros: 8374RUA XAVIER DE TOLEDO BRAGANA, 720 BLOCO 16 AP 17 SUITE 12 2938RUA Z, 9 CONTADOR RECEPCIONISTA OFFICE-BOY

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

Considerando o seguinte lay-out: 1-4 cdigo 5-80 endereo Repare que se o registro for fixo haver um desperdcio de bytes quando o endereo for curto. Neste caso o Analista de Sistemas poder adotar o registro varivel. Dever ser informado a clusula RECORD FORMAT IS VARIABLE no lugar de FIXED. Para o carto DD, dever ser informado o tamanho mximo (no nosso exemplo 80) acrescido de 4. Portanto 84. Estes 4 bytes a mais so para controle do registro. ARQUIVOS PARTICIONADOS So arquivos que possuem um diretrio interno e membros que podem ser parmetros, programas, procedures, jobs, etc. No so usados como base de dados e sim como bibliotecas do sistema. ARQUIVOS VSAM Existem 3 tipos de arquivos VSAM: KSDS, RRDS e ESDS. Estes 2 ltimos so utilizados muito raramente e por isso no ser objeto de nosso estudo. Vamos nos fixar em KSDS, que 99% das utilizaes. -So arquivos que trabalham com chaves. -So base de dados para o CICS mas tambm podem ser usados batch, mas no devem ser usados simultneamente. -Possui 2 arquivos inter-relacionados mas separados fsicamente. Um INDEX e um DATA. O index (ou chave) a base para o acesso ao data. -No pode ter chaves dIDElicadas. -O acesso pode ser randmico(ideal) ou sequencial. No acesso randmico o sistema procura a chave do registro para ento acessar o data, onde conter o restante das informaes. J o sequencial acessa todos os registro como se fosse um arquivo sequencial puro. -O IDCAMS um utilitrio criado para manuteno deste tipo de arquivo que estudaremos mais tarde. -Os arquivos VSAM devero ser definidos antes da sua utilizao, seja ele utilizado para leitura ou gravao atravs deste utilitrio. -Pode tambm ser fixo ou varivel. -No existe blocagem como no arquivo sequencial mas um formato de alocao especial atravs de clculos especiais. -O cluster a juno dos arquivos de INDEX e DATA.

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

INTERFACES COM O SISTEMA O sistema operacional possui interfaces que podem ser utilizadas para interagir com o sistema ou para movimentao de dados. Os exemplos mais comuns so ROSCOE e TSO como editores de texto e o CICS para gerenciador de dados. ROSCOE e TSO Embora tenham interfaces diferentes o objetivo o mesmo. Colocar o usurio dentro do sistema. Atravs destes aplicativos pode-se por exemplo criar JCL, editar programas, acessar arquivos, compilar programas, submeter jobs etc. sempre utilizado por usurios internos. CICS Customer information control system. Como o prprio nome indica, utilizado para acessar informaes, inserir dados, deletar dados etc. Tem sempre como base de dados arquivos do tipo VSAM. A interface criada pela equipe de desenvolvimento e cada tela est associada a uma transao. Quando o usurio acessa o sistema e valida seu user, ele ento poder utilizar as transaes que lhe so permitidas. Uma transao CICS pode acessar um ou mais arquivos VSAM.

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

10

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

J.C.L. DEFINIO DE UM JOB Um job (servio) composto por um ou mais programas que sero processados dentro de uma seqncia. Se esta seqncia for quebrada por alguma anormalidade, interrompe-se o fluxo, repara-se o erro e faz a retomada. Uma interrIDEo causada pelo programa chamamos de ABEND. Esta retomada (ou restart) poder ser feita desde o incio, a partir do ponto que houve a ocorrncia, em algum ponto anterior do Job, ou at mesmo de algum job anterior. Pode tambm ser necessrio a recIDEerao de algum arquivo que tenha sido o causador do trmino anormal. Um seqncia de jobs em cadeia chamamos de rotina. Observaes muito importantes sobre um JOB: Um job composto de pelo menos um programa. Este programa poder ser um desenvolvido na empresa ou at mesmo um utilitrio. Um job SEMPRE (obrigatoriamente) comea com um carto JOB, que ir se apresentar para o sistema operacional e disponibilizar as filas e prioridades dentro do sistema A cada programa ou utilitrio denominamos STEP. Cada step representado por um carto chamado EXEC. O carto EXEC responsvel por chamar o programa compilado e linkeditado. (Podendo ser tambm um utilitrio) Dentro de cada carto EXEC teremos cartes DD que iro disponibilizar os dispositivos necessrios para o funcionamento do programa. DESENHO BSICO DE UM JOB //XXXXXXX JOB XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX EXEC XXXXXXXXXXXXXXXXXXXXXX //XXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX.....EXEC XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX.....DD XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX.....EXEC XXXXXXXXXXXXXXXXXXXXXXX //XXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXX 11

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

//XXXXXXX DD //XXXXXXX DD //XXXXXXX.....DD //

XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX

Fig. 02 Repare: temos neste exemplo um Job composto de 4 steps. Estes steps podem ser programas caseiros e/ou utilitrios (como o SORT e o IDCAMS) que sero visto adiante. Voltando a fig.01 poder muito bem ser a seqncia 01 tendo um SORT entre os programas PROG003 e PROG009. Neste caso o PROG003 gerou um arquivo a ser lido pelo PROG009. Mas antes de utilizar, o PROG009 precisa reclassificar o arquivo para atender sua regra de negcio. A FUNO DO J.C.L. Quando mencionamos as palavras JOB, EXEC e DD, estamos falando de uma linguagem: JCL (Job control language ou linguagem de programao de servios). A funo do JCL solicitar e informar recursos e dispositivos ao sistema operacional. Os cartes JOB, EXEC e DD obrigatoriamente devero ter um NOME. Este nome ser conhecido como JOBNAME, STEPNAME e DDNAME. So inserido logo aps o // e antes do carto comando. Um exemplo tpico de um JOB com um step apenas para ilustrao. //IDE14KR JOB (9983,98,978,09),ADELMO, // CLASS=6,MSGCLASS=U //STEP0101 EXEC PGM=MYPROGSS //ENTR01 DD DSN=IDEYA.CADCLI,DISP=SHR //SAIDA02 DD DSN=IDEYA.CADENT,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=0) //SYSOUT DD SYSOUT=* //PARM01 DD * PRINTALL 12

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

//* //STEP0102 EXEC PGM=MYPROGXX,COND=(0,NE) //ENTR03 DD DSN=IDEYA.CADENT,DISP=SHR //ENTR04 DD DSN=IDEYA.CADRET,DISP=SHR //SAIDA03 DD DSN=IDEYA.CADSAI(+1),DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(GDG,RECFM=FB,LRECL=120,BLKSIZE=0) //RELATO DD SYSOUT=(R,,XPTO) // Fig.03 Neste exemplo temos um job com 2 steps apenas que ir executar um programa chamado MYPROGRSS , e ter 2 arquivos de entrada sendo o primeiro em disco chamado pelo DDNAME ENTR01 e um parmetro chamado PARM01 E uma sada chamado pelo DDNAME SAIDA02. Um outro step ir executar o programa MYPROGXX, que ir ler 2 arquivos e gerar um terceiro arquivo em GDG.

REGRAS BSICAS DE J.C.L. No se esquea que JCL uma srie de comandos que voc est passando para o sistema operacional entender o seu programa, como se fossem parmetros. JAMAIS confunda JCL ERROR com ABEND. O primeiro erro de sintaxe ou indisponibilidade de recursos. O segundo falha de programa que em alguns caso pode at mesmo ser causado por recursos do sistema. Em caso de erro de JCL, o programa em questo no foi executado. Os cartes // nas colunas 1 e 2 so obrigatrios em todo o JCL, exceto se houver algum parmetro a ser passado pelo usurio (opo) ao programa. (Veja regra 6) Existem parmetros obrigatrios e parmetros opcionais. Com exceo do Account e programer-name do carto Job, todos os outros parmetros possuem o sinal =. O parmetros vm a esquerda e os sub-parmetros direita do sinal.] Os sub-parmetros podem ser 1 ou mais de 1. Quando houver mais de 1 sub-parmetro dever estar entre aspas. Se o seu programa tem opo de processamento (ex: listagem total ou parcial), este opo (que na verdade tambm um parmetro), este

13

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

poder ser passado aps um carto DD que contenha o comando DD *. Ao comear numa empresa pea sempre uma cpia da padronizao da empresa. Nem sempre voc poder batizar seu programa, jobname, stepname etc com o nome que voc quer. Existem regras, com certeza. CARTO JOB //IDE14KR JOB (9983,98,978,09),ADELMO, // CLASS=6,MSGCLASS=U IDE14KR o JOBNAME. Dever ter sempre uma padronizao estabelecida pela rea de produo da empresa. Procure saber a regra antes de fazer a denominao. Regra: Dever ter de 1 a 8 caracteres (em geral sempre 8), sendo o primeiro alfabtico. JOB Nome do carto de comando Obrigatrio. Sempre entre espaos em branco. (9983,98,978,09): Informe-se com a produo pois isto varia de empresa para empresa. Pode nem ser obrigatrio. Mas se for, dever ser sempre o primeiro aps o JOB. ADELMO Programer-name. Obrigatrio. Para identificar o nome do usurio. Se no houver account, vem logo aps o comando JOB. CLASS=Define a classe que ser submetida na fila de JOBS. MSGCLASS=Define a classe de sysout (relatrio) onde sero geradas todas as logs durante o tempo em que o job permanecer no sistema. Outros parmetros usados podero ser requeridos na empresa, mas no so obrigatrio no carto JOB, tais como TYPRUN, NOTIFY e outros.

O CARTO EXEC composto do stepname, carto comando (EXEC) e o nome do programa (ou utilitrio) a ser chamado pelo JOB. Sintaxe: //STEP0101 EXEC PGM=MYPROGXX,COND=(0,NE) Neste caso, o MYPROGSS um programa que dever estar na biblioteca padro do sistema. Antes de dar OPEN no programa o sistema ir verificar se o programa realmente existe. Em seguida ir verificar os 14

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

recursos solicitados pelos cartes DD para s ento dar OPEN no programa e carrega-lo em memria. Todos os programas ao terminarem, emitem um cdigo de retorno para o sistema operacional. Se for 0 (zero) significa que terminou OK. O COND, neste caso ser para checar se o(s) step(s) anterior(es) terminou(aram) ok. Os mais comuns: (0,NE) Se todos os steps anteriores terminaram OK, pode processar este step. (2,LT) Significa que este step aceita que um os steps anteriores emitam um return code igual a 0 ou 1. Regra bsica: Comparar os return code anteriores e comparar com o parmetro. Se for negativo, execute. Se for positivo no execute. Outros exemplos: (0,LT) no ir executar nunca pois no existe return code negativo. (0,EQ) s processa se algum step anterior der return code diferente de 0. (EVEN) executa mesmo que algum step anterior tenha terminado anormalmente. (ONLY) executa somente se algum programa tenha terminado anormalmente. OBSERVAO: Em caso de erro de JCL o parmetro COND no respeitado. A interrIDEo ocorre de qualquer forma. O CARTO DD Acompanhando nosso exemplo na fig.03, vamos utilizar os cartes para as definies. Antes porm bom lembrar que o carto DD utilizado para pedir ao sistema alocao de recursos fsicos (dispositivos) para que o programa seja processado. Sintaxe: //ENTR01 DD DSN=IDEYA.CADCLI,DISP=SHR //SAIDA02 DD DSN=IDEYA.CADENT,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=0) DDNAME = (ENTR01) Tem que ser o mesmo que voc especificou na select do seu programa. Confira sempre a padronizao na sua instalao. DD = o nome do carto-comando. 15

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

DSN = Parmetro que ir dizer ao sistema qual o nome externo do arquivo em questo. Lembre-se que neste caso voc est associando ENTRO1 ao arquivo IDEYA.CADCLI e SAIDA02 ao arquivo IDEYA.CADENT. O nome externo o nome que o sistema conhece o arquivo. DISP = Informa o status do arquivo no sistema operacional. Sintaxe: NEW,CATLG,CATLG DISP=SHR,UNCTLG,UNCTLG OLD,DELETE,DELETE KEEP,KEEP PRIMEIRO SUB-PARMETRO STATUS DO ARQUIVO SHR ---> Significa que o arquivo j existe e pode ser lido por recurso simultneamente. OLD ---->Significa que o arquivo j existe e que o programa exclusividade na leitura. NEW ---->Arquivo novo, a ser criado neste momento. outro exige

SEGUNDO E TERCEIRO SUB-PARMETRO AO A SER TOMADA EM CASO DE TRMINO NORMAL E TRMINO ANORMAL RESPECTIVAMENTE. CATLG --> Catalogue o arquivo. bviamente que esta opo deve estar sempre acompanhada de NEW no primeiro sub-parmetro. Porque se o arquivo estiver sendo lido porque j est catalogado. UNCATLG --> Descatalgoue o arquivo. Evite usar sempre. DELETE ---> Delete o arquivo. Se precisar deletar o arquivo use sempre esta opo. KEEP ---> Mantenha o arquivo do jeito que intacto (do que jeito que estava antes). LEMBRETES: -SEMPRE use o modelo da pgina anterior para entrada/sada. -Se o arquivo de entrada(OLD ou SHR) no precisa especificar demais parmetros, pois bviamente j est catalogado e o sistema saber encontr-lo. Se for de sada voc dever usar os demais parmetros do exemplo ENTR02.

16

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

Exemplos invlidos: (SHR,CATLG,DELETE) ---> Se o arquivo novo (SHR) como ir catalogar se j est catalogado ? O sistema no recataloga. (NEW,KEEP,DELETE) ---> Como manter um arquivo que ainda no existe ? Default: Se voc colocar (SHR,KEEP,KEEP). Outros sub-parmetros: UNIT= ----> Especifica o tipo de dispositivo onde voc criar o arquivo. Geralmente disco SYSDA. Confira sempre com um funcionrio da sua seo ou com a equipe de produo. SPACE= ----> Espao a ser utilizado. Lembre-se que no precisa ser preciso, mas quanto mais preciso melhor. uma estimativa. O sistema ir checar se h disponibilidade para gravar seu arquivo. Se no houver, cancelar. Sintaxe: SPACE=(TRK,(5,2),RLSE). Repare que h sub-parmetro dentro de sub-parmetro. Neste caso permanece a regra de utilizar ' ( ) '. Neste exemplo estamos alocando 5 trilhas (TRK) na alocao primria, 2 trilhas de alocao secundria e liberando (RLSE) as trilhas no utilizadas. Poderia ser cilindros (CYL) ao invs de TRK mas no convm sua utilizao. Para saber o nmero ideal considere que uma trilha comporta aproximadamente 56.000 bytes. Portanto neste caso estamos alocando 5 trilhas. Se no for suficiente esta alocao, o sistema alocar mais 2 trilhas (alocao secundria) at 16 vezes para atender a solicitao. Se ainda no for suficiente o programa cancelar. DCB= ---> Indica o formato do arquivo a ser gravado. No necessrio para arquivos a serem lidos, pois o catlogo guarda esta informaes. Sintaxe: DCB=(RECFM=FB,LRECL=98,BLKSIZE=0) Obs.: A ordem dos sub-parmetros no obrigatria. Neste exemplo: Indica que o arquivo FB (fixo blocado). Confira que o seu programa possui as clusulas 'BLOCK 0' e 'RECORD FORMAT IS FIXED'. Outras 17 apenas DISP=SHR o sistema assume

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

opes possveis: VB (varivel blocado), FBA (fix blocado com caracter de impresso) e F (fixo sem blocagem. EVITE sempre) e PO (particionado) O tamanho do registro 98. Se fosse varivel deveria ser o tamanho do maior registro + 4. BLKSIZE= ---> Blocagem do registro. o maior nmero de bytes trazidos para a memria de uma s vez. sempre uma quantidade prxima de 32.000. Deixe sempre com '0', pois o sistema calcula automticamente a blocagem ideal. SYSOUT= ---> Este carto tem finalidade definir a classe em que o relatrio ser impresso. Como as empresas sempre tem mais que uma impressora, diversos recebedores, diversos tipos de formulrios estas informaes sero de utilizadas para fazer estas definies. Neste exemplo o relatrio ser emitida na classe 5 com tipo de formulrio XPTO, que pode ser por exemplo uma fatura. GDG/GENERATION DATA GROIDE Imagine o seguinte step: //STEP0102 EXEC PGM=MYPROGXX,COND=(0,NE) //ENTR03 DD DSN=IDEYA.CADENT,DISP=SHR //ENTR04 DD DSN=IDEYA.CADRET,DISP=SHR //SAIDA03 DD DSN=IDEYA.CADSAI,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(RECFM=FB,LRECL=120,BLKSIZE=0) //RELATO DD SYSOUT=(R,,XPTO) // Repare que o arquivo de sada referente ao DD SAIDA03 est tentando catalogar um arquivo. O que acontecer se o arquivo j existir ? Isto muito comum quando uma rotina tem uma certa frequncia de processamento. Neste caso o sistema no ir catalogar o arquivo pois emitir um erro de JCL Direct acess dIDElicate e o step ir interromper. Voc ter 2 sadas: deletar o arquivo previamente ou usar arquivos GDG. Os arquivos to tipo GDG permitem que voc grave um mesmo arquivo com uma extenso que ele mesmo cria e controla. Tudo que voc precisa fazer entregar o controle ao GDG. Isto feito atravs do utilitrio IDCAMS e sempre feito pela equipe de produo. Veja como funciona para o arquivo exemplificado. IDEYA.CADSAI 18 GDGBASE LIM=05

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

IDEYA.CADSAI.G004V00 IDEYA.CADSAI.G005V00 IDEYA.CADSAI.G006V00 IDEYA.CADSAI.G006V00 IDEYA.CADSAI.G007V00 Neste exemplo o pessoal da produo definiu o GDGBASE com 5 geraes. Ao completar o ciclo de 5 arquivos ele automaticamente libera a 6a. greao. Isto muito til pois evita-se ter que deletar um arquivo antes de cria-lo, permite ler um arquivo anterior etc. Portanto, para gravar siga o modelo abaixo: //STEP0102 EXEC PGM=MYPROGXX,COND=(0,NE) //ENTR03 DD DSN=IDEYA.CADENT,DISP=SHR //ENTR04 DD DSN=IDEYA.CADRET,DISP=SHR //SAIDA03 DD DSN=IDEYA.CADSAI(+1),DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(GDG,RECFM=FB,LRECL=120,BLKSIZE=0) //RELATO DD SYSOUT=(R,,XPTO) // O que h de diferente ? No dsname foi includo ao final o parmetro (+1) que indica acrescentar uma gerao. No DCB foi includo a opo GDG. Para ler este arquivo depois: //SAIDA03 DD DSN=IDEYA.CADSAI(0),DISP=SHR

Muito importante: GDG s vale para arquivos seqenciais. Para ler o ltimo arquivo no necessita escrever toda a extenso que ele criou. Basta apenas colocar (0) para ler a ltima verso. Para ler a penltima verso coloque (-1) e assim por diante. Se ao ler o arquivo esquecer de colocar o parmetro (0) o sistema ir ler TODOS os arquivos como se fosse apenas um.

19

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

UTILITRIOS SORT/MERGE O DFSORT um utilitrio da IBM apropriado para fazer classificao de arquivos. Pode tambm ser usado para intercalao. Alm disso, o DFSORT pode eliminar registros durante a cpia atravs de filtros, excluir campos, reformatar, sumarizar registro iguais, saltar registros, criar mais de uma sada etc. Seu uso muito extenso e vamos tratar dos itens mais utilizados. Sintaxe: //IDE14KR JOB (9983,98,978,09),ADELMO, // CLASS=6,MSGCLASS=U //STEP0101 EXEC PGM=SORT //SORTIN DD DSN=IDEYA.CADCLI,DISP=SHR //SORTOUT DSN=IDEYA.CADCLI.CLASS,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=0) //SYSOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=(13,10,BI,A),FORMAT=F //* OPES POSSVEIS: ALTSEQ DEBUG END INCLUDE INREC OMIT OPTION OUTFIL OUTREC RECORD SORT SUM

DD

20

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

UTILITRIOS - SORT SORT-INCLUDE Sort com seleo do que voc quer para gravar na sada //S01X04 EXEC PGM=SORT,COND=(0,NE),REGION=4096K //*---------------------------------------------------//* SORT POR BANCO, NUMPER //*---------------------------------------------------//SORTMSG DD SYSOUT=* //SORTWK01 DD UNIT=SYSDA,SPACE=(TRK,450) //SORTIN DD * A E B E A D B D X D B A A A //SORTOUT DD SYSOUT=* SORT FIELDS=COPY INCLUDE COND=(1,1,CH,EQ,C'A',AND,(9,1,CH,EQ,C'E',OR, 9,1,CH,EQ,C'A')) //* RESULTADO: A E A A OUTRO INCLUDE //SYSIN DD *,DCB=BLKSIZE=80 INCLUDE COND=(10,05,CH,EQ,C'00002',OR, 20,05,CH,EQ,C'00030') OPTION COPY EXEMPLO: ARQUIVO DE ENTRADA <...+....1....+....2....+....3. 21

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

============================== 01 00001 00010 01 00002 00020 02 00000 00030 02 00000 00040 02 00005 00050 ARQUIVO DE SAIDA S FICOU O QUE ESTAVA NA CONDIO <...+....1....+....2....+....3 ============================= 01 00002 00020 02 00000 00030 EXEMPLOS COM CAMPOS COMPACTADOS INCLUDE COND=(1,6,PD,NE,11000000000) EXEMPLOS COM CAMPOS COMPACTADOS INCLUDE COND=(1,6,PD,GT,12000000000) SORT-SOMA-REGS-NO-FINAL Sort para somar registros iguais //SYSIN DD *,DCB=BLKSIZE=80 INREC FIELDS=(1,30,C'0000000001') SORT FIELDS=(01,02,ZD,A), FORMAT=BI,FILSZ=E280000, DYNALLOC=(SYSDA,6) SUM FIELDS=(31,10,ZD) EXEMPLO: ARQUIVO DE ENTRADA 30 BYTES : <...+....1....+....2....+....3 ============================= 01 00001 00010 01 00002 00020 02 00003 00030 02 00004 00040 02 00005 00050 ARQUIVO DE SAIDA 40 BYTES COM A QTDE DE REGISTROS DE CADA CODIGO NO FINAL POS 31-40: 22

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

<...+....1....+....2....+....3....+....4 =============================== T O P = 01 00001 00010 000000000B 02 00003 00030 000000000C

23

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

UTILITRIOS - SORT SORT-SOMA-EM-UMA-COLUNA Sort para somar campos em uma coluna //SYSIN DD *,DCB=BLKSIZE=80 SORT FIELDS=(01,2,CH,A), FILSZ=E60000,DYNALLOC=(SYSDA,6) INCLUDE COND=(01,2,CH,EQ,C'01') SUM FIELDS=(10,5,ZD,20,5,ZD) // EXEMPLO: ARQUIVO DE ENTRADA POS CAMPO CODIGO VALOR-1 VALOR-2 <...+....1....+....2....+.. ========================== 01 00001 00010 01 00002 00020 02 00003 00030 02 00004 00040 RESULTADO: SOMENTE CODIGO = 01 SE QUISER SOMAR TODOS OS CODIGOS RETIRAR DO SORT O INCLUDE <...+....1....+....2....+ ======================== 01 0000C 0003{

24

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

UTILITRIOS - SORT SORT-SOMA-REGS-NO-FINAL-E-COLUNA Sort para somar campos em uma coluna e regs iguais no final //SYSIN DD *,DCB=BLKSIZE=80 INREC FIELDS=(1,30,C'0000000001') SORT FIELDS=(01,02,ZD,A), FORMAT=BI,FILSZ=E280000, DYNALLOC=(SYSDA,6) SUM FIELDS=(31,10,ZD,10,05,ZD) EXEMPLO: ARQUIVO DE ENTRADA 30 BYTES: <...+....1....+....2....+....3 ============================= 01 00001 00010 01 00002 00020 02 00003 00030 02 00004 00040 02 00005 00050 ARQUIVO DE SAIDA 40 BYTES: SOMOU A QTDE NAS POS 31-40 E O VALOR POS 10-15 <...+....1....+....2....+....3....+....4 =============================== T O P = 01 0000C 00010 000000000B 02 0001B 00030 000000000C SORT-COPY Sort para copiar arquivos //SYSIN DD *,DCB=BLKSIZE=80 OPTION COPY

25

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

UTILITRIOS - SORT SORT-ELIMINA-ZEROS Sort para eliminar campos com zeros //SYSIN DD *,DCB=BLKSIZE=80 OMIT COND=(10,05,CH,EQ,C'00000') OPTION COPY EXEMPLO: ARQUIVO DE ENTRADA <...+....1....+....2....+....3 ============================= 01 00001 00010 01 00002 00020 02 00000 00030 02 00000 00040 02 00005 00050 ARQUIVO DE SAIDA <...+....1....+....2....+....3 ============================= 01 00001 00010 01 00002 00020 02 00005 00050 SORT-ELIMINA-DUPLICIDADE Sort para eliminar duplicidades //SYSIN DD *,DCB=BLKSIZE=80 SORT FIELDS=(01,02,CH,A) SUM FIELDS=NONE EXEMPLO: ARQUIVO DE ENTRADA

26

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

<...+....1....+....2....+. ========================= 01 00001 00010 01 00002 00020 02 00003 00030 02 00004 00040 RESULTADO: S FICA O PRIMEIRO REGISTRO <...+....1....+....2....+. ========================= 01 00001 00010 02 00003 00030 UTILITRIOS - SORT SORT-ELIMINA-REGISTROS Sort para eliminar registros //SYSIN DD *,DCB=BLKSIZE=80 OMIT COND=(20,05,CH,GT,C'00030') OPTION COPY EXEMPLO: ARQUIVO DE ENTRADA: <...+....1....+....2....+....3 ============================= 01 00001 00010 01 00002 00020 02 00000 00030 02 00000 00040 02 00005 00050 ARQUIVO DE SAIDA <...+....1....+....2....+....3. ============================== 01 00001 00010 01 00002 00020 02 00000 00030 27

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

28

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

PROCEDURE CATALOGADA Muitas empresas preferem utilizar procedure catalogadas ao invs de JOBS extensos. uma opo bem saudvel pois evita-se manutenes e permite passar parmetros para as procedures. Veja o exemplo de um JOB antes e depois da converso em procedure catalogada (ou simplesmente PROC). Antes: //IDE14KR JOB (9983,98,978,09),ADELMO, // CLASS=6,MSGCLASS=U //STEP0101 EXEC PGM=MYPROGSS //ENTR01 DD DSN=IDEYA.CADCLI,DISP=SHR //SAIDA02 DD DSN=IDEYA.CADENT,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=0) //SYSOUT DD SYSOUT=* //PARM01 DD * PRINTALL //* //STEP0102 EXEC PGM=MYPROGXX,COND=(0,NE) //ENTR03 DD DSN=IDEYA.CADENT,DISP=SHR //ENTR04 DD DSN=IDEYA.CADRET,DISP=SHR //SAIDA03 DD DSN=IDEYA.CADSAI(+1),DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(GDG,RECFM=FB,LRECL=120,BLKSIZE=0) //RELATO DD SYSOUT=(R,,XPTO) DEPOIS: O job (chamada) vai executar uma procedure chamada IDE01P04 que est na biblioteca padro do sistema. Os parmetros podem ser passados pelo JOB ou pelo carto PROC. //IDE14KR JOB (9983,98,978,09),ADELMO, // CLASS=6,MSGCLASS=U //PROC001 EXEC IDE01P04,CLIENTE=IDE14,SAIDA=CADRET

29

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

A PROCEDURE CATALOGADA //IDE01P04 PROC VOIDE=SHR //STEP0101 EXEC PGM=MYPROGSS //ENTR01 DD DSN=&CLIENTE..IDE0.CADCLI,DISP=SHR //SAIDA02 DSN=&CLIENTE..IDE0.CADENT,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=0) //SYSOUT DD SYSOUT=* //PARM01 DD * PRINTALL //* //STEP0102 EXEC PGM=MYPROGXX,COND=(0,NE) //ENTR03 DD DSN=&CLIENTE..IDE0.CADENT,DISP=&VOIDE //ENTR04 DD DSN=&CLIENTE..IDE0.&SAIDA,DISP=SHR //SAIDA03 DSN=&CLIENTE..IDE0.CADSAI(+1),DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,1),RLSE), // DCB=(GDG,RECFM=FB,LRECL=120,BLKSIZE=0) //RELATO DD SYSOUT=(R,,XPTO)

DD

DD

Modelo de um define CLUSTER: //IDE14KR JOB (9983,98,978,09),ADELMO, // CLASS=6,MSGCLASS=U //STEP0101 EXEC PGM=IDCAMS //SYSIN DD * DELETE (IDEYA.CADENC) PURGE CLUSTER IF MAXCC = 8 THEN SET MAXCC = 0 DEFINE CLUSTER NAME (IDEYA.CADENC)VOL (VOL001) CYL (15 5) KEY (12 5) RECORDSIZE (250 250) FREESPACE (20 5) BUFFERSPACE (6192) SHAREOPTIONS (2,3) NOEMBEDED 30

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

DATA(NAME(IDEYA.CADENC.DATA)) INDEX(NAME(IDE14.IDEO.CADENC.INDEX)) /* // Existem vrios outros parmetros que no estudaremos agora pois no so foco do nosso estudo. Estes so os principais. Lembre-se que ao definir um arquivo ele ainda no est 'populado' isto , ainda no contm dados, apenas o 'esqueleto' do arquivo. Para popular o arquivo dever ser feito atravs de arquivos sequenciais carregados pelo utilitrio IDCAMS (parmetro repro) ou por introduo manual atravs do CICS.

Para carregar um arquivo VSAM a partir de um sequencial usando o utilitrio IDCAMS com opo repro: //IDE14KR JOB (9983,98,978,09),ADELMO, // CLASS=6,MSGCLASS=U //STEP0101 EXEC PGM=IDCAMS //DD01 DD DSN=IDEYA.CADENC.SEQ,DISP=SHR //DD02 DD DSN=IDEYA.CADENC,DISP=SHR //SYSIN DD * REPRO INFILE(DD01) OUTFILE (DD02) REUSE /* O PARMETRO REUSE DELETA DADOS QUE PORVENTURA EXISTIREM NO ARQUIVO. ROSCOE Entidades Linha de comandos Situada acima da linha pontilhada, so 3 linhas onde podero ser inseridos comandos do aplicativo. rea de display abaixo da linha pontilhada, a rea onde ser exibido o resultado do comando executado. No possvel interferir na rea de display.

31

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

AWS a rea que sobrepe a rea de display quando esta chamada. a rea de work onde o usurio poder trabalhar. Acessado pelo cursor. Roslib Bilioteca particular do usurio que poder ser acessada pela linha de comando. Detalhe: o Roscoe no caracter sensitivo. Isto , pode-se usar letras maisculas ou minsculas. DETALHE: Os atalhos do Windows Control+c e Control+V tambm funcionam nos emuladores. UTILIZAO NA LINHA DE COMANDO A D IDENGO.BIRA01.+ ------ Exibe todos os datasets do sistema c que comecem com IDENGO.BIRA01.+ Ex. do resultado. SEARCH ARGUMENT TYPE IDENGO.BIRA01.+ CATALOG.MVSICFM.VPR ICF DATA SET NAME EXT IDENGO.BIRA01.COBLIB IDENGO.BIRA01.COBLIB2 IDENGO.BIRA01.DBRMLIB.DATA IDENGO.BIRA01.JCLDATA IDENGO.BIRA01.LOADLIB IDENGO.BIRA01.MAPLIB IDENGO.BIRA01.PGMS MATCHES CATALOG NAME 7 STATUS TRKS IN-USE %USED 101 97 2 4 3 1 16 2 13 1 99 7 8 1 75 6 8 1 75 21 28 1 75 3 4 1

105 150

A D IDENGO.+ ---- Ir exibir todos os arquivos do sistema que comecem com IDEngo. ( sempre bom aps a visualizao, liberar o dataset atravs do comando - D D. A J 9999 -------- onde 9999 o nmero do job que foi submetido.

A L + ---- Exibe o contedo da Roslib A L AM* ----- Exibe todos os membros da Roslib que comecem com AM...

32

Servios de Informtica MainFrame Training

JCL e UTILITRIOS os jobs ativos (em processamento)

DIS A --- Exibe todos independente de quem submeteu.

DIS JOAQ* -- Exibe todos os jobs comeados com independente de estar em wait para execuo, em processamento ou encerrado.

JOAQ

EXP DSN=IDENGO.BIRA01.COBLIB(PGM0128) --- Exporta o contedo da AWS para a biblioteca IDENGO.BIRA01.COBLIB com o nome de PGM0128. IMP DSN=IDENGO.BIRA01.COBLIB(PGM0128) --- Importa o membro PGM0128 da biblioteca EXP DSN=IDENGO.BIRA01.COBLIB diretamente para a AWS. STA CMD ------ Exibe os ltimos comandos emitidos na linha de comando. Basta digitar o numero da msg e ela aparecer na linha De comando novamente. S(AVE) PGM025 --- Salva o atual contedo da AWS na Roslib como PGM025. F(ETCH) PGM025 -- Busca o programa PGM025 na Roslib e traz para AWS. Este comando necessita do comando A em seguida para habilit-lo na AWS. U * --- Faz IDEdate na Roslib do arquivo que foi trazido por ltimo. (no exemplo acima, PGM025). O COMANDO NA AWS E /BANANA/LARANJA/ --- Altera todas as palavras banana para laranja em todo contedo da aws.

33

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

E /BANANA/LARANJA/ 15 28 -- Altera banana para laranja da linha 15 at a linha 28. E 12 25 /BANANA/LARANJA/ -- Altera todo contedo de banana para laranja entre as colunas 12 e 25. SORT FIELDS=(1,12,BI,A) -- Classifica todo o contedo da AWS comeando na coluna 1 at a coluna 12, em ordem binria ascendente. R 1 1 -- Renumera as linhas a partir da linha 1 de comeando do nmero 1. R 1 10 - Renumera as linhas a partir da linha 1 de 10 em 10. COMANDOS DE LINHAS Os comandos de linhas so executados (numeradas), desde que esteja na AWS. nas linhas esquerda

> APPLID(ROSCOE) USER(M01,AMAURYM) > DSN() SCRL FULL COLS 00001 00073 PAU(M01.SDN) LINE 000001 > IDENGO.AMAURYM.ARQMOV > <...+....1....+....2....+....3....+....4....+....5....+....6....+....7... =============================== T O P ================================= 000001 OIJSADJOIADFDFJKLDFAKJLFADJKLFADJKJKLA 000002 JPIASDFJDAFSJKLKJSADFLJKLFADSKJLFDSAJK 000003 OIJASDFJKOADFSJKLFADSJKLAFDSJKLKJLFADSJ ============================ B O T T O M ============================== 1) - Neste exemplo acima, temos 3 linhas. SIDEonhamos que necessitemos manipula-las. > APPLID(ROSCOE) USER(M01,AMAURYM) D PENDING > AWS() SCRL FULL COLS 00001 00072 PAU(M01.SDN) A<ROS1> > <...+....1....+....2....+....3....+....4....+....5....+....6....+....7.. 34

Servios de Informtica MainFrame Training

JCL e UTILITRIOS O P

================================ T ================================= 000001 OIJSADJOIADFDFJKLDFAKJLFADJKLFADJKJKLA 0R0002 JPIASDFJDAFSJKLKJSADFLJKLFADSKJLFDSAJK 000003 OIJASDFJKOADFSJKLFADSJKLAFDSJKLKJLFADSJ ============================= B O T ============================== A letra Rna linha 2 far com que ela seja dIDElicada. Resultado:

APPLID(ROSCOE) USER(M01,AMAURYM) D PENDING AWS() SCRL FULL COLS 00001 00072 PAU(M01.SDN) A<ROS1> <...+....1....+....2....+....3....+....4....+....5....+....6....+....7.. ================================ T O P ================================= 000001 OIJSADJOIADFDFJKLDFAKJLFADJKLFADJKJKLA 000002 JPIASDFJDAFSJKLKJSADFLJKLFADSKJLFDSAJK 000003 JPIASDFJDAFSJKLKJSADFLJKLFADSKJLFDSAJK 000004 OIJASDFJKOADFSJKLFADSJKLAFDSJKLKJLFADSJ ============================= B O T T O M ============================== 2) - A letra C far que com a linha seja copiada. Neste caso, dever ser colocada tambm a letra A na linha acima da qual a linha dever ser copiada. 3) - Se voc quiser dIDElicar todas as linhas de 2 at 6, coloque RR na linha 2 e RR na linha 6. 4) - Se voc quiser copiar da linha 5 at 8 para debaixo da linha 33, coloque CC na linha 5 e na linha 8 e apenas um A na linha 33. Se voc quiser juntar as linhas 1 com a linha 2, coloque M na linha 1 e O na linha 2 ================================ T ================================= 0M00001 OIJSADJOIADFDFJ 0O0002 ADFLJKLFADSKJLFDSAJK 000003 OIJASDFJKOADFSJKLFADSJKLAFDSJKLKJLFADSJ O P

35

Servios de Informtica MainFrame Training

JCL e UTILITRIOS O T T O M

============================= B ============================== e o resultado ser este:

================================ T ================================= 000002 OIJSADJOIADFDFJ ADFLJKLFADSKJLFDSAJK 000003 OIJASDFJKOADFSJKLFADSJKLAFDSJKLKJLFADSJ ============================= B O T ============================== I ----- Para inserir uma nova linha logo abaixo. I12 --- Insere 15 linhas a partir daquela linha. D -- Deleta a linha corrente. D6 ----- Deleta esta linha e as prximas 5. DB ---- Deleta todas as linhas abaixo desta.

TS ---- Para quebrar uma linha (dividir em dois). Coloque este comando na linha, depois coloque o cursor no ponto para ser quebrado e d enter. )2 -- Faz com que esta linha seja empurrada para esquerda em 2 colunas. (9 --- Faz com que esta linha seja movida para esquerda em 9 colunas (pode haver truncamento em ambos os casos). Obs.: se quiser repetir o comando num determinado range de linhas, utilize ))9 na linha inicial e )) na linha final * ---- Colocando um asterisco numa linha far com que ela suba para a primeira da pgina. COMANDOS DE CONTROLE DE PGINA PF8 ---- Avana 1 pgina (tanto na aws como em display) PF7 ---- Volta 1 pgina PF10 -- Move contedo para esquerda 36

Servios de Informtica MainFrame Training

JCL e UTILITRIOS

15 + PF10 -- Move 15 colunas para esquerda PF11 -- Move contedo para direita 6 + PF11 -- Move 6 colunas para direita M + PF8 -- Avana at o final do texto. TOP + PF7 -- Volta ao inicio do texto. POINT L 345 -- Posiciona o cursor na linha 345 to texto (passa a ser a primeira do editor)

37

Você também pode gostar