domingo, 4 de diciembre de 2011

BASE DE DATOS EN VISUAL BASIC 6.0

 ADO CON VISUAL BASIC 6.0

En este ejemplo vamos a usar un control FlexGrid para asignar un Recordset y mostrar los datos directamente.
Por tanto, tendrás que crear un nuevo proyecto de Visual Basic 6.0 y agregar ese componente, el cual se muestra como:Microsoft Hierarchical FlexGrid Control 6.0 (SP4) (OLEDB) y en realidad es el control MSHFLXGD.OCX.
También tendrás que añadir una referencia a la librería de OLEDB, en mi caso he usado Microsoft ActiveX Data Objects 2.8 Library, pero supongo que con otra versión anterior funcionará, pero no lo he probado, y como esa referencia está disponible después de instalar el SQL Server 2005 Express, pues... ¿para qué complicarnos?
Dependiendo de la forma en que quieras acceder a la base de datos, necesitarás (como es de suponer) una base de datos de SQL Server 2005, por ejemplo la base de datos "pubs".
Si lo que pretendes es acceder a un fichero con la extensión .mdf, pues tendrás que tener el fichero al que quieres acceder. Es decir una base de datos de SQL Server 2005 en un fichero físico, el cual puedes guardar en el mismo directorio del ejecutable o donde más te plazca, que esa es una de las ventajas de SQL Server 2005: el poder usar un fichero de base de datos directamente, con lo que no necesitas distribuir una base de tipo Access.

El código de ejemplo
En el código de ejemplo, te voy a mostrar las dos formas de acceder.
1.- Acceder a una base de una instancia
En el caso de la base de datos "pubs", la cadena de conexión será la siguiente:
Provider=SQLNCLI;
Initial Catalog=pubs;
Data Source=(local)\SQLEXPRESS;
integrated security=SSPI; persist security info=True;
En este caso, la base de datos se supone que está en la instancia SQLEXPRESS del servidor del equipo actual, si no es así, tendrás que cambiar el valor de Data Source.
La base de datos es pubs, si no fuera esa, cambia el nombre asignado a Initial Catalog.
La autenticación usada es la de Windows, si no fuera esa, tendrás que indicar el usuario y el password y cambiar adecuadamente el valor de Integrated Security, aquí tienes un ejemplo de cómo "formar" una cadena de conexión a una base de datos de SQL Server.
Suponiendo que la conexión a la base de datos la hacemos desde el evento Click de un botón y que la cadena de selección esSELECT * FROM authors, para mostrar los datos en el control FlexGrid (llamado MSHFlexGrid1), el código sería el siguiente:
Private Sub btnConectar_Click()
    ' La conexión a la base de datos
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
   
    ' Para la cadena de selección
    Dim sSelect As String
   
    ' Para una base de datos normal:
    sSelect = "SELECT * FROM authors"

    cn.Open "Provider=SQLNCLI; " & _
             "Initial Catalog=pubs; " & _
             "Data Source=(local)\SQLEXPRESS; " & _
             "integrated security=SSPI; persist security info=True;"
   
    ' El recordset para acceder a los datos
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    ' Abrir el recordset de forma estática, no vamos a cambiar datos
    rs.Open sSelect, cn, adOpenStatic

    ' Permitir redimensionar las columnas
    MSHFlexGrid1.AllowUserResizing = flexResizeColumns

    ' Asignar el recordset al FlexGrid
    Set MSHFlexGrid1.DataSource = rs
   
    rs.Close
    cn.Close

End Sub

2- Acceder a una base de un fichero
Para acceder a una base de datos que está en un fichero, necesitarás indicar la ruta (path) en la que está ese fichero con la extensión .mdf. En este ejemplo, esa ruta está en la variable sBase.
La cadena de conexión sería la siguiente:
Provider=SQLNCLI;
AttachDBFileName= ruta completa del fichero de la base de datos;
Data Source=(local)\SQLEXPRESS;
integrated security=SSPI; persist security info=True;
Como es de suponer, el nombre (y el directorio completo) de la base de datos es lo que tienes que asignar aAttachDBFileName. Además debes indicar en Data Source el nombre de la instancia de SQLEXPRESS que se usará para acceder a esa base de datos, al menos debes indicar una instancia válida.
En el siguiente código tienes cómo usar una base de datos llamada PruebaPrecios.mdf que está en un directorio llamadobases del disco E. Esa base de datos debe tener una tabla llamada Clientes que es la que se usa en el siguiente ejemplo, que como en el código del ejemplo anterior, se ejecuta desde el evento Click de un botón y asigna los datos al FlexGrid que tenemos en el formulario.
Private Sub btnConectar_Click()
    ' La conexión a la base de datos
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
   
    ' Para la cadena de selección
    Dim sSelect As String
   
    ' Para usar un fichero directamente:
    Dim sBase As String

    ' Poner aquí el path y el nombre de la base
    sBase = "E:\bases\PruebaPrecios.mdf"

    ' Y la cadena de selección adecuada
    sSelect = "SELECT * FROM Clientes"
    '
    cn.Open "Provider=SQLNCLI; " & _
             "AttachDBFileName=" & sBase & "; " & _
             "Data Source=(local)\SQLEXPRESS; " & _
             "integrated security=SSPI; persist security info=True;"
   
    ' El recordset para acceder a los datos
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    ' Abrir el recordset de forma estática, no vamos a cambiar datos
    rs.Open sSelect, cn, adOpenStatic
   
    ' Permitir redimensionar las columnas
    Me.MSHFlexGrid1.AllowUserResizing = flexResizeColumns

    ' Asignar el recordset al FlexGrid
    Set Me.MSHFlexGrid1.DataSource = rs
   
    rs.Close
    cn.Close

End Sub
DAO CON VISUAL BASIC 6.0
2.- Ordenes SQL para cambiar los datos de una tabla.
UPDATE tabla
SET nombre_campo = 'nuevo_valor'
WHERE opciones_a_tener_en_cuenta
Ejemplo: Actualizar la tabla Clientes poniendo el campo Agente a LIBRE si la fecha de ÚltimaVisita es anterior al 1 de Enero de 1996 (este es un caso sobre una base de datos que uso en mi trabajo, pero como ejemplo puede valer):
UPDATE Clientes SET Agente = 'LIBRE' WHERE [ÚltimaVisita] < DateValue('01/01/96')
Normalmente el campo de fechas será según tengáis configurado el sistema.


 3.- Caracteres no "standard" en los nombres de los campos
Si al crear las tablas de la base de datos usas caracteres acentuados, eñes, espacios, etc. Cuando hagas una consulta o lo uses en un Recordset, etc, ponlos entre corchetes, fijates en cómo se usa ÚltimaVisita en el ejemplo anterior.


4.- Procesar una consulta SQL (Execute)
Para ejecutar una orden SQL en una base de datos, usar la orden Execute en la variable de una base de datos (Database)
'SQLTmp= orden SQL
'Db será una base de datos:
'Dim Db As Database  'Variable para las Bases de Datos
'Set Db = OpenDatabase("Nombre_Base_Datos")
 
On Error Resume Next
Db.Execute SQLTmp, dbFailOnError
If Err Then
             MsgBox "Se ha producido un error al ejecutar la orden:" & vbCrLf & SQLTmp
End If


5.- Procesar una consulta SQL creando un Recordset
Se creará un Recordset con el resultado de una consulta SQL realizada a uan base de datos, posteriormente se procesarán los datos que ha producido dicha consulta.
Por ejemplo si tenemos una base de datos con nuestra colección discográfica, podríamos hacer una consulta con todos los CD's de Phil Collins
Suponiendo que el formato de los discos (CD, LP, etc.) es Formato y el Nombre del Autor está en Cantante, la orden a ejecutar sería:
SQLTmp = "SELECT * FROM mis_discos WHERE Formato Like '*CD*' AND Cantante Like '*Phil Collins*'"
Por supuesto se puede usar = en lugar de Like, si estamos seguros de que no necesitamos los comodines, ya que la consulta es "bastante" más rápida. Es decir quedaría así:
SQLTmp = "SELECT * FROM mis_discos WHERE Formato = 'CD' AND Cantante = 'Phil Collins'"
'Ejecutar orden SQL con los datos solicitados
 
'Db será una base de datos:
'Dim Db As Database  'Variable para las Bases de Datos
'Set Db = OpenDatabase("Nombre_Base_Datos")
 
Dim SQLTmp As String
Dim MySnap As Recordset
 
SQLTmp = "select * from " & Nombre_Tabla & " <Consulta> " & " order by " & Clasificar
Set MySnap = Db.OpenRecordset(SQLTmp, dbOpenSnapshot)
Err = 0
MySnap.MoveFirst
If Err Then
             Err = 0
             'no hay datos, avisar
             MsgBox "No hay datos que coincidan con la búsqueda especificada," & vbCrLf & "(o no está bien realizada)", 64, "Listados"
             Exit Sub
End If
 
'Añadir el resultado a un List
List1.Clear
 
MySnap.MoveFirst
Do Until MySnap.EOF
             'Procesar los datos...
             '
             List1.AddItem MySnap("Cantante") & " " & MySnap("[Canción]") '...y demás datos
 
        MySnap.MoveNext
Loop
MySnap.Close


6.- Evitar el error al asignar un campo Null de una base de datos.
Además de evitar el error, es más rápido que usar If...Then... para comprobar si el campo es nulo o está vacío.
Para cadenas:
Cadena = "" & rs!Campo

Para números:
'Numero = 0 & rs!Campo
Numero = CInt("0" & rs!Campo)


7.- Comprobar si un registro se está editando.
Esto puede ser útil si el programa tiene que acceder a una base de datos en red o bien si accedes en el mismo equipo a una base de datos.
Lo que hay que hacer es usar EditMode y comprobar si se está editando.
Veamos un ejemplo:
With Data1.Recordset
    'Escribe el código para buscar el registro a editar, etc.
    '...
    Do While .EditMode = dbEditInProgress
             DoEvents
    Loop
    'Cuando llegue aquí, es que ya está libre...
    .Edit
    '...hacer los cambios al registro...
    .Update
End With
Los valores que devuelve EditMode, pueden ser:
dbEditNone          Si no se está editando.
dbEditInProgress    Se está editando actualmente.
dbEditAdd           Se ha añadido un registro con AddNew
                    y el registro actual todavía está en el buffer.


8.- Seleccionar los registros que queremos en un Recordset
Para asignar a un Data (Recordset) los datos que quieras de una tabla, usa la propiedad Recordsource.
Data1.RecordSource = "SELECT * FROM Tabla WHERE (condiciones de selección) ORDER BY campo, [campo2]"
Data1.Refresh
El Refresh que no se te olvide, si no quieres que produzca error.
Condiciones de selección, serán las comparaciones (consulta) que quieres incluir para la selección.
Por ejemplo, si quieres incluir todos los clientes de Málaga que tengan coche, clasificados por la población:
Data1.RecordSource = "SELECT * FROM Clientes WHERE Provincia = 'Málaga' AND Coche = 'Si' ORDER BY [Población]"
Fijate que Población está entre corchetes, esto es necesario, porque la ó (o acentuada) es un caracter "extraño" y se debe poner entre corchetes para que el Jet lo entienda. Lo mismo hay que hacer si el nombre del campo incluye espacios.
Otra cosa a tener en cuenta es que si usas =, el contenido del campo "debe coincidir exactamente", si en Provincia tienes algo como: Málaga (Andalucía), no lo "encontrará". Para que lo incluya también, cambia el signo igual por LIKE:
Data1.RecordSource = "SELECT * FROM Clientes WHERE Provincia LIKE '*Málaga*' AND Coche = 'Si' ORDER BY [Población]"
Más cosas, en la parte ORDER BY, se pueden incluir más de un campo, separados por comas.
El asterisco (*) que hay después de SELECT, es para que incluya todos los campos de la tabla.
Si sólo quieres incluir algunos campos, especificalos en lugar del asterisco y separalos con comas:
Data1.RecordSource = "SELECT Nombre,Apellidos, [Población], Provincia, Coche FROM Clientes WHERE Provincia LIKE 'Málaga' AND Coche = 'Si' ORDER BY [Población]"


CONSULTAS EN SQL
El lenguaje de consulta estructurado o SQL (por sus siglas en inglés structured query language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones en estas. Una de sus características es el manejo del álgebra y el cálculo relacional permitiendo efectuar consultas con el fin de recuperar -de una forma sencilla- información de interés de una base de datos, así como también hacer cambios sobre ella.

Consultas SQL
Una consulta SQL es una consulta creada con una instrucción SQL (cadena o instrucción de SQL: expresión que define un comando de SQL, como SELECT, UPDATE o DELETE, e incluye cláusulas como WHERE y ORDER BY. Las instrucciones o cadenas de SQL se utilizan en consultas y en funciones de agregado.). Puede utilizar el Lenguaje de consulta estructurado (SQL o Structured Query Language) para consultar, actualizar y administrar bases de datos relacionales, como Access.
Cuando se crea una consulta en la vista Diseño (vista Diseño: ventana que muestra el diseño de estos objetos de base de datos: tablas, consultas, formularios, informes, macros y páginas de acceso a datos. En la vista Diseño, puede crear objetos de base de datos nuevos y modificar el diseño de otros existentes.) de la consulta, Access construye en segundo plano las instrucciones SQL equivalentes.
De hecho, la mayoría de las propiedades de consulta de la hoja de propiedades de la vista Diseño de la consulta tienen cláusulas y opciones equivalentes a las que están disponibles en la vista SQL (vista SQL: ventana que muestra la instrucción SQL para la consulta activa o que se utiliza para crear una consulta específica de SQL (unión, paso a través o definición de datos). Cuando se crea una consulta en la vista Diseño, Access construye el SQL equivalente en la vista SQL.). Si lo desea, puede ver o editar la instrucción SQL en la vista SQL. Sin embargo, después de hacer cambios en una consulta en la vista SQL, puede que su aspecto no sea el que tenía en la vista Diseño.
Algunas consultas SQL, denominadas consultas específicas de SQL (consulta específica de SQL: consulta que consta de una instrucción SQL. Las subconsultas y consultas de paso a través, unión y definición de datos son consultas específicas de SQL.), no se pueden crear en la cuadrícula de diseño (cuadrícula de diseño: cuadrícula utilizada para diseñar una consulta o un filtro en la vista Diseño de consulta o en la ventana Filtro u orden avanzado. Para las consultas, esta cuadrícula se conocía antes como la cuadrícula QBE.). En el caso de las consultas de paso a través (consulta de paso a través: una consulta específica de SQL que se utiliza para enviar comandos directamente a un servidor de base de datos ODBC.
Las consultas de paso a través permiten trabajar directamente con las tablas del servidor en lugar de hacer que el motor de base de datos Microsoft Jet procese los datos.), consultas de definición de datos (consulta de definición de datos: consulta específica de SQL que contiene instrucciones DDL (lenguaje de definición de datos). Estas instrucciones permiten crear o alterar objetos de la base de datos.) y consultas de unión (consulta de unión: consulta que utiliza el operador UNION para combinar los resultados de dos o más consultas de selección.), debe crear las instrucciones SQL directamente en la vista SQL. En el caso de las subconsultas (subconsulta: instrucción SQL SELECT que está dentro de otra consulta de selección o de acción.), la instrucción SQL se escribe en la fila Campo o en la fila Criterios de la cuadrícula de diseño de la consulta.

Consultas
Creando una consulta
Para buscar y recuperar tan sólo los datos que cumplen las condiciones especificadas, incluyendo datos de varias tablas, cree una consulta. Una consulta puede también actualizar o eliminar varios registros al mismo tiempo, y realizar cálculos predefinidos o personalizados en los datos.
  Esta consulta tiene acceso a tablas distintas para recuperar la información de Id. de pedido, fecha de entrega, nombre de la organización y ciudad para los clientes de Londres cuyos pedidos se entregaron en el mes de abril.











No hay comentarios:

Publicar un comentario