NATURAL-ADABAS PASCUAL MARTINEZ CRUZ 0.- Introducción. 1.- Tipos de Datos. 2.- Comentarios. 3.- Declaración de variables. 4.- Asignación de valores a Variables. 5.- Arrays. 6.- Operaciones con arrays. 7.- Objetos de NATURAL. 8.- Operaciones Aritméticas. 9.- Bucles (Tipos). 10.- Instrucciones Condicionales. 11.- Trabajo con Ficheros. 12.- Trabajo con Vistas de Adabas. 13.- Subrutinas. 14.- Llamadas a rutinas. 15.- Edicion y compilación en entorno Mainframe. PASCUAL MARTINEZ CRUZ 26-11-2007 [email protected] 0.- INTRODUCCIÓN: El presente documento pretende ser una resumida guía de referencia introductoria para para programadores que trabajen por primera vez con Natural Adabas en entorno Mainframe. Adabas es una base de datos diseñada por Software AG para sistemas críticos y Natural el lenguaje de programación para operar con esta base de datos. Es conveniente tener un manual de referencia sobre Natural para poder sacar más partido de este lenguaje de programación. 1.- TIPOS DE DATOS: A Alfanumérico. B Binario. C Atributo de Control. D Fecha. F Punto Flotante. I Entero. L Lógico. N Numérico. P Numérico Empaquetado. T Hora. 2.- COMENTARIOS: Se comenta código con * y /* * Comentario para una línea entera. MOVE 2 TO A /* Comentario para el resto de línea 3.- DECLARACION DE VARIABLES: Todos los programas NATURAL empiezan con un bloque de declaración de variables. Las variables se encierran en este tipo de bloque: DEFINE DATA PARAMETER 1 Area-de-parametros. LOCAL 01 Variable 1 (A3) 01 Vvar REDEFINES Variable 1 02 S-var (A1) 02 SS-var (A2) END-DEFINE En PARAMETER se incluyen las áreas de datos que sirven como comunicación de entrada y salida entre los distintos objetos NATURAL. En LOCAL se declaran las variables,o vistas de ADABAS que se vayan a usar localmente en el programa.Podemos encontrarnos con la instrucción: PARAMETER USING Area_de_parametros. Esta instrucción declara Area_de_parametros como el area de comunicación de E/S entre los distintos objetos de NATURAL. LOCAL USING Area_de_parametros. Esta instrucción hace que Area de parámetros sea usada localmente en una llamada a cierto subprograma. Las variables van precedidas de un número que corresponde con el nivel de declaración al que pertenecen. Se empieza por nivel 1 o 01, los niveles 02,03 …(sucesion secuencial) etc nos indican que esas variables son subdivisiones de la variable que esta declarada un nivel inmediatamente superior. 4.- ASIGNACION DE VALORES A VARIABLES: La asignación se realiza mediante las instrucciones MOVE,ASSING o el operador := Ejemplos: MOVE 5 TO VALOR VAR1 := VAR2 (VAR1 pasa a valer lo que contiene VAR2) ASSING VALOR = 5 ASSING ROUNDED VALOR = 199.999 (Redondea el valor asignado). 5.- ARRAYS: DEFINICIONES *ARRAY(3) Define una matriz de una dimensión de 3 ocurrencias. ETIQUETA.FIELD(A 20/5) Define una matriz de un campo de la base de datos referenciada en la sentencia marcada por ‘ETIQUETA’, con formato alfanumérico, longitud 20 y 5 ocurrencias. * ARRAY(N7.2/1:5,10.12,1:4) Define una matriz con formato N7.2, de 3 dimensiones con 5 ocurrencias en la primera dimensión ,12 en la segunda y 4 en la tercera. 6.- OPERACIONES CON ARRAYS: REFERENCIA A LOS ELEMENTOS DEL ARRAY. *ARRAY(1) Referencia la primera ocurrencia de una matriz de una dimensión. *ARRAY(7:12) Referencia las ocurrencias de 7 a 12 en una matriz de una dimensión. *ARRAY(I+5) Referencia la ocurrencia I+5 de una matriz de una dimensión. *ARRAY(5,3:7,1:4) La referencia se realiza en una matriz de 3 dimensiones , a la ocurrencia 5 de la primera dimensión ,las ocurrencias de 3 a la 7 en la segunda dimensión, y las ocurrencias 1 a 4 de la tercera. *ARRAY(*) Todas las ocurrencias de una dimensión. 7.- OBJETOS DE NATURAL: PROGRAMA: Programa Natural. SUBPROGRAMA: Similar a una librería, los subprogramas son utilizados por programas Natural. SUBRUTINA: Porción de código Natural donde el bloque del programa es solo una subrutina. HELPRUTINA: Subrutina para mostrar cuadros de ayuda en una aplicación Natural. COPYCODE: Porción de código que se puede incluir en un programa Natural (similar a una macro),suele contener código para un tratamiento general de errores. TEXTO: Documentos de texto para describir programas,útil si carecemos del diccionario Predict. MAPA: Estructura de código Natural para crear interfaces de aplicación. AREA GLOBAL DE DATOS: Fuente donde se declaran variables para usarlas de forma global en una aplicación Natural. AREA LOCAL DE DATOS: Fuente donde se declaran variables para usarlas de forma local en un modulo de una aplicación Natural. AREA DE PARAMETROS: Fuente donde se declaran variables o vistas para pasarlas como parámetros a subprogramas,subrutinas externas etc. CLASE: Las clases son unos objetos que se usan en conjunto con NaturalX para crear componentes basados en aplicaciones cliente/servidor. DIALOGO: Los diálogos son objetos que se usan en conjunto con programación orientada a eventos para crear aplicaciones en entorno gráfico. 8.- OPERACIONES ARITMETICAS: SUMA: ADD 3 TO B ADD 4 5 GIVING B /* B vale 3 */ /* B vale 9 */ COMPUTE RES = NUM1 + NUM2 RESTA: SUBTRAC 4 FROM B /* Resta 4 a B*/ SUBTRAC 6 FROM 11 GIVING B /* Resta 6 a 11 y lo guarda en B */ COMPUTE RES = NUM1 - NUM2 MULTIPLICACION: A=3 MULTIPLY A BY 3 MULTIPLY A BY 3 GIVING B /* A vale 9 */ /* B vale 9 */ COMPUTE RES = NUM1 * NUM2 DIVISION: DIVIDE divisor INTO dividendo A = 20 DIVIDE 5 INTO A DIVIDE 5 INTO A GIVING B DIVIDE 5 INTO 31 REMAINDER C /* A vale 4 */ /* B vale 4 */ /* C vale 1 (resto de la división) */ COMPUTE RES = NUM2 / NUM1 /* RES vale la división entera 9.- BUCLES (TIPOS): Bucle FOR. #indice se refiere a la variable de control del bucle. Lo que sigue al TO es el número de iteraciones del bucle. STEP número , marca el incremento de la variable de control. FOR #indice 1 TO 5 Sentencias END-FOR FOR #indice 1 TO 5 STEP 2 Sentencias END-FOR Bucle REPEAT. Bucle sin condición de salida.Se sale cuando se encuentra una instrucción ESCAPE,STOP o TERMINATE. REPEAT Sentencias ESCAPE,STOP,TERMINATE /* Estas instrucciones se usan para romper el flujo de ejecución del bucle */ END-REPEAT Bucle con condición de salida.Se sale del bucle cuando la condición de while sea falsa. REPEAT WHILE #R <=8 Sentencias END-REPEAT Bucle con condición de salida.Se sale del bucle cuando la condición de UNTIL sea verdadera. REPEAT UNTIL #R <= 8 Sentencias END-REPEAT 10.- INSTRUCCIONES CONDICIONALES: Sentencia IF IF condición THEN IGNORE sentencias ELSE sentencias END-IF Sentencia DECIDE FOR FIRST/EVERY ,indica si se procesa solamente la primera condición que se cumpla o cada una de las condiciones que se cumplan.Se pone solo una no ambas. DECIDE FOR { FIRST } CONDITION { EVERY } {WHEN condición lógica sentencias} {WHEN ANY condición lógica sentencias} {WHEN ALL condición lógica sentencias} WHEN NONE {IGNORE} {sentencias} END-DECIDE Sentencia DECIDE ON FIRST/EVERY ,indica si se procesa solamente la primera condición que se cumpla o cada una de las condiciones que se cumplan.Se pone solo una pero no ambas. DECIDE ON {FIRST} VALUE OF operando1 {EVERY} {VALUE operando2} {ANY VALUE sentencias} {ALL VALUE sentencias} NONE VALUE {IGNORE} Sentencias END-DECIDE 11.- TRABAJO CON FICHEROS: READ WORK FILE Lee datos de un fichero secuencial físico. READ WORK [FILE] número de work-file [ONCE] {RECORD {operando 1 [ FILLER nX}]}…} {[AND][SELECT] {[{OFFSET n}] operando 2}…} {[AND][SELECT] {[{FILLER nX}] operando 2}…} END-READ WRITE WORK FILE Graba registros dea un fichero secuencial físico. WRITE WORK [FILE] número de work-file [VARIABLE] operando 1 NEWPAGE Avanza una nueva página NEWPAGE [(rep)] [{EVEN [IF][TOP][OF][PAGE]}] [{[{IF}] [LESS][THAN] operando 1[LINES][LEFT]}] [{[{WHEN}] [LESS][THAN] operando 1[LINES][LEFT]}] [[WITH] TITLE] PROCESS Permite leer y escribir ficheros , gestionar VTOC y catalogos,colas JES etc. PROCESS nombre de vista USING operando 1 = operando 2 GIVING operando 3 12.- TRABAJO CON VISTAS DE ADABAS: DELETE DELETE [RECORD] [IN] [STATEMENT] [(r)] Borra un registro de la base de datos. FIND FIND [{ALL}] [RECORDS][IN][FILE] Nombre de view [{operando 1}] [RECORDS][IN][FILE] Nombre de view [{FIRST}] [RECORDS][IN][FILE] Nombre de view [{NUMBER}] [RECORDS][IN][FILE] Nombre de view [{UNIQUE}] [RECORDS][IN][FILE] Nombre de view [PASSWORD-claúsula] [CIPHER-claúsula] WITH-claúsula [COUPLED-claúsula] [SORTED BY-claúsula] [RETAIN-claúsula] [WHERE-claúsula] [IF NO RECORDS FOUND-claúsula] Sentencias Selecciona una serie de registros desde la Base de Datos. GET GET [IN][FILE] nombre de vista [PASSWORD = operando 1] [CIPHER = operando 2] [RECORD] {operando 3, *ISN} operando 4 …. Lee un registro con un ISN (Número de Secuencia Interna) GET SAME GET SAME [(r)] operando 1 Se utiliza para volver a leer el registro que esta siendo procesado actualmente. GET TRANSACTION DATA GET TRANSACTION DATA operando 1 …. Se utiliza para leer los datos salvados con una sentencia END OF TRANSACTION anterior. HISTOGRAM HISTOGRAM [{operando 1}] [VALUE] [IN] [FILE] Nombre de view [PASSWORD = operando 2] [VALUE][FOR][FIELD]operando 3 [STARTING : ENDING - claúsula] [WHERE-claúsula] Sentencias END-HISTOGRAM Leer los valores de campos de la base de datos definidos como descriptor,subdescriptor o superdescriptor. END TRANSACTION END TRANSACTION [operando 1 …] Indica el final de una transacción lógica. OBTAIN OBTAIN operando 1 …. Se utiliza para hacer disponible un rango de ocurrencias de una matriz de la base de datos en almacenamiento continuo. READ {READ} {BROWSE} [(operando 1)] [RECORDS][IN][FILE] Nombre de view [PASSWORD = operando 2] [CIPHER = operando 3] [Especificación secuencia rango] [WHERE - claúsula] Sentencias …. END-READ Se utiliza para leer registros de la base de datos. STORE STORE [RECORD][IN][FILE] Nombre de view [PASSWORD = operando 1] [CIPHER = operando 1] [[{USING}] NUMBER operando 3][(r)] [[{GIVING}] NUMBER operando 3][(r)] {[USING] SAME [RECORD][AS][STATEMENT][(r)]} {[{SET,WITH}]{operando 4 = operando 5}…} Se utiliza para añadir un registro a la base de datos. UPDATE UPDATE [RECORD] [IN] [STATEMENT] [(r)] Se utiliza para actualizar uno o mas campos de un registro de la base de datos. 13.- SUBRUTINAS: Para crear una subrutina dentro de nuestro programa escribimos el código de nuestra subrutina procedemos así: DEFINE SUBROUTINE NOMBRE_DE_LA_SUBRUTINA /* Código de nuestra subrutina */ END-SUBROUTINE Para crear una subrutina externa: Creamos primero un objeto Natural de tipo subrutina,dentro de este objeto definimos en DATA PARAMETER las variables que usara la subrutina, y después el código de la subrutina. DEFINE DATA PARAMETER /* Variables */ END-DEFINE DEFINE SUBROUTINE NOMBRE_DE_LA_SUBRUTINA /* Código de nuestra subrutina */ END-SUBROUTINE END 14.- LLAMADAS A RUTINAS: CALL ‘RUTINA’ #PARAMETRO1 #PARAMETRO2 /* Rutina esta en un lenguaje /* distinto de NATURAL CALLNAT ‘RUTINA’ #PARAMETRO1 #PARAMETRO2 /* Rutina esta escrito /* en NATURAL /* CALL FILE Se usa para llamar a programas que ha escrito el Usuario y acceden a un fichero de datos que no es de ADABAS */ CALL FILE ‘RUTINA’ #PARAMETRO1 #PARAMETRO2 Sentencias END-FILE PERFORM SUBRUTINA [AREA_DE_PARAMETROS] /* subrutina externa PERFORM SUBRUTINA /* Subrutina interna 15.- EDICIÓN Y COMPILACIÓN EN ENTORNO MAINFRAME: COMANDOS DE EDICION: Los siguientes comandos deben ejecutarse en el área de edición del editor. .I Inserta una línea. .In Inserta n líneas. .C Copia una línea. .X Marca el principio de selección de un bloque de lineas. .Y Marca el final de la selección de un bloque de líneas. .CX-Y Copia un bloque de líneas. .D Elimina una línea. .DX-Y Borra la selección de líneas. Tecla Fin Borra una línea. .L Deja la línea como estaba anteriormente. COMANDOS DEL EDITOR: Los siguientes comandos deben ejecutarse en el área de comando del editor. RESET Quita la selección de líneas. SCAN Busca texto. SA Salva el programa. SA Nombre Salva el programa con el nombre Nombre. STRUCT Sangra el código fuente. COMANDOS DE COMPILACION Y EJECUCION: C Chequea la sintaxis. STOW Compila el programa. RUN Ejecuta el programa.