jueves, 10 de diciembre de 2009

Update or Insert

Sentencia SQL de Firebird que es muy util si desea insertar un registro sin necesidad de verificar si ya existe, ya que si existe el registro es actualizado y si no es insertado
(nos evitamos el error de Violacion por duplicidad de llave primaria.)
Claro hay que saber cuando tenemos que ocupar dicha sentencia.

Ejemplo:
Update or Insert into TABLA(Campo1,Campo2) values('ValorCampo1','ValorCampo2')

miércoles, 7 de octubre de 2009

Nuevas características de Firebird 2.1

Firebird 2.1 es una versión completa que está construida sobre los cambios de arquitectura presentados en la versión mayor 2.0. Gracias a todos que han probado las versiones Alfa y Beta durante 2007 y los primeros meses de 2008, ya que por ellos tenemos una versión que brilla por sus nuevas características y mejoras, incluyendo las tan esperadas Tablas Temporales, un catálogo de nuevos mecanismos de monitoreo en tiempo real, triggers de la base de datos, y muchas nuevas fucniones internas para ser utilizadas en el lenguaje SQL.


Triggers de base de datos

Módulos PSQL definidos por el usuario que pueden ser utilizados para dispararse en varios eventos a nivel de conexión y de transacción.

Tablas temporales globales

Tablas temporales globales que cumplen con el estándar SQL. Estas tablas predefinidas son instanciadas cuando se solicita dentro de una conexión o transacción para utilizarlas con datos no persistentes, y que la máquina interna de Firebird guada en archivos temporales.

Expresiones comunes de tablas (CTEs)

Expresiones comunes de tablas que cumplen con el estándar, que permiten hacer consultas dinámicas recursivas.

Cláusula RETURNING

Cláusula opcional RETURNING para todas las operaciones que regresan una sola fila, como en las instrucciones UPDATE, INSERT y DELETE.

Instrucción UPDATE OR INSERT

Nueva instrucción UPDATE OR INSERT para actualizar registros. Ahora puedes ejecutar una instrucción que es capaz de realizar ya sea una inserción o una actualización a un registro existente, dependiendo si existe el registro o no..

Función LIST()

Una nueva función de agregación LIST() recupera todos los SOMETHINGs en un grupo y los agrega dentro de una lista separada por comas..

Nuevas funciones integradas

Docenas de nuevas funciones integradas que reemplazan muchas de las que vienen en las UDFs incluidas con las versiones anteriores de Firebird.

Blobs de Texto, pueden enmascararse como VARCHAR largos

La maquinaria de Firebird ahora trata los BLOBs de texto que son menores a 32765 bytes de longitud, como si fueran VARCHARs. Las fucniones de cadenas como CAST, LOWER, UPPER, TRIM y SUBSTRING trabajarán con esos BLOBs, así como las concatenaciones y las asignaciones a tipos de cadenas.

Definir las variables PSQL (triggers y procedimientos) utilizando Dominios

Las variables locales PSQL y argumentos de entrada y salida para procedimientos almacenados ahora pueden ser declarados utilizando dominios en lugar de los tipos de datos básicos.

COLLATE en PSQL

Collations (ordenaimientos) pueden ser ahora aplicados a las variables y argumentos de PSQL.

Seguridad de Windows para autentificar usuarios

La seguridad de Windows llamada "Trusted User" puede ser utilizada para autentificar usuarios en un servidor de plataforma Windows.

Comando CREATE COLLATION

El comando de DDL CREATE COLLATION ha sido agregado para implementar un ordenamiento.

Ordenamientos Unicode en cualquier lugar

Dos nuevos ordenamientos Unicode pueden ser aplicados a cualquier caracter utilizando un nuevo mecanismo.

Firebird portado a nuevas plataformas

Ahora ha sido portado a Windows 2003 64-bit (AMD64 and Intel EM64T) en arquitectura clásica, Superserver y Embedded; PowerPC, Mac OSX Intel para 32 y 64-bits.

Monitoreo de bases de datos usando SQL

Monitoreo de bases de datos en tiempo de ejecución, utilizando SQL, y accediendo a nuevas tablas de sistema virtualizadas. Dentro de ellas existe una llamada MON$DATABASE que permite conocer mucha información sobre la base de datos que previamente no podía ser obtenida usando SQL. Estos detalles incluyen la versión de la estructura en disco (ODS), dialecto SQL, intervalo de barrido, OIT, OAT y más información sobre la base de datos. Es posible utilizar la información de monitoreo para cancelar una consulta en proceso.

Interfase remota

El protocolo remoto ha sido ligeramente mejorado para que funcione mejor en redes lentas siempre y cuando se utilicen los drivers actualizados (léase clientes). Las pruebas mostraron que las transmisiones y recepciones a la API se redujeron en tiempo cerca de 50%, resultando en un 40% menos tiempo de transmisión y recepción en TCP.


Fuente:http://www.firebird.com.mx/modules/smartsection/item.php?itemid=2

Extraer mes, dia , año en consultas firebird

Para extraer el dia, mes, año o semana en una consulta SQL de firebird, la sintasix es la siguiente:

SELECT
FECHA,
EXTRACT( Day FROM FECHA) AS dia,
EXTRACT( Month FROM FECHA) AS mes,
EXTRACT( Year FROM FECHA) AS año,
EXTRACT( WEEKDAY FROM FECHA) AS semana,
FROM Registro

lunes, 5 de octubre de 2009

La clausula RETURNING, FireBird

La clausula returning que ha sido incluida desde Firebird 2.1, nos sirve para capturar datos de forma fácil, luego de realizar un Insert, Update y/o Delete, su alcance se da en DSQL y PSQL. Returning nos ayudará a evitarnos una buena cantidad de select, ya no necesarios en nuestros aplicativos…

Veamos su definición según el archivo README.returning.txt distribuido con FireBird 2.1 y un pequeño ejemplo al respecto.




Su sintaxis es la siguiente:

INSERT INTO … VALUES (…) [RETURNING [INTO ]]
INSERT INTO … SELECT … [RETURNING [INTO ]]
UPDATE OR INSERT INTO … VALUES (…) … [RETURNING [INTO ]]
UPDATE … [RETURNING [INTO ]]
DELETE FROM … [RETURNING [INTO ]]

Para aclarar un poco el asunto, quiero explicarles el asunto, dentro de un INSERT, UPDATE, DELETE o UPDATE OR INSERT(Enlace interno), seguimos teniendo las mismas sintaxis de toda la vida, solo que ahora podemos incluirle al final un RETURNING con la lista de campos que queremos de vuelta y un INTO con la lista de variables (En el caso PSQL), que es donde caerán dichos datos devueltos por el returning.

Los ejemplos que trae el propio archivo README.returning.txt son bastante explicativos, los cuales son los siguientes:

Example(s):
1. INSERT INTO T1 (F1, F2)
VALUES (:F1, :F2)
RETURNING F1, F2 INTO :V1, :V2;
2. INSERT INTO T2 (F1, F2)
VALUES (1, 2)
RETURNING ID INTO :P K;
3. DELETE FROM T1 WHERE F1 = 1 RETURNING F2;
4. UPDATE T1 SET F2 = F2 * 10 RETURNING OLD.F2, NEW.F2;

En estos ejemplos podemos apreciar claramente, que además de todo lo que he dicho anteriormente, también es posible capturar el valor viejo (OLD) y nuevo (NEW), como si se tratara de un trigger en nuestra base de datos, de todas formas, estos ejemplos son bastante descriptivos, pero armemos uno nosotros mismos… se que lo siguiente se puede hacer de muchas formas, pero es solo eso, un ejemplo que solo busca que quede claro como usar el returning desde PSQL en Firebird 2.1:

Imaginemos que tenemos una base de datos con una tabla (CONSECUTIVOS) que siempre tiene el ultimo consecutivo de mis movimientos, digamos que la tabla tiene un campo para el tipo de movimiento y otro para el consecutivo…

Algo como esto…
Tipo Descripción Consecutivo
FV Factura de venta 198001
PE Pedido 259874
RC Recibo de caja 457869

También tenemos un procedimiento almacenado que nos crea automáticamente una factura a partir de por ejemplo… un pedido… pero para crear la nueva factura necesitamos saber cual es el número a seguir de dicha factura, teniendo el numero del pedido, el tipo de transacción del mismo, y el tipo de transacción de la factura… normalmente hacemos lo siguiente:

CREATE PROCEDURE sp_pedidoe_ins_fv (
tipo_trans_pedido CHAR(2),
numero_trans_pedido INTEGER,
tipo_trans_factura CHAR(2))
AS
DECLARE VARIABLE numero_trans_factura INTEGER;
BEGIN
/*hacemos el select respectivo, del pedido*/
SELECT pedido...

/*capturamos el numero a seguir de la factura*/
SELECT numero_trans+1 FROM consecutivos
WHERE tipo_trans = :tipo_trans_factura
INTO :numero_trans_factura;

/*sumamos en uno el consecutivo de facturas en la tabla consecutivos*/
UPDATE consecutivos SET numero_trans=numero_trans+1
WHERE tipo_trans = :tipo_trans_factura
INTO :numero_trans_factura;

/*hacemos el insert de la factura a partir de los datos del pedido*/
INSERT facturas INTO(numero_trans_factura,...)
VALUES(:numero_trans_factura,...);
END;

El returning nos ahorraría en este caso una de esas consultas, ya que no tenemos que hacer el select que nos sirve para capturar el número que sigue de la factura, la cuestión quedaría así:

CREATE PROCEDURE sp_pedidoe_ins_fv (
tipo_trans_pedido CHAR(2),
numero_trans_pedido INTEGER,
tipo_trans_factura CHAR(2))
AS
DECLARE VARIABLE numero_trans_factura INTEGER;
BEGIN
/*hacemos el select respectivo, del pedido*/
SELECT pedido...

/*sumamos en uno el consecutivo de facturas en la tabla
consecutivos y de una vez capturamos el valor correspondiente*/
UPDATE consecutivos SET numero_trans=numero_trans+1
WHERE tipo_trans = :tipo_trans_factura
RETURNING numero_trans
INTO :numero_trans_factura;

/*hacemos el insert de la factura a partir de los datos del pedido*/
INSERT facturas INTO(numero_trans_factura,...)
VALUES(:numero_trans_factura,...);

END;

Como vemos, en este caso nos ahorramos una consulta, obteniendo dicho numero de una forma mas eficiente, este fue un ejemplo sencillo, pero que muestra el uso de esta característica, ya que en la vida real, podemos enfrentarnos a varios casos de ese tipo y de otros tipos donde realmente es muy útil la clausula returning.

Notas

- También podemos usar returning para capturar un valor que haya sido afectado en ese registro por un trigger en la tabla,

mientras que este ultimo no sea un AFTER-triggers, porque de lo contrario será ignorado.
- Recuerden que también podemos usar las variables OLD y NEW luego del returning, como si de un trigger se tratara.

Limitaciones

- Sería genial poder usar la clausula returning en consultas donde se ejecuten acciones con múltiples registros, pero no es

posible, de manera que si un UPDATE, INSERT o DELETE, se aplica para mas de un registro no podremos usar returning.

Mas información al respecto

viernes, 2 de octubre de 2009

Establecer conexion a Firebird 2.1 desde VB.NET

A continuación la cadena de conexión a Firebird 2.1 desde VB.NET

'Una vez agregada la referencia importar el ensamblado para usarlo en nuestra aplicacion.

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Imports FirebirdSql.Data.FirebirdClient
_____________________________________________________________________
Public Class Consulta
Dim Conexion As New FbConnection
_____________________________________________________________________
Private Sub Conectarme(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConectar.Click
conecta()
End Sub
_____________________________________________________________________
Public Sub conecta()
Dim cadena_conexion As String = "ServerType=0;User=SYSDBA;Password=masterkey;Size=4096;Dialect=3;Pooling=FALSE;database=127.0.0.1:C:\NETFB\NETFB.FDB"
Try

Conexion.ConnectionString = cadena_conexion

If Conexion.State = ConnectionState.Closed Then
Conexion.Open()
End If

MessageBox.Show("Conectado", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information)

Catch errfb As FbException
MessageBox.Show("Error al conectar de la base de datos. Descripcion del error: " & errfb.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

Catch ex As Exception
MessageBox.Show("Error. Descripcion del error: " & Err.Description, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

End Sub
_____________________________________________________________________
Private Sub btnDesconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDesconectar.Click
Try

If Conexion.State = ConnectionState.Open Then
Conexion.Close()
End If

MessageBox.Show("Desconectado", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information)

Catch errfb As FbException

MessageBox.Show("Error al desconectar de la base de datos. Descripcion del error: " & errfb.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

Catch ex As Exception

MessageBox.Show("Error. Descripcion del error: " & Err.Description, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

End Sub
_____________________________________________________________________
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Agregar referencia a Firebird 2.1 desde VB.NET

Agregar una referencia a la DLL que proporciona Firebird para .NET:




Paso 1: para ver las referencias de nuestro proyecto.
Paso 2: para agregar la DLL como referencia a Firebird

***************************************************************************

¿Como encontrar la DLL?



En este caso yo hago clic en la pestaña reciente porque la he ocupado en otros proyectos, pero si es la primera vez que se va a añadir, se selecciona examinar(antes tener instalado el FirebirdClient (ADO.NET Data Provider)), que lo pueden descargar de la pagina oficial de firebird:
http://www.firebirdsql.org/dotnetfirebird/download/index.html
y se selecciona de DLL que esta ubicada en donde realizamos la instalación.


*********************************************************************************

¿Como saber que ya esta referenciada la DLL?



Una vez hecho lo anterior en el Explorador de soluciones/Referencias ya nos aparece la librería, la cual ya esta disponible para acceder a sus clases y gestionar bases de datos firebird.

Nota: La versión de la librería (descargada) debe corresponder con la versión de Firebird que se instala en el/los equipos.

Microsoft .NET

Microsoft .NET

.NET es un proyecto de Microsoft para crear una nueva plataforma de desarrollo de software con énfasis en transparencia de redes, con independencia de plataforma de hardware y que permita un rápido desarrollo de aplicaciones. Basado en ella, la empresa intenta desarrollar una estrategia horizontal que integre todos sus productos, desde el sistema operativo hasta las herramientas de mercado.

.NET podría considerarse una respuesta de Microsoft al creciente mercado de los negocios en entornos Web, como competencia a la plataforma Java de Sun Microsystems y a los diversos framework de desarrollo web basados en PHP. Su propuesta es ofrecer una manera rápida y económica, a la vez que segura y robusta, de desarrollar aplicaciones –o como la misma plataforma las denomina, soluciones– permitiendo una integración más rápida y ágil entre empresas y un acceso más simple y universal a todo tipo de información desde cualquier tipo de dispositivo.


Fuente: http://es.wikipedia.org/wiki/Microsoft_.NET

Herramientas para creación/administración de bases de datos firebird

EMS SQL Manager 2008 para IB/Firebird

Esta es la última versión de la mejor herramienta para creación/administración de bases de datos con el motor gratuito Firebird. También es compatible con la versión paga de Interbase.
Para los que conocen Firebird, les resultará muy útil. Para los que no, se los recomiendo. Para mayor información sobre este motor de base de datos, pueden revisar http://www.firebirdsql.org. Allí podrán conseguir documentación y sobre todo, los componentes de conexión para Visual Studio y otros entornos de programación.


FlameRobin

FlameRobin es una herramienta de administración de base de datos Firebird DBMS.
Nuestro objetivo es construir una herramienta que es:
- Ligero (huella pequeña, rápida ejecución)
- Multi-plataforma (Linux, Windows, Mac OS X, FreeBSD, Solaris),
- Sólo depende de otro software de código abierto

¿Que es Firebird?

Firebird es una base de datos relacional que ofrece muchas características de SQL ANSI estándar y que funciona en Linux, Windows, MacOSX y una variedad de plataformas UNIX. Firebird ofrece una concurrencia excelente, alto rendimiento y un poderoso lenguaje de procedimientos almacenados y disparadores. Ha estado usándose en producción bajo varios nombres desde 1981.

El Proyecto Firebird es un proyecto independiente de programadores de C y C++, asesores técnicos y colaboradores que desarrollan y mejoran a Firebird, la base de datos relacional basada en el código fuente liberado por Inprise Corp (ahora conocida como Borland Software Corp) el 25 de julio de 2000.


Fuente: http://www.firebird.com.mx

jueves, 1 de octubre de 2009

Ejemplo de consulta a firebird creando una instancia al objeto FbDataAdapter

'**Creamos una instancia al objeto Dataset
Dim AllTablas As New DataSet

'**PROCEDIMIENTO

Private Sub Consulta(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConsulta.Click

'**Creamos un objeto de la clase FbDataAdapter
Dim ADPT As New FbDataAdapter("Select IDESTADO as ID,NOMBRE from estados", Conexion.ConnectionString)

'**Adaptamos los datos al dataset
ADPT.Fill(AllTablas, "ESTADOS")

'**Mostamos los datos en el datagrid
Me.GridEdos.DataSource = AllTablas
Me.GridEdos.DataMember = "ESTADOS"

End Sub

System.Data

Las clases del nombre de espacio System.Data son bastantes extensas y variadas.
Quizás las clases más importantes son la clase DataView, la clase DataSet y la clase DataTable.


La clase DataSet

Puede que sea la capa más externa e importante del modelo ADO.NET, pero es la que contiene quizás, el modelo de colecciones y trabajo que más le puede resultar familiar al programador de Visual Basic 6, sobre todo a los anteriormente comentados RecordSets.
El DataSet contiene en sí, un conjunto de datos que han sido volcados desde el proveedor de datos.
De esa forma, podemos trabajar con ellos como lo hacíamos en Visual Basic 6 por ejemplo.
De hecho, por marcar una similitud con el RecordSet, el DataSet está preparado para trabajar con fuentes de datos desconectadas.
La novedad quizás más destacable, es que cuando trabajamos con DataSets, el origen de datos no es lo más importante, ya que éste, puede ser cualquier tipo de origen de datos. No tiene porqué ser una base de datos.
Un DataSet contiene colecciones de DataTables y DataRelations.
El DataTable contiene una tabla o tablas, mientras que la DataRelation contiene las relaciones entre las DataTables.
Sin embargo, no es necesario especificar todo esto hasta el último detalle como veremos más adelante.



La clase DataView


Este objeto nos permite crear múltiples vistas de nuestros datos, además de permitirnos presentar los datos.
Es la clase que nos permite representar los datos de la clase DataTable, permitiéndonos editar, ordenar y filtrar, buscar y navegar por un conjunto de datos determinado.



La clase DataTable

Este objeto nos permite representar una determinada tabla en memoria, de modo que podamos interactuar con ella.
A la hora de trabajar con este objeto, debemos tener en cuenta el nombre con el cuál definamos una determinada tabla, ya que los objetos declarados en en el DataTable es sensitivo a mayúsculas y minúsculas.


Fuente: http://elguille.info

¿Qué es ADO.NET?

ADO.NET posee las funcionalidades de ADO con las posibilidades añadidas del uso de documentos XML de forma nativa, junto a una disposición de objetos que aumentan el rendimiento de los desarrolladores, y posibilitan más aún, el trabajo y desarrollo de aplicaciones en n-capas.

Para el que no sepa que es ADO ni ADO.NET, el resumen de ADO.NET sería el de un conjunto de clases que nos permite leer e interactuar con fuentes de datos almacenadas en bases de datos y otras fuentes de almacenamiento de datos.

ADO.NET proporciona diferentes clases del nombre de espacio System.Data dentro de las cuáles, destacaremos por encima de todas, la clase DataView, la clase DataSet y la clase DataTable.

Este conjunto de clases de carácter armónico, funcionan de igual forma con la capa inferior que es la que corresponde a los proveedores de acceso a datos con los que podemos trabajar.

Esto facilita el trabajo en n-capas y la posible migración de aplicaciones que utilicen una determinada fuente de datos y deseemos en un momento dado, hacer uso de otra fuente de datos.



¿Qué capas o qué partes hay dentro de ADO.NET?

Dentro de ADO.NET tenemos dos partes importantes.
La primera de ellas es la que corresponde con el nombre de espacio System.Data y que constituye los objetos y clases globales de ADO.NET.

La otra parte es la que corresponde con los objetos que permiten el acceso a datos a una determinada fuente de datos desde ADO.NET y que utilizan así mismo, las clases del nombre de espacio System.Data.



Para resumir de alguna forma lo que estamos comentando, diremos que el trabajo de conexión con la base de datos, la ejecución de una instrucción SQL determinada, una vista, etc., la realiza el proveedor de acceso a datos.
Recuperar esos datos para tratarlos, manipularlos o volcarlos a un determinado control o dispositivo, es acción de la capa superior que corresponde con el nombre de espacio System.Data.



¿Qué nos permite realmente ADO.NET cuando trabajamos con XML?

Framework nos proporciona el trabajo con estándares y con ello, la posibilidad de trabajar con diferentes tipos de aplicaciones, entornos, sistemas operativos y lenguajes sin necesidad de conocer lo que hay al otro lado de nuestra aplicación.
XML es sin lugar a dudas, el lenguaje de etiquetas por excelencia, válido para llevar a cabo esta tarea sin tener un impacto relevante cuando trabajamos con diferentes soluciones en entornos dispares.
Tanto la posibilidad de trabajar con Servicios Web XML como con documentos e información en XML, sobre todo al trabajar con fuentes de datos en ADO.NET, nos proporciona a los desarrolladores las posibilidades necesarias que nos permite hacer que la información con la que trabajamos, pueda ser tratada entre diferentes sistemas o entornos, sin que por ello nos preocupemos de lo que hay al otro lado.


Fuente: http://elguille.info