Visual FoxPro y Firebird SQL

March 26, 2018 | Author: Jose Roberto Olivas Mendoza | Category: Computer File, Server (Computing), Table (Database), Sql, Password


Comments



Description

Visual FoxPro y Firebird SQLÍndice Introducción............................................... PARTE 1: Cliente/Servidor.................................. Servidores de archivos compartidos y Cliente/Servidor... Sistemas Cliente/Servidor............................... Como funciona Cliente/Servidor.......................... ¿Cuales son las ventajas de usar Cliente/Servidor?...... Como mostrar los datos al usuario....................... Manera eficiente de enviar/recibir datos del Servidor... Claves primarias........................................ Relaciones.............................................. Concurrencia............................................ Transacciones........................................... Diferencia de terminología.............................. PARTE 2: Firebird.......................................... ¿Qué es Firebird?....................................... Tipos de Servidor....................................... Recursos utilizados..................................... Plataformas y versiones para el Servidor................ Plataformas y versiones para el Cliente................. Características principales de Firebird................. Conectividad............................................ Herramientas............................................ Instalando el Servidor.................................. Instalando el Cliente................................... Instalando el driver ODBC............................... Verificando la instalación.............................. El archivo HOST......................................... El archivo ALIASES.CONF................................. El archivo FIREBIRD.CONF................................ El archivo SECURITY2.FDB................................ Como evitar la corrupción de las Bases de Datos......... Como corromper una Base de Datos........................ Dialectos SQL (SQL dialect)............................. Tamaño de la página (page size)......................... Conjunto de caracteres (character set).................. Scripts................................................. El usuario SYSDBA....................................... Agregando nuevos usuarios........................... Borrando usuarios................................... Listando todos los usuarios......................... Cambiando la contraseña de un usuario............... Nombres de los usuarios............................. Contraseñas (passwords) de los usuarios............. Como proteger las Bases de Datos........................ 4 5 5 5 6 6 7 7 9 9 9 10 10 11 11 11 11 12 12 12 13 14 14 14 15 15 16 16 17 17 17 17 18 18 18 19 20 21 21 21 22 22 22 22 -1- Privilegios de acceso a una Base de Datos............... Privilegios......................................... Privilegios sobre columnas (campos)................. Ejemplos............................................ Roles................................................... Creando un rol...................................... Eliminando un rol................................... Ejemplos............................................ Comandos del Firebird más utilizados.................... Crear una Base de Datos............................. Conectarse a una Base de Datos...................... Crear un dominio.................................... Ver los dominios existentes......................... Ver la estructura de un dominio..................... Crear una tabla..................................... Borrar una tabla de la Base de Datos................ Ver todas las tablas de una Base de Datos........... Ver la estructura de una tabla...................... Agregarle una clave primaria a una tabla............ Agregarle una columna a una tabla................... Borrar una columna de una tabla..................... Agregarle filas a una tabla......................... Borrar algunas filas de una tabla................... Borrar todas las filas de una tabla................. Modificar columnas de una tabla..................... Consultar las filas de una tabla.................... Consultar las filas cuando se conoce una subcadena.. Consultar solamente los que no están repetidos...... Consultar los datos ordenadamente................... Contar la cantidad de filas de una tabla............ Sumar una columna numérica.......................... Hallar el promedio de una columna numérica.......... Hallar el valor mínimo de una columna numérica...... Hallar el valor máximo de una columna numérica...... Agrupar filas....................................... Ponerles condiciones a las filas agrupadas.......... Relacionar dos tablas............................... Ordenar una tabla................................... El programa ISQL.EXE.................................... El programa GBAK.EXE.................................... Ejemplo 1........................................... Ejemplo 2........................................... El programa NBACKUP.EXE................................. Para hacer un backup completo....................... Para hacer un backup incremental.................... Para restaurar un backup completo................... Para restaurar un backup incremental................ Usando SQL Manager...................................... ¿Por qué usar un administrador gráfico?............. La Base de Datos Employee........................... Registrando una Base de Datos....................... ¿Qué son los dominios?.............................. ¿Cómo se crea un nuevo dominio?..................... ¿Qué son las tablas?................................ ¿Qué son las vistas?................................ ¿Qué son los procedimientos almacenados?............ 22 23 23 23 24 24 24 24 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 27 27 28 28 28 29 30 30 30 31 31 31 31 32 32 32 32 34 35 36 37 37 -2- ¿Qué son las UDFs?.................................. ¿Qué son los desencadenantes?....................... ¿Qué son las excepciones?........................... ¿Qué son los generadores?........................... ¿Para qué se usa SET TERM?.......................... ¿Cuándo se usan los : delante del nombre de una Variable?........................................... Integridad Referencial.................................. La restricción foreign key.......................... Indices................................................. Transacciones........................................... ¿Por qué se usan las transacciones?................. Una transacción, muchos pedidos..................... Transacciones y MGA................................. Grabación de datos.................................. Datos desechados.................................... Problemas con transacciones......................... Solución a los problemas............................ PARTE 3: Visual FoxPro y Firebird.......................... ¿Qué es DSN?............................................ Para crear un DSN................................... Para conectarse sin DSN............................. Una clase para usar con Bases de Datos SQL.............. Función para conectarse a una BD usando DSN......... Función para conectarse a una BD sin usar DSN....... Función para desconectarse de una (o todas) BD SQL.. Procedimiento para hallar el nombre del driver...... Función para ejecutar comandos SQL.................. Función para verificar si hay una conexión activa... Descargar las clases................................ Programas en Visual FoxPro que usan Firebird............ Ejemplo Nº 1. Usando la instrucción SELECT.......... Ejemplo Nº 2. Una pequeña aplicación administrativa. Conclusión................................................. 38 39 40 40 41 41 42 42 44 45 45 46 46 46 47 48 48 49 49 50 50 50 51 52 52 52 53 54 54 54 54 56 58 -3- Visual FoxPro y Firebird SQL Introducción ¿Por qué usar Firebird con Visual FoxPro? ¿Por qué Firebird gusta tanto? Responder a esas preguntas es el objetivo de este documento. Para conseguirlo se debe empezar desde el principio, es decir desde lo que es Cliente/Servidor, las características de Firebird y como integrarlo con Visual FoxPro. Para que todo sea más fácil de entender, este documento se divide en tres partes: 1. Cliente/Servidor. Donde se explican algunos conceptos básicos 2. Firebird. Donde se explican sus principales características 3. Visual FoxPro y Firebird. Donde se explica como usarlos juntos Visual FoxPro es un lenguaje fantástico, tiene muchísimas capacidades de las cuales carecen otros lenguajes, se pueden realizar aplicaciones realmente muy buenas usándolo, es más, resulta prácticamente imposible pensar en una aplicación del tipo administrativo o comercial que no pueda ser realizada exitosamente y en poco tiempo con él. Firebird es un motor de bases de datos SQL muy liviano, muy poderoso, muy fácil de usar y totalmente gratis tanto para uso privado como comercial. Y se lo puede integrar perfectamente con Visual Foxpro. Por lo tanto, es muy lógico que estos dos colosos trabajen juntos. Sin embargo, hasta este momento no había literatura al respecto, quienes usaron Visual Foxpro con Firebird están más que conformes con el rendimiento obtenido pero todo lo tuvieron que aprender desde cero. Cuando finalices de leer este documento te habrás ahorrado un montón de tiempo. En este documento se supone que ya has programado en Visual FoxPro y lo conoces más o menos bien. Está orientado a enseñarte las diferencias que tiene con el Firebird, las características de este último y como hacerlos trabajar conjuntamente. -4- Parte 1. Cliente/Servidor Servidores de archivos compartidos y Cliente/Servidor Mediante el uso de servidores de archivos compartidos es como Visual FoxPro, Clipper, DBase, Paradox, Access y otros lenguajes manejan los datos. En este caso el servidor de archivos es una característica del Sistema Operativo, no del lenguaje. Es el Windows quien te da acceso a los archivos que están en una carpeta compartida. Un programa que se encuentra en otra computadora de la red lee esos archivos en la memoria de su propia computadora y graba datos en ellos como si estuvieran en su disco local. El gran problema con este aprovechamiento es la fragilidad de los datos, que pueden dañarse o corromperse. Es bastante frecuente encontrarse con tablas o índices dañados. Un corte de la energía eléctrica o un “reset” en cualquiera de las computadoras de la red puede corromper las tablas o los índices. Además, como las carpetas son compartidas algunos humanos (por intención o por ignorancia) pueden borrar o modificar los archivos que en ellas se encuentran. En cambio en un sistema Cliente/Servidor los clientes (aunque estén localizados en la misma computadora que el Servidor) nunca tocan los datos directamente, sino que envían mensajes al Servidor diciéndole lo que quieren hacer. El Servidor procesa esos mensajes y ejecuta los pedidos usando su propio código y administrando el espacio en el disco duro, en forma independiente del Sistema Operativo. Un humano que esté sentado frente a otra computadora de la red y que tuviera la (mala) intención de modificar una Base de Datos necesitará conocer: • el nombre de la computadora donde se encuentra la Base de Datos • el motor utilizado (Firebird, Postgre, MySQL, etc.) • la carpeta donde se encuentra la Base de Datos • el nombre de la Base de Datos • el nombre de un usuario de esa Base de Datos • la contraseña de ese usuario • algunos conocimientos de programación para poder conectarse a ella En un sistema de archivos compartidos, es muy fácil que cualquiera consiga acceso a la carpeta compartida y a partir de allí ya puede borrar o modificar todas las tablas y eso es ¡¡¡un peligro potencial muy grave!!! Sistemas Cliente/Servidor Un sistema Cliente/Servidor (tal como Firebird) está compuesto por dos módulos de software diseñados para comunicarse entre sí usando el mismo protocolo de comunicación. El Cliente envía mensajes al Servidor pidiéndole algo y éste responde al pedido. Inclusive pueden estar en distintos Sistemas Operativos, por ejemplo el Servidor en una computadora con Linux y el Cliente en una computadora con Windows. El protocolo recomendado para usar con Firebird es TCP/IP. -5- no una copia. de los datos que se encuentran en el Servidor. En Firebird: La APLICACIÓN envía un pedido al CLIENTE quien lo envía al SERVIDOR El SERVIDOR envía la respuesta al CLIENTE quien la envía a la APLICACIÓN La aplicación puede ser un sistema de Contabilidad. de Sueldos. etc. Su misión es recibir pedidos de la aplicación (Contabilidad. etc. Inclusive a los usuarios se los puede agrupar en “roles” con lo cual se determina qué pueden hacer y que no. - -6- . APLICACIÓN (Contabilidad. Además. Recuerda que no hay carpetas compartidas. En cambio en un sistema de archivos compartidos (el utilizado por las tablas . Aunque los usuarios sean muchos. Los datos que viajan por la red son pocos. Sueldos. para usarla hay que especificar el nombre del usuario y la contraseña. los que utilizan las aplicaciones. de Facturación. una copia. Facturación.DBF) son los datos originales. Pero esos datos son una imagen. Otro programa.DBF) que tenga la misma cantidad de usuarios.) Pedido CLIENTE Pedido SERVIDOR Respuesta Respuesta ¿Cuales son las ventajas de usar Cliente/Servidor? Mayor seguridad.) y enviar esos pedidos al Servidor y recibir los datos que éste le provee para devolverlos a la aplicación. Sueldos. Tesorería. Su misión es “escuchar” los mensajes que llegan a un puerto de esa computadora (el puerto por defecto para Firebird es el 3050) y luego insertar / borrar / modificar / enviar / procesar los datos pedidos y enviar la respuesta correspondiente. el tráfico por la red siempre es mucho menor que usando un sistema de archivos compartidos (tablas . etc. Mayor rapidez. eso incrementa la velocidad. llamado Cliente. Ventas. - Este es un concepto que se debe entender muy bien: los datos que recibe el Cliente (y que luego envía a la aplicación) son una copia de los datos del Servidor.Como funciona Cliente/Servidor Un programa llamado Servidor se instala en una computadora. cada Base de Datos tiene sus propios mecanismos de seguridad. se instala en otra computadora (o en la misma). La Base de Datos se encuentra en una computadora a la cual los usuarios de otras computadoras de la red no pueden acceder. O se graban todos los datos o no se graba ninguno. Visual Basic. “Ultimo”. Lo normal en las buenas aplicaciones Cliente/Servidor es que la interfaz sea de búsqueda (el usuario escribe lo que necesita y sólo eso se le muestra). Jamás pueden estar incompletos. Independencia del lenguaje. mientras se están grabando las filas (registros) de la tabla de detalles se interrumpe la energía eléctrica. ¿Cuál es la consecuencia? Que el movimiento (o transacción) está incompleto. nunca en la aplicación Un ejemplo: una aplicación envía una petición de consulta al Servidor para que devuelva un cursor (un cursor es una tabla temporal) con las ventas realizadas entre dos fechas. ¿Por qué? porque se satura la red. En el caso de las grillas se considera que mostrar hasta 200 filas (registros) en ellas está dentro de lo aceptable. Inclusive es común mostrar muchos datos en una grilla para que el usuario pueda “navegar” a través de ella. En el Servidor se descubre que una de las fechas estaba vacía. al Servidor deben llegar siempre los datos totalmente validados.DBF es común que el programa de ABM tenga los botones “Primero”.DBF) podría darse el siguiente caso: se graba una fila (registro) en la tabla cabecera. O sea. Tanto en un sentido (del Cliente al Servidor) como en el otro (del Servidor al Cliente). Delphi o cualquier otro lenguaje. Cuando de devolver datos se trata. Dentro de la Base de Datos nada cambiará. “Anterior”. Por lo tanto: • Todo lo que puede procesarse en la aplicación se debe procesar en la • aplicación Los procesos que requieren acceso a las tablas deben realizarse en el Servidor. Acceso a través de Internet o redes WAN. allí no debe validarse nada. Como los datos que viajan son pocos. Manera eficiente de enviar/recibir datos del Servidor La filosofía detrás de Cliente/Servidor es que el tráfico en la red sea el mínimo posible. la petición de consulta viajó por la red y el mensaje de error también. Algo así no puede suceder en Firebird porque los datos: o se graban todos o no se graba ninguno. todas las validaciones deben realizarse antes. “Siguiente”. lo cual la hace más lenta. En un sistema de archivos compartidos (tablas . Si ya no quieres programar en Visual FoxPro y prefieres hacerlo en Java. Nunca. hubo un tráfico innecesario en la red. no hay problema. Eso es un error de concepto. En una aplicación Cliente/Servidor eso es considerado mala práctica. ¿Por qué? porque esa verificación pudo haberse realizado en la aplicación. Como mostrar los datos al usuario Cuando se utilizan tablas .- - - Consistencia de los datos. -7- . nunca más. Si el usuario necesita ver más filas (registros) entonces debe hacer click en un botón para que se le muestren las siguientes (o anteriores) 200 filas (registros). Ni un byte más de lo estrictamente necesario. hacer aplicaciones que envíen/reciban datos a través de Internet o de una red WAN es eficiente. ¿Por qué? porque en general no se necesitan todas las columnas (campos) de cada fila (registro). etc.000 dólares. Lo correcto es tener en el disco local una tabla con los datos de los proveedores (solamente códigos y nombres. e-mail.000 proveedores y solamente 50 cumplen con la condición. Pero si solamente se necesitan los datos de algunos proveedores. etc. en general.000 proveedores.000 dólares? ese es otro error de concepto.Otro ejemplo: se le muestra al usuario en una grilla la lista de todos los proveedores de la empresa para que elija a uno de ellos. Porque si hay 2. no de 2.000 que estaban en el Servidor.000 proveedores. O sea. ¿Cómo se obtuvieron esos datos? ¿Se los trajo del Servidor? Ese es otro error de concepto. ¿Cómo se hace eso? ¿Trayendo todos los proveedores del Servidor y luego filtrando para que solamente queden a quienes se les debe más de 10. viajaron por la red los datos de los 2. usar SELECT * es un error. En síntesis: en general. cuando el usuario quiere verlos para elegir a uno de ellos se verifica que la tabla local coincida con la tabla del Servidor ¿cómo? si por ejemplo el último código de la tabla local es el 1997 entonces se sabe que faltan los tres últimos proveedores.) entonce es correcta. En el lenguaje SQL la instrucción utilizada para traer datos desde el Servidor hacia el Cliente se llama SELECT. idioma oficial. para que el Servidor envíe los datos de 50 proveedores. capitales. Cuando el usuario elige a uno de esos proveedores entonces se envía su código al Servidor. un error de concepto. Siempre hay que tener presente lo siguiente: el tráfico en la red debe ser el mínimo posible. porque si la empresa tiene 2. Si realmente se desea ver todos los datos de todos los países (códigos.). teléfono. Por supuesto que si hay que imprimir un informe con los datos de todos los proveedores entonces los datos de todos los proveedores viajarán por la red. Se copian los códigos y nombres de esos tres proveedores en la tabla local y se le muestra al usuario esa tabla. Pero si solamente se desean ver algunos datos (códigos y nombres. Por ejemplo. forma de gobierno.000. localidad. para recuperar los demás datos de ese proveedor (dirección. Otro ejemplo: se le quiere mostrar al usuario los datos de los proveedores a quienes se les debe más de 10. solamente los datos de ellos deben viajar por la red. viajaron por la red los 2. nada más). población. por la red viajaron los datos de los 3 proveedores faltantes (códigos y nombres) más los datos del proveedor elegido. Por lo tanto traer todos los datos es.000. moneda. Lo correcto es que en la petición de consulta se especifique la condición. Estarás empezando a entender la idea detrás de Cliente/Servidor cuando tengas muy en claro que: por la red debe viajar la menor cantidad de datos posibles. por ejemplo) es errónea porque se está haciendo viajar por la red datos que no se utilizarán. -8- . la siguiente instrucción: SELECT * FROM Paises Mostrará todos los datos de todos los países. Y no los datos de los 2. nombres. ya que allí lo normal es que los registros se lean completamente. O sea. todo es más rápido. FormaGob. Eso puede causar problemas a veces graves.DBF esto puede resultar difícil al principio. Poblacion. Para que una columna (campo) pueda ser utilizada como clave primaria. no debe aceptar valores nulos.Para quienes están acostumbrados a usar tablas . Idioma. Moneda No es el mismo caso en SQL. nada más. etc. Por ejemplo: SELECT Codigo. Nombre. Capital. -9- . Pero no es el caso con Firebird ya que éste provee un mecanismo por el cual “los lectores no molestan a los escritores y los escritores no molestan a los lectores”. Claves primarias Cada tabla debe tener sí o sí una clave que identifique a cada fila (registro) de manera inequívoca (o sea que no puede faltar ni estar duplicada). Población. Por ejemplo: USE Paises SET ORDER TO TAG Codigo SEEK “595” && Busca el país que tiene código “595” ? Codigo. en SQL se pueden especificar cuales son las columnas (campos) requeridos. A esa clave se la llama Clave Primaria (PK = Primary Key). Concurrencia En una aplicación multi-usuario puede ocurrir que dos o más de ellos quieran leer o modificar la misma fila (registro) al mismo tiempo. que por la red solamente viajaron el Código y el Nombre de ese país. Nombre FROM Paises WHERE Codigo = “595” solamente traerá el Código y el Nombre del país cuyo código es “595”. Cuando se accede a un registro se tiene acceso a todos sus campos.. Relaciones Para relacionar una tabla con otra se utilizan las claves foráneas o extranjeras (FK = Foreign Key). Ese relacionamiento es persistente. o sea que estará en vigencia sea cual sea la aplicación que utilice a esa Base de datos. Lo mejor para estos casos es que esa clave la genere el propio Firebird ¿Por qué preocuparte en generar una clave única si el Firebird puede realizar ese trabajo por ti? No es lógico. Al no viajar la Capital. a partir de ese momento y hasta que finaliza (también por pedido de la aplicación al Cliente) puede realizar pedidos al Servidor. o sea que aunque ya se grabaron en el disco duro todavía son reversibles.Transacciones Esto puede ser un poco difícil de entender al principio ya que cuando se usan tablas . fila columna ----------> ----------> registro campo Como seguramente estás más acostumbrado a llamar registro y campo a lo que en SQL se llaman fila y columna es que muchas veces verás esas palabras rodeadas de paréntesis. Recuerda eso. En cambio en Firebird todas las comunicaciones entre el Cliente y el Servidor ocurren durante transacciones. Pero trata de acostumbrarte a los nombres “fila” y “columna” porque serán los que leerás en toda la literatura SQL. En este último caso se aplica la regla de la atomicidad: si aunque sea un cambio a la Base de Datos falló entonces todos los cambios son desechados. Inclusive leer una fila (registro) de una tabla no se puede realizar si antes no se inició una transacción.10 - . Diferencia de terminología En las bases de datos relacionales (como Firebird) se le llama “fila” a lo que en Visual FoxPro estamos acostumbrados a llamar “registro”. Durante este período se pueden grabar/borrar/modificar filas (registros) y estas operaciones son grabadas en el disco duro pero no cambian el estado de la Base de Datos. La transacción finaliza cuando la aplicación le pide al Cliente que las operaciones sean permanentes (commit) o que sean desechadas si ocurrió algún error (roll back). . Una transacción empieza cuando el Cliente la inicia (a pedido de la aplicación). Y se le llama “columna” a lo que le solemos llamar “campo”. Por lo tanto: o se graban todos o ninguno. Esto incluye cualquier cambio realizado por desencadenantes (triggers) o procedimientos almacenados (stored procedures).DBF los datos quedan grabados después que el usuario hizo click sobre el botón “Grabar” y la luz del disco duro se apagó. aunque un poco más puede ser necesario para realizar almacenamiento temporario. El recomendado para usar en Windows es el llamado SuperServer y por lo tanto las siguientes referencias serán a ese.Parte 2. tanto para uso privado como para uso comercial. incluye el Servidor y el Cliente en un solo archivo . Inclusive puede instalarse en las obsoletas computadoras 486 DX con Windows 95 o con Linux. En esta época casi cualquier computadora tiene por lo menos 1024 Mb. pero sí es posible. Es Open Source (código abierto) y es totalmente gratis. ya que no necesita instalación. . Sin embargo. Tipos de Servidor Firebird tiene cuatro tipos de Servidor (Classic. Tiene todas las características y la potencia de un RDBMS (Relational DataBase Management System o Sistema Administrador de Bases de Datos Relacionales). El espacio requerido en el disco duro es de alrededor de 14 Mb. Por supuesto que cuanto más poderosa sea la computadora será mucho mejor para todos. cualquiera de ellos se puede utilizar y sea cual sea el utilizado las Bases de Datos no cambian. Desde luego que no es realista usar esas computadoras en esta época. SuperClassic. si la computadora tiene varios procesadores entonces Classic o SuperClassic serían los preferibles. Embedded). Por lo tanto se puede pasar muy fácilmente de uno a otro.11 - .DLL Recursos utilizados Una de las ventajas de Firebird es que utiliza muy pocos recursos. Para aplicaciones monousuario o para catálogos en CD o programas similares se puede usar Embedded. Puede manejar bases de datos desde unos pocos Kilobytes hasta muchos Terabytes con muy buen rendimiento y casi sin mantenimiento. así que pueden realizarse muchísimas conexiones sin ningún problema. Firebird ¿Qué es Firebird? Es un motor de bases de datos relacionales SQL. El Servidor de Firebird utiliza 2 Mb de memoria y a eso hay que agregarle unos 115 Kb por cada conexión a la Base de Datos. SuperServer. Una regla mnemónica fácil es la siguiente: 2 Mb + 1 Mb cada 8 conexiones. . Un único servidor Firebird puede manejar múltiples bases de datos independientes. A=Atomicity (atomicidad). Consistencia: solamente se ejecutan las operaciones que no van a romper las reglas y las directrices de la base de datos. • A. Se hace un backup de la Base de Datos en una plataforma y se lo restaura en la otra plataforma. liviano. C=Consistency (consistencia).12 - . I=Isolation (aislamiento). jamás puede quedar incompleta.C. Atomicidad: la operación se realizó o no. es verdaderamente Open Source. y las necesidades de configuración y de administración son mínimas.I. cada una de ellas conectada a muchos clientes. Firebird cumple perfectamente con ello. Fácilmente se lo puede escalar desde monousuario hasta organizaciones con sucursales por todo el mundo y miles de computadoras conectadas al mismo tiempo. Es poderoso. Esto asegura que la realización de dos transacciones sobre la misma información sean independientes y no generen ningún tipo de error. Además. Plataformas y versiones para el Cliente Las mismas que para el Servidor. Durabilidad: una vez realizada la operación ésta persistirá y no se podrá deshacer aunque falle el sistema.D. Características principales de Firebird Firebird es un motor de bases de datos SQL muy completo. D=Durability (durabilidad) es algo que deben tener todos los motores de bases de datos bien hechos. lo cual significa que es totalmente gratis tanto para uso privado como para uso comercial. Aislamiento: una operación no puede afectar a otras.Plataformas y versiones para el Servidor • • • • • • • • • • • • • • • • Windows Seven Windows Vista Windows XP Profesional Windows 2008 Server Windows 2003 Server Windows 2000 Server Windows NT 4 Windows ME Windows 98 Windows 95 Linux FreeBSD varios UNIX Mac OS X (Darwin) Sun Solaris SPARC e Intel HP-UX Pasar de una plataforma a otra no puede ser más fácil. Generadores. El backup se puede hacer solamente sobre los últimos cambios. No es una característica nativa pero hay muchas herramientas de terceros que permiten hacerla (algunas son gratis). Control completo de las transacciones. Cada tabla puede tener todos los desencadenantes (triggers) que se desee. Bases de Datos de sólo lectura. . Funciones externas. Estas son rutinas que pertenecen a la Base de Datos y que se procesan en el Servidor. etc. por ejemplo) pueden recuperarse el 100% de los datos. Muy útiles para informes. proveedores de datos . paquetes de componentes nativos para C/C++/Delphi. etc. Procedimientos almacenados. PHP driver. presentaciones. Usándolos fácilmente se pueden tener columnas (campos) que se auto incrementan y claves únicas para ser usadas como PK (Primary Key). desencadenantes. Permite que al modificar un código de una tabla padre se modifiquen automáticamente los códigos de todas las tablas hijas. Desencadenantes. etc. OLEDB driver. JDBC (JayBird). italiano. de tal manera que si la primera tiene algún problema (disco duro dañado.• • • • • • • • • • • • • MGA. portugués. etc. procedimientos almacenados. El Firebird maneja varias versiones de la misma fila (registro) al mismo tiempo para que cada transacción tenga su propia versión. aunque haya muchos usuarios usando sus tablas.Net. ahorrando así mucho tiempo y espacio en disco. dbExpress. borrar o modificar una fila (registro). Backups en línea. asegurar la integridad de los datos. llamadas directas a la API. Una aplicación puede tener múltiples transacciones manteniendo el total control sobre cada una de ellas. Se las puede usar para programas demo o catálogos. Para usarlo desde Visual FoxPro el primero de ellos (ODBC) da excelentes resultados. alemán. (en castellano: Arquitectura de múltiples generaciones). Shadows. Bibliotecas de funciones externas (UDFs) pueden ser escritas en cualquier lenguaje que genere DLLs y luego ser usadas por el Firebird como si fueran funciones internas. Firebird implementa casi todos los lenguajes humanos (español. Pueden ser usados para poner valores por defecto. Backups incrementales. inglés.13 - . Python. Esto permite que las aplicaciones funcionen 24/7 (durante 24 horas. Perl. polaco. los cuales son lanzados automáticamente antes o después de insertar. Integridad referencial en cascada. Conjuntos de caracteres. vistas. por lo tanto: “los lectores no molestan a los escritores y los escritores no molestan a los lectores”. Los backups de una Base de Datos pueden realizarse en cualquier momento. Un caso especial son los procedimientos almacenados seleccionables los cuales pueden realizar sus tareas para cada fila (registro) de una tabla y luego ser usados como una vista o una tabla virtual en el lado del cliente. Todo lo que se escribe en una Base de Datos puede al mismo tiempo escribirse en otra Base de Datos. los 7 días de la semana). ruso. Multi Generational Architecture.) Conectividad Firebird acepta los siguientes métodos: ODBC. Replicación. porque se ahorra muchísimo tiempo al hacerlo. para que se inicie junto con el Windows. El mismo programa que se utiliza para instalar el Servidor se usará para instalar al Cliente. Siempre es aconsejable instalar la última versión estable. auditorías. También es posible instalar en la misma computadora el Servidor y el Cliente.org/index. en aquella donde se encontrarán todas las Bases de Datos. El Cliente se debe instalar en cada computadora de la red. incluyendo administradores gráficos. lo mejor es hacerlo mediante el programa de instalación. Instalando el Cliente Aunque se lo puede instalar manualmente. Es más que aconsejable utilizarlos. generadores de datos. analizadores de estadísticas del Servidor.14 - . . Lo aconsejable es instalarlo como un servicio del Windows. Se lo puede instalar CON las herramientas administrativas o SIN las herramientas administrativas. Se lo puede descargar de: http://www. Pero en la computadora que se usará para desarrollar aplicaciones hay que instalar el Cliente CON las herramientas administrativas. etc. Entre los administradores gráficos más conocidos se cuentan los siguientes: • FlameRobin (gratis) • SQL Manager for InterBase and Firebird (la versión Lite es gratis) • IBExpert (tiene una versión personal gratis) • DB Workbench (la versión Lite es gratis) • Firebird Development Studio (30 días gratis) Instalando el Servidor Hay que elegir cual tipo de Servidor se desea.php?op=files&id=engine El Servidor se debe instalar en una sola computadora de la red. Lo mejor es instalarlo SIN esas herramientas porque los usuarios comunes no deben tener acceso a ellas.Herramientas Hay muchos programas que pueden usarse con Firebird. replicadores.firebirdsql. t sustituyendo esa dirección IP por la que corresponda a la computadora donde se encuentra el Servidor.Instalando el driver ODBC Para poder conectarse a una Base de Datos Firebird desde Visual FoxPro se necesita escribir un “string de conexión” el cual necesitará de un driver ODBC (más sobre esto en el siguiente capítulo). Verificando que el Servidor se esté ejecutando En la computadora donde se instaló el Servidor: Inicio | Panel de Control | Herramientas administrativas | Servicios Si se está ejecutando. Esto se llama “ping con carga máxima” y asegura que la comunicación puede realizarse exitosamente.php?op=files&id=odbc Verificando la instalación Verificando la conexión a la computadora donde se encuentra el Servidor Para verificar que la red funciona correctamente y que la computadora donde se encuentra el Cliente puede comunicarse con la computadora donde se encuentra el Servidor se debe abrir una ventana de comandos en la computadora del Cliente y luego escribir lo siguiente: ping 192.21.firebirdsql.15 -1 65500 .org/index.7. Puedes descargar el driver ODBC que corresponde a tu computadora desde: http://www. se verá una pantalla similar a la siguiente: .15 - . Permite darle un nombre abreviado a las bases de datos y usar ese nombre abreviado en las conexiones.2:C:\SISTEMAS\SQL_CONTA\CONTA.0. Ejemplos: 192.SAM.com localhost # Servidor de Firebird en la LAN # Servidor en una red WAN # Servidor local El archivo HOST puede ser modificado con el NOTEPAD (Bloc de notas) o cualquier otro editor de texto plano.149 127.12. .FDB Conexión: Para conectarse a la Base de Datos se podría escribir: 10. Eso aumenta la seguridad.13.13.11 65. El archivo ALIASES. Si en la carpeta C:\WINDOWS\ no encuentras un archivo llamado HOST. ya que los curiosos no pueden saber en que carpeta se encuentra la Base de Datos ni cual es el nombre de ella. Este es un archivo que se encuentra en la carpeta C:\WINDOWS\ y que sirve para darle un nombre a las direcciones IP. Ejemplo: Conta = C:\SISTEMAS\SQL_CONTA\CONTA.FDB o: 10.2:Conta o: MiServidor:Conta Esta última es la preferible porque los curiosos no podrán saber ni la IP del Servidor ni la carpeta ni el nombre real de la Base de Datos. Luego.221.0.168.CONF Este es un archivo que se encuentra en la carpeta raíz del Firebird y no debe ser movido de allí.El archivo HOST Una manera de ocultar la dirección IP del Servidor es mediante el uso del archivo HOST.1 MiServidor apress. debe haber un archivo llamado HOSTS.12. renómbralo como HOST.215. cuando sea necesario.0. se puede usar el nombre y no la dirección IP.16 - . tanto para la Base de Datos como para los archivos temporales Las Bases de Datos Firebird no se corrompen si se interrumpe la energía eléctrica. Como corromper una Base de Datos Esta es una lista de las cosas que no debes hacer si quieres mantener a tu Base de Datos en buen estado. por ejemplo) se cambia lo que se desea y se lo graba. Mientras se está restaurando una Base de Datos. hay algunas medidas que pueden tomarse para disminuir aún más la probabilidad de que algo malo les pase: • • • • Chequear que la computadora tenga UPS (energía ininterrumpida) Chequear que la memoria de la computadora esté OK.El archivo FIREBIRD.CONF Este es un archivo que permite configurar al Firebird. se encuentra en su carpeta raíz y sus valores pueden ser cambiados.17 - . no debes restaurar sobre ella. Por defecto. Deshabilitar “Forced Writes”. pero si no es así. el Firebird graba los datos en el disco apenas se hace el commit de ellos. Se lo abre con cualquier editor de texto plano (el NOTEPAD. • Modificar las tablas de los metadatos. • • • . de acuerdo a la necesidad.EXE) Chequear que la Base de Datos tenga Forced Writes en ON Chequear que haya suficiente espacio libre en el disco. (para ello puede usarse el programa MTINST. El archivo SECURITY2. Permitir a los usuarios que se conecten durante una restauración. Si los usuarios están usando una Base de Datos. No cambies esa configuración. nadie debe estar conectado. está localizado en la misma carpeta del Firebird y no debe ser movido de allí. Te lo repito: no las toques. los valores que tiene son los más adecuados para la mayoría de las situaciones. Estas son las tablas internas que el Firebird crea dentro de cada Base de Datos. En general.FDB Este es el archivo donde el Firebird guarda los datos de cada usuario (nombres y contraseñas). No las toques. Como evitar la corrupción de las Bases de Datos Aunque las Bases de Datos Firebird muy raramente tienen problemas. Restaurando un backup en una Base de Datos que se está ejecutando. cambiarlos es muy fácil. nombrados respectivamente 1. Inglés.18 - . El último es el que debe usarse en todas las aplicaciones nuevas. Si eliges un tamaño que no es el más adecuado para tu aplicación. Conjunto de caracteres (character set) Los caracteres que puede reconocer el Firebird se encuentran en los así llamados “character set”. si escribes: 2000 toma 1024 3000 toma 2048 3500 toma 2048 8000 toma 4096 Puedes usar cualquier tamaño de página (PAGE_SIZE) que desees. se expresa en bytes. Si te parece que los accesos están lentos entonces puedes hacer un backup de tu Base de Datos y luego restaurarla con un nuevo tamaño de página. Hay varios de ellos. Portugués. Los valores que puede tomar son: 1024. el Firebird tomará el anterior en estos rangos. . Italiano.Dialectos SQL (SQL dialect) Firebird soporta tres dialectos SQL. etc.. Su valor por defecto es 4096. Lo importante a recordar es que para los idiomas latinos (el castellano entre ellos) debes elegir: ISO8859_1 . hasta encontrar el que resulte mejor. Por ejemplo. 8192. pero con estos ya tienes la idea. 16384 (habrás notado que son todas potencias de 2. 4096. Vietnamita CYRL Ruso ISO8859_1 Castellano. si no eliges uno entonces se usará 4096. Coreano. 2 y 3. Tamaño de la página (page size) Este es también un atributo opcional. Francés. ¿Para qué sirve el tamaño de página? Para decirle al Firebird cuantos bytes debe grabar en cada bloque. aunque no es necesario ya que si no lo especificas se usará el 3 (que es el más nuevo). empezando con 2 ^ 10). la única consecuencia será que los accesos a tu Base de Datos no serán tan rápidos como podrían serlo. Si escribes cualquier otro número. los anteriores existen para compatibilidad con versiones antiguas. El dialecto 3 es el que se usa por defecto pero si quieres puedes escribir: SET SQL DIALECT 3. Hay programadores a quienes les gusta especificar el dialecto que emplean. Hay muchos más. debes usarlos para decirle el idioma que emplearás: ASCII Inglés BIG_5 Chino.. 2048. Poblacion BigInt.esta es la contraseña del usuario. ‘Paraguay’. Nombre VarChar(25) NOT NULL.SQL en el cual se colocan los comandos que se desean ejecutar. ‘Washington’. Facturación. etc. se modifica el script y ese cambio puede quedar comentado. Para comentar algo hay dos formas: • Usando el par /* mi comentario va aquí */ • Usando -. ‘Asunción’. 6500000). ‘Beijing’. VarChar(20). otras tablas. INSERT INTO Paises VALUES(1. 1250000000). Son muy útiles para reconstruir la estructura de una Base de Datos o de una Tabla en la misma o en otra computadora. Mirando los scripts se puede conocer las características y las estructuras de una Base de Datos y de cada uno de sus componentes (Dominios. etc. etc. sólo en una línea . Tablas. También se podrían haber creado una Base de Datos. Sueldos. Dominios. ‘China’. con copiar y ejecutar los scripts es más que suficiente. etc. Capital VarChar(25). Un script es un archivo de texto plano usualmente con la extensión . Como se ve en este ejemplo. Tablas.) Si se debe modificar algo. 310000000). Contabilidad. dominios.Scripts Además de crear las Bases de Datos. No hace falta copiar una Base de Datos vacía en su computadora. Índices. VarChar(12) /* este es el nombre del usuario. manualmente. PRIMARY KEY (Codigo) ). INSERT INTO Paises VALUES(595. Índices.este es mi comentario Por ejemplo: CREATE TABLE Usuarios ( Nombre Contrasena ). pero además los scripts cumplen con otra tarea que es muy importante: documentación. Ejemplo: CREATE TABLE Paises ( Codigo SmallInt NOT NULL. INSERT INTO Paises VALUES(86. también se tiene la posibilidad de hacer esas tareas automáticamente a través de un script.19 - . Los scripts a menudo se utilizan cuando se instala una nueva aplicación (Ventas. se ha creado una tabla y también se le han agregado datos. se ahorra mucho espacio en disco. índices. si es necesario este comentario puede ocupar varias líneas */ -. ‘Estados Unidos’.) en lo de un cliente. Recuérdalo muy bien porque este es un concepto muy importante: las tareas diarias no debe hacerlas el usuario SYSDBA. como se ve en la siguiente pantalla: ¿Qué se hizo? primero. ejecutar el programa gsec.EXE y regresar a la ventana de comandos se debe escribir el comando quit. masterke. cambiar o borrar usuarios.EXE. IMPORTANTE: Como el usuario SYSDBA es muy poderoso y tiene un poder destructivo muy grande.exe con el usuario SYSDBA y con la contraseña masterkey. deben hacerlas los demás usuarios. debes crear usuarios comunes para que realicen esas tareas. no debería ser usado para crear bases de datos ni para llenar las tablas con datos. será la primera contraseña que probarán. Debes ingresar como usuario SYSDBA solamente para agregar. Luego.El usuario SYSDBA En Firebird hay un usuario que tiene todos los derechos. la contraseña anterior (masterkey) ya no funciona. Cuando se instala el Firebird la contraseña de ese usuario es masterkey (en realidad. A partir de este momento la contraseña del usuario SYSDBA es secreto. Las tareas de todos los días. restauraciones y otras tareas que solamente él puede hacer. Eso significa que no debes olvidar tu nueva contraseña porque si la olvidas perderás tus derechos como usuario principal. solamente se consideran los primeros ocho caracteres). puede hacer todo lo que quiera con cualquier Base de Datos. este es sólo un ejemplo. Para cambiar la contraseña del usuario SYSDBA debes abrir una ventana de comandos.20 - . . se cambió la contraseña de SYSDBA. realizar backups. Lo primero que debes hacer apenas has instalado el módulo Servidor del Firebird es cambiar esa contraseña ¿por qué? porque la contraseña masterkey la conocen todos en todo el mundo y si tu computadora está conectada a Internet y llega a ser hackeada o si dentro de tu organización hay un enemigo interno. El nombre de ese usuario es SYSDBA. ingresar a la carpeta \BIN del Firebird y ejecutar el programa GSEC. En lugar de eso. la nueva contraseña es ahora secreto. Por supuesto que tú debes elegir otra contraseña. Para salir del programa GSEC. Walter. con contraseña 123456. Listando todos los usuarios Para ver los nombres de todos los usuarios se utiliza el comando display.21 - . como se ve en la siguiente pantalla: Donde se ha borrado al usuario Erika utilizando para ello el comando del. como se ve en la siguiente pantalla: Aquí se agregaron tres nuevos usuarios. con contraseña hermosa y Erika con contraseña japonesa. Borrando usuarios El usuario SYSDBA también puede borrar usuarios.Agregando nuevos usuarios El usuario SYSDBA puede agregar nuevos usuarios. Silvia. . hasta que se les otorgan privilegios (o derechos).. Por ejemplo: MuyLinda. su nueva contraseña es muylinda. MUYLINDA son todas contraseñas diferentes y si escribes la que no corresponde. Como proteger las Bases de Datos Si alguien tiene acceso a la computadora donde se encuentra una Base de Datos puede copiarla.Cambiando la contraseña de un usuario Aquí se cambió la contraseña de Silvia. Mientras no se les hayan otorgado privilegios (o derechos) nada podrán hacer. . La regla a seguir es la siguiente: Solamente los procesos del Servidor deben tener acceso a las Bases de Datos.. Privilegios de acceso a una Base de Datos El creador de una Base de Datos y el usuario SYSDBA tienen acceso total y completo sobre ella desde el mismo momento en que fue creada. No solamente puede copiarla. las contraseñas (passwords) de los usuarios deben ser escritos siempre exactamente igual. también puede dañarla físicamente o destruirla completamente. no podrás acceder a la Base de Datos. Nombres de los usuarios Los nombres de los usuarios pueden escribirse en minúsculas.22 - . mayúsculas o cualquier combinación. ni siquiera consultarla. ni siquiera read-only (sólo lectura). silvia y SILVIA se refieren todas al mismo usuario. los demás usuarios nada pueden hacer con ella . Contraseñas (passwords) de los usuarios A diferencia de los nombres. Por ejemplo las palabras: Silvia. muylinda. los usuarios no necesitan y no deben tener acceso a ellas. la anterior ya no funciona. instalarla en otra computadora donde tenga acceso como usuario SYSDBA y ver o robar todos los datos que quiera. Recién a partir de ese momento podrán usar la Base de Datos. Muylinda. De la misma manera. . Insert. Para ello. ni siquiera SYSDBA puede quitárselos. References Ejecutar un Procedimiento Almacenado o llamarlo Adquirir todos los privilegios del rol . el creador tampoco puede quitarle derechos a SYSDBA. Privilegios sobre columnas (campos) El privilegio UPDATE permite modificar el contenido de todas las columnas (campos) de una fila (registro). Ejemplos: GRANT SELECT. no todas. Su sintaxis es la siguiente: GRANT <privilegio> ON <objeto> TO <usuario>. Delete. GRANT UPDATE (PRECIO_VENTA1. INSERT. Su sintaxis es la siguiente: REVOKE <privilegio> ON <objeto> FROM <usuario>. DELETE ON PRODUCTOS TO SILVIA.23 - . Para quitarles derechos a los usuarios se usa REVOKE. Pero a veces se necesita que el usuario solamente pueda modificar algunas columnas. El creador siempre tiene todos los derechos. Privilegios Los privilegios que pueden ser otorgados a los usuarios (y revocados) son los siguientes: Nombre del privilegio SELECT INSERT UPDATE DELETE REFERENCES ALL EXECUTE ROLE Lo que puede hacer Leer filas (registros) Insertar filas (registros) Modificar el contenido de las filas (registros) Borrar filas (registros) Relacionar una clave primaria con una clave secundaria Select. El comando que se usa para otorgar privilegios a los usuarios se llama GRANT. UPDATE. REVOKE DELETE ON PRODUCTOS TO SILVIA. GRANT SELECT ON PRODUCTOS TO MIRTHA. a continuación de UPDATE se debe escribir entre paréntesis los nombres de las columnas que podrá modificar.IMPORTANTE: El usuario SYSDBA puede otorgar o quitar derechos a todos los usuarios de la Base de Datos excepto a su creador. PRECIO_VENTA2) ON PRODUCTOS TO SILVIA. Update. Asignar el rol a los usuarios (usando GRANT NombreRol TO Usuario) 4. además del nombre del usuario. otro para Recursos Humanos. GRANT SELECT ON VENDEDORES TO R_VENDEDORES. Crear un rol (usando CREATE ROLE) 2. GRANT R_PRODUCTOS TO SILVIA. precios de venta y realizar ventas. etc. . otro para Contabilidad. Un usuario puede tener varios roles pero solamente uno de ellos estará activo en cada momento. la sintaxis es: DROP ROLE <NombreRol> Ejemplos: /* Se crea el rol R_PRODUCTOS.24 - . /* Se crea el rol R_VENDEDORES. Si se crea un rol llamado “Ventas” que solamente permite ver cantidades en stock. que tiene todos los privilegios sobre la tabla PRODUCTOS y se le asigna a Silvia */ CREATE ROLE R_PRODUCTOS. GRANT R_VENDEDORES TO SILVIA. Especificar el rol. La implementación de roles tiene los siguientes pasos: 1.Roles Los roles permiten agrupar a los usuarios para que todos quienes compartan un rol tengan los mismos privilegios. un rol creado para una Base de Datos no funcionará en otra. al conectarse a una BD Creando un rol La sintaxis para crear un rol es muy simple: CREATE ROLE <NombreRol> El creador de la Base de Datos y el usuario SYSDBA pueden crear los roles y otorgar los privilegios y asignarlos a los usuarios. los usuarios que usen ese rol no podrán ver los Balances ni los datos de los empleados. se puede tener un rol para Ventas. Los roles son específicos de cada Base de Datos. que solamente puede consultar la tabla VENDEDORES (o sea que no puede insertar ni borrar ni modificar datos) y se le asigna a Silvia */ CREATE ROLE R_VENDEDORES. Por ejemplo. GRANT ALL ON PRODUCTOS TO R_PRODUCTOS. Asignar privilegios al rol (usando GRANT privilegios TO NombreRol) 3. Eliminando un rol Si ya no se necesita un rol entonces se lo puede eliminar. Todos los usuarios que tienen el mismo rol disponen de exactamente los mismos derechos. Ver los dominios existentes SHOW DOMAINS. mostrando un código de error (-551). Ver la estructura de un dominio SHOW DOMAIN NumeroEntero. el cual solamente permite consultar a la tabla VENDEDORES pero no permite que se inserten. Crear un dominio CREATE DOMAIN NumeroEntero INTEGER. Conectarse a una Base de Datos CONNECT "C:\EJEMPLO.FDB" USER "SILVIA" PASSWORD "muylinda". . la mayoría de ellos con varias cláusulas y en cada versión se van agregando nuevos. CREATE DOMAIN NombrePersona VARCHAR(30).Como puede verse en la siguiente imagen.FDB" USER "WALTER" PASSWORD "123456". Comandos del Firebird más utilizados El Firebird tiene muchos comandos. Crear una Base de Datos CREATE DATABASE "C:\EJEMPLO. esos son los que se listan a continuación. El rol R_VENDEDORES se le otorgó a SILVIA. se creó el rol R_VENDEDORES. Cuando intentó agregar una fila a la tabla VENDEDORES el Firebird se lo impidió. por lo tanto ella puede consultar pero nada más. borren o modifiquen datos de ella. el cual significa: “no tienes permiso para insertar/escribir en la tabla”. Sin embargo hay algunos que son mucho más utilizados que los demás.25 - . SHOW DOMAIN NombrePersona. solamente puede hacer eso. "JUAN".26 - .Crear una tabla CREATE TABLE Personas(Codigo NumeroEntero. Borrar algunas filas de una tabla DELETE FROM Personas WHERE Codigo = 25. INSERT INTO Personas (Codigo. Agregarle una clave primaria a una tabla ALTER TABLE Amigos ADD PRIMARY KEY (Codigo). Nombres NombrePersona. DELETE FROM Personas WHERE Codigo >= 12 AND Codigo <= 18. "PEREZ"). "BENITEZ"). Ver la estructura de una tabla SHOW TABLE Personas. Apellidos) VALUES (2. Nombres) VALUES (3. Agregarle filas a una tabla INSERT INTO Personas (1. Borrar una tabla de la Base de Datos DROP TABLE Personas. Modificar columnas de una tabla UPDATE PERSONAS SET Apellidos = 'ARRUA' WHERE Nombres = 'CLAUDIA'. "CLAUDIA"). SHOW TABLE Amigos. la columna clave debe estar entre paréntesis Agregarle una columna a una tabla ALTER TABLE Personas ADD Telefono VarChar(15). Sueldo Integer). Ver todas las tablas de una Base de Datos SHOW TABLES. INSERT INTO Personas (Codigo. Apellidos VarChar(15)). "MARIA". Borrar todas las filas de una tabla DELETE FROM Personas. Nombres. DELETE FROM Personas WHERE Nombres = ‘MARIA’. ALTER TABLE Personas ADD Clave Integer NOT NULL. Borrar una columna de una tabla ALTER TABLE Personas DROP Codigo. Apellidos NombrePersona. Nombres VarChar(15). . CREATE TABLE Amigos (Codigo Integer NOT NULL. Consultar las filas de una tabla SELECT * FROM Personas. Apellidos FROM Personas. continúan con AN y finalizan con cualquier carácter Consultar solamente los que no están repetidos SELECT DISTINCT Nombres FROM Personas. mostrará todos los nombres que tengan a ANA en alguna parte (ANA. aunque pueden estar en distinto orden Ponerles condiciones a las filas agrupadas SELECT Codigo. Nombres.27 - . Apellidos. Apellidos FROM Personas. Consultar las filas cuando se conoce una subcadena SELECT * FROM Personas WHERE Nombres LIKE '%ANA%'. SELECT Nombres FROM Personas WHERE Apellidos = "BENITEZ". Codigo HAVING Nombres = "JUAN". SELECT * FROM Personas WHERE Nombres = "JUAN" OR Apellidos = "BENITEZ". Nombres FROM Personas GROUP BY Apellidos. Nombres. Nombres.) A_Z todas las filas que empiezan con A. Consultar los datos ordenadamente SELECT * FROM Personas ORDER BY Nombres. Codigo. SELECT * FROM Personas WHERE Sueldo BETWEEN '2000' AND '5000'. SELECT DISTINCT Nombres. SELECT AVG(Sueldo) FROM Personas WHERE Apellidos = "BENITEZ". Hallar el valor mínimo de una columna numérica SELECT MIN(Sueldo) FROM Personas. . Hallar el promedio de una columna numérica SELECT AVG(Sueldo) FROM Personas. Apellidos. SELECT * FROM Personas ORDER BY Apellidos. todas las columnas que están antes del GROUP BY deben estar también después. etc. LUCIANA. Agrupar filas SELECT Codigo. Nombres FROM Personas GROUP BY Apellidos. ANALIA. tienen cualquier caracter en el medio y finalizan con Z ABC% todas las filas que empiezan con ABC y continúan con cualquier caracter %XYZ todas las filas que finalizan con XYZ %AN% todas las filas que tienen AN en cualquier lugar _AN% todas las filas que empiezan con cualquier carácter. SELECT Nombres. SUSANA. Contar la cantidad de filas de una tabla SELECT COUNT (*) FROM Personas. Sumar una columna numérica SELECT SUM(Sueldo) FROM Personas. Hallar el valor máximo de una columna numérica SELECT MAX(Sueldo) FROM Personas. tablas. dominios. Personas. La ventaja que tiene es que existe en todas las instalaciones del Servidor de Firebird. Se encuentra en la carpeta \BIN del Firebird.FDB. El programa ISQL. en general no se lo usa.Apellidos.28 - . El comando a utilizar es CONNECT. índices.Relacionar dos tablas SELECT Personas. administrar transacciones. En la imagen de arriba se muestra como conectarse a una base de datos ya existente.EXE Interactive SQL es un programa de línea de comandos que incorpora herramientas y técnicas para mantener objetos de las bases de datos. Paises ORDER BY Paises. Personas.Codigo. Paises. . alguna vez puede ser de utilidad.Apellidos. Paises. Por eso es recomendable que practiques un poco con él. Ordenar una tabla SELECT Personas. pero siempre es bueno conocerlo.Codigo. y en general realizar todas las operaciones usuales.Codigo. la desventaja es que hay que escribir los comandos.Nombres FROM Personas.Nombres. para saber usarlo cuando lo necesites. En la imagen de arriba se muestran todas las tablas que pertenecen a la base de datos llamada EMPLOYEE. Con ISQL se pueden crear bases de datos.Nombres FROM Personas. Paises WHERE Personas. procesar scripts. Como hay muchos programas que permiten realizar esas tareas gráficamente.CodigoPais = Paises. libera el espacio en disco ocupado por las filas borradas (un equivalente al comando PACK del VFP).29 - . IMPORTANTE: Los usuarios pueden continuar trabajando normalmente mientras se realiza el backup.EXE Es un programa utilitario que se encuentra en la carpeta \BIN del Firebird.En la imagen de arriba se ve la estructura de la tabla llamada COUNTRY. El programa GBAK. resuelve las transacciones que no estaban completas. también se lo usa para restaurar el backup en otra plataforma (de Windows a Linux. IMPORTANTE: Nunca debes usar programas como WinZip o WinRar para comprimir tu base de datos si el Firebird está en ejecución. IMPORTANTE: El archivo de backup generado por el programa GBAK no puede ser usado directamente porque el Servidor no lo reconocerá. Todos los cambios que los usuarios hagan después no serán grabados en el archivo de backup. pero los datos que se graban son los que se encontraban en la base de datos en el momento que GBAK se inició. . En la imagen de arriba se ven todas las filas y las columnas country y currency de la tabla COUNTRY. permite partir una Base de Datos en varios archivos (muy útil cuando ya es demasiado grande). También detecta corrupción de datos. por ejemplo). antes de ser usado debe ser restaurado con una versión de GBAK igual o posterior a la usada para crearlo. su misión es realizar copias de seguridad (backups) de las bases de datos y restaurarlas cuando sea necesario. Ejemplo 2: Aquí el usuario SYSDBA cuya contraseña es secreto restauró el archivo de backup llamado AGENDA27112010 en una base de datos llamada AGENDA. Ejemplo 1: Aquí el usuario SYSDBA cuya contraseña es secreto hizo un backup del archivo AGENDA.PRECAUCIÓN: El hecho de que un backup se haya realizado exitosamente no implica que se podrá recuperar sin problemas cuando se lo necesite. sino que lo complementa. Es importante recordar que AGENDA27112010 no es reconocida como una Base de Datos por el Firebird. Por eso es importantísimo asegurar que los archivos de backup se encuentren en un lugar seguro. El programa NBACKUP.EXE Este programa ofrece posibilidades que no tiene GBAK. . Siempre debes probar a restaurar tu backup inmediatamente después de realizarlo. El uso del programa GBAK está restringido al usuario SYSDBA y al usuario quien creó la base de datos. PRECAUCIÓN: Cualquiera puede robar una base de datos Firebird restaurando un archivo de backup en una computadora donde conoce la contraseña del usuario SYSDBA.FDB. En este caso no realiza el backup sino que establece las condiciones para que pueda ser realizado. Este último sólo tiene los cambios ocurridos desde el último backup. Puede bloquear la base de datos para que el backup se haga con otro programa. para asegurarte que todo está bien.FDB.30 - . El nombre del archivo generado es AGENDA27112010.EXE pero no lo reemplaza. debe ser restaurada para poder ser utilizada como tal. Puede hacer el backup y la restauración completos o incrementales. como en la siguiente imagen: Para restaurar un backup incremental Se debe especificar toda la cadena de los archivos de backup. a continuación del parámetro –B se escribe un número mayor que cero (el número cero significa backup completo). el backup será incremental desde el último backup de nivel 0 . el programa nbackup. desde el nivel 0 hasta el nivel que se desea restaurar..B 2. Para ello.31 - . Esta es la sintaxis: nbackup [-U <usuario> -P <contraseña>] -R <Base de Datos> [<backup0> [<backup1> [. sin molestar a los usuarios. como se ve en la siguiente imagen: Si en el siguiente backup se utiliza: . es decir agregarle al backup anterior solamente los cambios realizados desde ese momento.] ] ] . Para hacer un backup completo La sintaxis de este comando es: nbackup [-U <usuario> -P <contraseña>] -B 0 <Base de Datos> [<Nuevo Nombre>] Como se ve en la imagen de arriba. El backup realizado siempre reflejará el estado al principio de la operación.B 1.B 0.Ambos modos pueden hacerse sobre una Base de Datos activa.nbk Para hacer un backup incremental Para ahorrar tiempo y espacio en disco se puede hacer un backup incremental. el backup será completo .. el backup será incremental desde el último backup de nivel 1 Para restaurar un backup completo Se debe usar el parámetro –R.exe creó un archivo de backup con la extensión . si se desea descargar una que es gratis elegir la que dice “freeware”.sqlmanager. etc. cualquiera de ellos puede ser utilizado. ¿Por qué usar un administrador gráfico? Porque facilita muchísimo el trabajo. DB Workbench. Por una cuestión de costumbre del autor de este documento. IB Expert. se necesita hacerlo para poder usarla. . FlameRobin. SQL Manager será el que se usará en las siguientes páginas. Como está disponible en todas las instalaciones. Eso es equivalente a abrirla. La Base de Datos Employee Cuando se instala el Firebird. SQL Manager.32 - .net/en/products/ibfb/manager/download Hay varias opciones. será la utilizada en los siguientes ejemplos: Registrando una Base de Datos Después de ingresar al SQL Manager lo primero que se debe hacer es registrar la Base de Datos con la cual se desea trabajar. dentro de su misma carpeta se copia una Base de Datos con el nombre Employee (empleado). para que los nuevos usuarios de Firebird puedan hacer pruebas con ella. Se lo puede descargar desde: http://www.Usando SQL Manager Hay varios administradores gráficos muy buenos. se ahorra muchísimo tiempo y se tienen las ideas más claras. se verá una pantalla. similar a la siguiente: Haciendo doble click sobre EMPLOYEE se verán todos sus componentes.33 - .Una vez que la Base de Datos esté registrada. como a continuación se muestra: . numérico.. Eso significa que además de los tipos de datos estándares como carácter.en el panel de la izquierda pueden verse los componentes de las Bases de Datos (dominios. funciones externas del usuario. tablas. se los puede usar o no.34 - . desencadenantes. que son utilizados en las definiciones de las columnas (pero no en las definiciones de variables ni en los parámetros de entrada o de salida de los procedimientos almacenados o de los desencadenantes).) Haciendo click sobre el signo + que se encuentra a la izquierda de cada categoría se pueden ver todos sus elementos. globales a la Base de Datos. procedimientos almacenados. fecha. se puede usar un dominio. Por ejemplo el dominio “Salary” tiene la siguiente definición: . vistas. en la práctica son un nuevo tipo de datos. etc. Son opcionales. como se muestra a continuación: ¿Qué son los dominios? Los dominios son definiciones. Es decir. etc. pero usarlos mejora la legibilidad del código. 2) DEFAULT 0 CHECK (VALUE > 0). de los pagos. “DeptNo” (número del departamento) CREATE DOMAIN DEPTNO AS CHAR(3) CHARACTER SET NONE CHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL) COLLATE NONE. Por ejemplo.”. si una columna (por ejemplo: salario) tiene ese dominio. Por lo tanto. Aquí hay otro ejemplo.35 - . te facilitará tu trabajo. el Firebird se encargará de esa tarea. como se ve a continuación: . Recuerda que usarlos o no es opcional. no pueden ser anteriores al 1 de enero de 2011. Ese dominio luego lo usarás como tipo de datos de todas las tablas que lo necesiten. Si te parece complicado no te preocupes.. el Firebird no permitirá que se grabe una fila si el valor de la columna salario es cero o menor que cero ¿Por qué no? porque antes de realizar la grabación verifica que el valor sea mayor que cero (CHECK (VALUE > 0)) Aquí hay otro ejemplo. de las cobranzas. el dominio “EmpNo” (número del empleado): CREATE DOMAIN EMPNO AS SMALLINT. dentro de poco lo entenderás. Aquí hay otro ejemplo. En ningún caso un usuario de tu aplicación podría grabar una fecha anterior. ¿Cómo se crea un nuevo dominio? Haciendo click con el botón derecho sobre la palabra “Domains” y luego eligiendo la opción “New domain. de las ventas.. “CustNo” (número del consumidor): CREATE DOMAIN CUSTNO AS INTEGER CHECK (VALUE > 1000). podrías crear un dominio basado en el tipo de datos “date” que no permita fechas anteriores. si sabes que las fechas de las compras.CREATE DOMAIN SALARY AS NUMERIC(10. no necesitarás validar que las fechas sean posteriores al 1 de enero de 2011. pero usarlos tiene sus ventajas. ¿Qué son las tablas? Los lugares donde se guardan los datos.36 - . Son muy similares a las utilizadas por Visual FoxPro así que no merecen mayor comentario. . first_name. ¿Qué son los procedimientos almacenados? Los procedimientos almacenados. location.dept_no. C. phone_ext. Reciben parámetros de entrada. o cualquier otro.¿Qué son las vistas? Consultas predeterminadas. LOCATION. Si los usuarios necesitan ver ciertos datos frecuentemente es mejor hacer una vista y no una consulta. PHONE_EXT. WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id. CREATE PROCEDURE ADD_EMP_PROJ( EMP_NO SMALLINT. END^ SET TERM . ¿por qué? porque al ya estar dentro de la Base de Datos las vistas se ejecutan más rápidamente. Java. Como pertenecen a la Base de Datos son independientes del lenguaje utilizado para acceder a ella. proj_id) VALUES (:emp_no. department WHERE employee. ^ . phone_no FROM employee. Es decir que pueden ser invocados por un programa hecho en Visual FoxPro. Hay dos clases de procedimientos almacenados: los ejecutables y los seleccionables. END SUSPEND. cuyas columnas pueden provenir de una tabla o de varias tablas. Este es un ejemplo de una vista: CREATE VIEW PHONE_LIST( EMP_NO. FIRST_NAME. realizan alguna tarea y pueden devolver valores. last_name. :proj_id). Delphi.dept_no = department. C++. Este es un ejemplo de un SP ejecutable: SET TERM ^ . PHONE_NO) AS SELECT emp_no. LAST_NAME.37 - . PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE) AS BEGIN BEGIN INSERT INTO employee_project (emp_no. Los ejecutables son los equivalentes a los procedimientos y funciones del Visual FoxPro en cambio los seleccionables devuelven filas y se los utiliza dentro de los SELECT. comúnmente llamados Stored Procedures (o SP para abreviar) son los equivalentes a los procedimientos y las funciones del Visual FoxPro. .Y este es un ejemplo de un SP seleccionable: SET TERM ^ . ^ Para que un SP sea seleccionable: a) Debe tener parámetros de salida declarados (y cargados. no hace falta colocarle un BEGIN. aunque puedes escribirlos.. DO hay varias líneas. CREATE PROCEDURE GET_EMP_PROJ( EMP_NO SMALLINT) RETURNS( PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE) AS BEGIN FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO SUSPEND. ¿Qué son las UDFs? UDF = User Defined Function o Función Definida por el Usuario. El Firebird permite tener bibliotecas de funciones hechas en cualquier lenguaje que pueda crear archivos DLL. es innecesario hacerlo cuando después del FOR .. ASIN()....END.38 - . DO podría haberse escrito de esta manera: FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO BEGIN SUSPEND. En Firebird si el ciclo FOR . las cuales siempre están dentro de tus ejecutables y los hacen más grandes de lo necesario. DO tiene una sola línea. Como ves. muchas de las cuales no usarás o usarás raramente. por claridad. etc. El . no tiene sentido llenarlo de funciones. En Visual FoxPro tienes muchas funciones que raramente usas. TAN() (tangente). se le agregó un BEGIN y un END... El FOR . END.. hasta que te acostumbres. por ejemplo SIN() (seno)... ninguna más. COS (coseno). Las funciones internas del Firebird son pocas ¿por qué? porque así se puede mantener el motor pequeño y rápido. (arco seno). también se le llama “función externa”. Es mejor que las funciones sean externas así dispones solamente de las que necesitas. DO. END^ SET TERM . por supuesto) b) Debe ser escrito con un SUSPEND después de cada bloque que debe retornar una fila En el ejemplo de arriba el parámetro de salida es PROJ_ID (porque está dentro del RETURNS()) y el SUSPEND está dentro del FOR .. DO hay una sola línea pero es obligatorio cuando dentro del ciclo FOR . Una tabla puede tener todos los desencadenantes que se desee.Firebird es más económico. son unos procedimientos almacenados que se ejecutan automáticamente cada vez que en una tabla se realiza una inserción. . borrado o modificación de fila (registro) Pueden activarse antes de la operación o después de la operación. usualmente lo único que haces es un “copiar y pegar” desde el script que descargaste de Internet al script tuyo. IMPORTANTE: Tú puedes crear tus propias funciones externas pero debes verificarlas muy bien antes de incluirlas en tus proyectos porque una función mal hecha puede corromper tu Base de Datos. Si lo hacen. también puedes usar esas funciones si las necesitas. pero si no las necesitas. Ejemplo: DECLARE EXTERNAL FUNCTION abs DOUBLE PRECISION RETURNS DOUBLE PRECISION BY VALUE ENTRY POINT ‘IB_UDF_abs’ MODULE NAME ‘ib_udf’. ¿Qué son los desencadenantes? También llamados triggers. el orden de ejecución de ellos depende del valor de la variable POSITION. La gran mayoría de las funciones externas que puedes descargar de Internet vienen con sus propios archivos de script. eso sirve de documentación para que puedas saber que hacen.39 - . no están ocupando espacio. eso significa que una vez declaradas las puedes utilizar en cualquier procedimiento almacenado o en cualquier desencadenante. Para elegir una u otra se usan las palabras clave BEFORE (antes) y AFTER (después). como llamarlas y los valores que retornan. Las funciones UDFs son globales a la Base de Datos. Probablemente la declaración anterior te pareció complicada pero no te preocupes. new y old. la probabilidad de que causen problemas se incrementa mucho. old se refiere al valor anterior. Antes de usar una función hay que declararla. Tienen dos seudovariables internas. No reciben parámetros de entrada ni devuelven valores. Las funciones externas no deberían modificar columnas (campos). New se refiere al nuevo valor que tendrá la columna. Para ello se utiliza el comando DECLARE EXTERNAL FUNCTION. o sea decirle al Firebird que deseas usar esa función en la Base de Datos abierta. (new.salary) * 100 / old. WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id. SET GENERATOR EMP_NO_GEN TO 145. percent_change) VALUES ( old. ^ ¿Qué son los generadores? Números secuenciales que pueden ser automáticamente insertados en una columna. Aquí está la declaración de una excepción: CREATE EXCEPTION UNKNOWN_EMP_ID 'Invalid employee number or project id.salary <> new. END^ SET TERM . :proj_id). Aquí se declara un generador: CREATE GENERATOR EMP_NO_GEN.salary. CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE ACTIVE AFTER UPDATE POSITION 0 AS BEGIN IF (old. Y aquí el uso de ella: SET TERM ^ .Aquí hay un ejemplo de un trigger (desencadenante): SET TERM ^ . En ese caso. .'. la inserción dentro de la tabla Salary_History se realizará solamente si el salario nuevo es distinto al salario anterior. 'NOW'.40 - . old_salary. END SUSPEND. change_date. deshacen todo lo que se había realizado con anterioridad. END^ SET TERM .salary) THEN INSERT INTO salary_history (emp_no.salary).emp_no. ¿Qué son las excepciones? Son mensajes que pueden colocarse dentro de un SP o de un trigger y que se envían cuando ocurrió un error. CREATE PROCEDURE ADD_EMP_PROJ( EMP_NO SMALLINT. Normalmente se los utiliza para asegurar que las PK (claves primarias) tengan un valor único. proj_id) VALUES (:emp_no. user. old. updater_id.salary . PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE) AS BEGIN BEGIN INSERT INTO employee_project (emp_no. ^ En este caso.old. La regla es la siguiente: • • Si son usados dentro del contexto del procedimiento almacenado (asignación o comparación) entonces no se necesitan los dos puntos.emp_no is null) then new. END^ SET TERM .). por ejemplo Pascal. CREATE TRIGGER SET_EMP_NO FOR EMPLOYEE ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if (new. C. C++. porque nunca llegó hasta el end. DELETE. Y aquí se usa ese generador: SET TERM ^ . El nuevo terminador puede ser cualquiera. si no se usa SET TERM. Para cambiar ese terminador por otro se utiliza SET TERM. Si son usados fuera del contexto del procedimiento almacenado (INSERT. En este ejemplo: create procedure p1 as begin finsert into t1 values(10). con una condición: no debe estar dentro del bloque de código que estás escribiendo (podrías usar la letra A pero tendrías problema si dentro del bloque aparece una letra A). Por eso verás que la primera y la última instrucción son siempre SET TERM. . etc. Cuando se escribe un procedimiento almacenado o un desencadenante hay que cambiar al terminador por defecto porque el analizador del Firebird termina su tarea cuando lo encuentra. el terminador por defecto es el punto y coma (. SELECT) entonces sí se necesitan los dos puntos. Delphi.41 - . Otros lenguajes también utilizan terminadores. el analizador finalizará después del (10) y eso ocasionaría un error. el que está prácticamente estandarizado en Firebird es el ^ ¿Cuándo se usan los : delante del nombre de una variable? Habrás visto que delante de los nombres de algunos parámetros o variables aparecen los dos puntos (:). UPDATE. ^ ¿Para qué se usa SET TERM? En Firebird. todos los comandos deben finalizar con un terminador. end. Al terminar el procedimiento almacenado o desencadenante hay que volver a colocar el terminador por defecto.emp_no = gen_id(emp_no_gen. Java. 1).Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL el cual le dice al Firebird que los números de empleado deben empezar con 145. El terminador alternativo más utilizado. O sea. .42 - .Walter R. En los scripts que hagas podrán verse las reglas. algunas quizás con un nivel bastante bajo. ¿Por qué se debería proteger las relaciones entre dos tablas? 1) Prueba de fuego. 4) Documentación automática. Los índices creados automáticamente para la integridad referencial aumentarán la velocidad de las consultas. no se puede vender un producto cuyos datos no se encuentren en la tabla PRODUCTOS. La integridad referencial entre dos tablas se crea a través de una restricción foreign key (clave foránea). Las restricciones referenciales (especialmente cuando usadas inteligentemente con otras restricciones) protegerán fuertemente las reglas de negocio de la aplicación contra errores. evitando así escribir documentos específicos (ya que todos saben que a la mayoría de los programadores no les gusta escribir documentación). las filas de la tabla VENTASDET dependen de la tabla PRODUCTOS. Durante la etapa de desarrollo y verificación los errores se encontrarán pronto porque la Base de Datos rechazará operaciones que rompan las reglas. 3) Control de calidad. 2) Velocidad de las consultas. sin importar de donde provengan ellos. Esto es de mucha importancia cuando la Base de Datos será manipulada por otras personas. entonces las filas en la tabla HIJO dependen de la existencia de una fila en la tabla PADRE. Específicamente se trata de proteger las relaciones entre dos tablas. Ojeda Valiente – Visual FoxPro y Firebird SQL Integridad Referencial La “integridad referencial” es la capacidad de una Base de Datos de protegerse a sí misma evitando recibir valores de entrada que puedan dañar a las relaciones. 4) Que no se puede tener una fila en VENTASDET que no haga referencia a una fila en PRODUCTOS. Por ejemplo: si se tienen dos tablas. una llamada PRODUCTOS y la otra llamada VENTASDET (detalle de ventas). ¿Qué implica esto? 1) Que primero se deben cargar los datos de los productos antes de poder venderlos 2) Que la tabla PRODUCTOS debe tener una clave primaria (el código del producto) 3) Que la tabla VENTASDET debe tener una restricción foreign key sobre el código del producto. La restricción foreign key Una foreign key (abreviada FK) es una columna o conjunto de columnas de una tabla que corresponde en orden exacto a una columna o conjunto de columnas de otra tabla definida/s como primary key (abreviada PK) o como unique. Si se implementa este modelo como dos tablas PADRE e HIJO. Esta restricción protege a la tabla contra los intentos de grabar filas que son inconsistentes con el modelo de datos. no se puede hacer eso. Por lo tanto. En Visual FoxPro: Aunque no exista un producto con ese Código igual se puede grabar un registro en VENTASDET Aunque se deje en blanco el campo Código del Producto. Estas acciones pueden ser: ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT} ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT} No action Es el valor por defecto.DBF del Visual FoxPro se pueden grabar registros en VENTASDET aunque el campo Código del Producto se deje en blanco o aunque se escriba un código inexistente. es más fácil “meter la pata” (hacer algo malo o incorrecto) en Visual FoxPro. Generalmente esta acción no es recomendada ya que se pierde la ventaja de la integridad referencial. aumenta en gran medida la seguridad y la confianza en los datos grabados. Solamente por esta característica ya deberías pensar seriamente en usar tablas Firebird. Su acción es impedir que la PK pueda ser borrada o modificada. Algo así es imposible en Firebird. aunque se quiera. Cuando se define una FK (Foreign Key) se le puede decir al Firebird que acciones deberá tomar cuando se quiera borrar o modificar la PK (Primary Key). On Delete Cascade Cuando se borra una fila de la tabla PADRE las filas relacionadas en la tabla HIJO también son borradas. .Trabajando con las tablas . por lo tanto esas filas quedan huérfanas. Naturalmente esta acción no puede realizarse si la columna código de la tabla HIJO no admite valores nulos. On Update Cascade Cuando se modifica un código en la tabla PADRE los códigos relacionados de la tabla HIJO son también modificados para que todos tengan el mismo valor. igual se puede grabar un registro en VENTASDET Se puede borrar un registro de la tabla PRODUCTOS aunque el código de ese registro se esté utilizando en la tabla VENTASDET Se puede cambiar el código de un producto aunque ese código se esté utilizando en la tabla VENTASDET O sea. Set Null Cuando se borra o modifica un código de la tabla PADRE los códigos relacionados de la tabla HIJO son puestos a null. por lo tanto puede ser (y generalmente es) omitido.43 - . como horas y minutos • No crees índices sobre columnas que se buscan con LIKE . Por lo tanto aunque pueden ser de gran ayuda es importante crear solamente los que sean necesarios y ninguno más. a veces mucho. además los índices deben ser actualizados cuando se agregan. Una buena práctica es la siguiente: • Creas tus tablas sin índices y los vas agregando a medida que los necesitas • Crea índices sobre columnas cuyo valores son frecuentemente buscados • Crea índices sobre columnas que frecuentemente aparecen en JOINs • Crea índices sobre columnas que frecuentemente aparecen en los primeros lugares de GROUP BY • No crees índices sobre columnas que tienen muchos valores repetidos • No crees índices sobre columnas que se usarán muy raras veces • No crees índices sobre columnas que tienen muchos valores que nunca son buscados. Límites Firebird admite hasta 256 índices por tabla. Cuando crees tus índices es importantísimo no duplicar los índices que ya ha creado el Firebird porque en ese caso el motor podría estar en la duda de cual usar (porque ambos son idénticos) y podría decidir no usar ninguno de ellos (haciendo tus búsquedas mucho más lentas). borran o modifican las filas.Índices Los índices son atributos de las tablas que pueden ser localizados sobre una columna o conjunto de columnas para acelerar la recuperación de filas. debes usar un índice ascendente • Si buscas valores altos.44 - . consumiendo tiempo. Dirección de los índices Todos los índices pueden ser ascendentes (de menor valor a mayor valor) o descendentes (de mayor valor a menor valor). La regla a aplicar es la siguiente: • Si buscas valores bajos. Es un error muy común creer que con un solo índice se obtendrán los mismos resultados tanto si se buscan valores altos como valores bajos. Cada índice puede tener hasta 253 bytes. debes usar un índice descendente Cuando indexar Cada índice ocupa espacio en disco. Índices automáticos Las restricciones PK y FK automáticamente crean sus propios índices. En lugar de eso. Cada transacción tiene un contexto único que causa que esté aislada de todas las demás transacciones. las aplicaciones realizan “conversaciones” con el Servidor a través de los pedidos que hacen y las respuestas que reciben. Transacciones intercaladas Ocurren cuando cambios en una fila por un usuario afectan a otras filas de esa misma tabla o de otras tablas que están siendo accedidas por otros usuarios. El primero de ellos realiza algunos cambios. La Base de Datos no cambiará si hay algún conflicto. pero sin tener la garantía de que esos cambios sean finales. esto puede ser un problema o no. Las reglas para ese contexto son especificadas por la aplicación cliente pasando parámetros de transacción. dependiendo de las circunstancias. Esto suele suceder cuando no hay forma de controlar el orden en el cual se realizan los cambios. Desde ese momento la transacción está activa. Para resolver estos problemas el Firebird aplica un modelo de administración que aísla cada tarea dentro un contexto único el cual le impide que sea completada si pone en riesgo otras tareas. . depende de las circunstancias.Transacciones Recuerda que en Firebird las aplicaciones nunca tocan los datos que están almacenados en una Base de Datos. pero no todas. Lecturas sucias Esto le permite a un usuario ver los cambios que otro usuario está haciendo. las filas insertadas por otro usuario. ¿Por qué se usan las transacciones? Porque cuando muchos usuarios están actualizando y consultando los mismos datos muchos problemas pueden ocurrir: Actualizaciones perdidas Esto ocurre cuando dos usuarios están viendo los mismos datos. Por lo tanto se pierden los cambios que había hecho el primero. Filas fantasmas Ocurre cuando un usuario puede seleccionar algunas. Lecturas no reproducibles Ocurren cuando un usuario está seleccionando filas continuamente mientras otros usuarios están modificando y borrando esas filas.45 - . Una conversación completa entre un cliente y el Servidor se llama transacción. ¿Cuándo se inicia una transacción? Cuando un Cliente pide que se inicie y recibe un handle del Servidor. poco después el segundo realiza otros cambios. Nuevamente. Esto puede ser un problema o no. Una transacción. ¿Cuál es la tarea del Servidor? Llevar la cuenta de cada transacción y mantener la vista que cada transacción tiene del estado de la Base de Datos consistente con su contexto. Una vez que una transacción se inició es la responsabilidad del Cliente enviar los pedidos de lectura y de escritura.46 - . Un Cliente puede tener muchas transacciones activas. muchos pedidos En Firebird cada operación pedida por un Cliente debe ocurrir en el contexto de una transacción. O sea que habrá dos filas similares guardadas en el disco duro. Una transacción puede implicar muchos pedidos del Cliente y muchas respuestas del Servidor. ¿Cómo se identifica una transacción? Cada transacción tiene un número único (ID) que sirve para identificarla. Para conocer cual es el número de la transacción actual en la base de datos activa: SELECT CURRENT_TRANSACTION FROM RDB$DATABASE. Grabación de datos En Firebird los datos pueden ser grabados de dos formas: a) Temporalmente b) Permanentemente .¿Cuándo finaliza una transacción? Cuando el Cliente envía un pedido de commit (grabar todos los cambios) o de roll back (deshacer todos los cambios) y ese pedido es completado. Una transacción puede abarcar más que una Base de Datos. También es su responsabilidad terminar la transacción (con un commit o un roll back). Tiene que administrar todos los pedidos de cambios a la Base de Datos para que los conflictos sean manejados adecuadamente y así evitar que se rompa la consistencia. Sin embargo no hay que usar ese número como clave primaria o clave única porque cada vez que se restaura un backup el contador de las transacciones vuelve a cero. el Servidor escribe una nueva versión de la fila en el disco duro. incluyendo lecturas y escrituras. Transacciones y MGA Como ya se ha visto. ¿Cuál es la tarea del Cliente? Iniciar todas las transacciones. las siglas MGA significan multi-generational architecture (arquitectura de múltiples generaciones). Si otra transacción escribe un cambio a esa misma fila. De esta manera el Firebird sabe cual es la transacción que está haciendo cada tarea. O sea que la primera transacción después de la restauración tendrá el número 1. En este modelo cada fila guardada en una base de datos tiene un número único identificando a la transacción que escribió esa fila. la segunda el número 2 y así sucesivamente. Por eso se dice que el Servidor mantiene dos generaciones de la misma fila. ” - Datos desechados El roll back nunca falla. entonces se los graba permanentemente en el disco (con un commit). Este desecha todos los cambios que se realizaron en la transacción. Si todo está bien y solamente si todo está bien. UPDATE o DELETE está viendo los cambios que esas operaciones implican o Los demás usuarios no los ven o Si el usuario graba en forma permanente (con un commit). nunca falta o sobra algo. modificarlos. Nunca. Una sola transacción puede realizar muchas tareas: insertar registros en una o en varias tablas. Por lo tanto: o El usuario que realizó un INSERT. los demás usuarios jamás se enteraron de ellos Por ejemplo: El usuario Juan cambia el número de teléfono del proveedor “TodoFrutas S. que aún es reversible.A” El usuario Juan imprime los números de teléfono de todos los proveedores. modificación o borrado se realiza en forma temporal. nadie más está enterado.A. Eso implica que: o El proveedor que se había agregado a PROVEEDORES es eliminado o La compra que se había agregado a COMPRASCAB es eliminada .” aparece en ese informe El usuario María imprime los números de teléfono de todos los proveedores. Es decir.47 - . borrarlos.A. Y mientras tanto solamente es visible dentro del contexto de la transacción que hizo la operación.A. los demás usuarios también ven los cambios o Si el usuario desecha los cambios (con un roll back). El nuevo número de teléfono de “TodoFrutas S. ¿Por qué se hace así? Porque de esa manera las bases de datos siempre tienen datos consistentes. Por ejemplo si se tiene una tabla maestro y una tabla detalles el programador puede estar seguro que la tabla detalles tiene todas las filas y con todos los datos correctos.” aparece en ese informe El usuario Juan graba en forma permanente los cambios (hace un commit) Los demás usuarios (María y los otros) recién ahora pueden ver el nuevo número de teléfono del proveedor “TodoFrutas S. El viejo número de teléfono de “TodoFrutas S. tanto el que causó el error como todos los demás que se hubieran grabado exitosamente de no haber ocurrido el error.Siempre que se realiza un INSERT o un UPDATE o un DELETE a una tabla esa inserción. modificaciones y borrados pueden ser desechados (mediante un roll back). Si se descubre algún error en alguna de esas tareas entonces todas esas inserciones. Por ejemplo: • Se inicia una transacción • Se agrega un proveedor a la tabla de PROVEEDORES • Se agrega una compra a la tabla COMPRASCAB • Se agregan los datos de los productos comprados a la tabla COMPRASDET • Se descubre un error • Se realiza un roll back de los datos. sin faltar nada. Solución a los problemas Para lidiar con esos problemas hay varias formas: 1.• o Los productos que se habían agregado a COMPRASDET son eliminados Se finaliza la transacción Problemas con transacciones Como ya se vio anteriormente. las aplicaciones no se cuelgan. pero no todos. Y las inserciones. las únicas formas de finalizar una transacción son mediante un commit o mediante un roll back. Es decir: se degrada la performance. cuando se le permite a un usuario salir de la aplicación sin antes hacer el commit o el roll back. .EXE (que está instalado en la carpeta \BIN del Firebird) El backup y la restauración solucionarán algunos de los problemas. Hacer un backup y una restauración de la Base de Datos 2. una revisión humana puede ser necesaria. A estas transacciones se las llama muertas porque no están ligadas a ninguna conexión. Pero ¿qué ocurre si la aplicación se colgó o hubo un corte de energía eléctrica? En ese caso la transacción continuará activa porque el Servidor no finalizará una transacción a menos que se le pida que lo haga.48 - . los usuarios no salen de la aplicación sin antes hacer un commit o un roll back ). si el entorno es el adecuado (el Servidor tiene una fuente de energía ininterrumpida. Pero si aún así la base de datos es más grande de lo que debería ser o las consultas son lentas. todo debería funcionar siempre muy bien. De todas maneras. En sistemas mal diseñados también ocurrirá lo mismo. El gfix solucionará otros. Usar el programa GFIX. modificaciones o borrados que hizo la transacción continúan dentro de la base de datos pero nadie puede acceder a ellos. ¿Y cuál es el problema? Que si múltiples versiones de una fila están en una tabla o si hay transacciones muertas entonces se está ocupando innecesariamente espacio en el disco duro y las búsquedas y las consultas son más lentas. si la conexión tiene problemas (suele ocurrir cuando es por Internet). Cuando se trabaja con Cliente/Servidor hay que: 1. Conectarse a la Base de Datos 2. Ventas. el nombre del usuario. La segunda opción (conectarse sin DSN) es preferible si una sola aplicación se conectará. En el DSN se especifican el nombre de la Base de Datos. la contraseña y alguna otra información relevante. Sin embargo. Una buena práctica es la siguiente: se realiza la conexión de la primera forma pero si se encuentran muchas o frecuentes caídas de conexión se opta por la segunda forma. La conexión también puede realizarse sin DSN. La conexión se realiza al principio de la aplicación (Contabilidad. el driver ODBC. Visual FoxPro y Firebird Bueno. porque el estar conectándose y desconectándose toma un buen tiempo.Parte 3. Sueldos. etc. después de todas las páginas anteriores finalmente llegamos a lo que puede resultar más interesante a los programadores en Visual FoxPro: como integrar el lenguaje con el Firebird. Ejecutar un comando 3. Una vez que se creó un DSN para una Base de Datos se lo puede usar en cualquier aplicación para conectarse a esa Base de Datos. La primera opción (conectarse con DSN) es útil cuando varias aplicaciones (quizás creadas con distintos lenguajes) deben conectarse a la misma Base de Datos. pero a veces no hay otra alternativa. Desconectarse de la Base de Datos Desde luego que esto es mucho más lento.) y la desconexión al finalizar la aplicación. . Si la conexión es sin DSN.49 - . En este caso toda la información necesaria para la conexión se escribe dentro de la aplicación. ¿Que es DSN? Son las siglas de Data Source Name (Nombre de la Fuente de Datos) y sirve para proveer conectividad a una Base de Datos a través de un driver ODBC. Desconectarse de la Base de Datos Esa es la forma correcta cuando tanto el Servidor como el Cliente están en una LAN. Conectarse a la Base de Datos 2. entonces hay que: 1. en lugar de utilizar un driver ODBC se puede usar OLE DB o algún otro método. Ejecutar los comandos 3. la carpeta. como se verá más adelante. lo único que tendrás que hacer es instalar el driver ODBC y luego enviar un “string” de conexión. entre ellas que permite que el código escrito sea reutilizable. La POO tiene muchas cosas buenas. La clase que se desarrollará a continuación permitirá: • Conectarse a una Base de Datos con DSN • Conectarse a una Base de Datos sin DSN • Desconectarse de una Base de Datos (o de todas al mismo tiempo) • Hallar el nombre del driver que se necesitará para la conexión • Ejecutar comandos • Verificar si hay una conexión activa Naturalmente puedes agregarle las funciones o procedimientos que te parezcan adecuados o necesarios.DLL) Escribir el nombre del usuario de la Base de Datos Escribir la contraseña de ese usuario Escribir el conjunto de caracteres (español es ISO8859_1) Si no ves el driver “Firebird/Interbase (r) driver” es porque aún no has ejecutado el instalador de ese driver. se le pueden adicionar nuevas funcionalidades. esta es una clase básica. debes instalar el driver ODBC del Firebird en la computadora. Para conectarse sin DSN Si deseas conectarte sin usar DSN (muchas veces es la opción preferible).php?op=files&id=odbc busca uno que corresponda a tu versión del Windows. Una clase para usar con Bases de Datos SQL Desde hace muchas versiones el Visual FoxPro permite la programación orientada a objetos (POO) y esta es una muy buena oportunidad para usarla. .firebirdsql. que todo se encuentre en un solo lugar haciendo más fácil buscar y modificar lo que se desee y que los cambios se propagan a todos los objetos creados a partir de una clase. Lo puedes encontrar y descargar de: http://www.Para crear un DSN Primero. Por supuesto que las Bases de Datos SQL se pueden usar sin necesidad de objetos pero ya que se tiene esa posibilidad. ¿por qué no aprovecharla?.50 - .org/index. de acuerdo a las necesidades de cada quien. luego: Inicio Panel de Control Herramientas Administrativas Orígenes de Datos (ODBC) DSN de Sistema Hacer click en el botón “Agregar” Elegir: Firebird/Interbase (r) driver Escribir el nombre que se le quiere dar a la conexión DSN Escribir una descripción Escribir el nombre de la Base de Datos que corresponde a la conexión Escribir el nombre del archivo DLL del cliente (FBCLIENT. 1.lnHandle > 0. * * ENDDEFINE * * Estas son todas las variables internas (o propiedades) de la clase que se está creando.lnResultado) * * La función SQLConnect() es la que intenta realizar la conexión. recibe como parámetros el nombre de la conexión DSN.PRG. entonces puedes usar la siguiente función para conectarte a una Base de Datos: Function CONECTAR_CON_DSN with This . && Si quiere terminar la conexión después && de ejecutar un comando. Pero esas propiedades por sí solas no sirven para mucho. . -1) endwith Return(This. el nombre del usuario y la contraseña del usuario.51 - . . devuelve un número entero y negativo.lcUsuario.lcNombreConexion. En la propiedad lnResultado se guarda el resultado del intento de conexión.lnResultado = iif(.lcContrasena) . devuelve un número entero mayor que cero (o sea. son más útiles cuando se crean procedimientos o funciones que las manipulan. Útil cuando se && accede por Internet.lnHandle = SQLConnect(.Lo primero que se debe hacer es escribir en la ventana de comandos: modify command SQL_CLASES Estando dentro del archivo SQL_CLASES. escribir: DEFINE CLASS SQL_DataBase as CUSTOM * * lcODBC_Driver = "" lcServidor = "" lcBaseDatos = "" lcNombreConexion = "" lcUsuario = "" lcContrasena = "" lnHandle = 0 lcMensajeError = "" lnResultado = 0 lcComando = "" lcNombreCursor = "" llTerminarConexion = . Función para conectarse a una Base de Datos usando DSN Si definiste un DSN (como se explicó anteriormente). un número natural: entero y positivo).F. . Si la conexión se realizó con éxito. Si por algún motivo la conexión no pudo realizarse. si vale -1 (menos uno) que falló. Si vale 1 (uno) significa que tuvo éxito. Un valor de 1 (uno) significa éxito y un valor de -1 (menos uno) que hubo algún problema. 1.lcServidor + ".lnHandle = SQLStringConnect(lcCadenaConexion) . .lnResultado = SQLDisconnect(0) endif if .lnResultado) * * En este caso hay que armar una “cadena de conexión” y usar la función SQLStringConnect()." .lnHandle) endwith Return(This. se puede usar la siguiente función para realizar la conexión a la Base de Datos: Function CONECTAR_SIN_DSN Local lcCadenaConexion with This lcCadenaConexion = "DRIVER={" + . Al igual que antes en la propiedad lnResultado se guardará el resultado del intento de conexión.lcBaseDatos + ". + "OPTIONS=131329. + "SERVER=" + ." . trata de desconectarse.lcUsuario + ".lnHandle > 0. + "DATABASE=" + .lnResultado = SQLDisconnect(.lnResultado > 0.52 - . "DispLogin"." .lcODBC_Driver + "}. 3) && Para no mostrar caja diálogo del Login with This ." . + "PASSWORD=" + ." .lnHandle > 0 && Si quiere desconectarse de UNA Base de Datos y hay && una conexión activa." endwith =SQLSetProp(0. Procedimiento para hallar el nombre del driver En una computadora normalmente hay muchos drivers instalados.lcContrasena + ". Function DESCONECTAR with This if . . Función para desconectarse de una (o todas) Base de Datos SQL Antes de finalizar tu aplicación lo correcto es que te desconectes de la Base de Datos que estuviste usando. + "USER=" + .lnHandle = iif(.lnHandle) endif .lnResultado = iif(. -1) endwith Return(This.Función para conectarse a una Base de Datos sin usar DSN Si no se definió un DSN. sin embargo para realizar la conexión a la Base de Datos SQL necesitamos saber si uno en especial está (o no está) instalado.lnHandle == 0 && Si quiere desconectarse de TODAS las Bases de && Datos. 0.lnResultado) * * Si la desconexión se realizó con éxito entonces la propiedad lnHandle tendrá el valor de 0 (cero) y la propiedad lnResultado el valor de 1 (1 = éxito). . . 53 - . tcNombreCursor Local lnI tcNombreCursor = iif(VarType(tcNombreCursor) <> "C".GetODBCDrvrs(@aVec) lcSetExact = Set("EXACT") set exact OFF && Tiene que estar en OFF para que lo pueda encontrar lnNumElemento = AScan(aVec. tcNombreCursor) with This .HayConexion() . Intento Nº " + Transform(lnI) TimeOut 2 endif lnI = lnI + 1 enddo if . lnNumError. lnNumElemento loReg = CreateObject("ODBCReg") Dimension aVec(2000) lnNumError = loReg. . usualmente cuando se accede por Internet .lcNombreCursor = tcNombreCursor lnI = 1 do while !.Lo que hace el siguiente procedimiento es lo siguiente: • Carga en un vector (o array) los nombres de todos los drivers • Verifica si el driver que se busca está en ese vector • Guarda en la propiedad lcODBC_driver el nombre del driver • Guarda en la propiedad lnResultado si se encontró o no el driver buscado. tcNombreMotorSQL) set exact &lcSetExact Release loReg with This . ¿por qué no crear una función propia que no solamente trate de ejecutar un comando sino que también verifique antes si hay una conexión activa y en caso de no haberla intente la conexión? Function EJECUTAR LParameters tcComando.Desconectar() endif else .lcNombreCursor) if .lnHandle > 0 && Hay una conexión activa .llTerminarConexion && Quiere terminar la conexión después de ejecutar el comando. loReg.lcODBC_Driver = iif(lnNumElemento > 0.lnResultado < 0 Wait window "No puedo conectarme al Servidor. Deberías verificar que la red esté funcionando correctamente.lnResultado = SQLExec(.Conectar_sin_DSN() if . desde luego).and. aVec[lnNumElemento].lnResultado = -1 endif endwith Return(This.lnResultado = iif(!Empty(.lcComando = tcComando . Procedure HALLARNOMBREDRIVER LParameters tcNombreMotorSQL Local lcNombre. Si hay una conexión activa entonces trata de ejecutar el . 1. "") . lnI <= 30 . verifica si hay una conexión activa. si no la hay trata de conectarse. Pero ya que se está escribiendo una clase. "".lnHandle.lnResultado >= 1) * * Primero.lcComando. . se hacen 30 intentos esperándose 2 segundos entre uno y el siguiente. lo que hace un total de 1 (un) minuto de intentos.lcODBC_Driver). lcSetExact. -1) endwith EndProc * * Función para ejecutar comandos SQL Con la función SQLExec() se pueden ejecutar los comandos SQL (si existe una conexión activa a una Base de Datos. por lo tanto la siguiente vez que se ejecute el programa se seguirán viendo los valores originales. si se tuvo éxito.lnHandle. "SELECT CURRENT_TIME FROM RDB$DATABASE") Catch llResultado = -1 EndTry Return(llResultado == 1) * * La forma de verificar si hay una conexión activa es la siguiente: se trata de obtener la fecha y la hora del Servidor. significa que sí hay una conexión activa. Usando la instrucción SELECT El comando SELECT permite realizar consultas a la Base de Datos. Function HAYCONEXION Local llResultado Try llResultado = SQLExec(This.mediafire. eso es seguro. Si se consiguió. Descargar las clases Estas clases (SQL_CLASES y SQL_REGISTRYCLASS) pueden descargarse desde: http://www. si modificas los campos que ves en el BROWSE. ocurrirá un error.F. . En cambio. la conexión está ok. En este ejemplo esos datos son luego mostrados con un BROWSE. ese nuevo valor no es actualizado en la Base de Datos.mediafire. eso significa que hubo algún problema. Ejemplo Nº 1. Eso es distinto que cuando se trabaja con tablas . La función devuelve .com/?qqsh1q2z3e6kmnq Programas en Visual FoxPro que usan Firebird Estos programas son ejemplos que muestran como usar Bases de Datos Firebird en Visual Foxpro. la conexión no está activa. Si después de eso el usuario quiere desconectarse de la Base de Datos. Porque si no la hay. los cambios que haces en un BROWSE no se graban en la tabla original. Función para verificar si hay una conexión activa Antes de enviar un comando SQL es conveniente verificar que hay una conexión activa a la Base de Datos. esos cambios quedan grabados en la tabla.DBF. si ocurrió algún problema. Si quieres grabar algo en una tabla SQL debes enviar específicamente una instrucción INSERT o UPDATE. cuando usas tablas SQL.comando pedido. O sea. Si no se pudo obtener la fecha y la hora. se desconecta. En este caso.com/?64vd8se54g91eob http://www. pero los datos los retorna en una tabla temporal (o cursor). Lo importante a notar es que si se cambia el contenido de alguno de los campos mostrados por el BROWSE.T.54 - . si el comando se ejecutó exitosamente o . Otra ventaja es que si el SELECT que has escrito en tu programa Visual FoxPro no te funciona y no sabes el motivo entonces al escribirlo dentro del ISQL obtendrás información que te resultará de utilidad para saber qué estás haciendo mal. como se muestra a continuación para el primero de ellos: Y aquí se muestra el segundo SELECT del programa (donde se supone que ya estás conectado a la Base de Datos EMPLOYEE.FDB): Por supuesto que usar ISQL no suele ser la mejor alternativa. Para salir del BROWSE presiona la tecla ESC (o si prefieres puedes presionar la tecla ESC tanto para salir del WAIT WINDOW como para salir del BROWSE). Por ejemplo: .En el programa de ejemplo antes de llamar a cada SELECT se muestra un mensaje mediante un WAIT WINDOW. para que ese mensaje desaparezca puedes presionar cualquier tecla.55 - . SQL Manager o inclusive el BROWSE del Visual FoxPro pero la gran ventaja que se tiene con ISQL es que está siempre disponible en todas las instalaciones del Firebird. IMPORTANTE: Todos estos SELECT los puedes escribir en el programa ISQL. y en su lugar se puede usar Flame Robin. El cursor de los ejemplos se llama TEMP (por: temporal o temporario). por supuesto que tú puedes elegir cualquier otro nombre que desees cuando generes tus propios cursores. pero a la izquierda de la cláusula GROUP BY hay dos campos y se debe usarlos a los dos. a nadie se le vende a crédito. gaseosas. En su lista hay cervezas. Al empleado además de un sueldo fijo se le paga una comisión del 3% sobre las ventas realizadas. Aunque a veces parecen ser la misma cosa. 24 unidades. comprada o vendida. usando Firebird SQL como motor de la Base de Datos. Las ventas pueden ser al por mayor o al por menor (o detalle). inclusive cuando hay partidos de fútbol importantes o algún otro acontecimiento los días Domingo tienen una venta muy grande. para ordenarlas en forma descendente hay que agregar DESCENDING. whiskies. EMP_NO. Después del análisis correspondiente se ha encontrado que se necesitarán las siguientes tablas: • Vendedores • Proveedores • Productos • Movimientos cabecera • Movimientos detalles Se han determinado las siguientes restricciones: • Ninguna fecha de compra o de venta puede faltar • Ninguna fecha de compra o de venta puede ser anterior al 1 de enero de 2011 • Ninguna cantidad. es lo único que venden y no tienen previsto vender algo más. pero su fuerte son las bebidas alcohólicas. 12. aguas minerales. en especial las cervezas. Nunca devuelven productos a los proveedores ni aceptan devoluciones de los clientes. comprada o vendida. agrupar es distinto que ordenar. 6. para ordenarlas se usa ORDER BY. Ejemplo Nº 2. Los clientes no pueden retirar la mercadería antes de pagarla. La aplicación se realizará en Visual FoxPro. las cajas (o packs) pueden contener: 3. por ningún motivo. vinos. ventas) Un pequeño negocio ha pedido que se le haga una aplicación para ayudarle con el control del mismo. Una pequeña aplicación administrativa (stock. Pueden vender por unidades o por cajas (o packs). compras.En este caso se agrupó solamente por FULL_NAME. No tienen sucursales ni planean tenerlas. para agrupar (poner a las filas en grupos) se usa GROUP BY. debe ser mayor que cero . Todas las compras y todas las ventas son al contado. La expresión correcta es la siguiente: SELECT EMP_NO. puede faltar • Toda cantidad. Ellos se dedican a vender bebidas. los precios de venta son distintos para ambos casos. El negocio abre los 7 días de la semana. quienes se van turnando los horarios.56 - . En ese negocio trabajan dos personas: el propietario y un empleado. FULL_NAME FROM EMPLOYEE GROUP BY FULL_NAME. los dominios. tablas y vistas se utilizaron scripts.SQL pero no es obligatorio. entre ‘000’ y ‘999’ Todos los vendedores deben tener un nombre y en mayúsculas Todos los proveedores deben tener un código único. de compra o de venta.57 - . de tal manera que sea muy fácil reconstruirla en caso de necesidad. .• • • • • • • • • • • • • • • Ningún importe. significando “compras” y “ventas”. entre ‘000’ y ‘999’ Todos los productos deben tener un nombre y en mayúsculas Todos los productos deben tener una cantidad no negativa Todos los productos deben tener un precio de costo positivo Todos los productos deben tener un precio de venta mayorista positivo Todos los productos deben tener un precio de venta minorista positivo Todos los movimientos cabecera deben tener un tipo de movimiento (‘COM’ o ‘VEN’. puede faltar Todo importe. En ISQL se utiliza la instrucción INPUT para ejecutar un script. entre ‘000’ y ‘999’ Todos los proveedores deben tener un nombre y en mayúsculas Todos los proveedores deben tener un teléfono Todos los productos deben tener un código único. respectivamente) Todos los movimientos detalles deben tener un campo que los relacione con los movimientos de cabecera Para crear la Base de Datos.SQL para que los demás puedan entenderte fácilmente. de compra o de venta. debe ser mayor que cero Todos los vendedores deben tener un código único. como se ve a continuación: Por convención los scripts tienen la extensión . a tus scripts puedes ponerles la extensión que quieras aunque desde luego sería preferible que usaras .
Copyright © 2024 DOKUMEN.SITE Inc.