Natclipse – Eclipse com Natural

Abril 13, 2009

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/


Parm no JCL

Outubro 20, 2008

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:

  • 1 parâmetro que é redefinido dentro do programa:
    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)
  • 1 parâmetro como grupo, com “sub-parâmetros” que são informados separadamente:
    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:

  1. Opção
  2. Nome
  3. Setor
  4. Ano

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!


Comandos e rotinas do Roscoe

Abril 18, 2008

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).

  • AWS é a área de trabalho
  • DataSet é um espaço alocado na fita ou disco
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.


Globals e Parameter no Natural

Fevereiro 1, 2008

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.


Comandos de linha no Editor (mainframe)

Janeiro 31, 2008

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


Curiosidade – Variáveis Redefinidas

Janeiro 30, 2008

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…


Convertendo Data Gregoriana em Juliana

Janeiro 25, 2008

Apesar de não ter implementado, pensei: “para economizar um byte na transmissão de dados, poderia enviar o ano mais o dia em juliano (de 1 a 365)”. Era bobeira minha… 1 byte… mas para elguém isso pode ajudar.

A maneira mais fácil é a seguinte:

DEFINE DATA LOCAL
1 #DATA-DMAC (A8) INIT <'05051984'> /* nasci nesse dia :D
1 #DATE-D (D)
1 #DATE-J (A7)
END-DEFINE
*
*** VOCE PODE RECEBER ESSA DATA DA TELA OU PARM
*
IF #DATE-DMAC NE MASK (MMDDYYYY)
OR #DATE-DMAC NE MASK (....1930:2014)
WRITE 'O CAMPO #DMAC NAO ESTA NO FORMATO DDMMAAAA.' #DATE-DMAC
STOP
END-IF
*
MOVE EDITED #DATE-DMAC TO #DATE-D (EM=DDMMYYYY)
MOVE EDITED #DATE-D (EM=YYYYJJJ) TO #DATE-J
*
WRITE '=' #DATE-DMAC / '=' #DATE-D / '=' #DATE-J
*
END

DMAC significa Dia, Mês e Ano Completo.

  • A primeira máscara verifica se a data possui um formato válido de dia, mês e ano, e depois verifica o intervalo do ano (eu coloquei de 1930, primeira Copa do Mundo, e 2014, a segunda Copa no Brasil); Se não estiver dentro dessas máscaras, mostro uma mensagem de erro.
  • Movo para uma variável do tipo DATE, dizendo que a máscara do campo é DDMMAAAA, para ela saber os valores corretos.
  • Movo o conteúdo da variável no formato D para uma no formato A com o valor do ano e o dia do ano
  • Mostro uma data em cada linha (a barra no WRITE faz isso)

Esse exemplo foi baseado – copiado e levemente modificado para uso – do fórum da Software AG sobre Natural: http://tech.forums.softwareag.com/viewtopic.php?t=13788


Arquitetura ADABAS

Dezembro 28, 2007

No Post anterior, falamos um pouco de uma pequena otimização para busca de dados, porém acredito que para um melhor entendimento, seria interessante ter o conceito de como é a arquitetura do ADABAS. Bom, para começar o Sistema ADABAS é composto por algumas áreas:

  • Nucleus: contém o programa ADABAS
  • ASSO: onde é gravado os relacionamentos e informações de FILE (FDT) assim como listas de files, LISTAS INVERTIDAS!
  • DATA: Dados dos FILES, que podem ser tanto de utilização do ADABAS como SYSFILE, FUSER e FDIC quanto os FILES dos usuários.
  • WORK: Area de trabalho do ADABAS, que é formado pela Protection Area, Temporay Intermediate results e Results of inquiries.
  • PLOG: Log das modificações efetuadas no banco (por registro) e pode ser utilizado em casos de danos físicos
  • CommandLOG: Log dos comandos das atividades dos usuários.

ada1.png


O Find no Adabas

Novembro 19, 2007
FIND (1) EMPREGADOS           WITH

SU-DEPARTAMENTO             GE          'COMPRAS'  AND

SU-DEPARTAMENTO             LE          'FINANCEIRO'

Para um programa que lista somente os empregados dos setores entre Compras e Financeiro, o Find acima funciona legal, né? Se for para poucos registros realmente poderia falar que funciona bem, mas se forem muitos registros, lamento informar mas a CPU que esse FIND irá consumir sera absurdamente grande, a melhor pesquisa seria:

FIND (1) EMPREGADOS           WITH

SU-DEPARTAMENTO             EQ          'COMPRAS'  THRU        'FINANCEIRO'

Esse consumo de CPU acontece porque para o primeiro exemplo de Find o Adabas irá na lista invertida, montará 2 listas na WORK, uma contendo a seleção dos registros com departamento maiores ou iguais a Compras e outra com os registros menores ou iguais a Financeiro, e após essa seleção ele fará uma intersecção e verificará quais os registros que atendem a ambas as condições, a ainda ordenará por ISN; já para o segundo exemplo de Find o trabalho é bem menor, apenas uma lista é gerada com os descritores que estejam no range e a ordenção por ISN é efetuada.


Erros comuns e resoluções na conversão para Natural 3.1

Outubro 31, 2007

Encontrei esse artigo de erros Natural na internet outro dia desses, e achei interessante postar. Está em inglês, mas eu comentei em português abaixo de cada item. Abraço!

Common Errors and Resolution – Converting to Natural 3.1.x

NAT0002 DEFINE DATA No file is available with specified name or number. Probably because the file has not been loaded into the test environment.Arquivo não disponível com o nome ou número especificado. provavelmente porque não foi carregado no teste de ambiente.
NAT0009 NEWPAGE
EJECT
Invalid relational operator in relation expression.
If NEWPAGE 14 LINES LEFT the keyword LESS is now required; should read:Operador relacional inválido na expressão de relação.
A palavra LESS é requerida agora em NEWPAGE 14 LINES LEFT; deveria ler:

NEWPAGE IF LESS THAN 14 LINES LEFT
or
NEWPAGE WHEN LESS THAN 14 LINES LEFT
or
NEWPAGE LESS THAN 14 LINES LEFT
NAT0082 INCLUDE
COPYCODE
This error message is issued when a value is entered in the command line, which is neither a Natural command nor the name of a Natural program, contained in the active library or in the library defined as STEPLIB.Esta mensagem de erro acontece quando o valor de entrada na linha de comando, que não é nem comando Natural nem nome de um programa Natural, contém em uma biblioteca ativa ou em uma biblioteca definida como STEPLIB.
NAT0111 DEFINE DATA Error … in line … of data area … processing ….
Commonly caused by a missing free rule not found in PREDICT.Erro… na linha… da área de dados… processando…
Normalmente causada pela falta de uma regra livre não encontrada no PREDICT.
NAT0166 DEFINE DATA
MOVE
An invalid definition of the DEFINE DATA statement has been detected.
Probably indexing for MU or element with a PE. Possibly an attempt to load alphanumeric data into a numeric field.
Under Natural 2 a RESET in Reporting Mode was allowed for a user-defined array. You’ll have to add either an (*) or range of occurrences, (1:36), under Natural 3Uma definição inválida da indicação DEFINE DATA foi detectada.
Provavelmente indexando por MU ou elemento com um PE. Possivelmente uma tentativa de carregar um dado alfanumérico em um campo numérico.
No Natural 2 um RESET no Modo Reporting era permitido para vetores definidos por usuários (você). Você terá que adicionar ou um (*) ou uma faixa de ocorrências, (1:36), no Natural 3

RESET +USDIP /* defined as A 31 (1:36)

Was permitted in Natural 2.2+; should look like this under Natural 3:

Era permitido no Natural 2.2+; deveria parecer assim no Natural 3:

RESET +USDIP(*)
NAT0199 NAT0199 Duplicate label definition.Definição de label duplicada

FIND-IIDM.
  FIND FIND-IIDM WITH POLICY-NUMBER = #POL-NUM
    IF NO RECORDS FOUND
      ESCAPE BOTTOM(FIND-IIDM.)
    END-NOREC

Natural is misinterpreting the label and the view name used in the above context. Change the paragraph/label name.

O Natural interpreta mal a label e o nome da view usada no contexto acima.
Mude o nome do parágrafo/label.

FIND-IIDM-POLICY.
  FIND FIND-IIDM WITH POLICY-NUMBER = #POL-NUM
    IF NO RECORDS FOUND
      ESCAPE BOTTOM(FIND-IIDM-POLICY.)
    END-NOREC
NAT0229 UPDATE
STORE
Invalid use of WITH clause in UPDATE or STORE statement. This was caused by a STORE statement that included a USING (nnnn) clause. Chris Brown simply removed it.Uso inválido da cláusula WITH na indicação UPDATE ou STORE. Isto é causado por uma indicação STORE que inclui uma cláusula USING (nnnn). Chris Brown simplesmente remove :D
NAT0273 DEFINE DATA Error É in line É of data area É processing É lda
An error has occurred in a specific line of a data area while processing a variable. Probably a security problem (not authorized to use file) for a file defined in an external LDA.
A missing free rule could also cause this error.Um erro ocorreu numa linha específica da área de dados enquanto processava a variável. Provavelmente um problema de segurança (não autorizado a usar o arquivo) para o arquivo definido numa LDA externa.
A falta de uma regra livre pode também ter causado esse erro.
NAT0274 INCLUDE
COPYCODE
Error É in line É of copycode É processing É
An error has occurred in a specific line of a copycode while processing a variable or the copycode member is not in the current library.
Most of the time this is the result of a missing free rule from PREDICT.Um erro ocorreu numa linha específica de um copycode enquanto processava uma variável ou o membro do copycode não está na bilbioteca atual.
Na maioria das vezes é resultado de uma falta de regra livre do PREDICT.
NAT0280 RESET Index entry incorrectly specified for field. An index was specified for a variable for which indexing is not permitted.Índice de entrada especificada incorretamente para o campo. Um índice foi especificado para uma variável que o índice não é permitido.

IF #LAST-POS LT 19 THEN
      RESET #INPUT.#CHAR-ARRAY(#LAST-POS+1:19)
      DECIDE FOR EVERY CONDITION

The problem encountered was #CHAR-ARRAY which was defined with only 10 occurrences. Applied the following changes:

O problema encontrado foi #CHAR-ARRAY que foi definida com apenas 10 ocorrências. Foi aplicada as seguintes mudanças:

IF #LAST-POS LT 10 THEN /* 19
RESET #INPUT.#CHAR-ARRAY(#LAST-POS+1:10) /* 19)
NAT0281 MOVE Index entry missing or invalid for an array.Falta de índice de entrada ou para um vetor inválido.

MOVE +USDIP TO #SDIP

This was an attempt in Reporting Mode to load the first four occurrences of an array into a large field (actually 4 times the size of a single element); made sense in Natural 2 Reporting Mode. Natural 3 does not permit this type of statement. Either redefine the target field to be able to move on an “element” by element level or use a simple loop to process the data:

Esta foi uma tentativa no modo Reporting para carregar as primeiras quatro ocorrências de um vetor dentro de uma campo grande (atualmente 4 vezes o tamanho de um elemento simples); faz sentido no modo Reporting do Natural 2. O Natural 3 não permite este tipo de indicação. Ou redefine o campo indicado para poder mover um elemento por nível de elemento ou simplesmente faça um laço para processar o dado:

DEFINE DATA LOCAL
1 #ARRAY(A10/8)
  INIT <'one','two','three','four'>
1 #FIELD(A40)
1 #I(I1)
1 #J(I1) INIT <1>
END-DEFINE
FOR #I 1 4
  MOVE #ARRAY(#I) TO SUBSTRING(#FIELD,#J,10)
  COMPUTE #J = (#I * 10) + 1
END-FOR
DISPLAY #ARRAY(*) #FIELD
END
NAT0285 Line References It seems that Natural 3 no longer permits programmers to code line reference numbers with Natural System Variables once permitted in Natural.Parece que o Natural 3 não permite mais que programadores codifiquem números de linha de referência com Natural System Variables uma vez já permitido no Natural.

WRITE 3x *TIME(0470)
  / 3x *TIMN(0470)
  / 3x *TIMD(0430)

In this example, the line references to line 470 are no longer permitted. They never really did anything except provide a form of documentation. However, *TIMD has always required a reference to the SETTIME statement and that hasn’t changed with Natural 3.

Neste exemplo, as linhas que referenciam a linha 470 não é mais permitida. Elas não faziam nada a não ser prover uma forma de documentação. Entretanto, *TIMD sempre necessitou uma referência à indicação SETTIME e isso não mudou com o Natural 3.

NAT0291 DEFINE DATA The format used of a database field is not compatible with the format of the field as defined in the data dictionary. This is probably due to Y2K fixes where an N6 definition is used for an (originally) A6 definition.O formato usado do campo do banco não é compatível com o formato do campo definido no dicionário de dados . Este é provavelmente devido aos reparos do Y2K onde uma definição N6 é usada para uma (originalmente) definição A6.

NAT0291 Format for database field incompatible.
>                                      > + Pro

       ....+....1....+....2....+....3....+....4
  0090 **
  0100 **
  0110 DEFINE DATA
  0120 LOCAL
  0130 01 ACTS-CASE-VIEW VIEW OF ACTS-CASE
  0140   02  CASE-KEY                      (A9)
  0150   02  PROD-TEST-INDIC               (A1)
  0160   02  CASE-STATUS-CODE              (A1)
  0170   02  INSURED-CLAIMANT-INDEX        (N2)
  0180   02  CLAIM-GROUP-CODE              (N1)
E 0190   02  DATE-OF-LOSS                  (N6)
  0200   02  LOSS-LOCATION-CODE            (A1)
  0210   02  POLICY-ISSUED-COMPANY-CODE    (A1)

In the example above it might be more prudent to just leave off the format/length “assignments” letting the program take the definition from the DDM.

No exemplo acima pode ser mais prudente simplesmente ignorar as atribuições de formato/tamanho deixando o programa pegar as definições da DDM.

NAT0300 MOVE Operands are not data transfer compatible.Operandos não são compatíveis para transferência de dados.

2 OCP-FIFTH-DIGITÉP  1.0 (1:2) /* FIELD IN PE
2 OCP-SIX-DIGIT  ÉP  1.0 (1:2) /* FIELD IN PE
2 #OCP-SIXTH-DIGIT       (P1/1:4)
MOVE OCP-SIX-DIGIT (#VHCL-INDEX) TO
   #OCP-SIXTH-DIGIT (#VHCL-INDEX)

Arrays should be equally dimensioned.

Vetores poderiam ser igualmente dimensionados.

NAT0384 RESET
REDEFINE
You’ll get this if a field has not been defined somewhere. More often as not you’re got a field missing from an external view (GDA or LOCAL USING) or a redefine is trying to reference a field in an old version of the program (probably a candidate for “retirement”).Você vai obter isso se um campo não for definido em lugar algum. Mais freqüente que não faltar um campo de uma view externa (GDA ou LOCAL USING) ou uma redefinição está tentando referenciar um campo em uma versão antiga de um programa (provavelmente um candidato a aposentadoria).
NAT0472 DEFINE DATA Misuse of a reserved word, for example: 1 COUNT (P5) is incorrect under Version 3.Mal uso de uma palavra reservada, por exemplo: 1 COUNT (P5) é incorreto na versão 3.
NAT0918 ON ERROR ESCAPE (TOP) not allowed in ON ERROR or AT block.This error may be caused by one of the following:

1. An ESCAPE statement was used to exit from a currently active ON ERROR block. However, an ON ERROR block must be exited with a FETCH, STOP, TERMINATE or RETURN statement.

2. An ESCAPE TOP statement was used within one of the following conditions:

3. &endash; AT BREAK

4. &endash; AT START/END OF DATA

ESCAPE (TOP) não é permitido nos blocos ON ERROR ou AT.

Este erro pode ser causado por um dos abaixo:

1. Uma indicação ESCAPE foi usada para sair de um bloco ON ERROR atualmente ativo. Entretanto, um bloco ON ERROR precisa ser deixado com uma indicação FETCH, STOP, TERMINATE ou RETURN.

2. Uma indicação ESCAPE TOP foi usada com uma das seguintes condições: AT BREAK ou AT START/END OF DATA.

2120   ON ERROR DO
2130     IF *ERROR = 3166 OR = 3199 DO
2140 **    WRITE 'BAD RECORD,  ISN =' +ISN1
2150 *     FETCH 'P16AB72P'
2160       ESCAPE
2170     DOEND /*(2130)
2180   DOEND /*2120)

The ESCAPE in the above example has no loop to exit. Removing the ESCAPE statement may not be the answer unless we can evaluate how the program was originally invoked.

o ESCAPE no exemplo acima não tem laço para sair. remover a linha do ESCAPE pode não ser a resposta a menos que possamos avaliar como o programa foi chamado originalmente.

NAT1167 Windows Invalid window page size (:1:),(4<=ps<=screen)Minimum window depth is 4.

Minimum window width is 9.

This applies to DEFINE WINDOW statements as well as %W window definitions.

Tamanho da página da janela inválido (:1:),(4<=ps<=screen)
Profundidade mínima da janela é 4.
Largura mínima da janela é 9.
Isto aplica para a indicação DEFINE WINDOW bem como definições de janela %W.

NAT3144   The specified ISN was not in ‘hold’ status.
Prior to Natural 2.3, you could use program logic like this:Um ISN espedificado não ficou com status em ‘hold’.
Antes com o Natural 2.3, você poderia usar um lógica de programação assim:

GET RECORD
UPDATE RECORD
END TRANSACTION
UPDATE RECORD
END TRANSACTION 

In Natural 3.1.2, the second UPDATE abends with a NAT3144. In order to fix the problem, you must either remove the first ET or GET the record with hold a second time. (Note: I use get in my example, but this applies to any database access statement)

No Narutal 3.1.2, o segundo UPDATE finaliza com um erro NAT3144. Para reparar o problema, você precisa ou remover o primeiro ET ou dar um GET no registro uma segunda vez. (Veja: Eu uso GET no meu exemplo [???], mas isto aplica para todas as instruções de acesso ao banco de dados)


SETTIME – Conta o Tempo de Execução

Outubro 31, 2007

Quem já não efetuou um programa online para um processamento pesado e desejou saber quanto tempo demorou uma leitura de x registros, ou o tempo parcial/total de execução? O recurso do comando SETTIME do Natural serve para isso, e é muito simples a sua utilização, como se fosse um cronometro, você chama para disparar e depois verifica o tempo registrado. Porém se for muito pequeno o tempo ficará zerado.

Um pequeno exemplo:

DEFINE DATA LOCAL
    01 #I        (N2)
    01 #Y        (N2)
END-DEFINE
FOR #Y=1 TO 3
   ST. SETTIME
       PRINT 10X 'INICIO:' *TIME
       FOR #I=1 TO 10
         PRINT 'NAO FAZENDO NADA...'
       END-FOR
       PRINT 10X 'FIM:' *TIME
       PRINT 10X 'TEMPO EXECUçãO:'
                 *TIMD (ST.) (EM=99:99:99'.'9)
END-FOR
END

Reparem que o tempo do primeiro loop, como cabe tudo na primeira página está zerado, mas como o loop do outro está ‘interrompido’ pela necessidade do <ENTER>, o tempo de execução é maior e dá para ser visto, já o terceiro loop que também cabe no restante da tela volta a ser zero.


Verificação de Data

Outubro 2, 2007

Para verificarmos se o conteúdo de uma variável alfanumérica é uma data válida, podemos utilizar a máscara:

IF #MINHA-VARIAVEL  EQ MASK(EM=YYYYMMDD)
...
END-IF

E se o programador formatou a data sendo DDMMAAAA, ou seja, DDMMYYYY?!

14092007

Seria dia 14 de setembro de 2007, mas por padrão e seguindo a máscara a interpretação do programa (que por exemplo não espera essa confusão)  seria dia 7 do mês 20 de de 1409

Ainda, se o conteúdo dela tiver, por exemplo, um ano válido mas que não corresponda a sua realidade, você pode ter problemas.

12500822

É o dia 22 de agosto de 1250. Uma data válida, mas  para um cadastro de funcionários ou algo assim essa data não corresponde ao nascimento de alguém ou data de admissão.

Para verificar se a data tem um dia válido de um mês válido de um ano válido, basta usar a máscara YYYYMMDD, ou até mesmo ao contrário, se for armazenada ou exibida em dia/mês/ano com máscara DDMMYYYY, ou MMDDYYYY: não importa, use máscara. E quando você quiser restringir uma faixa de anos, utilize:

MASK(DDMM19-20YY)

Que diz: um dia válido, um mês válido e um ano do século 20 e 21 (que comece com 19xx até 20xx). Se quiser aceitar datas com anos do tipo 7034, 9562, 6827 etc, eleve o segundo parâmetro da faixa do ano para 99

MASK(DDMM19-99YY)

Assim você ganha controle nas datas sem precisar quebrar sua variável com REDFINE ou SUBSTRING e ficar fazendo IFs desnecessários. Assim o processamento é muito mais rápido.

Abraço!


DEFINE DATA

Setembro 26, 2007

O DEFINE DATA deve ser a primeira instrução de um programa Natural, pois contém as definições das áreas de dados a serem usadas no programa. Estes são os tipos:

GLOBAL - Contém elementos que podem ser referenciados por mais de um objeto.

PARAMETER – Elementos usados como entrada em um subprograma a partir de um programa principal e devem estar na mesma seqüência na chamada e na declaração. Não podem ter valores iniciais e nem ser constantes.

LOCAL – Contém dados usados em um objeto Natural (programa, subprograma, subrotina).

DEFINE DATA
GLOBAL USING NOME-GDA
PARAMETER USING NOME-PDA
01 #CAMPO1 (N10)
01 #CAMPO2 (A50)
LOCAL USING NOME-LDA
01 #NOME (A50)
01 #TELEFONE (N10)
01 #EMAIL (A50)
END-DEFINE

Os campos podem ser nos formatos:

A – variáveis alfanuméricas;
N – variáveis numéricas;
P – variáveis numéricas compactadas;
I – variáveis inteiras para índices (normalmente);
B – variáveis binárias;
L – variáveis lógicas (TRUE ou FALSE, 1 ou 0) ;
D – para variáveis de data;
T – variáveis de hora;
F – variáveis com ponto flutuante;
U – variáveis com valor UNICODE UTF-16;
C – variáveis com atributos de controle;

Você pode estabeleer um valor inicial às variáveis, usando o comando INIT na mesma linha após a declaração de tipo:

01 #IND-TAB (I04) INIT <1>

Também pode usar vetores/matrizes. Primeiro declaramos o tipo do campo e depois sua quantidade:

01 #ARRAY (A10/5)

Neste exemplo temos um vetor com tamanho de 5 ocorrências de alfanuméricos de 10 posições.


Documentação Oficial

Setembro 19, 2007

A documentação oficial do Natural e do ADABAS podem ser visualizadas ou baixadas através de http://documentation.softwareag.com/

Lá há vários links para as referências direcionadas a assuntos específicos.

Abraço!


Tabela EBCDIC

Agosto 28, 2007
Dec Hex ASCII EBCDIC
0 00 NUL Null NUL Null
1 01 SOH Start of Heading (CC) SOH Start of Heading
2 02 STX Start of Text (CC) STX Start of Text
3 03 ETX End of Text (CC) ETX End of Text
4 04 EOT End of Transmission (CC) PF Punch Off
5 05 ENQ Enquiry (CC) HT Horizontal Tab
6 06 ACK Acknowledge (CC) LC Lower Case
7 07 BEL Bell DEL Delete
8 08 BS Backspace (FE)
9 09 HT Horizontal Tabulation (FE)
10 0A LF Line Feed (FE) SMM Start of Manual Message
11 0B VT Vertical Tabulation (FE) VT Vertical Tab
12 0C FF Form Feed (FE) FF Form Feed
13 0D CR Carriage Return (FE) CR Carriage Return
14 0E SO Shift Out SO Shift Out
15 0F SI Shift In SI Shift In
16 10 DLE Data Link Escape (CC) DLE Data Link Escape
17 11 DC1 Device Control 1 DC1 Device Control 1
18 12 DC2 Device Control 2 DC2 Device Control 2
19 13 DC3 Device Control 3 TM Tape Mark
20 14 DC4 Device Control 4 RES Restore
21 15 NAK Negative Acknowledge (CC) NL New Line
22 16 SYN Synchronous Idle (CC) BS Backspace
23 17 ETB End of Transmission Block (CC) IL Idle
24 18 CAN Cancel CAN Cancel
25 19 EM End of Medium EM End of Medium
26 1A SUB Substitute CC Cursor Control
27 1B ESC Escape CU1 Customer Use 1
28 1C FS File Separator (IS) IFS Interchange File Separator
29 1D GS Group Separator (IS) IGS Interchange Group Separator
30 1E RS Record Separator (IS) IRS Interchange Record Separator
31 1F US Unit Separator (IS) IUS Interchange Unit Separator
32 20 SP Space DS Digit Select
33 21 ! Exclamation Point SOS Start of Significance
34 22 Quotation Mark FS Field Separator
35 23 # Number Sign, Octothorpe, “pound”
36 24 $ Dollar Sign BYP Bypass
37 25 % Percent LF Line Feed
38 26 & Ampersand ETB End of Transmission Block
39 27 Apostrophe, Prime ESC Escape
40 28 ( Left Parenthesis
41 29 ) Right Parenthesis
42 2A * Asterisk, “star” SM Set Mode
43 2B + Plus Sign CU2 Customer Use 2
44 2C , Comma
45 2D - Hyphen, Minus Sign ENQ Enquiry
46 2E . Period, Decimal Point, “dot” ACK Acknowledge
47 2F / Slash, Virgule BEL Bell
48 30 0 0
49 31 1 1
50 32 2 2 SYN Synchronous Idle
51 33 3 3
52 34 4 4 PN Punch On
53 35 5 5 RS Reader Stop
54 36 6 6 UC Upper Case
55 37 7 7 EOT End of Transmission
56 38 8 8
57 39 9 9
58 3A : Colon
59 3B ; Semicolon CU3 Customer Use 3
60 3C < Less-than Sign DC4 Device Control 4
61 3D = Equal Sign NAK Negative Acknowledge
62 3E > Greater-than Sign
63 3F ? Question Mark SUB Substitute
64 40 @ At Sign SP Space
65 41 A A
66 42 B B
67 43 C C
68 44 D D
69 45 E E
70 46 F F
71 47 G G
72 48 H H
73 49 I I
74 4A J J ¢ Cent Sign
75 4B K K . Period, Decimal Point, “dot”
76 4C L L < Less-than Sign
77 4D M M ( Left Parenthesis
78 4E N N + Plus Sign
79 4F O O | Logical OR
80 50 P P & Ampersand
81 51 Q Q
82 52 R R
83 53 S S
84 54 T T
85 55 U U
86 56 V V
87 57 W W
88 58 X X
89 59 Y Y
90 5A Z Z ! Exclamation Point
91 5B [ Opening Bracket $ Dollar Sign
92 5C \ Reverse Slant * Asterisk, "star"
93 5D ] Closing Bracket ) Right Parenthesis
94 5E ^ Circumflex, Caret ; Semicolon
95 5F _ Underline, Underscore ¬ Logical NOT
96 60 ` Grave Accent - Hyphen, Minus Sign
97 61 a a / Slash, Virgule
98 62 b b
99 63 c c
100 64 d d
101 65 e e
102 66 f f
103 67 g g
104 68 h h
105 69 i i
106 6A j j
107 6B k k , Comma
108 6C l l % Percent
109 6D m m _ Underline, Underscore
110 6E n n > Greater-than Sign
111 6F o o ? Question Mark
112 70 p p
113 71 q q
114 72 r r
115 73 s s
116 74 t t
117 75 u u
118 76 v v
119 77 w w
120 78 x x
121 79 y y
122 7A z z : Colon
123 7B { Opening Brace # Number Sign, Octothorp, “pound”
124 7C | Vertical Line @ At Sign
125 7D } Closing Brace Apostrophe, Prime
126 7E ~ Tilde = Equal Sign
127 7F DEL Delete Quotation Mark
128 80 Reserved
129 81 Reserved a a
130 82 Reserved b b
131 83 Reserved c c
132 84 IND Index (FE) d d
133 85 NEL Next Line (FE) e e
134 86 SSA Start of Selected Area f f
135 87 ESA End of Selected Area g g
136 88 HTS Horizontal Tabulation Set (FE) h h
137 89 HTJ Horizontal Tabulation with Justification (FE) i i
138 8A VTS Vertical Tabulation Set (FE)
139 8B PLD Partial Line Down (FE)
140 8C PLU Partial Line Up (FE)
141 8D RI Reverse Index (FE)
142 8E SS2 Single Shift Two (1)
143 8F SS3 Single Shift Three (1)
144 90 DCS Device Control String (2)
145 91 PU1 Private Use One j j
146 92 PU2 Private Use Two k k
147 93 STS Set Transmit State l l
148 94 CCH Cancel Character m m
149 95 MW Message Waiting n n
150 96 SPA Start of Protected Area o o
151 97 EPA End of Protected Area p p
152 98 Reserved q q
153 99 Reserved r r
154 9A Reserved
155 9B CSI Control Sequence Introducer (1)
156 9C ST String Terminator (2)
157 9D OSC Operating System Command (2)
158 9E PM Privacy Message (2)
159 9F APC Application Program Command (2)
160 A0
161 A1
162 A2 s s
163 A3 t t
164 A4 u u
165 A5 v v
166 A6 w w
167 A7 x x
168 A8 y y
169 A9 z z
170 AA
171 AB
172 AC
173 AD
174 AE
175 AF
176 B0
177 B1
178 B2
179 B3
180 B4
181 B5
182 B6
183 B7
184 B8
185 B9 ` Grave Accent
186 BA
187 BB
188 BC
189 BD
190 BE
191 BF
192 C0
193 C1 A A
194 C2 B B
195 C3 C C
196 C4 D D
197 C5 E E
198 C6 F F
199 C7 G G
200 C8 H H
201 C9 I I
202 CA
203 CB
204 CC
205 CD
206 CE
207 CF
208 D0
209 D1 J J
210 D2 K K
211 D3 L L
212 D4 M M
213 D5 N N
214 D6 O O
215 D7 P P
216 D8 Q Q
217 D9 R R
218 DA
219 DB
220 DC
221 DD
222 DE
223 DF
224 E0
225 E1
226 E2 S S
227 E3 T T
228 E4 U U
229 E5 V V
230 E6 W W
231 E7 X X
232 E8 Y Y
233 E9 Z Z
234 EA
235 EB
236 EC
237 ED
238 EE
239 EF
240 F0 0 0
241 F1 1 1
242 F2 2 2
243 F3 3 3
244 F4 4 4
245 F5 5 5
246 F6 6 6
247 F7 7 7
248 F8 8 8
249 F9 9 9
250 FA
251 FB
252 FC
253 FD
254 FE
255 FF
NOTES:
(1) Introducer
(2) String Delimiter
(CC) Communication Control
(FE) Format effector
(IS) Information Separator
Fonte: http://www.natural-innovations.com/computing/asciiebcdic.html