Sei sulla pagina 1di 57

Visual FoxPro y Firebird SQL

ndice
Introduccin............................................... 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 terminologa.............................. PARTE 2: Firebird.......................................... Qu es Firebird?....................................... Tipos de Servidor....................................... Recursos utilizados..................................... Plataformas y versiones para el Servidor................ Plataformas y versiones para el Cliente................. Caractersticas principales de Firebird................. Conectividad............................................ Herramientas............................................ Instalando el Servidor.................................. Instalando el Cliente................................... Instalando el driver ODBC............................... Verificando la instalacin.............................. El archivo HOST......................................... El archivo ALIASES.CONF................................. El archivo FIREBIRD.CONF................................ El archivo SECURITY2.FDB................................ Como evitar la corrupcin de las Bases de Datos......... Como corromper una Base de Datos........................ Dialectos SQL (SQL dialect)............................. Tamao de la pgina (page size)......................... Conjunto de caracteres (character set).................. Scripts................................................. El usuario SYSDBA....................................... Agregando nuevos usuarios........................... Borrando usuarios................................... Listando todos los usuarios......................... Cambiando la contrasea de un usuario............... Nombres de los usuarios............................. Contraseas (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 ms 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 estn repetidos...... Consultar los datos ordenadamente................... Contar la cantidad de filas de una tabla............ Sumar una columna numrica.......................... Hallar el promedio de una columna numrica.......... Hallar el valor mnimo de una columna numrica...... Hallar el valor mximo de una columna numrica...... 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 grfico?............. La Base de Datos Employee........................... Registrando una Base de Datos....................... Qu son los dominios?.............................. Cmo 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?.......................... Cundo se usan los : delante del nombre de una Variable?........................................... Integridad Referencial.................................. La restriccin foreign key.......................... Indices................................................. Transacciones........................................... Por qu se usan las transacciones?................. Una transaccin, muchos pedidos..................... Transacciones y MGA................................. Grabacin de datos.................................. Datos desechados.................................... Problemas con transacciones......................... Solucin 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.............. Funcin para conectarse a una BD usando DSN......... Funcin para conectarse a una BD sin usar DSN....... Funcin para desconectarse de una (o todas) BD SQL.. Procedimiento para hallar el nombre del driver...... Funcin para ejecutar comandos SQL.................. Funcin para verificar si hay una conexin activa... Descargar las clases................................ Programas en Visual FoxPro que usan Firebird............ Ejemplo N 1. Usando la instruccin SELECT.......... Ejemplo N 2. Una pequea aplicacin administrativa. Conclusin.................................................

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


Introduccin
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 caractersticas de Firebird y como integrarlo con Visual FoxPro. Para que todo sea ms fcil de entender, este documento se divide en tres partes: 1. Cliente/Servidor. Donde se explican algunos conceptos bsicos 2. Firebird. Donde se explican sus principales caractersticas 3. Visual FoxPro y Firebird. Donde se explica como usarlos juntos Visual FoxPro es un lenguaje fantstico, tiene muchsimas capacidades de las cuales carecen otros lenguajes, se pueden realizar aplicaciones realmente muy buenas usndolo, es ms, resulta prcticamente imposible pensar en una aplicacin 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 fcil 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 lgico que estos dos colosos trabajen juntos. Sin embargo, hasta este momento no haba literatura al respecto, quienes usaron Visual Foxpro con Firebird estn ms que conformes con el rendimiento obtenido pero todo lo tuvieron que aprender desde cero. Cuando finalices de leer este documento te habrs ahorrado un montn de tiempo. En este documento se supone que ya has programado en Visual FoxPro y lo conoces ms o menos bien. Est orientado a ensearte las diferencias que tiene con el Firebird, las caractersticas 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 caracterstica del Sistema Operativo, no del lenguaje. Es el Windows quien te da acceso a los archivos que estn 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 daarse o corromperse. Es bastante frecuente encontrarse con tablas o ndices daados. Un corte de la energa elctrica o un reset en cualquiera de las computadoras de la red puede corromper las tablas o los ndices. Adems, como las carpetas son compartidas algunos humanos (por intencin o por ignorancia) pueden borrar o modificar los archivos que en ellas se encuentran. En cambio en un sistema Cliente/Servidor los clientes (aunque estn localizados en la misma computadora que el Servidor) nunca tocan los datos directamente, sino que envan mensajes al Servidor dicindole lo que quieren hacer. El Servidor procesa esos mensajes y ejecuta los pedidos usando su propio cdigo 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) intencin 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 contrasea de ese usuario algunos conocimientos de programacin para poder conectarse a ella En un sistema de archivos compartidos, es muy fcil 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 mdulos de software diseados para comunicarse entre s usando el mismo protocolo de comunicacin. El Cliente enva mensajes al Servidor pidindole 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-

Como funciona Cliente/Servidor


Un programa llamado Servidor se instala en una computadora. Su misin 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. Otro programa, llamado Cliente, se instala en otra computadora (o en la misma). Su misin es recibir pedidos de la aplicacin (Contabilidad, Ventas, Sueldos, etc.) y enviar esos pedidos al Servidor y recibir los datos que ste le provee para devolverlos a la aplicacin. Pero esos datos son una imagen, una copia, de los datos que se encuentran en el Servidor.

Este es un concepto que se debe entender muy bien: los datos que recibe el Cliente (y que luego enva a la aplicacin) son una copia de los datos del Servidor. En cambio en un sistema de archivos compartidos (el utilizado por las tablas .DBF) son los datos originales, no una copia, los que utilizan las aplicaciones. En Firebird: La APLICACIN enva un pedido al CLIENTE quien lo enva al SERVIDOR El SERVIDOR enva la respuesta al CLIENTE quien la enva a la APLICACIN La aplicacin puede ser un sistema de Contabilidad, de Facturacin, de Sueldos, etc.

APLICACIN (Contabilidad, Facturacin, Sueldos, Tesorera, etc.)

Pedido CLIENTE

Pedido SERVIDOR

Respuesta

Respuesta

Cuales son las ventajas de usar Cliente/Servidor?


Mayor seguridad. La Base de Datos se encuentra en una computadora a la cual los usuarios de otras computadoras de la red no pueden acceder. Recuerda que no hay carpetas compartidas. Adems, cada Base de Datos tiene sus propios mecanismos de seguridad, para usarla hay que especificar el nombre del usuario y la contrasea. Inclusive a los usuarios se los puede agrupar en roles con lo cual se determina qu pueden hacer y que no. Mayor rapidez. Los datos que viajan por la red son pocos, eso incrementa la velocidad. Aunque los usuarios sean muchos, el trfico por la red siempre es mucho menor que usando un sistema de archivos compartidos (tablas .DBF) que tenga la misma cantidad de usuarios.

-6-

Consistencia de los datos. O se graban todos los datos o no se graba ninguno. En un sistema de archivos compartidos (tablas .DBF) podra darse el siguiente caso: se graba una fila (registro) en la tabla cabecera, mientras se estn grabando las filas (registros) de la tabla de detalles se interrumpe la energa elctrica. Cul es la consecuencia? Que el movimiento (o transaccin) est incompleto. Algo as no puede suceder en Firebird porque los datos: o se graban todos o no se graba ninguno. Jams pueden estar incompletos. Acceso a travs de Internet o redes WAN. Como los datos que viajan son pocos, hacer aplicaciones que enven/reciban datos a travs de Internet o de una red WAN es eficiente. Independencia del lenguaje. Si ya no quieres programar en Visual FoxPro y prefieres hacerlo en Java, Visual Basic, Delphi o cualquier otro lenguaje, no hay problema. Dentro de la Base de Datos nada cambiar.

Como mostrar los datos al usuario


Cuando se utilizan tablas .DBF es comn que el programa de ABM tenga los botones Primero, Anterior, Siguiente, Ultimo. Inclusive es comn mostrar muchos datos en una grilla para que el usuario pueda navegar a travs de ella. En una aplicacin Cliente/Servidor eso es considerado mala prctica. 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, nunca ms. Nunca. Si el usuario necesita ver ms filas (registros) entonces debe hacer click en un botn para que se le muestren las siguientes (o anteriores) 200 filas (registros). Lo normal en las buenas aplicaciones Cliente/Servidor es que la interfaz sea de bsqueda (el usuario escribe lo que necesita y slo eso se le muestra).

Manera eficiente de enviar/recibir datos del Servidor


La filosofa detrs de Cliente/Servidor es que el trfico en la red sea el mnimo posible. Ni un byte ms de lo estrictamente necesario. Tanto en un sentido (del Cliente al Servidor) como en el otro (del Servidor al Cliente). Por lo tanto: Todo lo que puede procesarse en la aplicacin se debe procesar en la
aplicacin Los procesos que requieren acceso a las tablas deben realizarse en el Servidor, nunca en la aplicacin

Un ejemplo: una aplicacin enva una peticin de consulta al Servidor para que devuelva un cursor (un cursor es una tabla temporal) con las ventas realizadas entre dos fechas. En el Servidor se descubre que una de las fechas estaba vaca. Eso es un error de concepto. Por qu? porque esa verificacin pudo haberse realizado en la aplicacin, la peticin de consulta viaj por la red y el mensaje de error tambin. O sea, hubo un trfico innecesario en la red, lo cual la hace ms lenta. Cuando de devolver datos se trata, al Servidor deben llegar siempre los datos totalmente validados, all no debe validarse nada, todas las validaciones deben realizarse antes.

-7-

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. Cmo se obtuvieron esos datos? Se los trajo del Servidor? Ese es otro error de concepto, porque si la empresa tiene 2.000 proveedores, viajaron por la red los datos de los 2.000 proveedores. Lo correcto es tener en el disco local una tabla con los datos de los proveedores (solamente cdigos y nombres, nada ms), cuando el usuario quiere verlos para elegir a uno de ellos se verifica que la tabla local coincida con la tabla del Servidor cmo? si por ejemplo el ltimo cdigo de la tabla local es el 1997 entonces se sabe que faltan los tres ltimos proveedores. Se copian los cdigos y nombres de esos tres proveedores en la tabla local y se le muestra al usuario esa tabla. Cuando el usuario elige a uno de esos proveedores entonces se enva su cdigo al Servidor, para recuperar los dems datos de ese proveedor (direccin, telfono, localidad, e-mail, etc.). O sea, por la red viajaron los datos de los 3 proveedores faltantes (cdigos y nombres) ms los datos del proveedor elegido. Y no los datos de los 2.000 que estaban en el Servidor. Otro ejemplo: se le quiere mostrar al usuario los datos de los proveedores a quienes se les debe ms de 10.000 dlares. Cmo se hace eso? Trayendo todos los proveedores del Servidor y luego filtrando para que solamente queden a quienes se les debe ms de 10.000 dlares? ese es otro error de concepto. Porque si hay 2.000 proveedores y solamente 50 cumplen con la condicin, viajaron por la red los 2.000. Lo correcto es que en la peticin de consulta se especifique la condicin, para que el Servidor enve los datos de 50 proveedores, no de 2.000. Por supuesto que si hay que imprimir un informe con los datos de todos los proveedores entonces los datos de todos los proveedores viajarn por la red. Pero si solamente se necesitan los datos de algunos proveedores, solamente los datos de ellos deben viajar por la red. Siempre hay que tener presente lo siguiente: el trfico en la red debe ser el mnimo posible. Por lo tanto traer todos los datos es, en general, un error de concepto. Estars empezando a entender la idea detrs de Cliente/Servidor cuando tengas muy en claro que: por la red debe viajar la menor cantidad de datos posibles. En el lenguaje SQL la instruccin utilizada para traer datos desde el Servidor hacia el Cliente se llama SELECT. Por ejemplo, la siguiente instruccin: SELECT * FROM Paises Mostrar todos los datos de todos los pases. Si realmente se desea ver todos los datos de todos los pases (cdigos, nombres, capitales, poblacin, forma de gobierno, idioma oficial, moneda, etc.) entonce es correcta. Pero si solamente se desean ver algunos datos (cdigos y nombres, por ejemplo) es errnea porque se est haciendo viajar por la red datos que no se utilizarn. En sntesis: en general, usar SELECT * es un error. Por qu? porque en general no se necesitan todas las columnas (campos) de cada fila (registro).

-8-

Para quienes estn acostumbrados a usar tablas .DBF esto puede resultar difcil al principio, ya que all lo normal es que los registros se lean completamente. Cuando se accede a un registro se tiene acceso a todos sus campos. Por ejemplo: USE Paises SET ORDER TO TAG Codigo SEEK 595 && Busca el pas que tiene cdigo 595 ? Codigo, Nombre, Capital, Poblacion, FormaGob, Idioma, Moneda No es el mismo caso en SQL, en SQL se pueden especificar cuales son las columnas (campos) requeridos. Por ejemplo: SELECT Codigo, Nombre FROM Paises WHERE Codigo = 595 solamente traer el Cdigo y el Nombre del pas cuyo cdigo es 595. O sea, que por la red solamente viajaron el Cdigo y el Nombre de ese pas, nada ms. Al no viajar la Capital, Poblacin, etc., todo es ms rpido.

Claves primarias
Cada tabla debe tener s o s una clave que identifique a cada fila (registro) de manera inequvoca (o sea que no puede faltar ni estar duplicada). A esa clave se la llama Clave Primaria (PK = Primary Key). 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 lgico. Para que una columna (campo) pueda ser utilizada como clave primaria, no debe aceptar valores nulos.

Relaciones
Para relacionar una tabla con otra se utilizan las claves forneas o extranjeras (FK = Foreign Key). Ese relacionamiento es persistente, o sea que estar en vigencia sea cual sea la aplicacin que utilice a esa Base de datos.

Concurrencia
En una aplicacin multi-usuario puede ocurrir que dos o ms de ellos quieran leer o modificar la misma fila (registro) al mismo tiempo. Eso puede causar problemas a veces graves. 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.

-9-

Transacciones
Esto puede ser un poco difcil de entender al principio ya que cuando se usan tablas .DBF los datos quedan grabados despus que el usuario hizo click sobre el botn Grabar y la luz del disco duro se apag. En cambio en Firebird todas las comunicaciones entre el Cliente y el Servidor ocurren durante transacciones. Inclusive leer una fila (registro) de una tabla no se puede realizar si antes no se inici una transaccin. Una transaccin empieza cuando el Cliente la inicia (a pedido de la aplicacin), a partir de ese momento y hasta que finaliza (tambin por pedido de la aplicacin al Cliente) puede realizar pedidos al Servidor. Durante este perodo 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, o sea que aunque ya se grabaron en el disco duro todava son reversibles. La transaccin finaliza cuando la aplicacin le pide al Cliente que las operaciones sean permanentes (commit) o que sean desechadas si ocurri algn error (roll back). 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. Por lo tanto: o se graban todos o ninguno. Esto incluye cualquier cambio realizado por desencadenantes (triggers) o procedimientos almacenados (stored procedures).

Diferencia de terminologa
En las bases de datos relacionales (como Firebird) se le llama fila a lo que en Visual FoxPro estamos acostumbrados a llamar registro. Y se le llama columna a lo que le solemos llamar campo. Recuerda eso. fila columna ----------> ----------> registro campo

Como seguramente ests ms acostumbrado a llamar registro y campo a lo que en SQL se llaman fila y columna es que muchas veces vers esas palabras rodeadas de parntesis. Pero trata de acostumbrarte a los nombres fila y columna porque sern los que leers en toda la literatura SQL.

- 10 -

Parte 2. Firebird
Qu es Firebird?
Es un motor de bases de datos relacionales SQL. Es Open Source (cdigo abierto) y es totalmente gratis, tanto para uso privado como para uso comercial. Tiene todas las caractersticas y la potencia de un RDBMS (Relational DataBase Management System o Sistema Administrador de Bases de Datos Relacionales). Puede manejar bases de datos desde unos pocos Kilobytes hasta muchos Terabytes con muy buen rendimiento y casi sin mantenimiento.

Tipos de Servidor
Firebird tiene cuatro tipos de Servidor (Classic, SuperServer, SuperClassic, Embedded), cualquiera de ellos se puede utilizar y sea cual sea el utilizado las Bases de Datos no cambian. Por lo tanto se puede pasar muy fcilmente de uno a otro. El recomendado para usar en Windows es el llamado SuperServer y por lo tanto las siguientes referencias sern a ese. Sin embargo, si la computadora tiene varios procesadores entonces Classic o SuperClassic seran los preferibles. Para aplicaciones monousuario o para catlogos en CD o programas similares se puede usar Embedded, ya que no necesita instalacin, incluye el Servidor y el Cliente en un solo archivo .DLL

Recursos utilizados
Una de las ventajas de Firebird es que utiliza muy pocos recursos. Inclusive puede instalarse en las obsoletas computadoras 486 DX con Windows 95 o con Linux. Desde luego que no es realista usar esas computadoras en esta poca, pero s es posible. Por supuesto que cuanto ms poderosa sea la computadora ser mucho mejor para todos. El Servidor de Firebird utiliza 2 Mb de memoria y a eso hay que agregarle unos 115 Kb por cada conexin a la Base de Datos. Una regla mnemnica fcil es la siguiente: 2 Mb + 1 Mb cada 8 conexiones. En esta poca casi cualquier computadora tiene por lo menos 1024 Mb, as que pueden realizarse muchsimas conexiones sin ningn problema. El espacio requerido en el disco duro es de alrededor de 14 Mb, aunque un poco ms puede ser necesario para realizar almacenamiento temporario.

- 11 -

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 ms fcil. Se hace un backup de la Base de Datos en una plataforma y se lo restaura en la otra plataforma.

Plataformas y versiones para el Cliente


Las mismas que para el Servidor.

Caractersticas principales de Firebird


Firebird es un motor de bases de datos SQL muy completo. Es poderoso, liviano, y las necesidades de configuracin y de administracin son mnimas. Fcilmente se lo puede escalar desde monousuario hasta organizaciones con sucursales por todo el mundo y miles de computadoras conectadas al mismo tiempo. Un nico servidor Firebird puede manejar mltiples bases de datos independientes, cada una de ellas conectada a muchos clientes. Adems, es verdaderamente Open Source, lo cual significa que es totalmente gratis tanto para uso privado como para uso comercial. A.C.I.D. A=Atomicity (atomicidad), C=Consistency (consistencia), I=Isolation (aislamiento), D=Durability (durabilidad) es algo que deben tener todos los motores de bases de datos bien hechos. Firebird cumple perfectamente con ello. Atomicidad: la operacin se realiz o no, jams puede quedar incompleta. Consistencia: solamente se ejecutan las operaciones que no van a romper las reglas y las directrices de la base de datos. Aislamiento: una operacin no puede afectar a otras. Esto asegura que la realizacin de dos transacciones sobre la misma informacin sean independientes y no generen ningn tipo de error. Durabilidad: una vez realizada la operacin sta persistir y no se podr deshacer aunque falle el sistema. - 12 -

MGA. Multi Generational Architecture. (en castellano: Arquitectura de mltiples generaciones). El Firebird maneja varias versiones de la misma fila (registro) al mismo tiempo para que cada transaccin tenga su propia versin, por lo tanto: los lectores no molestan a los escritores y los escritores no molestan a los lectores. Procedimientos almacenados. Estas son rutinas que pertenecen a la Base de Datos y que se procesan en el Servidor. 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. Muy tiles para informes. Desencadenantes. Cada tabla puede tener todos los desencadenantes (triggers) que se desee, los cuales son lanzados automticamente antes o despus de insertar, borrar o modificar una fila (registro). Pueden ser usados para poner valores por defecto, asegurar la integridad de los datos, etc. Generadores. Usndolos fcilmente se pueden tener columnas (campos) que se auto incrementan y claves nicas para ser usadas como PK (Primary Key). Bases de Datos de slo lectura. Se las puede usar para programas demo o catlogos, presentaciones, etc. Control completo de las transacciones. Una aplicacin puede tener mltiples transacciones manteniendo el total control sobre cada una de ellas. Backups en lnea. Los backups de una Base de Datos pueden realizarse en cualquier momento, aunque haya muchos usuarios usando sus tablas, vistas, procedimientos almacenados, desencadenantes, etc. Esto permite que las aplicaciones funcionen 24/7 (durante 24 horas, los 7 das de la semana). Backups incrementales. El backup se puede hacer solamente sobre los ltimos cambios, ahorrando as mucho tiempo y espacio en disco. Shadows. Todo lo que se escribe en una Base de Datos puede al mismo tiempo escribirse en otra Base de Datos, de tal manera que si la primera tiene algn problema (disco duro daado, por ejemplo) pueden recuperarse el 100% de los datos. Replicacin. No es una caracterstica nativa pero hay muchas herramientas de terceros que permiten hacerla (algunas son gratis). Funciones externas. 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. Integridad referencial en cascada. Permite que al modificar un cdigo de una tabla padre se modifiquen automticamente los cdigos de todas las tablas hijas. Conjuntos de caracteres. Firebird implementa casi todos los lenguajes humanos (espaol, ingls, portugus, italiano, alemn, polaco, ruso, etc.)

Conectividad
Firebird acepta los siguientes mtodos: ODBC, JDBC (JayBird), PHP driver, Perl, Python, OLEDB driver, dbExpress, proveedores de datos .Net, paquetes de componentes nativos para C/C++/Delphi, llamadas directas a la API. Para usarlo desde Visual FoxPro el primero de ellos (ODBC) da excelentes resultados.

- 13 -

Herramientas
Hay muchos programas que pueden usarse con Firebird, incluyendo administradores grficos, replicadores, auditoras, generadores de datos, analizadores de estadsticas del Servidor, etc. Es ms que aconsejable utilizarlos, porque se ahorra muchsimo tiempo al hacerlo. Entre los administradores grficos ms conocidos se cuentan los siguientes: FlameRobin (gratis) SQL Manager for InterBase and Firebird (la versin Lite es gratis) IBExpert (tiene una versin personal gratis) DB Workbench (la versin Lite es gratis) Firebird Development Studio (30 das gratis)

Instalando el Servidor
Hay que elegir cual tipo de Servidor se desea. Lo aconsejable es instalarlo como un servicio del Windows, 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 versin estable. Se lo puede descargar de: http://www.firebirdsql.org/index.php?op=files&id=engine El Servidor se debe instalar en una sola computadora de la red, en aquella donde se encontrarn todas las Bases de Datos.

Instalando el Cliente
Aunque se lo puede instalar manualmente, lo mejor es hacerlo mediante el programa de instalacin. El Cliente se debe instalar en cada computadora de la red. Se lo puede instalar CON las herramientas administrativas o SIN las herramientas administrativas. Lo mejor es instalarlo SIN esas herramientas porque los usuarios comunes no deben tener acceso a ellas. Pero en la computadora que se usar para desarrollar aplicaciones hay que instalar el Cliente CON las herramientas administrativas. Tambin es posible instalar en la misma computadora el Servidor y el Cliente.

- 14 -

Instalando el driver ODBC


Para poder conectarse a una Base de Datos Firebird desde Visual FoxPro se necesita escribir un string de conexin el cual necesitar de un driver ODBC (ms sobre esto en el siguiente captulo). Puedes descargar el driver ODBC que corresponde a tu computadora desde: http://www.firebirdsql.org/index.php?op=files&id=odbc

Verificando la instalacin
Verificando la conexin 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.7.15 -1 65500 - t sustituyendo esa direccin IP por la que corresponda a la computadora donde se encuentra el Servidor. Esto se llama ping con carga mxima y asegura que la comunicacin puede realizarse exitosamente.

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, se ver una pantalla similar a la siguiente:

- 15 -

El archivo HOST
Una manera de ocultar la direccin IP del Servidor es mediante el uso del archivo HOST. Este es un archivo que se encuentra en la carpeta C:\WINDOWS\ y que sirve para darle un nombre a las direcciones IP. Luego, cuando sea necesario, se puede usar el nombre y no la direccin IP. Si en la carpeta C:\WINDOWS\ no encuentras un archivo llamado HOST, debe haber un archivo llamado HOSTS.SAM, renmbralo como HOST. Ejemplos: 192.168.0.11 65.215.221.149 127.0.0.1 MiServidor apress.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.

El archivo ALIASES.CONF
Este es un archivo que se encuentra en la carpeta raz del Firebird y no debe ser movido de all. Permite darle un nombre abreviado a las bases de datos y usar ese nombre abreviado en las conexiones. Eso aumenta la seguridad, ya que los curiosos no pueden saber en que carpeta se encuentra la Base de Datos ni cual es el nombre de ella. Ejemplo: Conta = C:\SISTEMAS\SQL_CONTA\CONTA.FDB Conexin: Para conectarse a la Base de Datos se podra escribir: 10.12.13.2:C:\SISTEMAS\SQL_CONTA\CONTA.FDB o: 10.12.13.2:Conta o: MiServidor:Conta Esta ltima es la preferible porque los curiosos no podrn saber ni la IP del Servidor ni la carpeta ni el nombre real de la Base de Datos.

- 16 -

El archivo FIREBIRD.CONF
Este es un archivo que permite configurar al Firebird, se encuentra en su carpeta raz y sus valores pueden ser cambiados, de acuerdo a la necesidad. En general, los valores que tiene son los ms adecuados para la mayora de las situaciones, pero si no es as, cambiarlos es muy fcil. Se lo abre con cualquier editor de texto plano (el NOTEPAD, por ejemplo) se cambia lo que se desea y se lo graba.

El archivo SECURITY2.FDB
Este es el archivo donde el Firebird guarda los datos de cada usuario (nombres y contraseas), est localizado en la misma carpeta del Firebird y no debe ser movido de all.

Como evitar la corrupcin de las Bases de Datos


Aunque las Bases de Datos Firebird muy raramente tienen problemas, hay algunas medidas que pueden tomarse para disminuir an ms la probabilidad de que algo malo les pase: Chequear que la computadora tenga UPS (energa ininterrumpida) Chequear que la memoria de la computadora est OK, (para ello puede usarse el programa MTINST.EXE) Chequear que la Base de Datos tenga Forced Writes en ON Chequear que haya suficiente espacio libre en el disco, tanto para la Base de Datos como para los archivos temporales

Las Bases de Datos Firebird no se corrompen si se interrumpe la energa elctrica.

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. Modificar las tablas de los metadatos. Estas son las tablas internas que el Firebird crea dentro de cada Base de Datos. No las toques. Te lo repito: no las toques. Deshabilitar Forced Writes. Por defecto, el Firebird graba los datos en el disco apenas se hace el commit de ellos. No cambies esa configuracin. Restaurando un backup en una Base de Datos que se est ejecutando. Si los usuarios estn usando una Base de Datos, no debes restaurar sobre ella. Permitir a los usuarios que se conecten durante una restauracin. Mientras se est restaurando una Base de Datos, nadie debe estar conectado.

- 17 -

Dialectos SQL (SQL dialect)


Firebird soporta tres dialectos SQL, nombrados respectivamente 1, 2 y 3. El ltimo es el que debe usarse en todas las aplicaciones nuevas, 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, aunque no es necesario ya que si no lo especificas se usar el 3 (que es el ms nuevo).

Tamao de la pgina (page size)


Este es tambin un atributo opcional, se expresa en bytes. Su valor por defecto es 4096. Los valores que puede tomar son: 1024, 2048, 4096, 8192, 16384 (habrs notado que son todas potencias de 2, empezando con 2 ^ 10). Si escribes cualquier otro nmero, el Firebird tomar el anterior en estos rangos. Por ejemplo, si escribes: 2000 toma 1024 3000 toma 2048 3500 toma 2048 8000 toma 4096 Puedes usar cualquier tamao de pgina (PAGE_SIZE) que desees, si no eliges uno entonces se usar 4096. Para qu sirve el tamao de pgina? Para decirle al Firebird cuantos bytes debe grabar en cada bloque. Si eliges un tamao que no es el ms adecuado para tu aplicacin, la nica consecuencia ser que los accesos a tu Base de Datos no sern tan rpidos como podran serlo. Si te parece que los accesos estn lentos entonces puedes hacer un backup de tu Base de Datos y luego restaurarla con un nuevo tamao de pgina, hasta encontrar el que resulte mejor.

Conjunto de caracteres (character set)


Los caracteres que puede reconocer el Firebird se encuentran en los as llamados character set. Hay varios de ellos, debes usarlos para decirle el idioma que emplears: ASCII Ingls BIG_5 Chino, Coreano, Vietnamita CYRL Ruso ISO8859_1 Castellano, Francs, Ingls, Italiano, Portugus, etc. ... Hay muchos ms, pero con estos ya tienes la idea. Lo importante a recordar es que para los idiomas latinos (el castellano entre ellos) debes elegir: ISO8859_1

- 18 -

Scripts
Adems de crear las Bases de Datos, Dominios, Tablas, ndices, etc. manualmente, tambin se tiene la posibilidad de hacer esas tareas automticamente a travs de un script. Un script es un archivo de texto plano usualmente con la extensin .SQL en el cual se colocan los comandos que se desean ejecutar. Son muy tiles para reconstruir la estructura de una Base de Datos o de una Tabla en la misma o en otra computadora. Ejemplo:
CREATE TABLE Paises ( Codigo SmallInt NOT NULL, Nombre VarChar(25) NOT NULL, Capital VarChar(25), Poblacion BigInt, PRIMARY KEY (Codigo) ); INSERT INTO Paises VALUES(595, Paraguay, Asuncin, 6500000); INSERT INTO Paises VALUES(1, Estados Unidos, Washington, 310000000); INSERT INTO Paises VALUES(86, China, Beijing, 1250000000);

Como se ve en este ejemplo, se ha creado una tabla y tambin se le han agregado datos. Tambin se podran haber creado una Base de Datos, dominios, otras tablas, ndices, etc. Los scripts a menudo se utilizan cuando se instala una nueva aplicacin (Ventas, Facturacin, Contabilidad, Sueldos, etc.) en lo de un cliente. No hace falta copiar una Base de Datos vaca en su computadora, con copiar y ejecutar los scripts es ms que suficiente, se ahorra mucho espacio en disco, pero adems los scripts cumplen con otra tarea que es muy importante: documentacin. Mirando los scripts se puede conocer las caractersticas y las estructuras de una Base de Datos y de cada uno de sus componentes (Dominios, Tablas, ndices, etc.) Si se debe modificar algo, se modifica el script y ese cambio puede quedar comentado. Para comentar algo hay dos formas: Usando el par /* mi comentario va aqu */ Usando -- este es mi comentario Por ejemplo:
CREATE TABLE Usuarios ( Nombre Contrasena ); VarChar(20), VarChar(12) /* este es el nombre del usuario, si es necesario este comentario puede ocupar varias lneas */ -- esta es la contrasea del usuario, slo en una lnea

- 19 -

El usuario SYSDBA
En Firebird hay un usuario que tiene todos los derechos, puede hacer todo lo que quiera con cualquier Base de Datos. El nombre de ese usuario es SYSDBA. Cuando se instala el Firebird la contrasea de ese usuario es masterkey (en realidad, masterke, solamente se consideran los primeros ocho caracteres). Lo primero que debes hacer apenas has instalado el mdulo Servidor del Firebird es cambiar esa contrasea por qu? porque la contrasea 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 organizacin hay un enemigo interno, ser la primera contrasea que probarn. Para cambiar la contrasea del usuario SYSDBA debes abrir una ventana de comandos, ingresar a la carpeta \BIN del Firebird y ejecutar el programa GSEC.EXE, como se ve en la siguiente pantalla:

Qu se hizo? primero, ejecutar el programa gsec.exe con el usuario SYSDBA y con la contrasea masterkey. Luego, se cambi la contrasea de SYSDBA, la nueva contrasea es ahora secreto. Por supuesto que t debes elegir otra contrasea, este es slo un ejemplo. Para salir del programa GSEC.EXE y regresar a la ventana de comandos se debe escribir el comando quit. A partir de este momento la contrasea del usuario SYSDBA es secreto, la contrasea anterior (masterkey) ya no funciona. Eso significa que no debes olvidar tu nueva contrasea porque si la olvidas perders tus derechos como usuario principal. IMPORTANTE: Como el usuario SYSDBA es muy poderoso y tiene un poder destructivo muy grande, no debera ser usado para crear bases de datos ni para llenar las tablas con datos. En lugar de eso, debes crear usuarios comunes para que realicen esas tareas. Debes ingresar como usuario SYSDBA solamente para agregar, cambiar o borrar usuarios, realizar backups, restauraciones y otras tareas que solamente l puede hacer. Las tareas de todos los das, deben hacerlas los dems usuarios. Recurdalo muy bien porque este es un concepto muy importante: las tareas diarias no debe hacerlas el usuario SYSDBA.

- 20 -

Agregando nuevos usuarios


El usuario SYSDBA puede agregar nuevos usuarios, como se ve en la siguiente pantalla:

Aqu se agregaron tres nuevos usuarios. Walter, con contrasea 123456, Silvia, con contrasea hermosa y Erika con contrasea japonesa.

Borrando usuarios
El usuario SYSDBA tambin puede borrar usuarios, como se ve en la siguiente pantalla:

Donde se ha borrado al usuario Erika utilizando para ello el comando del.

Listando todos los usuarios

Para ver los nombres de todos los usuarios se utiliza el comando display.

- 21 -

Cambiando la contrasea de un usuario

Aqu se cambi la contrasea de Silvia, su nueva contrasea es muylinda, la anterior ya no funciona.

Nombres de los usuarios


Los nombres de los usuarios pueden escribirse en minsculas, maysculas o cualquier combinacin. Por ejemplo las palabras: Silvia, silvia y SILVIA se refieren todas al mismo usuario.

Contraseas (passwords) de los usuarios


A diferencia de los nombres, las contraseas (passwords) de los usuarios deben ser escritos siempre exactamente igual. Por ejemplo: MuyLinda, Muylinda, muylinda, MUYLINDA son todas contraseas diferentes y si escribes la que no corresponde, no podrs acceder a la Base de Datos.

Como proteger las Bases de Datos


Si alguien tiene acceso a la computadora donde se encuentra una Base de Datos puede copiarla, instalarla en otra computadora donde tenga acceso como usuario SYSDBA y ver o robar todos los datos que quiera. No solamente puede copiarla, tambin puede daarla fsicamente o destruirla completamente. La regla a seguir es la siguiente: Solamente los procesos del Servidor deben tener acceso a las Bases de Datos, los usuarios no necesitan y no deben tener acceso a ellas, ni siquiera read-only (slo lectura).

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, los dems usuarios nada pueden hacer con ella ... hasta que se les otorgan privilegios (o derechos). Recin a partir de ese momento podrn usar la Base de Datos. Mientras no se les hayan otorgado privilegios (o derechos) nada podrn hacer, ni siquiera consultarla.

- 22 -

IMPORTANTE: El usuario SYSDBA puede otorgar o quitar derechos a todos los usuarios de la Base de Datos excepto a su creador. El creador siempre tiene todos los derechos, ni siquiera SYSDBA puede quitrselos. De la misma manera, el creador tampoco puede quitarle derechos a SYSDBA. El comando que se usa para otorgar privilegios a los usuarios se llama GRANT. Su sintaxis es la siguiente:
GRANT <privilegio> ON <objeto> TO <usuario>;

Para quitarles derechos a los usuarios se usa REVOKE. Su sintaxis es la siguiente:


REVOKE <privilegio> ON <objeto> FROM <usuario>;

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, Insert, Update, Delete, References Ejecutar un Procedimiento Almacenado o llamarlo Adquirir todos los privilegios del rol .

Privilegios sobre columnas (campos) El privilegio UPDATE permite modificar el contenido de todas las columnas (campos) de una fila (registro). Pero a veces se necesita que el usuario solamente pueda modificar algunas columnas, no todas. Para ello, a continuacin de UPDATE se debe escribir entre parntesis los nombres de las columnas que podr modificar. Ejemplos:
GRANT SELECT, UPDATE, INSERT, DELETE ON PRODUCTOS TO SILVIA; GRANT SELECT ON PRODUCTOS TO MIRTHA; REVOKE DELETE ON PRODUCTOS TO SILVIA; GRANT UPDATE (PRECIO_VENTA1, PRECIO_VENTA2) ON PRODUCTOS TO SILVIA;

- 23 -

Roles
Los roles permiten agrupar a los usuarios para que todos quienes compartan un rol tengan los mismos privilegios. Todos los usuarios que tienen el mismo rol disponen de exactamente los mismos derechos. Un usuario puede tener varios roles pero solamente uno de ellos estar activo en cada momento. Por ejemplo, se puede tener un rol para Ventas, otro para Contabilidad, otro para Recursos Humanos, etc. Si se crea un rol llamado Ventas que solamente permite ver cantidades en stock, precios de venta y realizar ventas, los usuarios que usen ese rol no podrn ver los Balances ni los datos de los empleados. Los roles son especficos de cada Base de Datos, un rol creado para una Base de Datos no funcionar en otra. La implementacin de roles tiene los siguientes pasos: 1. Crear un rol (usando CREATE ROLE) 2. Asignar privilegios al rol (usando GRANT privilegios TO NombreRol) 3. Asignar el rol a los usuarios (usando GRANT NombreRol TO Usuario) 4. Especificar el rol, adems del nombre del usuario, 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. Eliminando un rol Si ya no se necesita un rol entonces se lo puede eliminar, la sintaxis es:
DROP ROLE <NombreRol>

Ejemplos:
/* Se crea el rol R_PRODUCTOS, que tiene todos los privilegios sobre la tabla PRODUCTOS y se le asigna a Silvia */ CREATE ROLE R_PRODUCTOS; GRANT ALL ON PRODUCTOS TO R_PRODUCTOS; GRANT R_PRODUCTOS TO SILVIA;

/* Se crea el rol R_VENDEDORES, 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; GRANT SELECT ON VENDEDORES TO R_VENDEDORES; GRANT R_VENDEDORES TO SILVIA;

- 24 -

Como puede verse en la siguiente imagen, se cre el rol R_VENDEDORES, el cual solamente permite consultar a la tabla VENDEDORES pero no permite que se inserten, borren o modifiquen datos de ella. El rol R_VENDEDORES se le otorg a SILVIA, por lo tanto ella puede consultar pero nada ms, solamente puede hacer eso. Cuando intent agregar una fila a la tabla VENDEDORES el Firebird se lo impidi, mostrando un cdigo de error (-551), el cual significa: no tienes permiso para insertar/escribir en la tabla.

Comandos del Firebird ms utilizados


El Firebird tiene muchos comandos, la mayora de ellos con varias clusulas y en cada versin se van agregando nuevos. Sin embargo hay algunos que son mucho ms utilizados que los dems, esos son los que se listan a continuacin. Crear una Base de Datos
CREATE DATABASE "C:\EJEMPLO.FDB" USER "WALTER" PASSWORD "123456";

Conectarse a una Base de Datos


CONNECT "C:\EJEMPLO.FDB" USER "SILVIA" PASSWORD "muylinda";

Crear un dominio
CREATE DOMAIN NumeroEntero INTEGER; CREATE DOMAIN NombrePersona VARCHAR(30);

Ver los dominios existentes


SHOW DOMAINS;

Ver la estructura de un dominio


SHOW DOMAIN NumeroEntero; SHOW DOMAIN NombrePersona;

- 25 -

Crear una tabla


CREATE TABLE Personas(Codigo NumeroEntero, Nombres NombrePersona, Apellidos NombrePersona, Sueldo Integer); CREATE TABLE Amigos (Codigo Integer NOT NULL, Nombres VarChar(15), Apellidos VarChar(15));

Borrar una tabla de la Base de Datos


DROP TABLE Personas;

Ver todas las tablas de una Base de Datos


SHOW TABLES;

Ver la estructura de una tabla


SHOW TABLE Personas; SHOW TABLE Amigos;

Agregarle una clave primaria a una tabla


ALTER TABLE Amigos ADD PRIMARY KEY (Codigo); la columna clave debe estar entre parntesis

Agregarle una columna a una tabla


ALTER TABLE Personas ADD Telefono VarChar(15); ALTER TABLE Personas ADD Clave Integer NOT NULL;

Borrar una columna de una tabla


ALTER TABLE Personas DROP Codigo;

Agregarle filas a una tabla


INSERT INTO Personas (1, "JUAN", "PEREZ"); INSERT INTO Personas (Codigo, Nombres, Apellidos) VALUES (2, "MARIA", "BENITEZ"); INSERT INTO Personas (Codigo, Nombres) VALUES (3, "CLAUDIA");

Borrar algunas filas de una tabla


DELETE FROM Personas WHERE Codigo = 25; DELETE FROM Personas WHERE Codigo >= 12 AND Codigo <= 18; DELETE FROM Personas WHERE Nombres = MARIA;

Borrar todas las filas de una tabla


DELETE FROM Personas;

Modificar columnas de una tabla


UPDATE PERSONAS SET Apellidos = 'ARRUA' WHERE Nombres = 'CLAUDIA';

- 26 -

Consultar las filas de una tabla


SELECT * FROM Personas; SELECT Nombres, Apellidos FROM Personas; SELECT Nombres FROM Personas WHERE Apellidos = "BENITEZ"; SELECT * FROM Personas WHERE Nombres = "JUAN" OR Apellidos = "BENITEZ"; SELECT * FROM Personas WHERE Sueldo BETWEEN '2000' AND '5000';

Consultar las filas cuando se conoce una subcadena


SELECT * FROM Personas WHERE Nombres LIKE '%ANA%'; mostrar todos los nombres que tengan a ANA en alguna parte (ANA, ANALIA, SUSANA, LUCIANA, etc.) A_Z todas las filas que empiezan con A, tienen cualquier caracter en el medio y finalizan con Z ABC% todas las filas que empiezan con ABC y continan 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 carcter, continan con AN y finalizan con cualquier carcter

Consultar solamente los que no estn repetidos


SELECT DISTINCT Nombres FROM Personas; SELECT DISTINCT Nombres, Apellidos FROM Personas;

Consultar los datos ordenadamente


SELECT * FROM Personas ORDER BY Nombres; SELECT * FROM Personas ORDER BY Apellidos, Nombres;

Contar la cantidad de filas de una tabla


SELECT COUNT (*) FROM Personas;

Sumar una columna numrica


SELECT SUM(Sueldo) FROM Personas;

Hallar el promedio de una columna numrica


SELECT AVG(Sueldo) FROM Personas; SELECT AVG(Sueldo) FROM Personas WHERE Apellidos = "BENITEZ";

Hallar el valor mnimo de una columna numrica


SELECT MIN(Sueldo) FROM Personas;

Hallar el valor mximo de una columna numrica


SELECT MAX(Sueldo) FROM Personas;

Agrupar filas
SELECT Codigo, Apellidos, Nombres FROM Personas GROUP BY Apellidos, Nombres, Codigo; todas las columnas que estn antes del GROUP BY deben estar tambin despus, aunque pueden estar en distinto orden

Ponerles condiciones a las filas agrupadas


SELECT Codigo, Apellidos, Nombres FROM Personas GROUP BY Apellidos, Nombres, Codigo HAVING Nombres = "JUAN";

- 27 -

Relacionar dos tablas


SELECT Personas.Codigo, Personas.Apellidos, Paises.Nombres FROM Personas, Paises WHERE Personas.CodigoPais = Paises.Codigo;

Ordenar una tabla


SELECT Personas.Codigo, Personas.Apellidos, Paises.Nombres FROM Personas, Paises ORDER BY Paises.Nombres;

El programa ISQL.EXE
Interactive SQL es un programa de lnea de comandos que incorpora herramientas y tcnicas para mantener objetos de las bases de datos, administrar transacciones, procesar scripts. La ventaja que tiene es que existe en todas las instalaciones del Servidor de Firebird, la desventaja es que hay que escribir los comandos. Como hay muchos programas que permiten realizar esas tareas grficamente, en general no se lo usa, pero siempre es bueno conocerlo, alguna vez puede ser de utilidad. Por eso es recomendable que practiques un poco con l, para saber usarlo cuando lo necesites. Con ISQL se pueden crear bases de datos, dominios, tablas, ndices, y en general realizar todas las operaciones usuales. Se encuentra en la carpeta \BIN del Firebird.

En la imagen de arriba se muestra como conectarse a una base de datos ya existente. El comando a utilizar es CONNECT.

En la imagen de arriba se muestran todas las tablas que pertenecen a la base de datos llamada EMPLOYEE.FDB.

- 28 -

En la imagen de arriba se ve la estructura de la tabla llamada COUNTRY.

En la imagen de arriba se ven todas las filas y las columnas country y currency de la tabla COUNTRY.

El programa GBAK.EXE
Es un programa utilitario que se encuentra en la carpeta \BIN del Firebird, su misin es realizar copias de seguridad (backups) de las bases de datos y restaurarlas cuando sea necesario. Tambin detecta corrupcin de datos, libera el espacio en disco ocupado por las filas borradas (un equivalente al comando PACK del VFP), resuelve las transacciones que no estaban completas, permite partir una Base de Datos en varios archivos (muy til cuando ya es demasiado grande), tambin se lo usa para restaurar el backup en otra plataforma (de Windows a Linux, por ejemplo). IMPORTANTE: Nunca debes usar programas como WinZip o WinRar para comprimir tu base de datos si el Firebird est en ejecucin. IMPORTANTE: El archivo de backup generado por el programa GBAK no puede ser usado directamente porque el Servidor no lo reconocer, antes de ser usado debe ser restaurado con una versin de GBAK igual o posterior a la usada para crearlo. IMPORTANTE: Los usuarios pueden continuar trabajando normalmente mientras se realiza el backup, pero los datos que se graban son los que se encontraban en la base de datos en el momento que GBAK se inici. Todos los cambios que los usuarios hagan despus no sern grabados en el archivo de backup.

- 29 -

PRECAUCIN: El hecho de que un backup se haya realizado exitosamente no implica que se podr recuperar sin problemas cuando se lo necesite. Siempre debes probar a restaurar tu backup inmediatamente despus de realizarlo, para asegurarte que todo est bien. El uso del programa GBAK est restringido al usuario SYSDBA y al usuario quien cre la base de datos. PRECAUCIN: Cualquiera puede robar una base de datos Firebird restaurando un archivo de backup en una computadora donde conoce la contrasea del usuario SYSDBA. Por eso es importantsimo asegurar que los archivos de backup se encuentren en un lugar seguro. Ejemplo 1:

Aqu el usuario SYSDBA cuya contrasea es secreto hizo un backup del archivo AGENDA.FDB. El nombre del archivo generado es AGENDA27112010. Ejemplo 2:

Aqu el usuario SYSDBA cuya contrasea es secreto restaur el archivo de backup llamado AGENDA27112010 en una base de datos llamada AGENDA.FDB. Es importante recordar que AGENDA27112010 no es reconocida como una Base de Datos por el Firebird, debe ser restaurada para poder ser utilizada como tal.

El programa NBACKUP.EXE
Este programa ofrece posibilidades que no tiene GBAK.EXE pero no lo reemplaza, sino que lo complementa. Puede hacer el backup y la restauracin completos o incrementales. Este ltimo slo tiene los cambios ocurridos desde el ltimo backup. Puede bloquear la base de datos para que el backup se haga con otro programa. En este caso no realiza el backup sino que establece las condiciones para que pueda ser realizado.

- 30 -

Ambos modos pueden hacerse sobre una Base de Datos activa, sin molestar a los usuarios. El backup realizado siempre reflejar el estado al principio de la operacin. Para hacer un backup completo La sintaxis de este comando es:
nbackup [-U <usuario> -P <contrasea>] -B 0 <Base de Datos> [<Nuevo Nombre>]

Como se ve en la imagen de arriba, el programa nbackup.exe cre un archivo de backup con la extensin .nbk Para hacer un backup incremental Para ahorrar tiempo y espacio en disco se puede hacer un backup incremental, es decir agregarle al backup anterior solamente los cambios realizados desde ese momento. Para ello, a continuacin del parmetro B se escribe un nmero mayor que cero (el nmero cero significa backup completo), como se ve en la siguiente imagen:

Si en el siguiente backup se utiliza: - B 0, el backup ser completo - B 1, el backup ser incremental desde el ltimo backup de nivel 0 - B 2, el backup ser incremental desde el ltimo backup de nivel 1 Para restaurar un backup completo Se debe usar el parmetro R, como en la siguiente imagen:

Para restaurar un backup incremental Se debe especificar toda la cadena de los archivos de backup, desde el nivel 0 hasta el nivel que se desea restaurar. Esta es la sintaxis:
nbackup [-U <usuario> -P <contrasea>] -R <Base de Datos> [<backup0> [<backup1> [...] ] ]

- 31 -

Usando SQL Manager


Hay varios administradores grficos muy buenos, FlameRobin, SQL Manager, IB Expert, DB Workbench, etc. cualquiera de ellos puede ser utilizado. Por una cuestin de costumbre del autor de este documento, SQL Manager ser el que se usar en las siguientes pginas. Se lo puede descargar desde: http://www.sqlmanager.net/en/products/ibfb/manager/download Hay varias opciones, si se desea descargar una que es gratis elegir la que dice freeware.

Por qu usar un administrador grfico?


Porque facilita muchsimo el trabajo, se ahorra muchsimo tiempo y se tienen las ideas ms claras.

La Base de Datos Employee


Cuando se instala el Firebird, 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. Como est disponible en todas las instalaciones, ser la utilizada en los siguientes ejemplos:

Registrando una Base de Datos


Despus de ingresar al SQL Manager lo primero que se debe hacer es registrar la Base de Datos con la cual se desea trabajar. Eso es equivalente a abrirla, se necesita hacerlo para poder usarla.

- 32 -

Una vez que la Base de Datos est registrada, se ver una pantalla, similar a la siguiente:

Haciendo doble click sobre EMPLOYEE se vern todos sus componentes, como a continuacin se muestra:

- 33 -

en el panel de la izquierda pueden verse los componentes de las Bases de Datos (dominios, tablas, vistas, procedimientos almacenados, funciones externas del usuario, desencadenantes, etc.) Haciendo click sobre el signo + que se encuentra a la izquierda de cada categora se pueden ver todos sus elementos, como se muestra a continuacin:

Qu son los dominios?


Los dominios son definiciones, globales a la Base de Datos, que son utilizados en las definiciones de las columnas (pero no en las definiciones de variables ni en los parmetros de entrada o de salida de los procedimientos almacenados o de los desencadenantes). Es decir, en la prctica son un nuevo tipo de datos. Eso significa que adems de los tipos de datos estndares como carcter, numrico, fecha, etc., se puede usar un dominio. Son opcionales, se los puede usar o no, pero usarlos mejora la legibilidad del cdigo. Por ejemplo el dominio Salary tiene la siguiente definicin:

- 34 -

CREATE DOMAIN SALARY AS NUMERIC(10, 2) DEFAULT 0 CHECK (VALUE > 0);

si una columna (por ejemplo: salario) tiene ese dominio, 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 grabacin verifica que el valor sea mayor que cero (CHECK (VALUE > 0)) Aqu hay otro ejemplo, el dominio EmpNo (nmero del empleado):
CREATE DOMAIN EMPNO AS SMALLINT;

Aqu hay otro ejemplo, CustNo (nmero del consumidor):


CREATE DOMAIN CUSTNO AS INTEGER CHECK (VALUE > 1000);

Aqu hay otro ejemplo, DeptNo (nmero 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;

Si te parece complicado no te preocupes, dentro de poco lo entenders. Recuerda que usarlos o no es opcional, pero usarlos tiene sus ventajas. Por ejemplo, si sabes que las fechas de las compras, de las ventas, de las cobranzas, de los pagos, no pueden ser anteriores al 1 de enero de 2011, podras crear un dominio basado en el tipo de datos date que no permita fechas anteriores. Ese dominio luego lo usars como tipo de datos de todas las tablas que lo necesiten. Por lo tanto, no necesitars validar que las fechas sean posteriores al 1 de enero de 2011, el Firebird se encargar de esa tarea, te facilitar tu trabajo. En ningn caso un usuario de tu aplicacin podra grabar una fecha anterior.

Cmo se crea un nuevo dominio?


Haciendo click con el botn derecho sobre la palabra Domains y luego eligiendo la opcin New domain..., como se ve a continuacin:

- 35 -

Qu son las tablas?


Los lugares donde se guardan los datos. Son muy similares a las utilizadas por Visual FoxPro as que no merecen mayor comentario.

- 36 -

Qu son las vistas?


Consultas predeterminadas, cuyas columnas pueden provenir de una tabla o de varias tablas. Si los usuarios necesitan ver ciertos datos frecuentemente es mejor hacer una vista y no una consulta, por qu? porque al ya estar dentro de la Base de Datos las vistas se ejecutan ms rpidamente. Este es un ejemplo de una vista:
CREATE VIEW PHONE_LIST( EMP_NO, FIRST_NAME, LAST_NAME, PHONE_EXT, LOCATION, PHONE_NO) AS SELECT emp_no, first_name, last_name, phone_ext, location, phone_no FROM employee, department WHERE employee.dept_no = department.dept_no;

Qu son los procedimientos almacenados?


Los procedimientos almacenados, comnmente llamados Stored Procedures (o SP para abreviar) son los equivalentes a los procedimientos y las funciones del Visual FoxPro. Reciben parmetros de entrada, realizan alguna tarea y pueden devolver valores. Como pertenecen a la Base de Datos son independientes del lenguaje utilizado para acceder a ella. Es decir que pueden ser invocados por un programa hecho en Visual FoxPro, C, C++, Delphi, Java, o cualquier otro. Hay dos clases de procedimientos almacenados: los ejecutables y los seleccionables. 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. Este es un ejemplo de un SP ejecutable:
SET TERM ^ ; CREATE PROCEDURE ADD_EMP_PROJ( EMP_NO SMALLINT, PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE) AS BEGIN BEGIN INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id); WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id; END SUSPEND; END^ SET TERM ; ^

- 37 -

Y este es un ejemplo de un SP seleccionable:


SET TERM ^ ; 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; END^ SET TERM ; ^

Para que un SP sea seleccionable: a) Debe tener parmetros de salida declarados (y cargados, por supuesto) b) Debe ser escrito con un SUSPEND despus de cada bloque que debe retornar una fila En el ejemplo de arriba el parmetro de salida es PROJ_ID (porque est dentro del RETURNS()) y el SUSPEND est dentro del FOR ... DO. En Firebird si el ciclo FOR ... DO tiene una sola lnea, no hace falta colocarle un BEGIN...END; aunque puedes escribirlos, por claridad, hasta que te acostumbres. El FOR ... DO podra haberse escrito de esta manera:
FOR SELECT proj_id FROM employee_project WHERE emp_no = :emp_no INTO :proj_id DO BEGIN SUSPEND; END;

Como ves, se le agreg un BEGIN y un END; es innecesario hacerlo cuando despus del FOR ... DO hay una sola lnea pero es obligatorio cuando dentro del ciclo FOR ... DO hay varias lneas.

Qu son las UDFs?


UDF = User Defined Function o Funcin Definida por el Usuario, tambin se le llama funcin externa. El Firebird permite tener bibliotecas de funciones hechas en cualquier lenguaje que pueda crear archivos DLL. Las funciones internas del Firebird son pocas por qu? porque as se puede mantener el motor pequeo y rpido, no tiene sentido llenarlo de funciones, muchas de las cuales no usars o usars raramente. Es mejor que las funciones sean externas as dispones solamente de las que necesitas, ninguna ms. En Visual FoxPro tienes muchas funciones que raramente usas, por ejemplo SIN() (seno), COS (coseno), TAN() (tangente), ASIN(), (arco seno), etc. las cuales siempre estn dentro de tus ejecutables y los hacen ms grandes de lo necesario. El

- 38 -

Firebird es ms econmico, tambin puedes usar esas funciones si las necesitas, pero si no las necesitas, no estn ocupando espacio. Las funciones UDFs son globales a la Base de Datos, eso significa que una vez declaradas las puedes utilizar en cualquier procedimiento almacenado o en cualquier desencadenante. Antes de usar una funcin hay que declararla, o sea decirle al Firebird que deseas usar esa funcin en la Base de Datos abierta. Para ello se utiliza el comando DECLARE EXTERNAL FUNCTION. La gran mayora de las funciones externas que puedes descargar de Internet vienen con sus propios archivos de script, eso sirve de documentacin para que puedas saber que hacen, como llamarlas y los valores que retornan. IMPORTANTE: T puedes crear tus propias funciones externas pero debes verificarlas muy bien antes de incluirlas en tus proyectos porque una funcin mal hecha puede corromper tu Base de Datos. Las funciones externas no deberan modificar columnas (campos). Si lo hacen, la probabilidad de que causen problemas se incrementa mucho. Ejemplo:
DECLARE EXTERNAL FUNCTION abs DOUBLE PRECISION RETURNS DOUBLE PRECISION BY VALUE ENTRY POINT IB_UDF_abs MODULE NAME ib_udf;

Probablemente la declaracin anterior te pareci complicada pero no te preocupes, usualmente lo nico que haces es un copiar y pegar desde el script que descargaste de Internet al script tuyo.

Qu son los desencadenantes?


Tambin llamados triggers, son unos procedimientos almacenados que se ejecutan automticamente cada vez que en una tabla se realiza una insercin, borrado o modificacin de fila (registro) Pueden activarse antes de la operacin o despus de la operacin. Para elegir una u otra se usan las palabras clave BEFORE (antes) y AFTER (despus). Una tabla puede tener todos los desencadenantes que se desee, el orden de ejecucin de ellos depende del valor de la variable POSITION. No reciben parmetros de entrada ni devuelven valores. Tienen dos seudovariables internas, new y old. New se refiere al nuevo valor que tendr la columna, old se refiere al valor anterior.

- 39 -

Aqu hay un ejemplo de un trigger (desencadenante):


SET TERM ^ ; CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE ACTIVE AFTER UPDATE POSITION 0 AS BEGIN IF (old.salary <> new.salary) THEN INSERT INTO salary_history (emp_no, change_date, updater_id, old_salary, percent_change) VALUES ( old.emp_no, 'NOW', user, old.salary, (new.salary - old.salary) * 100 / old.salary); END^ SET TERM ; ^

En este caso, la insercin dentro de la tabla Salary_History se realizar solamente si el salario nuevo es distinto al salario anterior.

Qu son las excepciones?


Son mensajes que pueden colocarse dentro de un SP o de un trigger y que se envan cuando ocurri un error. En ese caso, deshacen todo lo que se haba realizado con anterioridad. Aqu est la declaracin de una excepcin:
CREATE EXCEPTION UNKNOWN_EMP_ID 'Invalid employee number or project id.';

Y aqu el uso de ella:


SET TERM ^ ; CREATE PROCEDURE ADD_EMP_PROJ( EMP_NO SMALLINT, PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE) AS BEGIN BEGIN INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id); WHEN SQLCODE -530 DO EXCEPTION unknown_emp_id; END SUSPEND; END^ SET TERM ; ^

Qu son los generadores?


Nmeros secuenciales que pueden ser automticamente insertados en una columna. Normalmente se los utiliza para asegurar que las PK (claves primarias) tengan un valor nico. Aqu se declara un generador:
CREATE GENERATOR EMP_NO_GEN; SET GENERATOR EMP_NO_GEN TO 145;

- 40 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL el cual le dice al Firebird que los nmeros de empleado deben empezar con 145. Y aqu se usa ese generador:
SET TERM ^ ; CREATE TRIGGER SET_EMP_NO FOR EMPLOYEE ACTIVE BEFORE INSERT POSITION 0 AS BEGIN if (new.emp_no is null) then new.emp_no = gen_id(emp_no_gen, 1); END^ SET TERM ; ^

Para qu se usa SET TERM?


En Firebird, todos los comandos deben finalizar con un terminador, el terminador por defecto es el punto y coma (;). Para cambiar ese terminador por otro se utiliza SET TERM. Otros lenguajes tambin utilizan terminadores, por ejemplo Pascal, Delphi, C, C++, Java, 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. Al terminar el procedimiento almacenado o desencadenante hay que volver a colocar el terminador por defecto. Por eso vers que la primera y la ltima instruccin son siempre SET TERM. En este ejemplo: create procedure p1 as begin finsert into t1 values(10); end; si no se usa SET TERM, el analizador finalizar despus del (10) y eso ocasionara un error, porque nunca lleg hasta el end. El nuevo terminador puede ser cualquiera, con una condicin: no debe estar dentro del bloque de cdigo que ests escribiendo (podras usar la letra A pero tendras problema si dentro del bloque aparece una letra A). El terminador alternativo ms utilizado, el que est prcticamente estandarizado en Firebird es el ^

Cundo se usan los : delante del nombre de una variable?


Habrs visto que delante de los nombres de algunos parmetros o variables aparecen los dos puntos (:). La regla es la siguiente: Si son usados dentro del contexto del procedimiento almacenado (asignacin o comparacin) entonces no se necesitan los dos puntos. Si son usados fuera del contexto del procedimiento almacenado (INSERT, DELETE, UPDATE, SELECT) entonces s se necesitan los dos puntos.

- 41 -

Walter R. 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 daar a las relaciones. Especficamente se trata de proteger las relaciones entre dos tablas. Por qu se debera proteger las relaciones entre dos tablas? 1) Prueba de fuego. Las restricciones referenciales (especialmente cuando usadas inteligentemente con otras restricciones) protegern fuertemente las reglas de negocio de la aplicacin contra errores, sin importar de donde provengan ellos. Esto es de mucha importancia cuando la Base de Datos ser manipulada por otras personas, algunas quizs con un nivel bastante bajo. 2) Velocidad de las consultas. Los ndices creados automticamente para la integridad referencial aumentarn la velocidad de las consultas. 3) Control de calidad. Durante la etapa de desarrollo y verificacin los errores se encontrarn pronto porque la Base de Datos rechazar operaciones que rompan las reglas. 4) Documentacin automtica. En los scripts que hagas podrn verse las reglas, evitando as escribir documentos especficos (ya que todos saben que a la mayora de los programadores no les gusta escribir documentacin). La integridad referencial entre dos tablas se crea a travs de una restriccin foreign key (clave fornea). Esta restriccin protege a la tabla contra los intentos de grabar filas que son inconsistentes con el modelo de datos. La restriccin 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, entonces las filas en la tabla HIJO dependen de la existencia de una fila en la tabla PADRE. Por ejemplo: si se tienen dos tablas, una llamada PRODUCTOS y la otra llamada VENTASDET (detalle de ventas), las filas de la tabla VENTASDET dependen de la tabla PRODUCTOS. O sea, no se puede vender un producto cuyos datos no se encuentren en la tabla PRODUCTOS. 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 cdigo del producto) 3) Que la tabla VENTASDET debe tener una restriccin foreign key sobre el cdigo del producto. 4) Que no se puede tener una fila en VENTASDET que no haga referencia a una fila en PRODUCTOS.

- 42 -

Trabajando con las tablas .DBF del Visual FoxPro se pueden grabar registros en VENTASDET aunque el campo Cdigo del Producto se deje en blanco o aunque se escriba un cdigo inexistente. Algo as es imposible en Firebird, no se puede hacer eso, aunque se quiera. Por lo tanto, aumenta en gran medida la seguridad y la confianza en los datos grabados. En Visual FoxPro: Aunque no exista un producto con ese Cdigo igual se puede grabar un registro en VENTASDET Aunque se deje en blanco el campo Cdigo del Producto, igual se puede grabar un registro en VENTASDET Se puede borrar un registro de la tabla PRODUCTOS aunque el cdigo de ese registro se est utilizando en la tabla VENTASDET Se puede cambiar el cdigo de un producto aunque ese cdigo se est utilizando en la tabla VENTASDET

O sea, es ms fcil meter la pata (hacer algo malo o incorrecto) en Visual FoxPro. Solamente por esta caracterstica ya deberas pensar seriamente en usar tablas Firebird. 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). 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, por lo tanto puede ser (y generalmente es) omitido. Su accin es impedir que la PK pueda ser borrada o modificada. On Delete Cascade Cuando se borra una fila de la tabla PADRE las filas relacionadas en la tabla HIJO tambin son borradas. On Update Cascade Cuando se modifica un cdigo en la tabla PADRE los cdigos relacionados de la tabla HIJO son tambin modificados para que todos tengan el mismo valor. Set Null Cuando se borra o modifica un cdigo de la tabla PADRE los cdigos relacionados de la tabla HIJO son puestos a null, por lo tanto esas filas quedan hurfanas. Generalmente esta accin no es recomendada ya que se pierde la ventaja de la integridad referencial. Naturalmente esta accin no puede realizarse si la columna cdigo de la tabla HIJO no admite valores nulos.

- 43 -

ndices
Los ndices son atributos de las tablas que pueden ser localizados sobre una columna o conjunto de columnas para acelerar la recuperacin de filas. Lmites Firebird admite hasta 256 ndices por tabla. Cada ndice puede tener hasta 253 bytes. ndices automticos Las restricciones PK y FK automticamente crean sus propios ndices. Cuando crees tus ndices es importantsimo no duplicar los ndices que ya ha creado el Firebird porque en ese caso el motor podra estar en la duda de cual usar (porque ambos son idnticos) y podra decidir no usar ninguno de ellos (haciendo tus bsquedas mucho ms lentas). Direccin de los ndices Todos los ndices pueden ser ascendentes (de menor valor a mayor valor) o descendentes (de mayor valor a menor valor). Es un error muy comn creer que con un solo ndice se obtendrn los mismos resultados tanto si se buscan valores altos como valores bajos. La regla a aplicar es la siguiente: Si buscas valores bajos, debes usar un ndice ascendente Si buscas valores altos, debes usar un ndice descendente Cuando indexar Cada ndice ocupa espacio en disco, adems los ndices deben ser actualizados cuando se agregan, borran o modifican las filas, consumiendo tiempo, a veces mucho. Por lo tanto aunque pueden ser de gran ayuda es importante crear solamente los que sean necesarios y ninguno ms. Una buena prctica 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 usarn muy raras veces No crees ndices sobre columnas que tienen muchos valores que nunca son buscados, como horas y minutos No crees ndices sobre columnas que se buscan con LIKE

- 44 -

Transacciones
Recuerda que en Firebird las aplicaciones nunca tocan los datos que estn almacenados en una Base de Datos. En lugar de eso, las aplicaciones realizan conversaciones con el Servidor a travs de los pedidos que hacen y las respuestas que reciben. Una conversacin completa entre un cliente y el Servidor se llama transaccin. Por qu se usan las transacciones? Porque cuando muchos usuarios estn actualizando y consultando los mismos datos muchos problemas pueden ocurrir: Actualizaciones perdidas Esto ocurre cuando dos usuarios estn viendo los mismos datos. El primero de ellos realiza algunos cambios, poco despus el segundo realiza otros cambios. Por lo tanto se pierden los cambios que haba hecho el primero. Lecturas sucias Esto le permite a un usuario ver los cambios que otro usuario est haciendo, pero sin tener la garanta de que esos cambios sean finales. Lecturas no reproducibles Ocurren cuando un usuario est seleccionando filas continuamente mientras otros usuarios estn modificando y borrando esas filas. Esto puede ser un problema o no, depende de las circunstancias. Filas fantasmas Ocurre cuando un usuario puede seleccionar algunas, pero no todas, las filas insertadas por otro usuario. Nuevamente, esto puede ser un problema o no, dependiendo de las circunstancias. Transacciones intercaladas Ocurren cuando cambios en una fila por un usuario afectan a otras filas de esa misma tabla o de otras tablas que estn siendo accedidas por otros usuarios. Esto suele suceder cuando no hay forma de controlar el orden en el cual se realizan los cambios. Para resolver estos problemas el Firebird aplica un modelo de administracin que asla cada tarea dentro un contexto nico el cual le impide que sea completada si pone en riesgo otras tareas. La Base de Datos no cambiar si hay algn conflicto. Cada transaccin tiene un contexto nico que causa que est aislada de todas las dems transacciones. Las reglas para ese contexto son especificadas por la aplicacin cliente pasando parmetros de transaccin. Cundo se inicia una transaccin? Cuando un Cliente pide que se inicie y recibe un handle del Servidor. Desde ese momento la transaccin est activa.

- 45 -

Cundo finaliza una transaccin? Cuando el Cliente enva un pedido de commit (grabar todos los cambios) o de roll back (deshacer todos los cambios) y ese pedido es completado. Cmo se identifica una transaccin? Cada transaccin tiene un nmero nico (ID) que sirve para identificarla. De esta manera el Firebird sabe cual es la transaccin que est haciendo cada tarea. Sin embargo no hay que usar ese nmero como clave primaria o clave nica porque cada vez que se restaura un backup el contador de las transacciones vuelve a cero. O sea que la primera transaccin despus de la restauracin tendr el nmero 1, la segunda el nmero 2 y as sucesivamente. Para conocer cual es el nmero de la transaccin actual en la base de datos activa:
SELECT CURRENT_TRANSACTION FROM RDB$DATABASE;

Una transaccin, muchos pedidos En Firebird cada operacin pedida por un Cliente debe ocurrir en el contexto de una transaccin. Una transaccin puede implicar muchos pedidos del Cliente y muchas respuestas del Servidor. Una transaccin puede abarcar ms que una Base de Datos, incluyendo lecturas y escrituras. Cul es la tarea del Cliente? Iniciar todas las transacciones. Una vez que una transaccin se inici es la responsabilidad del Cliente enviar los pedidos de lectura y de escritura. Tambin es su responsabilidad terminar la transaccin (con un commit o un roll back). Un Cliente puede tener muchas transacciones activas. Cul es la tarea del Servidor? Llevar la cuenta de cada transaccin y mantener la vista que cada transaccin tiene del estado de la Base de Datos consistente con su contexto. 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. Transacciones y MGA Como ya se ha visto, las siglas MGA significan multi-generational architecture (arquitectura de mltiples generaciones). En este modelo cada fila guardada en una base de datos tiene un nmero nico identificando a la transaccin que escribi esa fila. Si otra transaccin escribe un cambio a esa misma fila, el Servidor escribe una nueva versin de la fila en el disco duro. O sea que habr dos filas similares guardadas en el disco duro. Por eso se dice que el Servidor mantiene dos generaciones de la misma fila. Grabacin de datos En Firebird los datos pueden ser grabados de dos formas: a) Temporalmente b) Permanentemente

- 46 -

Siempre que se realiza un INSERT o un UPDATE o un DELETE a una tabla esa insercin, modificacin o borrado se realiza en forma temporal. Es decir, que an es reversible. Y mientras tanto solamente es visible dentro del contexto de la transaccin que hizo la operacin, nadie ms est enterado. Una sola transaccin puede realizar muchas tareas: insertar registros en una o en varias tablas, modificarlos, borrarlos. Si se descubre algn error en alguna de esas tareas entonces todas esas inserciones, modificaciones y borrados pueden ser desechados (mediante un roll back). Si todo est bien y solamente si todo est bien, entonces se los graba permanentemente en el disco (con un commit). Por qu se hace as? Porque de esa manera las bases de datos siempre tienen datos consistentes, nunca falta o sobra algo. 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, sin faltar nada. Por lo tanto: o El usuario que realiz un INSERT, UPDATE o DELETE est viendo los cambios que esas operaciones implican o Los dems usuarios no los ven o Si el usuario graba en forma permanente (con un commit), los dems usuarios tambin ven los cambios o Si el usuario desecha los cambios (con un roll back), los dems usuarios jams se enteraron de ellos Por ejemplo: El usuario Juan cambia el nmero de telfono del proveedor TodoFrutas S.A El usuario Juan imprime los nmeros de telfono de todos los proveedores. El nuevo nmero de telfono de TodoFrutas S.A. aparece en ese informe El usuario Mara imprime los nmeros de telfono de todos los proveedores. El viejo nmero de telfono de TodoFrutas S.A. aparece en ese informe El usuario Juan graba en forma permanente los cambios (hace un commit) Los dems usuarios (Mara y los otros) recin ahora pueden ver el nuevo nmero de telfono del proveedor TodoFrutas S.A.

Datos desechados El roll back nunca falla. Nunca. Este desecha todos los cambios que se realizaron en la transaccin, tanto el que caus el error como todos los dems que se hubieran grabado exitosamente de no haber ocurrido el error. Por ejemplo: Se inicia una transaccin 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. Eso implica que: o El proveedor que se haba agregado a PROVEEDORES es eliminado o La compra que se haba agregado a COMPRASCAB es eliminada - 47 -

o Los productos que se haban agregado a COMPRASDET son eliminados Se finaliza la transaccin

Problemas con transacciones Como ya se vio anteriormente, las nicas formas de finalizar una transaccin son mediante un commit o mediante un roll back. Pero qu ocurre si la aplicacin se colg o hubo un corte de energa elctrica? En ese caso la transaccin continuar activa porque el Servidor no finalizar una transaccin a menos que se le pida que lo haga. En sistemas mal diseados tambin ocurrir lo mismo, cuando se le permite a un usuario salir de la aplicacin sin antes hacer el commit o el roll back. A estas transacciones se las llama muertas porque no estn ligadas a ninguna conexin. Y las inserciones, modificaciones o borrados que hizo la transaccin continan dentro de la base de datos pero nadie puede acceder a ellos. Y cul es el problema? Que si mltiples versiones de una fila estn en una tabla o si hay transacciones muertas entonces se est ocupando innecesariamente espacio en el disco duro y las bsquedas y las consultas son ms lentas. Es decir: se degrada la performance. Solucin a los problemas Para lidiar con esos problemas hay varias formas: 1. Hacer un backup y una restauracin de la Base de Datos 2. Usar el programa GFIX.EXE (que est instalado en la carpeta \BIN del Firebird) El backup y la restauracin solucionarn algunos de los problemas, pero no todos. El gfix solucionar otros. Pero si an as la base de datos es ms grande de lo que debera ser o las consultas son lentas, una revisin humana puede ser necesaria. De todas maneras, si el entorno es el adecuado (el Servidor tiene una fuente de energa ininterrumpida, las aplicaciones no se cuelgan, los usuarios no salen de la aplicacin sin antes hacer un commit o un roll back ), todo debera funcionar siempre muy bien.

- 48 -

Parte 3. Visual FoxPro y Firebird


Bueno, despus de todas las pginas anteriores finalmente llegamos a lo que puede resultar ms interesante a los programadores en Visual FoxPro: como integrar el lenguaje con el Firebird. Cuando se trabaja con Cliente/Servidor hay que: 1. Conectarse a la Base de Datos 2. Ejecutar los comandos 3. Desconectarse de la Base de Datos Esa es la forma correcta cuando tanto el Servidor como el Cliente estn en una LAN. La conexin se realiza al principio de la aplicacin (Contabilidad, Ventas, Sueldos, etc.) y la desconexin al finalizar la aplicacin. Sin embargo, si la conexin tiene problemas (suele ocurrir cuando es por Internet), entonces hay que: 1. Conectarse a la Base de Datos 2. Ejecutar un comando 3. Desconectarse de la Base de Datos Desde luego que esto es mucho ms lento, porque el estar conectndose y desconectndose toma un buen tiempo, pero a veces no hay otra alternativa. Una buena prctica es la siguiente: se realiza la conexin de la primera forma pero si se encuentran muchas o frecuentes cadas de conexin se opta por la segunda forma.

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 travs de un driver ODBC. En el DSN se especifican el nombre de la Base de Datos, la carpeta, el driver ODBC, el nombre del usuario, la contrasea y alguna otra informacin relevante. Una vez que se cre un DSN para una Base de Datos se lo puede usar en cualquier aplicacin para conectarse a esa Base de Datos. La conexin tambin puede realizarse sin DSN. En este caso toda la informacin necesaria para la conexin se escribe dentro de la aplicacin. Si la conexin es sin DSN, en lugar de utilizar un driver ODBC se puede usar OLE DB o algn otro mtodo. La primera opcin (conectarse con DSN) es til cuando varias aplicaciones (quizs creadas con distintos lenguajes) deben conectarse a la misma Base de Datos. La segunda opcin (conectarse sin DSN) es preferible si una sola aplicacin se conectar.

- 49 -

Para crear un DSN Primero, debes instalar el driver ODBC del Firebird en la computadora, luego:
Inicio Panel de Control Herramientas Administrativas Orgenes de Datos (ODBC) DSN de Sistema Hacer click en el botn Agregar Elegir: Firebird/Interbase (r) driver Escribir el nombre que se le quiere dar a la conexin DSN Escribir una descripcin Escribir el nombre de la Base de Datos que corresponde a la conexin Escribir el nombre del archivo DLL del cliente (FBCLIENT.DLL) Escribir el nombre del usuario de la Base de Datos Escribir la contrasea de ese usuario Escribir el conjunto de caracteres (espaol es ISO8859_1)

Si no ves el driver Firebird/Interbase (r) driver es porque an no has ejecutado el instalador de ese driver. Lo puedes encontrar y descargar de: http://www.firebirdsql.org/index.php?op=files&id=odbc busca uno que corresponda a tu versin del Windows. Para conectarse sin DSN Si deseas conectarte sin usar DSN (muchas veces es la opcin preferible), lo nico que tendrs que hacer es instalar el driver ODBC y luego enviar un string de conexin, como se ver ms adelante.

Una clase para usar con Bases de Datos SQL


Desde hace muchas versiones el Visual FoxPro permite la programacin orientada a objetos (POO) y esta es una muy buena oportunidad para usarla. 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?. La POO tiene muchas cosas buenas, entre ellas que permite que el cdigo escrito sea reutilizable, que todo se encuentre en un solo lugar haciendo ms fcil buscar y modificar lo que se desee y que los cambios se propagan a todos los objetos creados a partir de una clase. La clase que se desarrollar a continuacin 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 conexin Ejecutar comandos Verificar si hay una conexin activa Naturalmente puedes agregarle las funciones o procedimientos que te parezcan adecuados o necesarios, esta es una clase bsica, se le pueden adicionar nuevas funcionalidades, de acuerdo a las necesidades de cada quien. - 50 -

Lo primero que se debe hacer es escribir en la ventana de comandos:


modify command SQL_CLASES

Estando dentro del archivo SQL_CLASES.PRG, escribir:


DEFINE CLASS SQL_DataBase as CUSTOM * * lcODBC_Driver = "" lcServidor = "" lcBaseDatos = "" lcNombreConexion = "" lcUsuario = "" lcContrasena = "" lnHandle = 0 lcMensajeError = "" lnResultado = 0 lcComando = "" lcNombreCursor = "" llTerminarConexion = .F. && Si quiere terminar la conexin despus && de ejecutar un comando. til cuando se && accede por Internet. * * ENDDEFINE * *

Estas son todas las variables internas (o propiedades) de la clase que se est creando. Pero esas propiedades por s solas no sirven para mucho, son ms tiles cuando se crean procedimientos o funciones que las manipulan. Funcin para conectarse a una Base de Datos usando DSN Si definiste un DSN (como se explic anteriormente), entonces puedes usar la siguiente funcin para conectarte a una Base de Datos:
Function CONECTAR_CON_DSN with This .lnHandle = SQLConnect(.lcNombreConexion, .lcUsuario, .lcContrasena) .lnResultado = iif(.lnHandle > 0, 1, -1) endwith Return(This.lnResultado) * *

La funcin SQLConnect() es la que intenta realizar la conexin, recibe como parmetros el nombre de la conexin DSN, el nombre del usuario y la contrasea del usuario. Si la conexin se realiz con xito, devuelve un nmero entero mayor que cero (o sea, un nmero natural: entero y positivo). Si por algn motivo la conexin no pudo realizarse, devuelve un nmero entero y negativo. En la propiedad lnResultado se guarda el resultado del intento de conexin. Si vale 1 (uno) significa que tuvo xito, si vale -1 (menos uno) que fall.

- 51 -

Funcin para conectarse a una Base de Datos sin usar DSN Si no se defini un DSN, se puede usar la siguiente funcin para realizar la conexin a la Base de Datos:
Function CONECTAR_SIN_DSN Local lcCadenaConexion with This lcCadenaConexion = "DRIVER={" + .lcODBC_Driver + "};" ; + "SERVER=" + .lcServidor + ";" ; + "USER=" + .lcUsuario + ";" ; + "PASSWORD=" + .lcContrasena + ";" ; + "DATABASE=" + .lcBaseDatos + ";" ; + "OPTIONS=131329;" endwith =SQLSetProp(0, "DispLogin", 3) && Para no mostrar caja dilogo del Login with This .lnHandle = SQLStringConnect(lcCadenaConexion) .lnResultado = iif(.lnHandle > 0, 1, -1) endwith Return(This.lnResultado) * *

En este caso hay que armar una cadena de conexin y usar la funcin SQLStringConnect(). Al igual que antes en la propiedad lnResultado se guardar el resultado del intento de conexin. Un valor de 1 (uno) significa xito y un valor de -1 (menos uno) que hubo algn problema. Funcin para desconectarse de una (o todas) Base de Datos SQL Antes de finalizar tu aplicacin lo correcto es que te desconectes de la Base de Datos que estuviste usando.
Function DESCONECTAR with This if .lnHandle == 0

&& Si quiere desconectarse de TODAS las Bases de && Datos. .lnResultado = SQLDisconnect(0) endif if .lnHandle > 0 && Si quiere desconectarse de UNA Base de Datos y hay && una conexin activa, trata de desconectarse. .lnResultado = SQLDisconnect(.lnHandle) endif .lnHandle = iif(.lnResultado > 0, 0, .lnHandle) endwith Return(This.lnResultado) * *

Si la desconexin se realiz con xito entonces la propiedad lnHandle tendr el valor de 0 (cero) y la propiedad lnResultado el valor de 1 (1 = xito). Procedimiento para hallar el nombre del driver En una computadora normalmente hay muchos drivers instalados, sin embargo para realizar la conexin a la Base de Datos SQL necesitamos saber si uno en especial est (o no est) instalado.

- 52 -

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.
Procedure HALLARNOMBREDRIVER LParameters tcNombreMotorSQL Local lcNombre, loReg, lnNumError, lcSetExact, lnNumElemento loReg = CreateObject("ODBCReg") Dimension aVec(2000) lnNumError = loReg.GetODBCDrvrs(@aVec) lcSetExact = Set("EXACT") set exact OFF && Tiene que estar en OFF para que lo pueda encontrar lnNumElemento = AScan(aVec, tcNombreMotorSQL) set exact &lcSetExact Release loReg with This .lcODBC_Driver = iif(lnNumElemento > 0, aVec[lnNumElemento], "") .lnResultado = iif(!Empty(.lcODBC_Driver), 1, -1) endwith EndProc * *

Funcin para ejecutar comandos SQL Con la funcin SQLExec() se pueden ejecutar los comandos SQL (si existe una conexin activa a una Base de Datos, desde luego). Pero ya que se est escribiendo una clase, por qu no crear una funcin propia que no solamente trate de ejecutar un comando sino que tambin verifique antes si hay una conexin activa y en caso de no haberla intente la conexin?
Function EJECUTAR LParameters tcComando, tcNombreCursor Local lnI tcNombreCursor = iif(VarType(tcNombreCursor) <> "C", "", tcNombreCursor) with This .lcComando = tcComando .lcNombreCursor = tcNombreCursor lnI = 1 do while !.HayConexion() .and. lnI <= 30 .Conectar_sin_DSN() if .lnResultado < 0 Wait window "No puedo conectarme al Servidor. Deberas verificar que la red est funcionando correctamente. Intento N " + Transform(lnI) TimeOut 2 endif lnI = lnI + 1 enddo if .lnHandle > 0 && Hay una conexin activa .lnResultado = SQLExec(.lnHandle, .lcComando, .lcNombreCursor) if .llTerminarConexion && Quiere terminar la conexin despus de ejecutar el comando, usualmente cuando se accede por Internet .Desconectar() endif else .lnResultado = -1 endif endwith Return(This.lnResultado >= 1) * *

Primero, verifica si hay una conexin activa, si no la hay trata de conectarse, se hacen 30 intentos esperndose 2 segundos entre uno y el siguiente, lo que hace un total de 1 (un) minuto de intentos. Si hay una conexin activa entonces trata de ejecutar el

- 53 -

comando pedido. Si despus de eso el usuario quiere desconectarse de la Base de Datos, se desconecta. La funcin devuelve .T. si el comando se ejecut exitosamente o .F. si ocurri algn problema. Funcin para verificar si hay una conexin activa Antes de enviar un comando SQL es conveniente verificar que hay una conexin activa a la Base de Datos. Porque si no la hay, ocurrir un error, eso es seguro.
Function HAYCONEXION Local llResultado Try llResultado = SQLExec(This.lnHandle, "SELECT CURRENT_TIME FROM RDB$DATABASE") Catch llResultado = -1 EndTry Return(llResultado == 1) * *

La forma de verificar si hay una conexin activa es la siguiente: se trata de obtener la fecha y la hora del Servidor. Si se consigui, si se tuvo xito, significa que s hay una conexin activa, la conexin est ok. Si no se pudo obtener la fecha y la hora, eso significa que hubo algn problema. O sea, la conexin no est activa. Descargar las clases Estas clases (SQL_CLASES y SQL_REGISTRYCLASS) pueden descargarse desde: http://www.mediafire.com/?64vd8se54g91eob http://www.mediafire.com/?qqsh1q2z3e6kmnq

Programas en Visual FoxPro que usan Firebird


Estos programas son ejemplos que muestran como usar Bases de Datos Firebird en Visual Foxpro. Ejemplo N 1. Usando la instruccin SELECT El comando SELECT permite realizar consultas a la Base de Datos, pero los datos los retorna en una tabla temporal (o cursor). En este ejemplo esos datos son luego mostrados con un BROWSE. Lo importante a notar es que si se cambia el contenido de alguno de los campos mostrados por el BROWSE, ese nuevo valor no es actualizado en la Base de Datos, por lo tanto la siguiente vez que se ejecute el programa se seguirn viendo los valores originales. Eso es distinto que cuando se trabaja con tablas .DBF. En este caso, si modificas los campos que ves en el BROWSE, esos cambios quedan grabados en la tabla. En cambio, cuando usas tablas SQL, los cambios que haces en un BROWSE no se graban en la tabla original. Si quieres grabar algo en una tabla SQL debes enviar especficamente una instruccin INSERT o UPDATE. - 54 -

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. 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). 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. IMPORTANTE: Todos estos SELECT los puedes escribir en el programa ISQL, como se muestra a continuacin para el primero de ellos:

Y aqu se muestra el segundo SELECT del programa (donde se supone que ya ests conectado a la Base de Datos EMPLOYEE.FDB):

Por supuesto que usar ISQL no suele ser la mejor alternativa, y en su lugar se puede usar Flame Robin, 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. 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 obtendrs informacin que te resultar de utilidad para saber qu ests haciendo mal. Por ejemplo:

- 55 -

En este caso se agrup solamente por FULL_NAME, pero a la izquierda de la clusula GROUP BY hay dos campos y se debe usarlos a los dos. La expresin correcta es la siguiente:
SELECT EMP_NO, FULL_NAME FROM EMPLOYEE GROUP BY FULL_NAME, EMP_NO;

Aunque a veces parecen ser la misma cosa, agrupar es distinto que ordenar, para agrupar (poner a las filas en grupos) se usa GROUP BY, para ordenarlas se usa ORDER BY, para ordenarlas en forma descendente hay que agregar DESCENDING. Ejemplo N 2. Una pequea aplicacin administrativa (stock, compras, ventas) Un pequeo negocio ha pedido que se le haga una aplicacin para ayudarle con el control del mismo. Ellos se dedican a vender bebidas, es lo nico que venden y no tienen previsto vender algo ms. En su lista hay cervezas, vinos, whiskies, gaseosas, aguas minerales, pero su fuerte son las bebidas alcohlicas, en especial las cervezas. El negocio abre los 7 das de la semana, inclusive cuando hay partidos de ftbol importantes o algn otro acontecimiento los das Domingo tienen una venta muy grande. No tienen sucursales ni planean tenerlas. En ese negocio trabajan dos personas: el propietario y un empleado, quienes se van turnando los horarios. Al empleado adems de un sueldo fijo se le paga una comisin del 3% sobre las ventas realizadas. Todas las compras y todas las ventas son al contado, a nadie se le vende a crdito, por ningn motivo. Los clientes no pueden retirar la mercadera antes de pagarla. Las ventas pueden ser al por mayor o al por menor (o detalle), los precios de venta son distintos para ambos casos. Pueden vender por unidades o por cajas (o packs), las cajas (o packs) pueden contener: 3, 6, 12, 24 unidades. Nunca devuelven productos a los proveedores ni aceptan devoluciones de los clientes. La aplicacin se realizar en Visual FoxPro, usando Firebird SQL como motor de la Base de Datos. Despus del anlisis correspondiente se ha encontrado que se necesitarn 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, comprada o vendida, puede faltar Toda cantidad, comprada o vendida, debe ser mayor que cero - 56 -

Ningn importe, de compra o de venta, puede faltar Todo importe, de compra o de venta, debe ser mayor que cero Todos los vendedores deben tener un cdigo nico, entre 000 y 999 Todos los vendedores deben tener un nombre y en maysculas Todos los proveedores deben tener un cdigo nico, entre 000 y 999 Todos los proveedores deben tener un nombre y en maysculas Todos los proveedores deben tener un telfono Todos los productos deben tener un cdigo nico, entre 000 y 999 Todos los productos deben tener un nombre y en maysculas 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, significando compras y ventas, respectivamente) Todos los movimientos detalles deben tener un campo que los relacione con los movimientos de cabecera

Para crear la Base de Datos, los dominios, tablas y vistas se utilizaron scripts, de tal manera que sea muy fcil reconstruirla en caso de necesidad. En ISQL se utiliza la instruccin INPUT para ejecutar un script, como se ve a continuacin:

Por convencin los scripts tienen la extensin .SQL pero no es obligatorio, a tus scripts puedes ponerles la extensin que quieras aunque desde luego sera preferible que usaras .SQL para que los dems puedan entenderte fcilmente.

- 57 -

Potrebbero piacerti anche