Visual FoxPro y Firebird SQL

download Visual FoxPro y Firebird SQL

of 57

Transcript of Visual FoxPro y Firebird SQL

Visual FoxPro y Firebird SQLndiceIntroduccin............................................... 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 SQLIntroduccinPor 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/ServidorServidores de archivos compartidos y Cliente/ServidorMediante 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/ServidorUn 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/ServidorUn 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 usuarioCuando 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 ServidorLa 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 primariasCada 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.

RelacionesPara 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.

ConcurrenciaEn 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-

TransaccionesEsto 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 terminologaEn 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. FirebirdQu 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 ServidorFirebird 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 utilizadosUna 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 ClienteLas mismas que para el Servidor.

Caractersticas principales de FirebirdFirebird 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.)

ConectividadFirebird 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 -

HerramientasHay 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 ServidorHay 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 ClienteAunque 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 ODBCPara 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 instalacinVerificando 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 HOSTUna 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.CONFEste 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.CONFEste 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.FDBEste 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 DatosAunque 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 DatosEsta 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 -

ScriptsAdems 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 SYSDBAEn 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 usuariosEl 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 usuariosEl 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 usuariosLos 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 usuariosA 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 DatosSi 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 DatosEl 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 ON TO ;

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

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 -

RolesLos 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

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

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 utilizadosEl 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 DatosCREATE DATABASE "C:\EJEMPLO.FDB" USER "WALTER" PASSWORD "123456";

Conectarse a una Base de DatosCONNECT "C:\EJEMPLO.FDB" USER "SILVIA" PASSWORD "muylinda";

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

Ver los dominios existentesSHOW DOMAINS;

Ver la estructura de un dominioSHOW DOMAIN NumeroEntero; SHOW DOMAIN NombrePersona;

- 25 -

Crear una tablaCREATE 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 DatosDROP TABLE Personas;

Ver todas las tablas de una Base de DatosSHOW TABLES;

Ver la estructura de una tablaSHOW TABLE Personas; SHOW TABLE Amigos;

Agregarle una clave primaria a una tablaALTER TABLE Amigos ADD PRIMARY KEY (Codigo); la columna clave debe estar entre parntesis

Agregarle una columna a una tablaALTER TABLE Personas ADD Telefono VarChar(15); ALTER TABLE Personas ADD Clave Integer NOT NULL;

Borrar una columna de una tablaALTER TABLE Personas DROP Codigo;

Agregarle filas a una tablaINSERT 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 tablaDELETE FROM Personas WHERE Codigo = 25; DELETE FROM Personas WHERE Codigo >= 12 AND Codigo 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 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 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 FirebirdEstos 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 -