Muito interessante:
http://www.easymarketplace.de/codepages.php
PDF para cada EBCDIC e ASCII code page.
Muito interessante:
http://www.easymarketplace.de/codepages.php
PDF para cada EBCDIC e ASCII code page.
Este post é só para constatar a boa ou má elaboração de um job.
Um programa Cobol deveria rodar 30 minutos aproximadamente concorrendo com outras aplicações. Por ser uma execução emergencial, não foi aguardado o período de janela ou menor utilização de máquina.
Quando o job foi montado, colocou-se o Block Size do arquivo de saída igual ao LRECL (tamanho do registro). A idéia é que o sistema grave blocos com uma boa quantidade de registros, e não registro a registro. Do jeito que foi montado ele está fazendo a “desgastante” operação de I/O a cada linha. Em uma leitura de batimento de um arquivo de entrada de 130 milhões de registros, o tempo de duração foi de 30 minutos (estimado) para 2h30min. De quebra deu ABEND S837 pela quantidade de volumes máxima pré-configurada e talves atrapalhada pelo tamanho mínimo do bloco.
Após a correção do Job no tamanho do BLKSIZE (deve ser um múltiplo do tamanho registro do registro) para um valor considerável (por isso bloco) a execução ocorreu em 29min.
Use sempre um múltiplo bem alto para menor operação de I/O, mas lembre-se que você deve avaliar a utilização para o propósito da sua execução.
Abraço!
De vez em quando precisamos contar quantos elementos temos em um vetor no banco (Adabas) através de um programa Natural.
Muitas vezes deparei com um código fazendo um loop de 1 a 199 e verificando um a um para ver se não está em branco ou zerado.
Ok! Às vezes é necessário, pois não se sabe como o programa foi inicialmente concebido e como pode se comportar (deixar posições sem uso, por exemplo). De qualquer forma, uma maneira de verificar a quantidade de elementos no vetor (múltiplo ou periódico) é usar o count:
IF C*GR-HISTORICO EQ 0...
Isso faz com que eu veja se está vazio – nunca foi populado -, ou já tem algo – quantos tem.
Hmmm deu pau 0047 (erro na definição da variável)…
Na definição do seu programa deve estar assim:
1 F513 VIEW OF AA-SIMRAV-ATIVACAO
...
2 C*GR-HISTORICO
2 GR-HISTORICO (1:191)
3 CO-HISTORICO
3 DA-HISTORICO
...
Deve-se repetir o campo, uma vez com o “C*” e a outra a definição propriamente dita. Aí funciona!
Documentação de utilização do DFSORT:
https://www-304.ibm.com/support/docview.wss?rs=114&uid=isg3T7000080
É sempre bom relembrar as variáveis de ambiente para trabalhar com data e hora no Natural. Chupinhado do site da SoftwareAg (http://documentation.softwareag.com/natural/nat426mf/vari/dtime.htm).
Data
* D = dia, M = mês, Y = ano, Mês = apenas as 3 primeiras letras do nome obtido por *DATG
Hora
| Variável | Formato/Tamanho | Explicação |
|---|---|---|
| *TIMD (r) | N7 | Pode apenas ser usado junto com o comando SETTIME, pois fornece a diferença de tempo no formato HHIISST da sua execução do SETTIME e a da chamada da variável.(r) representa o label/marca ou linha do comando SETTIME usado como base para o *TIMD. |
| *TIME | A10 | Contem a hora do dia no formato HH:II:SS.T (*). |
| *TIME-OUT | N5 | Contem o número de segundos antes da transação atual dar time out (apenas disponível com Natural Security).*TIME-OUT é 0 se o mode transacional não foi acionado, que somente ocorre quando é executado um FIND, READ or GET para ler um registro da base para atualizá-lo.
|
| *TIMESTMP | B8 | Valor do relógio interno da máquina.
Sob BS2000/OSD, este valor é disponível como hora local ou como GMT. Para ser consistente em todos os ambientes, o conteúdo de *TIMESTMP sob BS2000/OSD é sempre em GMT. |
| *TIMN | N7 | Contém a hora do dia no formato HHIISST (*). |
| *TIMX | T | Contém a hora do dia no formato de hora interno. |
* H = hora, I = minuto, S = segundo, T = décimo de segundo.
Recebemos um comentário a respeito de linguagens antigas. Respondi, mas vou postá-lo por achar interessante a possibilidade de discussão. Quer quiser opinar, questionar, discordar, complementar… fique à vontade!
Nadia disse:
agosto 6, 2010 às 7:55 pmOlá Daniel! Beleza?
Eu estou fazendo meu TCC sobre Cobol e estou procurando por linguagens antigas, na verdade eu ia comentar sobre o Natural como uma linguagem que não se usava mais, mas pesquisando eu vi que ainda usa-se bastante. Você sabia me dizer quais tipo de empresas usam e porque ainda usam?Muito obrigada!
=)
Resposta:
Nadia,
Vai ser muito difícil você achar uma linguagem que não se usa mais. Existem linguagens da moda, linguagens que se fixaram, outras já tiveram seu ápice, mas deixar de ser usada… ainda existe até programas rodando em clipper… vai numa lojinha de bairro e olha para a tela.
Com relação ao Cobol ou Natural, muitas empresas usam, principalmente que necessitam de grande processamento e grande massa de dados em mainframe como bancos e órgãos governamentais (SERPRO, PRODESP etc). Um dos motivos é que sistemas grandes e antigos estão consolidados e realizar alterações drásticas como plataforma migrando para algo ainda com performance e confiabilidade desconhecida é muito arriscado, além de muito custoso.
Cuidado para não iniciar o seu TCC por um caminho irreal! As linguagens surgem para suprir uma necessidade, seja ela performance, arquitetura, ambiente, facilidade, hardware ou qualquer outra coisa. Enquanto houver essa necessidade, ela pode ser aos poucos substituída, mas dificilmente completamente erradicada. Cobol ainda é muito usado, por exemplo, já que foi citado no seu comentário – peça a lista de casamento no Extra e olhe para a tela da atendente. E Natural, há 1 ou 2 anos foi lançada a nova versão. Já ouvi muita coisa sobre estas linguagens e sobre “agora é só Java” (que é uma excelente plataforma para integração e reaproveitamento com código moderno em OO), mas é na maioria das vezes empolgação de quem não sabe o que está falando, ou que acreditou em fulano e repassa como verdade… ou necessidade de auto-afirmação… rsrs. Mais uma vez: CUIDADO para não cair em armadilhas!Bjo e bom TCC!
Para alterar o modo de programação do elemento Natural, basta na linha de comando (superior):
Para quem estiver interessa http://documentation.softwareag.com/adabas/ada744mfr/adamf/util/adauld-unload.htm
Você tem um programa e quer modularizá-lo, ou ainda sabe que determinada rotina pode e deve ser compartilhada por outros programas. Neste cenário você pensa em criar Subs! Sub-o-quê?
A diferença básica entre subrotina e subprograma é que o subprograma é uma caixa preta – ele independe de quem o chama e se comporta como um programa a parte com seu universo particular. Já uma subrotina permite o compartilhamento de uma global! Isso mesmo: se o programa chamador está usando uma global e a subrotina referenciá-la, ele aproveitará das mesmas variáveis e valores em memória.
Resumindo: um subprograma conversa com seus chamadores via parâmetros, enquanto uma subrotina pode conversar pelos parâmetros ou pelas variáveis da global.
Abraço!
Para quem não conhece, Eclipse é um IDE para diversas linguagens contruída em Java, o que permite o uso em diversos sistemas operacionais. O Natclipse é um plugin para o IDE trabalhar com a linguamge Natural e inclusive a confecção de mapas! O lado ruim é que aparentemente é pago…
Este é o link do site: http://www.natclipse.com
Lá pedem para entrar em contato:
innoWake
PR and Media Department
Simone Bernecker
Robert-Bosch-Str. 1
89250 Senden
Germany
Phone: +49 7307 921900
Email: simone.bernecker@innowake.de
Web: http://www.natclipse.com/
Quando executamos uma programa batch via um JCL, muitas, se não a maioria das vezes, necessitamos utilizar parâmetros. Existem as seguintes opções de parâmetros utilizadas:
01 #PARM (A2) 01 REDEFINE #PARM 02 #P1 (A1) 02 #P2 (A2)
Exemplo no JCL:
MEUPROG AB (em que 'A' seria entendido como #P1 e 'B' como #P2)
01 #PARM 02 #P1 (A1) 02 #P2 (A2)
Exemplo no JCL:
MEUPROG A B (em que 'A' seria entendido como #P1 e 'B' como #P2)
A segunda utilização é comum para parâmetros com tamanho indefinido, ou seja, reservamos um espaço de 40 caracteres, mas passível de ser informado somente 6, por exemplo, sendo os últimos completados com espaços como um parâmetro #NOME com ‘DANIEL’.
Mas há possibilidaddes de utilizarmos a primeira alternativa mesmo com espaços sem que o programa entenda, ou o JCL informe co programa, que são 2 parâmetros ou mais quando na verdade informo somente 1. Podemos passar o parâmetro na mesma linha ou nas linhas subseqüentes. Se passarmos na mesma linha, isso será interpretado que cada espaço define o término de um parâmetro; se colocarmos um em cada linha, a quebra de linha é que será interpretada como término de parâmetro. Vamos a um exemplo:
Meu programa vai receber um parâmetro que será quebrado, por algum motivo, em 4 variáveis:
A ‘Opção’ é um numérico de 1 posição que será usada para definir algo lá dentro do programa; o ‘Nome’ é um alfanumérico de 30 posições que pode conter espaços no final; ‘Setor’ é um alfanumérico de 10 posições que também pode conter espaços no final; ‘Ano’ tem tamanho fixo de 4 posições e é numérico.
Se executarmos o JCL da seguinte maneira
MEUPROG1 9DANIEL TI-DEV 2008
haverá interpretação de 3 parâmetros: 9DANIEL,TI-DEV e 2008.
Mas se executarmos da seguinte maneira
MEUPROG1 9DANIEL TI-DEV 2008
haverá interpretação de um só parâmetro.
É isso. Espero que isso ajude alguém neste mundo misterioso dos jobs!
Abraço!
Essa tabela é interessante, pois tem os comandos do Roscoe de forma rápida e simples. Originalmente é em inglês, mas eu traduzi (ou ao menos tentei).
| Comando Roscoe | Forma Resumida | Propósito |
|---|---|---|
| ALL | Mostrar uma lista com nomes de membro, descrições e atributos de uma biblioteca de usuário do Roscoe.
Displays a list of member names, descriptions and attributes of the user’s ROSCOE library. |
|
| COB | Executa uma verificação da sintaxe no código fonte de rotinas Cobol.
Performs syntax checking of COBOL source code statements. |
|
| COPY | C | Cria uma cópia duplicada de toda ou comente parte da AWS, membro da biblioteca ou arquivo de saída anexado.
Creates a duplicate copy of all or part of an AWS, library member or attached output file. |
| DISPLAY | DIS | Mostra informações sobre o job submetido ao sistema operacional, seus iniciadores, fila de jobs etc.
Displays information about jobs submitted to the operating system, their initiators, job queues, etc. |
| DSN | Aciona as facilidades do Data Set.
Inquiry of the Data Set Facility. |
|
| EDIT | E | Procura na AWS atual elementos com uma string (cadeia de caracteres) fornecida e lista todas as ocorrências. Também pode ser usado para substituir uma ou outra string.
Searches current AWS for character string supplied and lists all occurrences. This can also be used to substitute one string for another. |
| EXPORT | EXP | Escreve dados de uma AWS ativa em uma dataset catalogado.
Writes data from the active AWS to a cataloged dataset. |
| FETCH | F | Trás toda, ou parte de, um membro da biblioteca para a AWS.
Brings all or part of a library member into AWS. |
| HELP | Provê informações online sobre comandos e facilidades do Roscoe, monitor e RPF, e suas sintaxes.
Provides online information about ROSCOE, Monitor and RPF commands and facilities and their syntax. |
|
| IMPORT | IMP | Importa toda ou parte de um dataset catalogado em uma AWS.
Imports all or part of a cataloged dataset into AWS. |
| JCK | Executa uma verificação na sintaxe de um membro JCL. É recomendado usar essa rotina em todo JCL novo ou modificado antes de submetê-lo para execução.
Performs syntax checking on a JCL member. It is recommended to use this routine on all new or modified JCL before submitting it to be run. |
|
| LSHIFT | LSH | Joga todos os dados ou uma seqüência deles na AWS para a esquerda.
Shifts all data or a range of data in the AWS to the left. |
| PAN | Provê acesso de leitura para as bibliotecas Panvalet.
Provides read access to Panvalet libraries. |
|
| RSHIFT | RSH | Joga todos os dados ou uma seqüência deles na AWS para a esquerda.
Shifts all data or a range of data in the AWS to the right. |
| SAVE | S | Salva o conteúdo de uma AWS na biblioteca do usuário Roscoe usando o nome do membro fornecido.
Save the contents of the AWS in the user’s ROSCOE library using the supplied member name. |
| SORT | SOR | Ordena todo o conteúdo da AWS. Primeiro verifica a coluna a ser ordenada.
Sorts the contents of the AWS. First verify the columns to be sorted on. |
| TIQ | Permite acionar e mostrar informações sobre os volumes de fitas catalogadas e datasets do sistema de gerenciamento de fita (TMS). Você precisa especificar ou nome do DataSet (DSN) ou o volume da fita (VOLSER).
Allows inquiry and display of the Tape Management System (TMS) information about cataloged tape volumes and datasets. You must specify either a Dataset Name (DSN) or a tape volume (VOLSER). |
|
| WHO | Mostra informações sobre o usuário Roscoe atual do terminal e usuário logado. Não destrói sua AWS
Displays terminal and user signon information about the current ROSCOE user. Does not destroy your AWS. |
GLOBAL DATA AREA
A Global Data Area, ou Global, é um tipo de objeto natural onde são definidos os elementos de dados que podem ser referenciados por múltiplos programas e subrotinas na mesma aplicação ou biblioteca. Somente uma Global pode ser utilizada em determinado programa/subrotina. É importante lembrar que se uma Global for modificada e recatalogada, os programas e subrotinas que a utilizam também deverão ser recatalogados.
PARAMETER DATA AREA
Define os elementos de dados que um subprograma (programas não aceitam parameter) irá usar para receber e retornar dados para o programa chamador.
Os nomes da Parameter não precisam coincidir com os nomes do programa chamador, mas o formato, tamanho e ordem de serem definidos precisam ser iguais aos que foram passados pelo programa chamador. Pode-se especificar o tamanho e/ou o formato diferente desde que seja utilizada a clausula “BY VALUE” OU “BY RESULT”. A Parameter pode ser tanto interna quanto externa ao sub-programa.
O editor do natural possui alguns recursos interessantes para facilitar a edição dos programas, uma tarefa que é limitada pela interface mainframe.
Por exemplo, no código abaixo quero inserir 15 linhas entre a linha comentada e o END, utilizando os comandos de linha, basta na ir na linha 40 e na primeira posição do editor, digitar .I(15) e pronto! É claro que esse foi apenas um exemplo simples, mas existem muitas outras possibilidades, como listaremos a seguir.
Antes
0010 DEFINE DATA LOCAL 0020 01 TESTE (A2) 0030 END-DEFINE 0040 * -------------------------------------------------------------------- * 0050 END
Depois
0010 DEFINE DATA LOCAL 0020 01 TESTE (A2) 0030 END-DEFINE 0040 * -------------------------------------------------------------------- * 0041 0042 0043 0044 0045 0046 0047 0048 0049 0049 0049 0049 0049 0049 0049 0050 END
COMANDOS DE LINHA
.X e .Y - Marca o início de um bloco de linhas
.C(N) - Copia a linha em que estiver o cursor N vezes, caso queria somente copiar a linha 1 vez o (N) pode ser omitido
.CX(N) - Copia a linha previamente marcada com o .X N vezes.
.CX-Y – Copia o bloco marcado por entre .X e .Y
.D(N) – Deleta N linhas a partir da linha em que estiver o cursor.
.I(N) - Insere linhas, se informado o parâmetro (N) insere o número de linhas solicitado
.I(NOME-DO-OBJETO,SS,NN) - Insere linhas de outro objeto natural (COPIA), sendo que SS indica a linha inicial e NN a quantidade de linhas a ser copiada
.J – Junta a linha atual com a porterior (se o tamanho da linha resultante for maior que a linha do editor, a linha será marcada com ‘L’, e deverá ser separada novamente com .S, antes de ser modificada)
.S – Divide a linha corrente (split) na posição que se encontra o cursor, ou seja, deverá ser colocado o .S no início da linha e posicionado o cursor no ponto a ser divida a linha e pressionado <Enter>
.MX – Move a linha previamente marcada com .X
.MX-Y – Move o bloco marcado entre .X e .Y
.P – Posiciona a linha marcada no topo da tela
Veja o seguinte código e tente responder o que será impresso.
DEFINE DATA LOCAL 01 #TESTE (A15) 01 REDEFINE #TESTE 02 #TESTE-A (A5) 02 #TESTE-N (N10) END-DEFINE * MOVE 11 TO #TESTE-N WRITE #TESTE END
a – cinco espaços em branco e 0000000011
b – treze espaços em branco e 11
A resposta certa é a opção ‘a’, sim com os zeros ! Mas e se eu pedir pra exibir o valor de TESTE-N? Somente aparecerá o 11 sem os zeros.
#TESTE..: 0000000011 #TESTE-N: 11
Aparentemente isso parece ser bem simples e sem importância, mas acredite problemas com formatação são bem chatos e difíceis de serem percebidos…