Está en la página 1de 60

Introducción

Base de Datos

Base de Datos: es una colección de información interrelacionada así como un conjunto de


programas para tener acceso a dicho datos, usada para las aplicaciones de una organización.
El objetivo de una base de datos es proporcionar un entorno que sea conveniente y eficiente
para extraer y almacenar información.

Algunos de los problemas que se presentan cuando no se utiliza una base de datos son:

• Redundancia e inconsistencia de los datos: Debido a que los archivos de


programas de aplicaciones son creados por diferentes personas a través del tiempo,
puede ocurrir que los archivos tengan diferente formato o se encuentren duplicados,
de la misma manera puede ocurrir que los programas para acceder a la información
se encuentre en más de un sitio.
• Desarrollos de múltiples aplicaciones para la recuperación de la información:
Un sistema de información basado en Base de datos pretende desarrollar
aplicaciones de uso general para la recuperación de la información, tratando de
establecer estándares tanto en las aplicaciones como en la forma de almacenar los
datos.
• Proliferación de archivos: Pretende aislar los datos de las aplicaciones para un
mejor control de tal manera que no se tenga que modificar la estructura de la Base
de datos cuando se desarrolle una nueva aplicación.
• Evitar el acceso simultaneo de los usuarios a la misma información: Control de
acceso a la información ara evitar su inconsistencia, permitiendo que solamente un
usuario tenga acceso a los datos y colocando candados hasta que estos sean
liberados.
• Problemas de seguridad: Implantar las restricciones de seguridad para tener acceso
a los datos.
• Problemas de integridad: Colocar restricciones de consistencia de datos.

Sistema de información: Conjunto de elementos interrelacionados que tiene como fin


suministrar a los usuarios la información requerida para la toma de decisiones.

Sistema administrador de Base de datos(Data Base Manager System): Es un


conjunto de herramientas integrado que proporciona el entorno para un eficiente
almacenamiento y recuperación de la información.

Abstracción de los datos

Un objetivo importante en un sistema de Base de datos es proporcionar a los


usuarios una visión abstracta de los datos; el sistema esconde ciertos detalles de cómo se
almacenan y mantiene los datos.
• Nivel físico: En este nivel se describe como están los datos realmente almacenados,
se describen en detalle las estructuras de datos complejas.
• Nivel conceptual: En este nivel se describe que datos son almacenados realmente y
las relaciones que existen entre ellos. Este nivel lo emplean los administradores de
la Base de datos ya que ellos deben decidir que información es la que se almacena.
• Nivel de visión: Este nivel es empleado por los usuarios ya que ellos solamente
necesitan ver los datos con los que va a trabajar.

MODELO DE DATOS

El modelo de datos es un conjunto de herramientas conceptuales para describir datos, las


relaciones entre ellos, la semántica asociada entre ellos y las restricciones de consistencia.

Modelos lógicos basado en objetos: Se usan para describir a los datos en los niveles de
conceptual y de visión entre los mas conocidos se encuentran:
• Modelo Entidad-Relación.
• Modelo Orientado a Objetos.
• Modelo Binario.
• Modelo Semántico de Datos.
• Modelo Infológico.
• Modelo Funcional de datos.

Modelo Entidad-Relación
Se basa en una percepción del mundo real que consiste en un conjunto de objetos
básicos llamados entidades y las relaciones entre ellos.
Entidades
Son objetos fundamentales del mundo real acerca de los cuales se almacena
información. Estos objetos pueden ser distinguibles mediante sus características llamadas
atributos que los hacen únicos. Se clasifican en dos grupos:
1. Entidades fuertes: Tienen identificadores que determinan de una manera única a las
ocurrencias de las entidades. Por lo tanto se puede afirmar que tienen existencia de
otras entidades.
2. Entidades débiles: Su existencia depende de los atributos de una o más entidades
“padres” por lo tanto su existencia está limitada por la existencia de las entidades
padre.
Atributos: Son las características que poseen las entidades mediante las cuales se pueden
describir y que tomadas todas en conjunto hacen que dicha entidad sea única.
Relación: Es la asociación entre las entidades. La relación puede ser Simple o Compleja.
• Simple: Es cuando existe una relación de uno a uno.
• Compleja: Es cuando existe una relación de 1:M, M:1, M:M.

Diagrama Entidad-Relación
Es la representación gráfica lógica global de una base de datos, puede representarse
gráficamente por medio de un diagrama de E-R que consta de los siguientes componentes:
Entidades :

Entidad Fuerte Entidad Débil

Atributo
Atributo Compuesto

Relación de 1:1 Relación de 1:M

Relación de M:1 Relación M:M

Reglas de interrelación de tablas:

Relación 1:1

La llave primaria de una de las dos tablas o entidad pasa a la siguiente tabla o
entidad.
Relación 1:M, M:1

La llave primaria de la tabla que tiene la relación número 1 pasa como llave foránea
a la tabla de relación de muchos.

Relación M:M

Se formara una nueva tabla que contenga las llaves primarias de ambas tablas o
entidades y estas formaran una llave primaria en la nueva tabla, separadamente serán llaves
foráneas.
Proceso de normalización

• El proceso de normalización es un estándar que consiste, básicamente, en un


proceso de conversión de las relaciones entre las entidades.

Tomando como referencia la tabla siguiente:

AUTORES Y LIBROS
NOMBRE NACION CODLIBRO TITULO EDITOR
Date USA 999 IBD AW
Ad.Mig. ESP 888 CyD RM
Ma.Piat. ITA 777 CyD RM
Date USA 666 BdD AW

Se plantean una serie de problemas:

• Redundancia: cuando un autor tiene varios libros, se repite la nacionalidad.


• Anomalías de modificación: Si Ad.Mig. y Ma.Piat. desean cambiar de editor, se
modifica en los 2 lugares. A priori no podemos saber cuántos autores tiene un libro.
Los errores son frecuentes al olvidar la modificación de un autor. Se pretende
modificar en un sólo sitio.
• Anomalías de inserción: Se desea dar de alta un autor sin libros, en un principio.
NOMBRE y CODLIBRO son campos clave, una clave no puede tomar valores
nulos.

Asegurando:

• Integridad entre los datos: consistencia de la información.

El proceso de normalización nos conduce hasta el modelo físico de datos y consta de varias
fases denominadas formas normales, estas formas se detallan a continuación.

Definición de la clave

Antes de proceder a la normalización de la tabla lo primero que debemos de definir es una


clave, esta clave deberá contener un valor único para cada registro (no podrán existir dos
valores iguales en toda la tabla) y podrá estar formado por un único campo o por un grupo
de campos.

En la tabla de alumnos de un centro de estudios no podemos definir como campo clave el


nombre del alumno ya que pueden existir varios alumnos con el mismo nombre. Podríamos
considerar la posibilidad de definir como clave los campos nombre y apellidos, pero
estamos en la misma situación: podría darse el caso de alumnos que tuvieran los mismo
apellidos y el mismo nombre (Juan Fernández Martín).

La solución en este caso es asignar un código de alumno a cada uno, un número que
identifique al alumno y que estemos seguros que es único.

Una vez definida la clave podremos pasar a estudiar la primera forma normal.

Primera forma normal (1NF)

Se dice que una tabla se encuentra en primera forma normal (1NF) si y solo si cada uno de
los campos contiene un único valor para un registro determinado. Supongamos que
deseamos realizar una tabla para guardar los cursos que están realizando los alumnos de un
determinado centro de estudios, podríamos considerar el siguiente diseño:

Código Nombre Cursos


1 Marcos Inglés
2 Lucas Contabilidad, Informática
3 Marta Inglés, Contabilidad

Podemos observar que el registro de código 1 si cumple la primera forma normal, cada
campo del registro contiene un único dato, pero no ocurre así con los registros 2 y 3 ya que
en el campo cursos contiene más de un dato cada uno. La solución en este caso es crear dos
tablas del siguiente modo:

Tabla A
Código Nombre
1 Marcos
2 Lucas
3 Marta

Tabla B
Código Curso
1 Inglés
2 Contabilidad
2 Informática
3 Inglés
3 Informática

Como se puede comprobar ahora todos los registros de ambas tablas contienen valores
únicos en sus campos, por lo tanto ambas tablas cumplen la primera forma normal.
Una vez normalizada la tabla en 1NF, podemos pasar a la segunda forma normal.

Segunda forma normal (2NF)

La segunda forma normal compara todos y cada uno de los campos de la tabla con la clave
definida. Si todos los campos dependen directamente de la clave se dice que la tabla está es
segunda forma normal (2NF).

Supongamos que construimos una tabla con los años que cada empleado ha estado
trabajando en cada departamento de una empresa:

Código Empleado Código Dpto. Nombre Departamento Años


1 6 Juan Contabilidad 6
2 3 Pedro Sistemas 3
3 2 Sonia I+D 1
4 3 Verónica Sistemas 10
2 6 Pedro Contabilidad 5

Tomando como punto de partida que la clave de esta tabla está formada por los campos
código de empleado y código de departamento, podemos decir que la tabla se encuentra en
primera forma normal, por tanto vamos a estudiar la segunda:

1. El campo nombre no depende funcionalmente de toda la clave, sólo depende del


código del empleado.
2. El campo departamento no depende funcionalmente de toda la clave, sólo del
código del departamento.
3. El campo años si que depende funcionalmente de la clave ya que depende del
código del empleado y del código del departamento (representa el número de años
que cada empleado ha trabajado en cada departamento)

Por tanto, al no depender todos los campos de la totalidad de la clave la tabla no está en
segunda forma normal, la solución es la siguiente:

Tabla A
Código Empleado Nombre
1 Juan
2 Pedro
3 Sonia
4 Verónica
Tabla B
Código Departamento Dpto.
2 I+D
3 Sistemas
6 Contabilidad

Tabla C
Código Empleado Código Departamento Años
1 6 6
2 3 3
3 2 1
4 3 10
2 6 5

Podemos observar que ahora si se encuentras las tres tabla en segunda forma normal,
considerando que la tabla A tiene como índice el campo Código Empleado, la tabla B
Código Departamento y la tabla C una clave compuesta por los campos Código Empleado y
Código Departamento.

Tercera forma normal (3NF)

Se dice que una tabla está en tercera forma normal si y solo si los campos de la tabla
dependen únicamente de la clave, dicho en otras palabras los campos de las tablas no
dependen unos de otros. Tomando como referencia el ejemplo anterior, supongamos que
cada alumno sólo puede realizar un único curso a la vez y que deseamos guardar en que
aula se imparte el curso. A voz de pronto podemos plantear la siguiente estructura:

Código Nombre Curso Aula


1 Marcos Informática Aula A
2 Lucas Inglés Aula B
3 Marta Contabilidad Aula C

Estudiemos la dependencia de cada campo con respecto a la clave código:

• Nombre depende directamente del código del alumno.


• Curso depende de igual modo del código del alumno.
• El aula, aunque en parte también depende del alumno, está mas ligado al curso que
el alumno está realizando.
Por esta última razón se dice que la tabla no está en 3NF. La solución sería la siguiente:

Tabla A
Código Nombre Curso
1 Marcos Informática
2 Lucas Inglés
3 Marta Contabilidad

Tabla B
Curso Aula
Informática Aula A
Inglés Aula B
Contabilidad Aula C

Una vez conseguida la segunda forma normal, se puede estudiar la cuarta forma normal.

Cuarta forma normal (4NF)

Una tabla está en cuarta forma normal si y sólo si para cualquier combinación clave -
campo no existen valores duplicados. Veámoslo con un ejemplo:

Geometría
Figura Color Tamaño
Cuadrado Rojo Grande
Cuadrado Azul Grande
Cuadrado Azul Mediano
Círculo Blanco Mediano
Círculo Azul Pequeño
Círculo Azul Mediano

Comparemos ahora la clave (Figura) con el atributo Tamaño, podemos observar que
Cuadrado Grande está repetido; igual pasa con Círculo Azul, entre otras. Estas repeticiones
son las que se deben evitar para tener una tabla en 4NF.
La solución en este caso sería la siguiente:

Tamaño
Figura Tamaño
Cuadrado Grande
Cuadrado Pequeño
Círculo Mediano
Círculo Pequeño

Color
Figura Color
Cuadrado Rojo
Cuadrado Azul
Círculo Blanco
Círculo Azul

Ahora si tenemos nuestra base de datos en 4NF.

Otras formas normales

Existen otras dos formas normales, la llamada quinta forma normal (5FN) que no detallo
por su dudoso valor práctico ya que conduce a una gran división de tablas y la forma
normal dominio / clave (FNDLL) de la que no existe método alguno para su implantación.
Introducción al Progress

Qué es progress?

Progress: es un sistema administrador de base de datos relacionales.

Aplicaciones:

• Data Dictionary

• Procedure Editor

• Data Administration

• Application Compiler

• Pro tools

• AppBuilder

• Report Builder

Data Dictionary

-Creación y manipulación de las estructuras de la base de datos.


-Permite administrar la conexión a la base de datos.

Procedure Editor

Es un editor de texto con el cual se escribe el código del procedimiento, se corrige la


sintaxis, se compilan y se corren los programas.

Data Administration

Esta herramienta permite ejecutar diferentes tareas relacionadas con la administración de


datos tales como:
o Crear, conectar y desconectar base de datos.
o Descargar, cargar y exportar las definiciones de datos.
o Establecer la seguridad de la base de datos
o Así como proveer acceso a las utilerías del servidor de datos cuando esta en uso.

Application Compiler

-Permite compilar uno o varios programas asociados con una aplicación en un simple paso.
Pro tools

-Ejecuta un grupo de utilerías para auxiliar en el desarrollo y ejecución de aplicaciones en


progress

AppBuilder

-Facilita la creación de objetos de interfase con el usuario.


-Genera y administra el código involucrado con la interfase desarrollada.

Report Builder

Se usa para definir reportes del usuarios. Permite incorporar reportes predefinidos en una
aplicación.

Archivos de Progress

Cuando se esta trabajando con progress, este automáticamente genera diferentes clases de
archivos:

• Archivos de base de datos(Database file): Estos archivos tienen como extensión


.db y es el archivo principal de la Base de datos, en estos archivos se almacenan los
datos así como se esquema.
• Archivo de bitácora de eventos(Event log file) : Estos archivos tienen como
extensión .lg y contiene la historia de eventos cruciales tales como el inicio o
desconexión de una base de datos.
• Archivos de imagen anterior(Before-image file): Estos archivos tienen como
extensión .bi o .bn; es en estos archivos donde se mantiene una copia de los datos
antes de que los usuarios realicen algún cambio.
• Archivo de imagen posterior(after-image file) : Estos archivos tienen como
extensión .al o .an; es en estos archivos donde se mantiene los cambios desde la
ultima vez que se hizo un back-up para permitir al administrador reconstruir la base
de datos si se cae el sistema.
• Archivos candado(lock file) : Estos archivos tiene como extensión .lk y se
generan cuando algún usuario se encuentra haciendo uso de las bases de datos. Este
tipo de candado impide que otro usuario use una base de datos que se encuentra
actualmente en uso. Esto garantiza la integridad de la base de datos.

Archivos Temporales de Progress

• Archivos de imagen anterior local(local Before-image file): Estos archivos tienen


como extensión .lbi y contienen el calor de variables y datos temporales.
• Tablas temporales(Temporary Tables): Estos archivos tienen como extensión
.dbi son tablas creadas exclusivamente para la sesión y no se almacenan
permanentemente en la base de datos.
• Tablas ordenadas(Sort tables): Tiene como extensión .srt y son tablas ordenadas.
• Tablas trap(Trap Tables): Tienen como extensión .trp y contiene los cambios que
se hacen en el diccionario de datos y permanecen hasta que éstos se comprometen y
se guarda la base de datos.

Archivo de Programas

Progress genera 3 tipos de archivos de programa dependiendo del trabajo que se esté
desarrollando:

• Archivos de programa(.p) (program files): Pueden contener ya sea el


procedimiento principal o procedimientos externos que son llamados desde el
procedimiento principal. Estos archivos se crean con el editor de procedimientos y
se debe agregar al nombre la extensión .p.
• Archivos de programa(.w) (program files): Contienen elementos de la interfase
de usuario.Estos se generan cuando se usa el App Builder para crear la ventana
principal del programa.
• Archivos include(.i) (Include files): Son archivos que pueden ser incluidos en el
procedimiento durante la compilación.

Procedimientos

Cuando se ejecuta un procedimiento de PROGRESS desde el editor o desde la App builder


este procedimiento se compila en la memoria y cuando termina la ejecución, la versión
compilada del procedimiento es eliminada. Cuando se corre un procedimiento usando el
estatuto RUN, (Corriéndolo desde otro procedimiento), PROGRESS crea un archivo objeto
temporal al que se llama Versión Compilada de Sesión (Session Compiled Versión [SCV]).

Se pueden crear archivos de procedimientos compilados permanentemente (archivos con


extensión .r) usando el estatuto COMPILE o desde el menú OPTIONS. Un mismo archivo
que ha sido compilado permanentemente (archivo con extensión .r) se ejecuta mas
rápidamente que no compilado (archivo con extensión .p o .w) esto se debe a que se ahorra
el tiempo de compilación.

Procedimientos externos e internos

El uso de procedimientos permite desarrollar aplicaciones en forma modular y por lo tanto


el código puede ser múltiples veces. Un procedimiento puede llamar a otros procedimientos
y de hecho puede llamarse a si mismo para una crear recursión.

Un procedimiento es llamado en tiempo de ejecución. Esto significa que los valores de las
variables y expresiones, así como las referencias a los registros de la base de datos se
evalúan cuando el programa corre. Después de ejecutar un procedimiento, PROGRESS
ejecuta el siguiente estatuto después de la llamada del procedimiento.

Procedimiento Externo: Es un procedimiento almacenado como archivo independiente


que puede ser llamado fácilmente como procedimiento interno de otro procedimiento.
Cuando el código de un procedimiento es relativamente largo, o pudiera ser usado por otros
procedimientos, es conveniente dividir el código en partes y guardarlas en diferentes
archivos. Un procedimiento externo se puede llamar desde otro procedimiento con el
estatuto RUN.

Procedimiento interno: Es una forma conveniente de incluir un procedimiento en otros


para hacerlos mas cortos. Se puede colocar en el mismo procedimiento principal.

En las siguientes tabla se hace una comparación entre estos dos tipos de procedimientos:

Procedimiento interno Procedimiento Externo


Reutilizables Múltiples veces dentro del Desde el procedimiento
procedimiento principal. principal así como desde
otros procedimientos
externos.
Longitud del código Relativamente corto Cualquier longitud
Alcance Tiene acceso a todas las No comparte variables ni
variables y objetos definidos objetos con el procedimiento
en el procedimiento principal principal a menos que se
definan como compartidas
(SHARED)
Funcionamiento Cargado en la memoria Necesita ser cargado en la
memoria.

Archivos Include

Son procedimientos que fueron almacenados separadamente en un archivo con extensión .i,
estos archivos pueden ser usados por otros procedimientos.

Cuando se hace referencia a ese tipo de archivos desde un procedimiento, PROGRESS


coloca en la línea actual el código del archivo include. Esto ocurre cuando se compila el
procedimiento. Tiene el mismo efecto que si se escribieran las líneas del código en todos
los lugares en donde se haya colocado en archivos include y luego se compila, solamente
que lo hace PROGRESS.

Si se hace referencia a un archivo include muchas veces en un procedimiento, el código se


incluye (se expande) tantas veces como se haga referencia a él, por lo tanto el resultado es
un muy largo código objeto.

El código de procedimiento interno existe una sola vez en el archivo de procedimiento, aún
cuando sea llamado muchas veces.
El modelo de PROGRESS para el movimiento de datos entre la Base de datos y el
usuario.

Para que el usuario final tenga acceso a la base de datos, los datos se deben mover entre la
base de datos y la IU (interfase usuario). Para permitir esto, se deben usar los estatutos de
movimientos de datos de PROGRESS. Parte de este código es creado en la sección de
AppBuilder cuando se define la interfase de usuario. Por ejemplo, cuando se agregan
campos de base de datos a una ventana, el AppBuilder crea el código necesario para extraer
los datos y desplegarlos en la pantalla en el formato que se haya especificado.

Cuando se mueven datos entre la Base de datos y la interfase de usuario. PROGRESS


utiliza las buffers de memoria: El buffer de registro y el buffer de pantalla. Los estatutos de
PROGRESS mueven los datos entre la base de datos, el buffer de registro, el buffer de
pantalla y cualquier dispositivo de entrada / salida que use el usuario.

Buffer de registro

Un buffer de registro contiene solamente campos de un registro de una tabla de una Base de
datos. Esto es equivalente a un renglón de la tabla.

Debido a que un buffer de registro contiene un solo registro de una sola tabla de la Base de
datos, si se accesa más de una tabla de la Base de datos, cada una de ellas tendrá su propio
buffer de registros y cada buffer de registro contendrá solamente un registro o renglón de
esa tabla a la vez.

Buffer de pantalla

El buffer de pantalla es una abstracción par almacenar los datos de todos los dispositivos de
entrada / salida. Esto no indica que se representan los datos únicamente en la pantalla,
aunque en la mayoría de los casos este sea el dispositivo de entrada / salida más usado. Por
lo tanto, el buffer de pantalla se usa para indicar entrada o salida desde: la pantalla. CRT o
cualquier otro monitor; la impresora o plotter el usuario, incluyendo el teclado, el mouse o
cualquier otro dispositivo de entrada.

Diccionario de Datos

Es una herramienta iterativa basada en ventanas con la que se puede crear, modificar y
eliminar base de datos de PROGRESS, también se pueden generar reportes del esquema de
la base de datos.
Creación de Base de Datos

1.- Creación de una Base de Datos en Progress:


• Seleccionar desde el Desktop el menú File.
• En el menú File seleccionar la opción New.
• Dentro de la opción New se selecciona la opción Database.
La pantalla que aparecerá es Create Database :
• Proporcione el nombre físico de la nueva base de datos e indique que se creará a
partir de EMPTY.
• Dar OK.

• Automáticamente aparecerá la pantalla de conexión de base de datos.

NOTA:
Para Conectarse a una base de datos en Progress:

• Seleccionar desde el menú de File y la opción OPEN, después Database. se busca la


base de datos realizada por tí.
• También para conectar la Tecla F3.

Para Desconectarse de una Base de Datos en Progress:

• En la Aplicación de Data Dictionary.


• Se selecciona la opción de database
• Después elegir la opción de Disconnect.
• También para desconectar la Tecla F8.

El Metaesquema

• Es un conjunto de tablas relacionadas, la cual nos indica la descripción de la


estructura de una base de datos.
• Contiene la definición para describir los componentes de una base de datos, tales
como tablas, campos, índices entre otros.
• También contiene elementos y mensajes de validación.
• Es el corazón de la base de datos en PROGRESS.
• Al momento de crear una base de datos “EMPTY” , se tiene toda la información
básica necesaria para crear el esquema de una aplicación.

Definición de una base de datos

• Nombre de Tablas, Campos e Índices:


o Máximo de 32 caracteres de largo.
o Debe de comenzar por un carácter alfabético (A-Z, o a-z).
Caracteres alfabéticos (A-Z o a-z).
Dígitos (0-9).
Caracteres especiales($,&,%,-).
o Es insensitivo al uso de mayúsculas.

Tablas
Las tablas definen a las entidades que componen el diseño de Base de datos relacional.

*En el diccionario de datos es posible definirle las siguientes características:


Table Name
Etiqueta
Descripción
Nombre para “DUMP”.
TRIGGERS y Atributos de traducción.
Validación de borrado.
Hidden
Frozen
String Attrs.
Data server
Check CRC
Overdrable

Propiedades de los archivos:

• Hidden: Oculta un archivo para evitar que sea desplegado en la lista de archivos del
diccionario de datos.
• Frozen: Evita que las definiciones de campos e índices sean modificadas. No
incluyen los registros de datos.
• La opción de String Attrs, se utiliza para definir los atributos de las etiquetas de un
archivo que va a ser traducido por el Traslation Manager.
• Validaciones: Establece una expresión que si al ser evaluada, resulta falsa, evita
que el archivo sea eliminado.
• Triggers: Es un código 4GL que se ejecuta como resultado de un evento de base de
datos, como:
borrar y crear archivos.
Ejemplo: Trigger Procedure for Create of articulo

******Dentro de los Triggers se manejan las siguientes opciones:

• Check CRC: Proceso de validación que verifica la integridad de la base de


datos para poder ejecutar un trigger.
• Overdrable: Permite que un trigger sea o no modificado.

Campos

Los campos son los atributos de las tablas. En el diccionario de datos es posible
definirles, entre otras, las siguientes características:

Crear campos:

Nombre
Tipo de dato
Formato de captura
Etiqueta
Etiqueta para desplegado
Valor inicial
Orden del campo
Descripción
Ayuda
Mandatory
Case Sensitive
Extent
Propiedades de los campos:

• Carácter: Contiene datos alfanuméricos.


• Integer: Acepta números enteros positivos o negativos. Rango:2,147,483,648 a
2,147,483,647.
• Decimal: Es un dato compuesto de dígitos, incluyendo 10 dígitos a la derecha del
punto decimal.
• Logical: lmacena valores YES/NO ó TRUE/FALSE.
• Date: Representa datos de fechas.
• Recid : macena valores de identificadores de registro.
• Mandatory: Indica que el campo debe de ser capturado obligatoriamente
• Case Sensitive: Es utilizado solamente para campos de tipo carácter. Si es falso
permite realizar comparaciones entre caracteres sin importar la forma en que son
escritas.
Ejemplo: Clave = clave = CLAVE
• Extent: Indica que el campo es un arreglo de múltiples elementos.

Para realizar Índices:

¿Qué es un Índice?
Es un dato elemental de un registro que se utiliza como criterio de identificación.

Razones para definir un índice:


Identificación única
Ordenamiento de registros
Relación con otras tablas
Rápido acceso a registros

Tipos de Índices

• Primario:
Establece por default que el archivo será ordenado por este campo a menos que se
especifique el ordenamiento por otro índice.
• Activo:
Índica si un índice esta activo o no. En el caso de que se establezca un índice en un
archivo muy largo es más eficiente definirlo como inactivo y solamente activarlo
cuando sea necesario.
• Único:
Indica que el contenido del índice debe de ser diferente.
Ej. R.F.C., Matricula, Curp, etc.

• Word index:
Permite accesar búsquedas por palabras o por frases sobre el campo.
• Abbreviated:
Permite que el registro sea accesado utilizando los primeros caracteres del
Campo. Se utiliza solamente en campos de tipo carácter.
• Add
Sirve para declarar como índice el campo que se encuentra seleccionado en el
rectángulo del lado izquierdo. Al hacer clic sobre este botón, dicho campo pasa al
rectángulo del lado derecho.
• Remove
Sirve para eliminar el índice seleccionado en el rectángulo derecho. Al hacer clic sobre
este botón, se elimina dicho índice y pasa al campo al rectángulo del izquierdo.
• Move Down:
Sirve para mover el índice seleccionado una posición abajo.
• Move Up:
Sirve para mover el índice seleccionado una posición arriba.

Reglas para la validación de datos

Se usa para definir una expresión y mensajes de validación para la tabla.

1. Se selecciona la tabla o campo para el cual se quiere establecer el criterio de


validación.
2. Seleccione la opción Validation .
3. Una vez desplegada la caja de dialogo, escribir la expresión que debe ser verdadera
para que:
o Se puede borrar un registro de la tabla.
o Que valor deberá ser introducido en ese campo.
4. Escribir el mensaje que le diga a los usuarios que hacer cuando intentan borrar o
eliminar una entrada.
5. Seleccionar OK.

Secuencias

Una secuencia es un objeto de base de datos que proporciona valores incrementales a una
aplicación. Puede generar valores secuenciales dentro de cualuier rango de enteros, con
valores positivos o negativos.

Como crear una secuencia

1. Desde la ventana de data diccionary, se selecciona el icono de Sequense para que se


despliegue la ventana de Create Séquense (nótese que las etiquetas de los botones
han cambiado), en donde se encuentran los botones Create Sequense, Séquense
Propieties y Delete Séquense.
2. Cuando se haya desplegado la ventana anterior, se hace clic en el botón de Create
Séquense, es el único que se encuentra activado cuando se despliega pro primera
vez. El botón central, se usa para ver las propiedades de una secuencia que
anteriormente haya sido creada; estas propiedades se pueden cambiar. El botón de la
derecha, se utiliza para eliminar la secuencia que se encuentra seleccionada.
3. Dentro de la caja de dialogo, se escribe el nombre de la secuencia, el valor inicial, el
incremento asi como él superior. Adicionalmente se puede indicar que haga un
ciclo(que vuelva a iniciar) al llegar al limite.
4. Cuando se haya terminado de crear la secuencia, se puede hacer clic en el botón de
Create para crear otra secuencia, o hacer clic en el botón de Cancel para eliminar la
secuencia actual. Para salir de esta caja de dialogo y aceptar las secuencias, se hace
clic en el botón de Ok

¿Qué es el Administrador de Base de Datos?

Es una herramienta creada por PROGRESS que auxilia al usuario en la


administración de la base de datos.

Principales funciones:
Dump y Load de datos.
Exportar e Importar datos.
Seguridad en base de datos.

Proceso Dump

Genera archivos que pueden contener definiciones, datos de los archivos de la base de
datos.

Principales opciones:

• Data definition : genera un archivo(.df), contiene el esquema.


• Table contents: genera un archivo (.d), contiene datos.

Proceso Load

Reconstruye una base de datos archivos Dump previamente generados.


Principales opciones:

• Data definition: Reconstruye un archivo basado en el esquema almacenado en el


archivo (.df).
• Table contents: Genera los datos de un archivo basado en los datos almacenados en
el archivo (.d).

EL EDITOR DE PROCEDIMIENTOS

El editor de procedimientos (Procedure Editor) es un editor de textos en donde se


escriben los procedimientos de PROGRESS. Se puede invocar directamente desde el
escritorio de ADE. Cuando se inicia abre un buffer sin nombre. Cada buffer en el editor de
procedimientos puede contener: un procedimiento recién creado, o uno que anteriormente
haya sido creado.
PROGRESS permite mantener abiertos varios buffers a la vez, lo que es muy
conveniente ya que cuando se trabaja con varios buffers a la vez, lo que es muy
conveniente ya que cuando se trabaja con varios de ellos, se puede transferir información
entre los mismos mediante las opciones de copiar, cortar y pegar.

Cómo editar texto

La navegación en el Editor de Procedimientos bajo Windows es similar a la


navegación en cualquier otro editor de texto. Se puede usar tanto el mouse como el teclado
para desplazar el punto de inserción, o para marcar el texto, o para ir directamente a una
línea de texto determinada. El editor de procedimientos también permite compilar, depurar
y correr los procedimientos. En la siguiente tabla se muestran las teclas rápidas para
algunas opciones del menú:

TECLA F1 F2 F3 F4 F6 F7 F8 F9
FUNCION Help Run Open Save Buffer Close Encontrar
Siguiente siguiente
SHIFT + Revisar New Debug Guardar Buffer Encontrar
TECLA sintaxis Como Anterior anterior
CTRL + Ventana de
TECLA procedimiento
nueva

Teclas de función disponibles en el editor de procedimientos de PROGRESS

TECLA X C V F R G L E
CTRL.+ Cut Copy Paste Find Replace Go to List Mensajes
line Buffers de
compilador

Combinación de teclas para la edición de un procedimiento desde el Procedure Editor

Para crear un archivo nuevo p se debe comenzar en la opción new de menú file o
usar la combinación de teclas <shift><F3>.

Cuando se ha terminado de escribir el código de nuevo procedimiento en el buffer,


se debe guardar para crear un nuevo archivo con la extensión.p. Para hacer esto, se usa la
opción save del menú file o <F6>. Se debe agregar la extensión .p en el nombre del archivo
ya que al abrirlo en otra ocasión posterior, PROGRESS emplea un filtro en donde se
muestran todos los archivos .p.

Para abrir un archivo .p creado anteriormente, se puede usar la opción open del menú file o
la tecla <F3>.
Si se quiere saber cuales archivos están abiertos o sin guardar, se puede usar la
combinación de las teclas <Ctrl><L> o seleccionar la opción list del menú Buffer

Cuando se está trabajando con varios archivos o buffers que no se han guardado, y
se desea saber cuales son los que se encuentran activos, se emplea la combinación de teclas
<CTRL><L> o se selecciona la opción List del menú Buffer. La caja de diálogo que
muestra la lista de los buffers abiertos, muestra resaltado el que se está usando ese
momento al final de la lista. Sin embrago se puede seleccionar otro buffer haciendo doble
clic en el nombre del que se desea ir , o seleccionándolo y seleccionando el botón OK. Para
desplazarse entre los buffers estando en la ventana de edición, se puede usar la tecla <F7>
para ir al siguiente buffer, o la combinación de las teclas <Shift><F7> para ir al buffer
anterior.

Lista de Buffers

Cuando se trabaja con un grupo de procedimientos por periodos de tiempo largos, se


puede lograr que este grupo de procedimientos se abra cada vez que se invoque al editor. El
editor de procedimientos permite guardar una lista de buffers con la que está trabajando.
Para incluir los archivos necesarios en una lista de buffer, todo lo que se necesita hacer es
abrirlos todos en el editor como buffers y posteriormente seleccionar la opción Preferences
del menú options. La próxima vez que se abra el editor, se abrirá con todos los archivos que
se colocaron en la lista de buffer.

Ventanas de procedimientos múltiples

Con PROGRESS es posible trabajar con varias ventanas en la pantalla a la vez, esto
tiene la ventaja de que se pueda cortar, copiar y pegar entre las ventanas.

Cómo insertar campos de Base de datos en un procedimiento

Cuando se hace clic en el botón derecho del mouse, se despliega un menú pop-up el
que se pueden ejecutar alguna de las tareas que se encuentran en la barra de menús del
editor. De esta manera se pueden insertar dentro del código del procedimiento elementos
tales como nombres o campos de la Base de datos conectada o el contenido de un archivo.

Verificación de sintaxis

Para verificar la sintaxis de un procedimiento, éste se puede correr para probarlo y usar el
depurador (debugger) del editor. También se puede revisar la sintaxis mediante las teclas
<Shift><F2> o seleccionando la opción check sintaxis del menú Compile.

Ayuda sobre la sintaxis

Si no se tiene la seguridad de que un estatuto o parte de él este correcta, se puede obtener


ayuda del tema, marcando la palabra clave y presionando la tecla <F1>. Si la palabra tiene
más de un significado, se despliega una caja dialogo de búsqueda en donde se puede
especificar alguno de los tópicos.

Como correr un procedimiento

Para correr un procedimiento se puede presionar la tecla <F2> o seleccionar la opción Run
del menú Compile. Cuando se corre un procedimiento en el Editor de Procedimientos,
PROGRESS primero lo compila temporalmente y posteriormente lo ejecuta. Se puede
compilar permanentemente un procedimiento y convertirlo en un archivo con extensión .r,
pero se debe hacer separadamente. Se puede compilar un procedimiento con le estatuto
COMPILE o usando la opción Application Compiler del menú Tools.

El estatuto COMPILE

Se puede usar el estatuto COMPILE en una ventana de procedimiento en donde se debe


especificar: el procedimiento que se va a compilar, si se desea que el archivo sea guardado
en un archivo de código .r o en una versión de archivo de sesión compilada (SCV), en
diferentes listas de archivos.

Para iniciar la compilación de un procedimiento cuando se usa el estatuto COMPILE, se


debe correr el procedimiento que lo contiene.

Cómo usar la herramienta Application Compiler

Para compilar un procedimiento cuando está desplegado como buffer actual, en una
ventana de procedimiento, se puede emplear la opción Application Compiler del menú
Tools, esto permite definir los parámetros iterativamente con aquello que se hayan
especificado en el estatuto COMPILE.

COMPILE nom_proc

SAVE = expresión-lógica INTO nombre-dir

[ LISTING lista-nom-arch ]

[ XREF xref-nom-arch ]

Cuando se usa el estatuto COMPILE en una ventana de procedimiento, se debe indicar:


• Cuál procedimiento se va a compilar
• Si se quiere guardar el archivo compilado como un archivo permanente .r o en un
archivo de sesión compilada (SCV)
• Las diferentes listas

Para iniciar la compilación de un procedimiento con el estatuto COMPILE, se corre el


procedimiento que contiene a dicho estatuto. También se puede compilar cuando se
encuentra desplegado usando la opción Application Compiler del menú Tools. Esta opción
permite iterativamente definir los parámetros.

El empleo de la opción Compiler del menú Options permite definir algunos parámetros
opcionales del comando compile de la misma manera que se haría con es estatuto
COMPILE.

CAPÍTULO V
SINTAXIS DEL LENGUAJE DE PROGRESS

PROGRESS es un lenguaje de cuarta generación.

PROGRESS posee una sintaxis muy parecida al inglés hablado y proporciona


estatutos muy
poderosos para:
• Tener acceso ala Base de Datos
• Programar interfaces de usuarios (UI)

Así mismo, proporciona todo el flujo y control para la construcción típica de un


lenguaje de tercera generación (3GL).
Elementos del lenguaje

En la siguiente tabla se listan los componentes de la sintaxis del lenguaje de


PROGRESS.

Elementos del lenguaje Descripción

Statements Definen una acción o proceso


Variables Guardan datos en memoria para su procesamiento

Elementos de base de datos Guardan datos en la base de datos


Operadores Símbolos que ejecutan operaciones matemáticas o
comparaciones
Expresiones Combinación de variables, campos de base de
datos y operadores, que juntos producen algún
valor.
Símbolos especiales Comentarios, o referencias especiales, referencias
tales como archivos include.
Procedimientos Unidad de ejecución compuesta de una o más
instrucciones.
Blocks Grupo de declaraciones que son parte de la misma
rama de condición o de un ciclo
Funciones Están predefinidas, están dentro de un proceso,
tales como cálculos o conversiones
Obetos de interface de usuario Unidades de despliegue en pantalla, que pueden
aceptar datos del usuario, de las variables de la
aplicación, de archivos o de la base de datos.

Símbolos especiales
En PROGRESS se utilizan los siguientes símbolos en sus procedimientos:

Símbolo Papel
/* */ Encierran un comentario
* Comodín, sustituye a cualquier grupo de
caracteres
Punto ( . ) • Termina una instrucción
• Comodín para un carácter
• Separador. Separa el nombre de la
base de datos del nombre de la tabla
y del nombre del campo
Dos Puntos ( : ) Terminación de Block, encabezado o
etiqueta de Block.
Introduce una atributo a la sintaxis de
traducción
Introduce un atributo a un objeto o método
? Designa un valor desconocido
~ Causa que el siguiente carácter sea tratado
como literal
“” o ‘‘ Encierra a una cadena de caracteres
{nombre-archivo} Incluye referencia de archivo
{} Argumentos de paso
[] Referencia a una matriz, se usa para
subindicar la matriz y los valores iniciales
{&} Variable del preprocesador
Objetos de interfase de usuario

Un objeto de interfase de usuario (UI) permite desplegar gráficamente los datos en la


pantalla. La siguiente tabla lista algunos de los elementos que se pueden usar cuando se
trabaja con objetos:

Elemento Descripción
Object Elemento básico o componente de la GUI
Events Acción emprendida por el usuario sobre
algún objeto
Trigger Respuesta programada para un evento.
Handle Indicador nombrado para un objeto.
Attribute Alguna característica de un objeto ya sea que
se puede leer o asignar diferente valor
Method Acción sobre algún objeto que regresa algún
valor

Componentes de los estatutos

La sintaxis de los estatutos de PROGRESS esta formada por una combinación de: Una
palabra clave (keyword) obligatoria, parámetros y opciones específicas del estatuto, frases,
expresiones y un terminador de estatuto que generalmente es un punto (.)

Componente Papel
Keyword Es el verbo principal de la declaración,
designa la acción o el proceso que se ha de
ejecutar
Parametre(s) and Option(s) Información adicional que indica que algo
esta cambiando la acción o proceso
designado por la declaración.
Phrase(s) Algún elemento común del lenguaje
significa que pueden aparecer en algunas
declaraciones de PROGRESS
Expression Es una combinación de variables, constantes
y operadores que evalúan a un elemento de
la sintaxis.
Terminator Es el que le indica PROGRESS que termina
una declaración.

Uso de variables

Para poder usar una variable en PROGRESS, es necesario primero definirla, declarando su
tipo y opcionalmente la forma en que se desplegará y posteriormente se le deben asignar los
valores correspondientes. La definición de una variable reserva espacio para ella en un
buffer similar al buffer de registro (llamado buffer de variable)

Definición de variables

Cuando se define una variable, se debe especificar si es una sola variable o una matriz
describirla indicando el tipo de dato, valor inicial (si debe llegar alguno), etiqueta y los
colores del fondo y primer plano, asi como la forma en que se visualizará usando algún tipo
de objeto de la UI.
Sintaxis

AS tipo-dato [ FORMAT (formato) ]

DEFINE VARIABLE nom-var


LIKE campo

[ [ NOT ] CASE-SENSITIVE ]

[DECIMALS n ] [EXTENT n ]

[ INITIAL valores ]

[LABEL string]

[ BGCOLOR expression ] [ FGCOLOR expression ]

[ NO-UNDO ]

Asignación de valores a las variables

En PROGESS se pueden asignar valores a las variables, fundamentalmente de dos maneras:

Sintaxis

• Especificando un valor inicial con el estatuto DEFINE VARIABLE


• Usando el estatuto ASSIGN

El uso del estatuto ASSIGN permite agrupar la asignación de valores de diferentes


variables con un solo estatuto. Agrupando varias variables con este estatuto produce un
código ejecutable más pequeño y rápido.

Sintaxis

ASIGN variable = valor [ variable = valor ... ]

Ejemplo:
ASSIGN
Var1 = 3.1
Var2 = “hola”
Var3 = 1
Var4 = 2

Uso del comando display


El comando DISPLAY mueve los datos del buffer de registros al buffer de la pantalla (se
despliegan los valores de las variables en la pantalla)

Sintaxis
Expresión [ format-phrase ]
DISPLAY SPACE [(N)] [frame-phrase]
SKIP [(n)]

En la siguiente tabla se indica el significado de cada uno de los parámetros que se emplean
con el estatuto DISPLAY:

Parámetro Designa
Expresión Lo que se despliega. Puede ser una variable,
una constante o un campo de base de datos
Format-phrase Como se despliega el dato
Frame-phrase Características del marco que contiene los
elementos desplegados.
SPACE [(N)] Número de espacios que se despliegan.
Puede ser cero o un número positivo. Si es
mayor el espacio del que cabe en la línea,
PROGRESS salta a la siguiente línea y no
despliega más espacios.
SKIP [(N)] Número de líneas que debe saltar:
• Si n es cero o si no se especifica ,
PROGRESS salta a la siguiente línea,
a menos que ya haya saltado a una
nueva línea debido a la longitud de
los datos desplegados.
• Si se especifica SKIP (1)
PROGRESS salta a una nueva línea
sin importar que ya haya saltado una
nueva línea.

Introducción de valores para las variables

Estatutos para aceptar entradas del usuario

Para permitir al usuario introducir datos se usan los siguientes estatutos SET,
PROMPT-FOR Y UPDATE.

PROMPT-FOR
Interactúa solamente con el buffer de pantalla, permite al usuario introducir valores pero no
los pasa al buffer de registro por lo que no se pueden tomar valores para usarlos ya que
dichos valores permanecen en el buffer de pantalla solamente. Para poder usar estos valores
se debe usar la función INPUT.

Ejemplo:

/* p5-13 */
DEFINE VARIABLE nombre AS CARÁCTER FORMAT “X (20)”
LABEL “Introduzca su nombre”.
DEFINE VARIABLE saludo AS CARÁCTER FORMAT “X (27)”
PROMPT-FOR nombre.
ASSIGN saludo = “Hola, ” + INPUT nombre + “!” .
DISPLAY saludo.

El estatuto SET

Se le puede pedir al usuario que introduzca un valor , que será asignado a una variable
(PROGRESS lo pasa del buffer de pantalla al buffer de registro)

Ejemplo:

/* p5-12 */
DEFINE VARIABLE name AS CARÁCTER FORMAT “X (20)”
LABEL “Introduzca su nombre”.
DEFINE VARIABLE saludos AS CARÁCTER FORMAT “X (27)”
SET name.
ASSIGN saludos = “Hola, ” + name + “ ! ” .
DISPLAY saludos.

El estatuto UPDATE

El estatuto UPDATE despliega los campos o variables, solicita al usuario una entrada y
posteriormente la coloca tanto en el buffer de pantalla como en los campos o variables
específicos. Es una combinación de los siguientes estatutos:

• DISPLAY ya que pasa los valores de los campos o variables al buffer de


pantalla y los despliega.
• PROMPT-FOR ya que solicita al usuario datos y los coloca en el buffer de
pantalla.
• ASSIGN porque pasa los datos del buffer de pantalla al buffer de registro.
Sintaxis

UPDATE
[{field [format-phrase][WHEN expression]}|
{TEXT (field [format-phrase]…)}|
{field = expression }| {constant [ A T n|TO n]}|
{^}|{SPACE [(n)]}|{SKIP[(n)]}]….
[GO-ON (key-label…)] [frame-phrase] [editing-phrase]
[NO-ERROR]

Ejemplo de sintaxis

UPDATE record [EXCEPT field….] [frame-phrase] [NO-ERROR]

En el siguiente ejemplo, el procedimiento permite desplegar cada registro de la tabla


customer así como modificar el nombre y el límite de crédito. LA opción VALIDATE en le
primer estatuto UPDATE garantiza que se introduzcan valores menores de 500,000. La
opción HELP despliega un mensaje para tal efecto.

/* r-updat2.p */

FOR EACH customer:


UPDATE customer.name
Credit-limit VALIDATE (credit-limit < 500000, “Too high”)
HELP “Enter credit-limit < 500000”.
FOR EACH order OF customer:
DISPLAY order-num.
UPDATE promise-date ship-date VALIDATE(ship-date <
today,
“Ship date must be later than today ”).
END
END

El segundo block lee cada registro de la tabla order que pertenece a customer, despliega el
campo order-num y permite modificar los campos promise-date y ship-date. La opción
VALIDATE asegura que no se introduzca un fecha de envío anterior a la actual. Este
procedimiento.....sigue

Las Expresiones PROGRESS

Las expresiones son parecidas a una formula en donde se combinan variables y/o
constantes junto con algunos operadores. Los elementos que se pueden usa son: constantes,
variables, campos de base de datos atributos de los objetos y operadores.
Operadores
Los operadores que se usan en PROGRESS pueden ser aritméticos, lógicos o de
comparación, en las siguientes tablas se muestran los tres tipos:

Operadores Aritméticos
Símbolo Operación
+ Valor positivo
Suma numérico y de operandos de fecha
Concatenación de operandos string
- • Valor negativo
• Resta numérica y de operandos de
fecha
* Multiplicación de dos operandos de fecha
/ División de dos operandos numéricos,
produce un valor decimal.

Operadores Lógicos

Palabra clave(operador) Operación


AND Y lógico, produce un valor verdadero
solamente si ambos operadores son
verdaderos.
OR O lógico produce un valor verdadero si uno
de los operandos es verdadero.
NOT Negación lógica niega el valor de un
operando lógico.

Operadores de comparación

Símbolo del operador Palabra clave Designa


= EQ Igualdad
<> EN Desigualdad
> GT Mayor que
< LT Menor que
>= GE Mayor o igual que
<= LE Menor o igual que
BEGINS Revisa si un string comienza
con otro string
MATCHES Compara un string con un
patrón
CONTAINS Revisa si un string en un
campo de palabra indexada
contiene un substring
Para evaluar una expresión, PROGRESS sigue el siguiente orden:
1. Funciones.
2. Expresiones dentro de paréntesis.
3. Operadores.
• Signo.
• Multiplicación, división, módulo.
• Suma, resta (incluyendo operaciones con fecha).
• MATCHES, BEGINS, operadores de comparación.
• NOT
• AND
• OR

Conexión a una base de datos con código

Estatuto CONNECT
Para que un procedimiento que accesa a una base de datos, corra debe contenerse a la base
de datos referida esto se puede hacer desde el DATA DICTIONARY o bien mediante el
estatuto CONECT desde un procedimiento. Para que el usuario se conecte a una o más
bases de datos se deben usar el estatuto CONNECT. Las operaciones que se emplean para
conectarse a una base de datos son las mismas que se usan en el diccionario de datos.

Al conectarse a una base de datos se puede usar o no el nombre físico con el path completo.
También se puede indicar un nombre lógico, sin embargo si no se indica el nombre lógico,
PROGRESS le asigna uno usando el mismo nombre del archivo sin extensión o path. El
nombre lógico es necesario para desconectarse de la base de datos.
Sintaxis:
CONNECT ({physical-name} [options] options ) [NO-ERROR]

Desconexión de una base de datos

Estatuto DISCONNECT
Para desconectarse de una o más bases de datos desde un procedimiento se usa el estatuto
DISCONNECT
Sintaxis:
DISCONNECT {logical-name} [NO-ERROR]

/*Programa para conectar y desconectar bases de datos */


CONNECT ... \nom-bd.
DISCONNECT nom-bd (LOGICO).

Las funciones de PROGRESS

Las funciones son procedimientos preconstruidos que pueden tomar parámetros y siempre
regresan un valor. Cuando se usa una función, el valor que regresa se puede desplegar o
asignarlo a una variable o campo de base de datos. PROGRESS proporciona un gran
número de funciones, entre las que se encuentran funciones para:
• Verifica el estado de una conexión a una base de datos.
• Manipulación del PROPATH.
• Manipulación y cálculo de fechas.
• Manipulación de strings.
• Conversiones de tipo de datos.
• Comandos del sistema operativo.

Funciones de conexión

Las funciones relacionadas con la conexión permite verificar la conexión a una base de
datos y regresa alguna información de la misma. En la siguiente tabla se describen algunas
de las funciones de conexión:

Función Sintaxis Regresa


CONNECTED CONNECTED (“nom-log base datos”) Verdadero si la conexión es
exitosa
NUM-DBS NUM_DBS Número de base de datos
conectadas
DBNAME DBNAME Nombre físico o lógico de la
base de datos conectada,
dependiendo del nombre
usado par ala conexión
LDBNAME LDBNAME(“logical-name” | integer) Nombre lógico de la base de
datos conectada
PDBNAME PDBNAME(“logical-name” | integer) Nombre físico de la base de
datos conectada
DBTYPE DBTYPE(“logical-name” | integer) Tipo de base e datos
conectada (PROGRESS,
Oracle, etc.)

Se pueden ejecutar comandos del sistema operativo desde un procedimiento de


PROGRESS usando una combinación de los siguientes estatutos y funciones:

Estatuto / Función Sintaxis Descripción


OPSYS OPSYS Verifica en que sistema operativo esta
corriendo el programa
OS-COMMAND OS-COMMAND[SILENT] Sale al sistema operativo y ejecuta el
comando-y-parámetros comando indicado.
OS-COPY OS-COPY(fuente destino Copia un archivo
OS-APPEND OS-APPEND(fuente destino) Fusiona dos archivos
OS-RENAME OS-RENAME(oldname new Cambia el nombre a un archivo
name)
OS-DELETE OS-DELETE(nom-archivo) Elimina un archivo
OS-CREATE-DIR OS-CREATE-DIR(nom-dir) Crea un directorio
OS-GETENV OS-GETENV(en-var-name) Obtiene información de las variables
OS-DRIVES OS-DRIVES Reporta los drives disponibles
OS-ERROR OS-ERROR Verifica el estado de error después de
ejecutar un comando del sistema
operativo.

Funciones String y sus operadores

Los string se pueden concatenar usando el operador (+) para pegar dos o más strings de la
siguiente manera:

String1 + String2
En la siguiente tabla se describe algunas de las funciones y operaciones que se puedan
aplicar a los strings:

Función Sintaxis Operación


STRING STRING(valor) Convierte otro tipo de dato en string.
BEGINS string1 BEGINS string2 Revisa si string1 comienza con string2.
MATCHES string MATCHES patron Revisa si string cumple con el patrón, que
puede contener comodines:
Punto (.)- para un carácter
Asterisco(*)- para cualquier número de
caracteres, incluyendo nulos.
LENGTH LENGTH(string) Regresa el número de caracteres o bytes
contenidos en string.
INDEX INDEX(fuente, Regresa la posición del string destino en el
destino[,inicio]) string fuente.
R-INDEX R-INDEX(fuente, Igual que index, pero ejecuta la búsqueda
destino[,inicio]) de derecha a izquierda.
SUBSTRING SUBSTRING (string, Extrae un substring de una longitud
Función posición, [longitud]) comenzando en la posición señalada del
string.
SUBSTRING SUBSTRING (destino, Substituye el contenido de una variable o
Statement posición, [longitud]) = string campo destino con el string, iniciando en
la posición señalada en destino.
CAPS CAPS (string) Convierte un string en mayúsculas.
LC LC (string) Convierte un string en minúsculas.
FILL FILL (string,n) Crea un string del string de entrada,
repetido n veces.
TRIM TRIM (string, [trim-chars]) Corta los primeros y últimos espacios de
string.
LEFT-TRIM LEFT-TRIM (string, [trim- Corta los espacios iniciales.
chars])
RIGHT-TRIM RIDTH-TRIM (string, [trim- Corta los últimos espacios.
chars])
OVERLAY OVERLAY (destino, Sobrescribe en destino la expresión en la
posición [,longitud[,tipo]]) = posición señalada.
expresión

En la siguiente tabla se describen algunas de las funciones y operaciones que se pueden


aplicar a un string: contiene una lista de elementos. La lista se delimita por comas por
omisión, sin embargo, se puede indicar otro delimitador.

Función Sintaxis Operación


LOOKUP LOOCKUP (string, La posición del string en
list[,delimitador]) lista.
ENTRY ENTRY (index, El carácter es índice en el
list[delimitador]) string.
NUM-ENTRIES NUM-ENTRIES Número de elementos en la
(list([,delimitador])) lista.

Funciones para fechas

Las funciones relacionadas con las fechas permiten obtener la fecha actual o manipular la
información de fechas. En la siguiente tabla se hace una descripción de las funciones de
fecha:

Función Sintaxis Operación


Today TODAY Regresa la fecha actual del S. O.
Date DATE(mes, día, año /fecha-string) Convierte un string a tipo date.
Day DAY (fecha-expresión) Regresa el número
correspondiente al día.
Month MONTH(fecha-expresión) Regresa el número
correspondiente al mes.
Weekday WEEKDAY(fecha-expresión) Regresa el string
correspondiente al día.
Year ( ) YEAR(fecha-expresión) Regresa el número
correspondiente al año.
Time ( ) TIME Regresa la hora del sistema
operativo.

Ejemplo:

/* Operaciones con la función DATE*/

DEFINE VARIABLE days_since AS INTEGER FORMAT ”9999”.


day_since = TODAY – DATE (“01 / 01 / 2005 “) .
DISPLAY “Hoy es “ TODAY.
DISPLAY “Hoy es el “ days_since “avo. Día del año.” WITH NO-LABELS.

Funciones numéricas y operadores


Junto con las operaciones aritméticas se pueden usar la operación TRUNCATE y el
operador MODULE para operar con valores numéricos, también se pueden convertir otros
tipos de datos a tipos de datos numéricos. En la siguiente tabla se indica el uso de las
funciones:

Función Sintaxis operación


INTEGER INTEGER(expresión) Convierte a la expresión en
enteros tipo fecha.
DECIMAL DECIMAL(expresión) Convierte la expresión a dato
tipo decimal.
TRUNCATE TRUNCATE(decimal, num- Trunca num-dec de decimal
dec)
MODULO Num1 MODULE num2 Divide num1 entre num2 y
regresa el residuo.

Usando Set

Se puede utilizar el SET para vaciar pronto algunos valores, y entonces estos
valores son asignados a las variables.(Progress mueve el registro del buffer).
El siguiente ejemplo permite la entrada hasta el primer nombre.

/* Programa que ejemplifica el uso del SET */

DEFINE VARIABLE nombre AS CHARACTER FORMAT “X(20)”


LABEL “Escribe tu primer nombre”.
DEFINE VARIABLE saludo AS CHARACTER FORMAT “X(27)”.
SET nombre.
ASSIGN saludo = “Hola, ” + nombre + “ ! “ .
DISPLAY saludo.

Usando el Prompt-For

PROMPT-FOR permite el uso de la entrada de valores, pero no permite mover el


valor entre el buffer de registro. Por eso tú no puedes referirlo, desde que un valor entra en
el buffer de pantalla tu lo puedes referir al uso de la función INPUT.

/* Programa que ejemplifica el uso del PROMPT-FOR */

DEFINE VARIABLE nombre AS CHARACTER FORMAT “X(20)”


LABEL “Escribe tu primer nombre”.
DEFINE VARIABLE saludo AS CHARACTER FORMAT “X(27)”.
PROMPT-FOR nombre.
INPUT nombre.
ASSIGN saludo = “Hola, ” + nombre + “ ! “ .
DISPLAY saludo.
NOTA: Poner INPUT.
ASSIGN saludo = “Hola, ” + INPUT nombre + “ ! “ .

BLOQUES EN PROGRESS

¿ Qué es un bloque ?.
Una serie de estatutos que PROGRESS trata como una sola unidad para definirles
características.
-Generalmente un bloque comienza con un estatuto de encabezado y concluye con un
estatuto END.

Tipos de Bloques

Procedimientos:
- Procedimiento principal.
- Procedimiento interno.
- Procedimiento externo (programas).

Triggers.
Bloques de control:
- DO.
- REPEAT.
- FOR EACH.

Reglas generales para bloques.

- Siempre inician con un estatuto de encabezado de bloque.


- Siempre terminan con un estatuto END.
- Tienen servicios implícitamente definidos llamados
propiedades de bloque.
- Algunos bloques pueden ser nombrados.
- A varios bloques es posible definirles servicios de forma
explícita.

Bloques de Control
-
- Bloque de DO.
Es usado generalmente para agrupar estatutos y éstos sean tratados como una sola
unidad.
Sintaxis parcial:
{ label : }
DO { FOR record }
{ variable = expression 1 TO expression 2 { BY k } }
{ WHILE expression }:
/*Programa que ejemplifica el uso del DO*/
DEFINE VARIABLE i As INTEGER.
Mensaje:
DO i=1 TO 5 BY 1:
DISPLAY “Progress ”.
END.

Bloque de REPEAT.
Este bloque tiene implícito el servicio de ciclo.

Sintaxis parcial:

[ label:]
REPEAT [FOR record
[variable = expresion1 TO expresion2 [BY k] ]
[WHILE expresion ]:

/*Programa que ejemplifica el uso del REPEAT*/


DEFINE VARIABLE i AS INTEGER .
REPEAT i = 1 TO 10 BY 1:
DISPLAY “ Progress “.
END.

/*Programa que ejemplifica el uso del REPEAT*/


DEFINE VARIABLE i AS INTEGER.
DEFINE VARIABLE count AS INTEGER FORMAT “99” INITIAL 0.
DEFINE VARIABLE nombre AS CHARACTER FORMAT “X(20)”
LABEL “lista de nombres”.
SET nombre.
REPEAT i = 1 TO NUM-ENTRIES(nombre) BY 1:
DISPLAY ENTRY(I, nombre) FORMAT “X(25)”.
ASSIGN count = count + 1.
END.
MESSAGE “Hay “ count “lista de nombre”.

Bloque de FOR EACH


Este bloque tiene implícito el servicio de ciclo. Es también una estructura
esencial para moverse a través de registros en la base de datos.
Sintaxis.
[label:] FOR [ EACH|FIRST|LAST]record-phrase
[variable = expression1 TO expression2 [ BY k]]
[WHILE expression ][WHERE expression]:

/*PROGRAMA NO. Pendiente*/


FOR EACH CLIENTE:
DISPLAY nombre.
END.
Estatuto IF.....THEN.....ELSE
Este estatuto permite ejecutar una de dos acciones, dependiendo de las condiciones
en el momento de correr.

Sintaxis:
IF condición THEN expresión 1 [ELSE expresión 2]

Estatuto Case
Sintaxis:
CASE expression:
WHEN value1 [.. OR WHEN valuen....] THEN { } WHEN...
OTHERWISE { }
END [ CASE]

/* Programa que ejemplifica el uso del CASE */


DEFINE VARIABLE os AS CHAR.
ASSIGN os = OPSYS.
CASE os:
WHEN “UNIX” THEN
UNIX is.
WHEN “MSDOS” OR WHEN “OS2” THEN
OS-COMMAND dir.
WHEN “VMS” THEN
VMS directory.
WHEN “BTOS” THEN
BTOS “[sys]<sys>files.run” files.
OTHERWISE
DISPLAY OPSYS “Es un sistema Operativo no soportado”.
END CASE.

Definición de la condición de salida del ciclo.

Para terminar un ciclo iteractuante, se utiliza los siguientes mecanismos:


o Usar el valor de una variable como limites inferior y superior.
o Agregando la expresión WHILE:
o Usando el estatuto LEAVE:

DO...WHILE
Sintaxis:
[etiqueta:]
DO[WHILE expresión]
Estatutos….
END:
REPEAT… WHILE
Sintaxis:
[etiqueta:]
REPEAT [WHILE expresión]
Estatutos….
END.

Acciones dentro del ciclo.

Estatuto Especifica...
NEXT [etiqueta] Va directamente al final del block e inicia el
procesamiento de su siguiente interacción.
LEAVE Sale del block y continua procesando el
siguiente estatuto.

LEAVE
Sintaxis:
loop:
REPEAT:
estatutos...
IF......THEN......LEAVE loop.
estatutos
END.

Laboratorio

1. Hacer un programa que permita al usuario introducir su nombre completo y se


muestren las iniciales.
Solución

DEFINE VARIABLE lnombre AS CHAR FORMAT “X(15)”


LABEL “Apellido Paterno”.
DEFINE VARIABLE fnombre AS CHAR FORMAT “X(25)”
LABEL “Primer nombre”.
DEFINE VARIABLE mi AS CHAR FORMAT “X(15)”
LABEL “Apellido materno”.
DEFINE VARIABLE Monograma AS CHAR FORMAT “X(40)”.
SET fnombre lnombre mi.
ASSIGN Monograma = CAPS (SUBSTRING ( fnombre,1,1))
+ CAPS ( SUBSTRING ( lnombre,1,1))
+ CAPS ( SUBSTRING ( mi,1,1)).
DISPLAY Monograma

2. Hacer un programa que muestre la fecha actual y diga cuantos años le faltan para el
2020.
Solución:
DEFINE VAR tday AS DATE.
DEFINE VAR tyear AS INTEGER.
DEFINE VARIABLE yleft AS INTEGER FORMAT 9.
ASSIGN
tday = TODAY
tyear = YEAR (tday)
yleft = 2020 - tyear.
DISPLAY “La fecha de hoy es:” tday SKIP (1).
DISPLAY “Faltan” yleft “años hasta llegar al 2020”.

3. Hacer un programa que diga que día de la semana es hoy. Si es sábado o domingo,
que salude al usuario deseándole un feliz fin de semana. Sí es viernes que
despliegue el mensaje “¡Al fin es viernes!”.

Solución:
DEFINE VAR tday AS DATE.
DEFINE VAR wdayi AS INT.
DEFINE VAR wday AS CHAR INITIAL
[“Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado”].
ASSIGN
tday = TODAY.
wdayi = WEEKDAY(tday).
DISPLAY “La fecha de Hoy es:” tday
SKIP (1) WITH NO-LABEL.
CASE wdayi:
WHEN 1 OR WHEN 7 THEN
DISPLAY “¡Que tengas un buen fin de semana!”.
WHEN 6 THEN
DISPLAY “¡Finalmente es Viernes!”.
OTHERWISE
DISPLAY SKIP (1)
“Hoy es”
+ STRING(ENTRY(WEEKDAY(tday), wday))
+ “.” FORMAT “X(25)”.
END CASE.

COMANDOS A UTILIZAR

o Filosofía de movimiento de datos.


o Uso de FIND
o * Uso de Queries.
o Modificación de información.
o Creación de registros .
o Borrado de registros.
o Uso del Browse.
o Frame
Comandos a utilizar en el manejo de tablas

• ALTAS INSERT
• BAJAS DELETE
• CAMBIOS UPDATE
• CONSULTAS DISPLAY

NOTA: UNDO, RETRY: Cancela el mensaje y reintenta al posicionarse de nuevo en


la captura.

Estatuto FIND
• Para accesar un registro específico de la base de datos y ponerlo en el buffer de
registro, se utiliza el estatuto Find.

• El estatuto Find requiere que se le especifique el registro a encontrar.

• Find hace uso de un índice.

Sintaxis del estatuto FIND


FIND [ FIRST | LAST | NEXT | PREV | CURRENT ] record
[ OF table ] [ WHERE expression ] [ USE - INDEX index ]
[ USING field ] [ NO- ERROR ]

/*Para encontrar el cliente número 2 :*/

FIND articulos WHERE articulos.noart = 2.


/* Para desplegar los datos del cliente encontrado:*/
DISPLAY articulos.

/*Para desplegar ciertos datos del cliente :*/

DISPLAY articulos.nomart
articulos.Cantidad
articulos.descart.

/*Para desplegar haciendo excepciones:*/


DISPLAY articulos EXCEPT articulos.nomart.

/* encontrar el ultimo articulo. Nota: que es el ultimo en la base de datos*/


FIND LAST articulos.
DISPLAY articulos.noart articulos.nomart.
PAUSE.
/*Encontrar el articulo numero 3*/

FIND articulos
WHERE articulos.noart = 3.
DISPLAY articulos.noart articulos.nomart.
PAUSE.

Función AVAILABLE

Devuelve un valor lógico indicando si en el buffer de registro indicado hay un registro


disponible.

Para usarse en conjunto con el estatuto FIND, debe usarse con la opción de NO-ERROR.
Sintaxis: AVAILABLE record

*Programa que ejemplifica el uso del available*/


REPEAT:
PROMPT-FOR articulos.noart.
FIND articulos USING nomart NO-ERROR.
IF AVAILABLE articulos
THEN DISPLAY nomart cantidad descart.
ELSE MESSAGE "Not found".
END.

¿ Que son los queries ?


• Es una solicitud de información a la base de datos.
• Es un conjunto de registros de base de datos; puede consistir de una o más tablas, y
puede contener todos los registros de una tabla en particular, o bien sólo un
subconjunto de registros.

Características
Para utilizar un QUERY es necesario seguir la secuencia:
• Definir el QUERY.Abrir el QUERY.Hacer uso del QUERY.
• Cerrar el QUERY

Uso de Queries
Definición del Query

Sintaxis (parcial):Define Query query-name For archivo


• [Fields/Except[ field-list] [Cache n]
• [Scrolling].

• La definición del query requiere que le sean definidas todas las tablas a ser
utilizadas.
Cache
Indica el número de registros que serán mantenidos en memoria.
La opción SCROLLING debe ser usada cuando se desea tener la capacidad de
reposicionarse libremente en el query.
En caso de ser seleccionada la opción caché es activada por default la opción Scrolling.
• Uso del estatuto GET
• Funciona parecido a un estatuto FIND, con la diferencia de que este estatuto
funciona con un query definido.
• El estatuto GET mueve información de la base de datos al buffer de registro.

Estatuto GET Sintaxis


GET {FIRST|NEXT|PREV|LAST|CURRENT}
query [NO-ERROR]

* Después de un estatuto GET es posible usar la función AVAILABLE para verificar si


fue posible traer un registro al buffer.

* Características del estatuto GET

• Cuando se aplica el estatuto GET a un query que referencia a varias tablas, el


estatuto regresa un conjunto de registros que corresponde a un “renglón” de la
consulta.

* Si se ejecuta un GET NEXT después del último registro disponible del query, la
condición de error NO se habilita. Se debe aplicar la función Available para probar si se
regresó el registro.
*Cuando se ejecuta el estatuto GET, cualquier trigger de FIND definido para las tablas se
ejecuta.

/*Ejemplo del QUERY y el estatuto GET*/

DEFINE QUERY q-prueba FOR articulos.


OPEN QUERY q-prueba FOR EACH articulos.
GET FIRST q-prueba.
REPEAT WHILE AVAILABLE articulos:
DISPLAY articulos.noart articulos.nomart.
GET NEXT q-prueba.
END.

Estatuto Update
* Sintaxis (parcial): UPDATE [field [ WHEN expression
{SPACE [(n ) ]} | { SKIP [(n)]}]]...[NO ERROR]

* El estatuto Update realiza lo siguiente:* Crea una interfase default.


* Despliega datos del registro(DISPLAY).
* Habilita la captura y bloquea la ejecución para permitirle al usuario interactuar con los
datos (PROMPT-FOR).
* Asigna los cambios (ASSIGN).
* El registro cuyos datos se actualizarán debe estar en el buffer de registro.
* El estatuto Update realiza el siguiente movimiento de información:
/*Programa que ejemplifica el uso del UPDATE*/
DEFINE VARIABLE v-articulo LIKE articulos.noart.

/*Nótese que para salir del ciclo repeat es necesario presionar


la tecla Esc, durante la captura de v-articulo*/

REPEAT:
UPDATE v-articulo.
FIND articulos WHERE articulos.noart =
v-articulo NO-ERROR.
IF AVAILABLE articulos THEN DO:
DISPLAY articulos.noart.
UPDATE articulos.nomart articulos.descart articulos.Cantidad.
END.
END.

CREACION DE REGISTROS

Estatuto CREATE

o Sintaxis: CREATE: record [NO-ERROR]

Este estatuto crea un registro nuevo vacío y la copia al buffer de registro. Si hay
valores iniciales estos son asignados aquí .

Es recomendable permitir actualizar la información inmediatamente después de


haber creado el registro.

/*Programa para crear Registros */


/*Nótese que para salir del ciclo de REPEAT es necesario presionar la tecla ESC o F4
durante la captura del PROMPT-FOR*/
REPEAT:
PROMPT-FOR articulos.noart.
FIND articulos WHERE articulos.noart = INPUT
articulos.noart NO-ERROR.
/* Si no existe se crea y se le asigna una llave solicitada */
IF NOT AVAILABLE articulos THEN DO:
CREATE articulos.
ASSIGN articulos.noart.
END.
UPDATE articulos EXCEPT articulos.noart
WITH 2 COLUMNS.
END.
Estatuto Message

Sintaxis (parcial):
MESSAGE mensaje { SKIP [ (n) ]} [ VIEW -
AS ALERT-BOX] [tipo-ventana][ BUTTONS
tipo-botones ] [ UPDATE variable ].

Notas sobre el estatuto MESSAGE:

El mensaje es desplegado en el área de mensajes si la ventana activa la tiene definida, de lo


contrario usa una caja de alerta.

Estatuto INSERT
Sintaxis: INSERT record [EXCEPT field...][NO-ERROR]

Este estatuto crea un nuevo registro de base de datos, despliega los valores iniciales para los
campos del registro permite capturar sus valores, y asigna dichos valores al registro.

Este estatuto es una combinación de los estatutos CREATE Y UPDATE.

/*Muestra como se utiliza el insert */


REPEAT:
INSERT articulos WITH 2 COL.
END.

BORRADO DE REGISTROS

Estatuto DELETE
o Sintaxis DELETE record [VALIDATE (condition, msg-expression)] [NO-
ERROR]

• El registro a borrar debe estar disponible en el buffer de registro.


• Este estatuto no mueve información, solamente borra al registro del buffer de
registro y le indica al manejador de base de datos que debe borrarse físicamente.

/*Programa para borrar registros*/


define variable sn as character format "x(1)" LABEL "¿Seguro que desea borrar archivo?
(s/n)".

define frame a
nomart skip
Cantidad skip
descart skip

with side-labels centered.


define frame b
sn
with side-labels centered 1 down.

repeat for articulos:


PROMPT-FOR nomart.
FIND articulos USING nomart no-error.
if not available articulos then do:
message "Número de artículo no existe, Favor de verificar".
end.
else do:

DISPLAY nomart Cantidad descart WITH frame a . /* SIDE-LABELS centered.*/


set sn with 1 down.
if sn = 's' then do:
message "Artículo Borrado con éxito".
delete articulos.
end.
else do:
message "Artículo No ha sido Borrado".
end.
end.
end.

U s o d e l Bro w s e

¿ Qué es un Browse ?
Es una lista de selección de registros de la base de datos.
o Sintaxis (parcial):

DEFINE BROWSE browse-name QUERY


query-name DISPLAY { column -list | {record
[ EXCEPT field...]}}
[browse-enable-phrase]

Estatuto Release
Verifica que un registro cumpla con un campo obligatorio y las definiciones únicas
del índice. Elimina el registro del buffer y lo asocia a la base de datos si lo ha de modificar.

FRAMES
¿Qué es un Frame?

o Un frame es un área rectangular que Progress usa para desplegar objetos a nivel de
campo.
Estatuto Enable

Valida entradas para uno o más niveles de campo y [widgets] del frame del child dentro
de un frame.

/*Programa que muestra el funcionamiento del QUERY, BROWSE, RELEASE,


FRAME, BOTTON */

DEFINE BUTTON upd-articulos LABEL "Cambios articulos".


DEFINE BUTTON exit-app LABEL "Exit".

DEFINE VARIABLE methRtn AS LOGICAL.


DEFINE VARIABLE curr-articulos AS ROWID.
DEFINE QUERY seq-articulos FOR articulos.
DEFINE BROWSE brow-articulos QUERY seq-articulos DISPLAY
noart nomart WITH 10 DOWN.

FORM
upd-articulos exit-app SKIP(1)
brow-articulos
WITH FRAME main-frame.

FORM
articulos EXCEPT descart
WITH FRAME curr-frame COLUMN 40.

OPEN QUERY seq-articulos FOR EACH articulos.


ON VALUE-CHANGED OF brow-articulos
DO:
DISPLAY articulos EXCEPT descart WITH FRAME
curr-frame SIDE-LABELS.
curr-articulos = ROWID(articulos).
END.

ON CHOOSE OF upd-articulos
DO: /* TRANSACTION */
FIND articulos WHERE ROWID(articulos) = curr-articulos
EXCLUSIVE-LOCK.
UPDATE articulos WITH FRAME cust-frame VIEW-AS
DIALOG-BOX
TITLE "articulos Update".
methRtn = brow-articulos:REFRESH().

DISPLAY articulos EXCEPT descart WITH


FRAME curr-frame
SIDE-LABELS.
RELEASE articulos.
END.
ENABLE ALL WITH FRAME main-frame.
APPLY "VALUE-CHANGED" TO brow-articulos.
PAUSE 0 BEFORE-HIDE.

WAIT-FOR CHOOSE OF exit-app OR WINDOW-CLOSE


OF DEFAULT-WINDOW.

/* Programa que ejemplifica el uso del ENABLE*/

DEFINE BUTTON btn1 SIZE-PIXELS 80 BY 50 LABEL “1”.


DEFINE BUTTON btn2 SIZE-PIXELS 80 BY 50 LABEL “2”.
DEFINE BUTTON btn3 SIZE-PIXELS 80 BY 50 LABEL “3”.
DEFINE BUTTON btn4 SIZE-PIXELS 80 BY 50 LABEL “4”.
DEFINE BUTTON btn-done SIZE-PIXELS 100 BY 70 LABEL
“Done”.
DEFINE FRAME f-buttons btn1 btn2 SKIP (1)
btn3 btn4 SKIP (2)
btn-done
WITH 2 COLUMNS.
ENABLE btn1 btn2
btn3 btn4
btn-done WITH FRAME f-buttons.
WAIT-FOR CHOOSE OF btn-done IN FRAME f-buttons.

Manejo De Errores
Procesamiento de errores

El procesamiento de los errores de Progress depende del tipo de error generado. Progress
reconoce los siguiente errores:
• Error generado por procedimiento.
• Una tecla predefinida de ERROR.
• Una tecla predefinida de ENDKEY.
• La tecla de END-ERROR.
• Una falla del sistema o software.
Tipo de Error Acción
* Error de procedimiento * UNDO RETRY
Presionar la tecla

* UNDO RETRY
* predefinida de ERROR.

* UNDO LEAVE
* Presionar la tecla

predefinida ENDKEY * UNDO LEAVE ó


UNDO RETRY

* Presionar la tecla de
END-ERROR. * Deshace la transacción
actual y corre el proc. de
inicio.
* Presionar la tecla de
STOP. * Deshace cualquier transacc.
incompleta para todos los
* Cuando falle el sistema usuarios del sistema.

El procesamiento de error es un servicio asociado a bloques.


La propiedad de error puede ser manipulada usando la frase NO ERROR en los
encabezados de los bloques:

o FOR EACH.
o DO.
o REPEAT.

El procesamiento default es deshacer y reintentar el proceso del bloque (UNDO, RETRY).


Side-Labels

El uso de SIDE-LABELS coloca la etiqueta de las variables a su izquierda en lugar de


colocarlas como cabeceras de columnas en la parte superior del marco. Cuando no se
especifican las etiquetas los nombres de las variables actúan como etiquetas.

DEFINE VAR var1 AS DECIMALS 1.


DEFINE VAR var2 AS CARÁCTER FORMAT “X(5)” CASE_SENSITIVE:
DEFINE VAR arr AS INTEGER extent 3.
Define var var4 as char format “Q 9” extent 4 initial [1, 2, 3, 4].
Def var var5 as logical format “in/out” initial “in”.
Assign var1 = 3.1
var2 = “HOLA”
arr[1] = 1
arr[2] = 2
arr[3] = 3.
Display “aqui están los valores de hoy: “
var1 FORMAT “99.99”
var2
arr[1] arr[2] arr[3]
arr4[1] var4[2]
var5
with side-labels.

Como ordenar el contenido de un marco en columnas

n COLUMN

Con esta opción se presentan los elementos del marco en una o más columnas. En este caso
PROGRESS usa la opción SIDE-LABELS por omisión, tomando en como etiquetas los
nombres de las variables.

DEFINE VAR var1 AS DECIMALS 1.


DEFINE VAR var2 AS CARÁCTER FORMAT “X(5)” CASE_SENSITIVE:
DEFINE VAR arr AS INTEGER extent 3.
Define var var4 as char format “Q 9” extent 4 initial [1, 2, 3, 4].
Def var var5 as logical format “in/out” initial “in”.
Assign var1 = 3.1
var2 = “HOLA”
arr[1] = 1
arr[2] = 2
arr[3] = 3.
Display “aquí están los valores de hoy: “
var1 FORMAT “99.99”
var2
arr[1] arr[2] arr[3]
arr4[1] var4[2]
var5
with 1 column..

Cuando se usa la opción n COLUMNS se debe tomar en cuenta el espacio que se necesita
para mostrar los datos en cada columna. Si los datos que se despliegan ocupan más espacio
que del que se dispone para cada columna, PROGRESS trunca los datos.

Como usar la opción NO-BOX

El uso de esta opción elimina el marco dentro del cual se despliegan los elementos.

/*Ejemplo:*/

DEFINE VAR var1 AS DECIMALS 1.


DEFINE VAR var2 AS CARÁCTER FORMAT “X(5)” CASE_SENSITIVE:
DEFINE VAR arr AS INTEGER extent 3.
Define var var4 as char format “Q 9” extent 4 initial [1, 2, 3, 4].
Def var var5 as logical format “in/out” initial “in”.
Assign var1 = 3.1
var2 = “HOLA”
arr[1] = 1
arr[2] = 2
arr[3] = 3.
Display “aquí están los valores de hoy: “
var1 FORMAT “99.99”
var2
arr[1] arr[2] arr[3]
arr4[1] var4[2]
var5
with 2 columns NO-BOX.

Uso de la opción CENTERED


La opción centered se emplea para centrar el marco de despliegue dentro de la ventana de
PROGRESS.

/*Ejemplo*/

DEFINE VAR var1 AS DECIMALS 1.


DEFINE VAR var2 AS CARÁCTER FORMAT “X(5)” CASE_SENSITIVE:
DEFINE VAR arr AS INTEGER extent 3.
Define var var4 as char format “Q 9” extent 4 initial [1, 2, 3, 4].
Def var var5 as logical format “in/out” initial “in”.
Assign var1 = 3.1
var2 = “HOLA”
arr[1] = 1
arr[2] = 2
arr[3] = 3.
Display “aquí están los valores de hoy: “
var1 FORMAT “99.99”
var2
arr[1] arr[2] arr[3]
arr4[1] var4[2]
var5
with 2 columns centered.

Como colocar en una posición exacta el marco de despliegue

Con las opciones ROW y COLUMN se pueden colocar el marco de despliegue en cualquier
posición de la ventana.

/*Ejemplo*/
DEFINE VAR var1 AS DECIMALS 1.
DEFINE VAR var2 AS CARÁCTER FORMAT “X(5)” CASE_SENSITIVE:
DEFINE VAR arr AS INTEGER extent 3.
Define var var4 as char format “Q 9” extent 4 initial [1, 2, 3, 4].
Def var var5 as logical format “in/out” initial “in”.
Assign var1 = 3.1
var2 = “HOLA”
arr[1] = 1
arr[2] = 2
arr[3] = 3.
Display “aquí están los valores de hoy: “
var1 FORMAT “99.99”
var2
arr[1] arr[2] arr[3]
arr4[1] var4[2]
var5
with 2 columns column 15 row 5.

Como asignarle un título al marco

Para asignarle un título al marco se usa la opción TITLE. El título se mostrará en la parte
superior del marco, dentro de la ventana de despliegue de PROGRESS.

DEFINE VAR var1 AS DECIMALS 1.


DEFINE VAR var2 AS CARÁCTER FORMAT “X(5)” CASE_SENSITIVE:
DEFINE VAR arr AS INTEGER extent 3.
Define var var4 as char format “Q 9” extent 4 initial [1, 2, 3, 4].
Def var var5 as logical format “in/out” initial “in”.
Assign var1 = 3.1
var2 = “HOLA”
arr[1] = 1
arr[2] = 2
arr[3] = 3.
Display “aquí están los valores de hoy: “
var1 FORMAT “99.99”
var2
arr[1] arr[2] arr[3]
arr4[1] var4[2]
var5
with 2 columns centered row 3 title “mi marco”.

Como colocar la presentación de los datos en un marco.

Con la frame phrase se pueden indicar el aspecto general del marco, como por ejemplo su
ubicación dentro de la ventana. También se controla el aspecto de los campos dentro del
marco al declarar los parámetros del marco tales como SIDE-LABELS y n COLUMNS.
Así mismo, se puede controlar el aspecto y la localización exacta de los elementos del
marco usando format phrase para cada uno de los elementos dentro del marco.

Siempre que se despliegan variables, constantes, expresiones o campo de base de datos,


PROGRESS sigue las siguientes reglas:
• Si el marco utiliza etiquetas para las columnas, PROGRESS calcula el ancho de las
columnas tomando como referencia la etiqueta mayor de las columnas o el mayor
de los datos. Utiliza el tipo de dato y las etiquetas definidas en el diccionario de
datos o en el estatuto DEFINE FRAME o DISPLAY.
• Los elementos están colocados en una posición dentro del marco. Si se hace
referencia a la misma variable o campo de base de datos en el mismo marco,
PROGRESS los despliega en la misma posición dentro del marco.
• Las etiquetas de columna de matrices incluyen un subíndice dentro de corchetes,
pero solamente si PROGRESS conoce el subíndice en el momento de compilar (sí
el subíndice no es variable).

Control de justificación y ubicación de los elementos

La justificación de los elementos dentro del marco (variable o campos de base datos)se
pueden controlar usando una de las siguientes format phrase:

Para colocar un elemento Usar la format phrase


Al final de alguna columna dentro del TO n
marco
Justificado a la izquierda en una posición AT COLUMN col ROW row
particular column / row dentro del marco
Alineado con el punto en una posición COLON col o AT COLUMN col ROW
particular row COLON-ALIGNED
Alineado a la derecha en una posición AT COLUMN col ROW row RIGHT-
particular column/row dentro del marco ALIGNED
Alineado a la izquierda en una posición AT COLUMN col ROW row LEFT-
particular column/row dentro del marco. ALIGNED

El empleo de la opción TO para especificar el extremo izquierdo del elemento

Con el empleo de la opción TO de la format phrase se pueden colocar los elementos dentro
de un marco para que se desplieguen en una columna determinada. En el siguiente ejemplo
se nota que no es necesario alinear los elementos a la derecha, debido a que los elementos
de datos de tipo CARÁCTER y LOGICAL están lineados dentro de sus campos.

/*Ejemplo/

define var dec1 as decimal decimals 1 initial 3.1.


def var int1 as integer initil 0.
Define var int-arr1 as integer extent 3 initial [1, 2, 3] format “9”.
Def var dia1 as date.
Def var char1 as format “x(5)” case-sensitive initial “hola”.
Def var char-arr1 as char format “q9” extent 4 initial [1, 2, 3, 4].
Def var logl as logical format “In/out” initial “in”.

Assign dia1 = TODAY.

DISPLAY “aqui estaán los valores de hoy:” TO 40


dec1 format “99.99” TO 40
int1 format “9” TO 40
dia1 TO 40
char1 TO 40
char-arr1[1] TO 40
char-arr[2] TO 40
char-arr[3] TO 40
log1 TO 40
WITH SIDE-LABELS CENTERED.

Colocar usar las opciones AT y COLON

Con la opción AT de la format phrase, se puede indicar un lugar exacto para cada elemento
dentro del marco. También se puede indicar el alineamiento, ya sea al a izquierda, derecha
o los dos puntos para separar los datos de su etiqueta en la posición indicada con la opción
AT. Si se desea, se pueden alinear los separadores dos puntos de los elementos dentro del
marco usando la opción COLON en la format phrase.

La palabra calve AT se refiere al marco y no a la ventana. Para cambiar la ubicación del


marco dentro de la ventana se usan las palabras clave CENTERED o ROW y COLUMN
(después de la palabra clave WITH).

/*Ejemplo*/
def var dec1 as decimals 1 initial 3.1.
def var int1 as int initial 0.
Def var int-arr1 as int 3 initial [1, 2, 3] format “9”.
Def var dea1 as date.
Def var char1 as char format “x(5)” case-sensitive initial “Hola”.
Def var char-arr1 as char format “Q9” Extent 4 initial [1, 2, 3, 4].
Def var log1 as logical format “ In / out” initial “in”.

Assign dia1 = today.


Display “aqui están los valores de hoy:” at column 30 row 1 right-aligned
dec1 format “99.99” at column 30 row 2 right-aligned
int1 format “9” at column 30 row 3 right-aligned
int-arr[1] at column 30 row 4 right-aligned
int arr[2] at column 30 row 5 right-aligned
int-arr[3] at column 30 row 6 right-aligned
dia1 at column 30 row 7 left-aligned
char1 at column 30 row 8 leftt-aligned
char-arr[1] at column 30 row 9 colon-aligned
char-arr[2] at column 30 row 10 colon-aligned
char-arr[3] colon 30
log1 colon 30
with side-labels centered.

Como definir un marco

Con el uso de la frame-phrase junto con el uso de estatuto DISPLAY u otros estatutos se
pueden definir objetos- marco que posteriormente pueden ser usados en estatutos que
despliegan datos. El estatuto DEFINE-FRAME le da un nombre a un marco y define sus
características de despliegue. Posteriormente se pueden desplegar los elementos dentro del
marco al hacer referencia a él a través del nombre indicado en éste estatuto.

Sintaxis
DEFINE-FRAME nom-marco [form-item][frame-phrase]

Form-item
field[format-phrase]
variable [at-phrase]
SPACE[n]
SKIP[n]

Como hacer referencia a un marco con nombre

Una vez que se haya definido un marco, se puede usar el siguiente formato para frame-
phrase junto con el estatuto DISPLAY:
DISPLAY ..... UIT[FRAME nom-marco]

Como usar un marco definido

Existen varias razones para usar marcos con nombre. Se tiene control explícito sobre las
cuales los mismos elementos de marco se muestran; una vez creada la plantilla del marco,
se puede usar par desplegar los mismo elementos en el mismo formato en diferentes lugares
del código, sin tener que repetir la definición del despliegue; se puede reusar la definición
del marco en más de un procedimiento; se puede definir y usar más de un marco en un
procedimiento, mostrando los mismos campos diferentes veces en diferentes posiciones en
la misma pantalla.

Si se usa el marco por omisión que proporciona PROGRESS para el bloque de


procedimiento, no se puede lograr la salida deseada. Si se indica el mismo nombre de la
variable más de una vez en el mismo marco, PROGRESS despliega todas las ocurrencias
de la variable en la misma posición.

/*Ejemplo*/
Def var nombre as char format “x(10)” label “Nombre” initial “Juan”.
Def var appelido as char format “x(15)” label “Apellido” initial “Pérez”.
Def var cia as char format “x(15)” label “compañía ” initial “PROGRESS”.
Display nombre at row1 column 8
apellido at row 1 column 15
cia row 1 column 25
with centered.
Display
nombre at row 5 column 8
“trabaja en “ at row 5 column 15
cia at row 5 column 25
with no-labels centered no-box row 2.

Para obtener las salida deseada, se utilizan dos marcos, uno para desplegar las variables en
una columna y otra para mostrarlas en forma de oración. Se usan dos DISPLAY para
referirse a esos marcos, indicando cual variable va dentro de cual parco para un despliegue
determinado.

/*Ejemplo/
Def var nombre as char format “x(10)” label “Nombre” initial “Juan”.
Def var apellido as char format “x(15)” label “Apellido” initial “Pérez”.
Def var cia as char format “x(15)” label “compañía ” initial “PROGRESS”.

Define frame f-nombre


nombre colon 15
apellido colon 15
cia colon 15
with side-labels row 1 centered.
Define frame f-cia
nombre at row 2 column 8
“ trabaja en ” at row 2 column 15
cia at row 2 column 25
with no-labels centered no-box.
Display nombre apellido cia with frame f-nombre.
Display nombre cia with frame f-cia.

También podría gustarte