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 M:1 Relación de 1:M 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 Ad.Mig. Ma.Piat. Date USA ESP ITA USA 999 888 777 666 IBD CyD CyD BdD AW RM RM 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 1 2 3 Marcos Lucas Marta Cursos Inglés Contabilidad, Informática 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 2 3 Marcos Lucas Marta Tabla B Código 1 2 2 3 3 Curso Inglés Contabilidad Informática Inglés 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. 1 2 3 4 2 6 3 2 3 6 Nombre Departamento Años Juan Pedro Sonia Verónica Pedro Contabilidad Sistemas I+D Sistemas Contabilidad 6 3 1 10 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 1 2 3 4 Nombre Juan Pedro Sonia Verónica Tabla B Código Departamento 2 3 6 Dpto. I+D Sistemas Contabilidad Código Empleado 1 2 3 4 2 Tabla C Código Departamento 6 3 2 3 6 Años 6 3 1 10 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 1 2 3 Marcos Lucas Marta Curso Informática Inglés Contabilidad Aula Aula A Aula B 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 1 2 3 Marcos Lucas Marta Curso Informática Inglés Contabilidad Tabla B Curso Aula Informática Inglés Contabilidad Aula A Aula B 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 Cuadrado Cuadrado Círculo Círculo Círculo Rojo Azul Azul Blanco Azul Azul Grande Grande Mediano Mediano Pequeño 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 Cuadrado Círculo Círculo Grande Pequeño Mediano Pequeño Color Figura Color Cuadrado Cuadrado Círculo Círculo Rojo Azul Blanco 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: Reutilizables Longitud del código Alcance Funcionamiento Procedimiento interno Múltiples veces dentro del procedimiento principal. Procedimiento Externo Desde el procedimiento principal así como desde otros procedimientos externos. Relativamente corto Cualquier longitud 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) 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 FUNCION Help Run SHIFT + TECLA CTRL + TECLA F3 F4 Open Revisar New sintaxis Ventana de procedimiento nueva F6 Save F7 F8 F9 Buffer Close Encontrar Siguiente siguiente Debug Guardar Buffer Encontrar Como Anterior anterior Teclas de función disponibles en el editor de procedimientos de PROGRESS TECLA X CTRL.+ Cut C Copy V Paste F Find R G Replace Go to line L List Buffers E Mensajes 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 Variables Definen una acción o proceso Guardan datos en memoria para su procesamiento Elementos de base de datos Operadores Guardan datos en la base de datos Símbolos que ejecutan operaciones matemáticas o comparaciones Combinación de variables, campos de base de datos y operadores, que juntos producen algún valor. Comentarios, o referencias especiales, referencias tales como archivos include. Unidad de ejecución compuesta de una o más instrucciones. Grupo de declaraciones que son parte de la misma rama de condición o de un ciclo Están predefinidas, están dentro de un proceso, tales como cálculos o conversiones 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. Expresiones Símbolos especiales Procedimientos Blocks Funciones Obetos de interface de usuario Símbolos especiales En PROGRESS se utilizan los siguientes símbolos en sus procedimientos: Símbolo /* */ * Punto ( . ) Dos Puntos ( : ) Papel Encierran un comentario Comodín, sustituye a cualquier grupo de caracteres • 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 Terminación de Block, encabezado o etiqueta de Block. Introduce una atributo a la sintaxis de traducción ? ~ “” o ‘‘ {nombre-archivo} {} [] {&} Introduce un atributo a un objeto o método Designa un valor desconocido Causa que el siguiente carácter sea tratado como literal Encierra a una cadena de caracteres 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 Object Events Trigger Handle Attribute Method Descripción Elemento básico o componente de la GUI Acción emprendida por el usuario sobre algún objeto Respuesta programada para un evento. Indicador nombrado para un objeto. Alguna característica de un objeto ya sea que se puede leer o asignar diferente valor 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 Keyword Parametre(s) and Option(s) Phrase(s) Expression Papel Es el verbo principal de la declaración, designa la acción o el proceso que se ha de ejecutar Información adicional que indica que algo esta cambiando la acción o proceso designado por la declaración. Algún elemento común del lenguaje significa que pueden aparecer en algunas declaraciones de PROGRESS Es una combinación de variables, constantes y operadores que evalúan a un elemento de Terminator la sintaxis. 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 DISPLAY Expresión [ format-phrase ] SPACE [(N)] SKIP [(n)] [frame-phrase] En la siguiente tabla se indica el significado de cada uno de los parámetros que se emplean con el estatuto DISPLAY: Parámetro Expresión Format-phrase Frame-phrase SPACE [(N)] SKIP [(N)] Designa Lo que se despliega. Puede ser una variable, una constante o un campo de base de datos Como se despliega el dato Características del marco que contiene los elementos desplegados. 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. 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) AND OR NOT Operación Y lógico, produce un valor verdadero solamente si ambos operadores son verdaderos. O lógico produce un valor verdadero si uno de los operandos es verdadero. Negación lógica niega el valor de un operando lógico. Operadores de comparación Símbolo del operador = <> > < >= <= Palabra clave EQ EN GT LT GE LE BEGINS MATCHES CONTAINS Designa Igualdad Desigualdad Mayor que Menor que Mayor o igual que Menor o igual que Revisa si un string comienza con otro string Compara un string con un patrón 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 CONNECTED Sintaxis CONNECTED (“nom-log base datos”) NUM-DBS NUM_DBS DBNAME DBNAME LDBNAME LDBNAME(“logical-name” | integer) PDBNAME PDBNAME(“logical-name” | integer) DBTYPE DBTYPE(“logical-name” | integer) Regresa Verdadero si la conexión es exitosa Número de base de datos conectadas Nombre físico o lógico de la base de datos conectada, dependiendo del nombre usado par ala conexión Nombre lógico de la base de datos conectada Nombre físico de la base de datos conectada 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 OPSYS OPSYS OS-COMMAND OS-COPY OS-APPEND OS-RENAME OS-DELETE OS-CREATE-DIR OS-GETENV Descripción Verifica en que sistema operativo esta corriendo el programa OS-COMMAND[SILENT] Sale al sistema operativo y ejecuta el comando-y-parámetros comando indicado. OS-COPY(fuente destino Copia un archivo OS-APPEND(fuente destino) Fusiona dos archivos OS-RENAME(oldname new Cambia el nombre a un archivo name) OS-DELETE(nom-archivo) Elimina un archivo OS-CREATE-DIR(nom-dir) Crea un directorio OS-GETENV(en-var-name) Obtiene información de las variables OS-DRIVES OS-ERROR OS-DRIVES OS-ERROR Reporta los drives disponibles 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 STRING BEGINS MATCHES LENGTH INDEX R-INDEX SUBSTRING Función SUBSTRING Statement CAPS LC FILL TRIM LEFT-TRIM RIGHT-TRIM OVERLAY Sintaxis STRING(valor) string1 BEGINS string2 string MATCHES patron Operación Convierte otro tipo de dato en string. Revisa si string1 comienza con string2. 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(string) Regresa el número de caracteres o bytes contenidos en string. INDEX(fuente, Regresa la posición del string destino en el destino[,inicio]) string fuente. R-INDEX(fuente, Igual que index, pero ejecuta la búsqueda destino[,inicio]) de derecha a izquierda. SUBSTRING (string, Extrae un substring de una longitud posición, [longitud]) comenzando en la posición señalada del string. SUBSTRING (destino, Substituye el contenido de una variable o posición, [longitud]) = string campo destino con el string, iniciando en la posición señalada en destino. CAPS (string) Convierte un string en mayúsculas. LC (string) Convierte un string en minúsculas. FILL (string,n) Crea un string del string de entrada, repetido n veces. TRIM (string, [trim-chars]) Corta los primeros y últimos espacios de string. LEFT-TRIM (string, [trimCorta los espacios iniciales. chars]) RIDTH-TRIM (string, [trim- Corta los últimos espacios. chars]) 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 LOOKUP Sintaxis LOOCKUP (string, list[,delimitador]) ENTRY (index, list[delimitador]) NUM-ENTRIES (list([,delimitador])) ENTRY NUM-ENTRIES Operación La posición del string en lista. El carácter es índice en el string. Número de elementos en la 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 Today Date Day Month Weekday Year ( ) Time ( ) Sintaxis Operación TODAY Regresa la fecha actual del S. O. DATE(mes, día, año /fecha-string) Convierte un string a tipo date. DAY (fecha-expresión) Regresa el número correspondiente al día. MONTH(fecha-expresión) Regresa el número correspondiente al mes. WEEKDAY(fecha-expresión) Regresa el string correspondiente al día. YEAR(fecha-expresión) Regresa el número correspondiente al año. 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 INTEGER Sintaxis INTEGER(expresión) DECIMAL DECIMAL(expresión) TRUNCATE TRUNCATE(decimal, numdec) Num1 MODULE num2 MODULO operación Convierte a la expresión en enteros tipo fecha. Convierte la expresión a dato tipo decimal. Trunca num-dec de decimal 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 { OTHERWISE { } END [ CASE] } WHEN... /* 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 NEXT [etiqueta] LEAVE Especifica... Va directamente al final del block e inicia el procesamiento de su siguiente interacción. 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 o o o o o o o Filosofía de movimiento de datos. Uso de FIND * Uso de Queries. Modificación de información. Creación de registros . Borrado de registros. Uso del Browse. 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 ERROR] • • DELETE record [VALIDATE (condition, msg-expression)] [NO- 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 * Error de procedimiento Presionar la tecla * predefinida de ERROR. * Presionar la tecla predefinida ENDKEY * Presionar la tecla de END-ERROR. * Presionar la tecla de STOP. * Cuando falle el sistema Acción * UNDO RETRY * UNDO RETRY * UNDO LEAVE * UNDO LEAVE ó UNDO RETRY * Deshace la transacción actual y corre el proc. de inicio. * Deshace cualquier transacc. incompleta para todos los 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 Al final de alguna columna dentro del marco Justificado a la izquierda en una posición particular column / row dentro del marco Alineado con el punto en una posición particular Alineado a la derecha en una posición particular column/row dentro del marco Alineado a la izquierda en una posición particular column/row dentro del marco. Usar la format phrase TO n AT COLUMN col ROW row COLON col o AT COLUMN col ROW row COLON-ALIGNED AT COLUMN col ROW row RIGHTALIGNED AT COLUMN col ROW row LEFTALIGNED 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:” dec1 format “99.99” int1 format “9” dia1 char1 char-arr1[1] char-arr[2] char-arr[3] log1 WITH SIDE-LABELS CENTERED. TO 40 TO 40 TO 40 TO 40 TO 40 TO 40 TO 40 TO 40 TO 40 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 framephrase 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.