IPB

Bienvenido, invitado ( Identificarse | Registrarse )

 
Reply to this topicStart new topic
> Acceso a Datos 06: Acceso a campos y ABC DAO Simple, Material del 2000
Admin
mensaje Apr 2 2009, 06:59 PM
Publicado: #1


Lobo Alfa
Ícono de Grupo

Grupo: Admin
Mensajes: 14606
Registrado: 17-November 05
Desde: Mexico
Miembro nº: 1




Antes que empiecen a pensar otra cosa, les recuerdo que vamos por PASOS, mas adelante veremos ADO y bases relacionales, pero creo que aquí viene información interesante para todos.

Para los que no recuerden las diferencias básicas, habíamos dicho antes que DAO era bueno para labores en un solo lugar, su principal ventaja es ser fácil de entender, pero si hay una maquina fuera, por ejemplo, en otra ciudad, es un poco lento de ejecución.

Si bien originalmente DAO era rápido, le faltaba cierta conectividad. En su versión original, nosotros usábamos una propiedad llamada Fields para referirnos al contenido de los datos. En unos dias veremos como funcionaba esa conectividad.

Pongamos como ejemplo la tabla CUENTA.

Habíamos dicho que CUENTA tenia los siguientes campos:

CTA_NUM
CTA_NOMBRE
CTA_TIPO
CTA_DESCRIP
Como pueden ver, todos empiezan con CTA, lo que nos indica fácilmente que todos son propiedades de un mismo conjunto.

Si bien nosotros podemos Abrir la tabla de diversos modos según si usamos DAO, ADO o lo que sea, siempre hay tres formas de referirnos a CTA_NUM, para leer o escribir los datos:

Lectura Tradicional

La primera forma y mas utilizada es :

Para leer
Valor= Cuenta!CTA_NUM

Para Escribir:
Cuenta!CTA_NUM = Valor

Cual es su problema?

En una sola llamada ( un solo campo ) no tiene gran problema, pero si estamos leyendo Dos o mas campos, si.

Ejemplo:
Valor= Cuenta!CTA_NUM
Valor2= Cuenta!CTA_NOMBRE
Pues muy simple, se carga dos VECES Cuenta!, esto significa que dos o mas veces se carga la tabla o su estructura, cuando una sola puede manejarse con otro de los dos métodos.

Otro problema es la dificultad del uso de arreglos.

Lectura ORDINAL (depende del orden)

Para leer
Valor= Cuenta.Fields(0) ' nos regresa CTA_NUM,por ser el primer campo

Para Escribir:
Cuenta.fields(0) = Valor
Problema:

Pues que resulta muy difícil de mantener. A lo mejor en ocho días no nos acordamos que el campo CUENTA.Fields(3) era igual a cuenta!Descrip

No tiene el problema de cargar dos veces, porque puede usarse un bucle with de este modo:

CODE
with cuenta
  Valor= .Fields(0)
  Valor2= .Fields(1)
end with


La forma anterior es un poquito mas tardada de escribir que la que sigue, pero ocupa mucho menos memoria y tiene mayor velocidad.

CODE
Valor= cuenta.Fields(0)
Valor2= cuenta.Fields(1)


Pero en muchos aspectos es el peor método, por legibilidad y facilitar la posibilidad de cometer errores si se añade un campo a la tabla mas adelante.

Lectura NOMINATIVA (declarativa)

Para leer
Valor= Cuenta.Fields("CTA_NUM") ' nos regresa cta_num,por ser el primer campo

Para Escribir:
Cuenta.Fields("CTA_NUM") = Valor
Desventaja:

Hay que escribir el nombre completo, pero da mayor legibilidad, y usándolo en un bucle with no está nada mal.

QUOTE
with cuenta
Valor= .Fields("CTA_NUM")
Valor2= .Fields("CTA_NOMBRE")
end with


La lectura Declarativa será lo que usaremos aquí siempre para leer los datos, no importando el acceso o motor que usemos. principalmente porque nos facilita modificar código, y que no dependamos del orden de la base de datos. No solamente tuiene ventajas de rendimiento, sino de legibilidad y estabilidad.

QUOTE
Nota del 2009: PHP maneja tresformas de lectura similares, y el usar Fetch_object es el equivalente. Modificar un sistema hecho con métodos ordinales es de locos, además de ser vulnerable y dificil de mantener


Ahora bien, DAO poco a poco se fue ampliando, y con esa ampliación hubo personas que quisieron tener acceso a datos estilo UNIX, con el lenguaje de consultas conocido como SQL.

SQL Son las iniciales de Structured Query Language, o "Lenguaje estructurado de Consultas".

Vamos a ver como se hacen las consultas SIN USAR SQL, con DAO PURO, y mas adelante veremos SQL en la conectividad.

Lo primero es abrir la base de datos.

Es muy simple, primero tenemos que dar de alta la referencia del lenguaje a DAO. en project references, después vamos a poner en nuestro código lo siguiente:

Dim db as DAO.database
Dim rs as DAO.Recordset
Esas dos líneas me van a decir que voy a usar una base de datos, tipo DAO, y un Recordset también tipo DAO. Debemos considerar que el DAO es importante, porque un código escrito

Dim db as database
dim rs as Recordset
no indica que se refiere a DAO, y nos impide actuar de manera rápida al detectar errores tiempo después. Si ustedes programan cotidianamente varios proyectos, es muy fácil que se les olvide que usaron en uno determinado.

Volviendo al tema:

Dim db as DAO.database
Dim rs as DAO.Recordset
Set db= OpenDatabase("Contabil.mdb") ' esto abre la base de datos en Access
Con esto se crea la "conexión", solamente debe existir la base de datos contabil.mdb en la ruta. Claro que podemos definirle ruta.

Ahora bien, DAO no es único para Access, con DAO es posible abrir también tablas DBF o SQL server, por ejemplo. La forma de abrir una conexión en DBF sería muy parecida.

Set db= OpenDatabase("c:\contab\",false,false,"dbase III;") ' esto abre la base de datos en Dbase.

SIEMPRE que abran una tabla DBF, abranla con la cadena del directorio en primer lugar, y por ultimo la constante "dbase III;", cualquier otro tipo de conexión, dbaseIV; o foxpro, causa problemas de corrupción tarde o temprano.

Abrir Conexión DAO NORMAL:

QUOTE
Dim db as DAO.database
Dim rs as DAO.Recordset
Set db= OpenDatabase("Contabil.mdb") ' esto abre la base de datos en Access

Ahora que ya tenemos abierta nuestra base de datos, podemos hacer cualquier cosa de ABC, es decir, altas Bajas o cambios, pero antes debemos abrir el Recordset, es decir, la tabla donde queremos los resultados ( en este caso, cuenta )

Set RS= db.openrecordset("Select * from CUENTA")

Fijense que uso mayúsculas en el nombre de la tabla, y en este caso uso * , que significa "Todos los campos de la tabla".

para dar un alta, en DAO se debe dar primero la instrucción addnew, del Recordset.

CODE
Dim db as DAO.database
Dim rs as DAO.Recordset
Set db= OpenDatabase("Contabil.mdb") ' esto abre la base de datos en Access
Set RS= db.openrecordset("Select * from CUENTA") ' abre la tabla cuenta
rs.addnew ' indica, da alta de registro en este lugar.
rs.Fields("CTA_NUM")=101
rs.Fields("CTA_NOMBRE")="CAJA"
rs.Fields("CTA_TIPO")="AC"
rs.Fields("CTA_DESCRIP")="Efectivo disponible en caja"
rs.update ' Graba la información realmente
rs.close ' cierra el Recordset
Set rs=nothing ' libera la memoria

Este código es valido, pero podría ser mucho mas eficiente con el end with, es decir :

CODE
Set RS= db.openrecordset("Select * from CUENTA") ' abre la tabla cuenta
with rs
.addnew ' indica, da alta de registro en este lugar.
.Fields("CTA_NUM")=101
.Fields("CTA_NOMBRE")="CAJA"
.Fields("CTA_TIPO")="AC"
.Fields("CTA_DESCRIP")="Efectivo disponible en caja"
.update ' Graba la información realmente
.close ' cierra el Recordset
end with
Set rs=nothing ' libera la memoria
En principio esto nos permite funcionar SIETE veces mas rápido, y el resultado es dar de alta un registro De cuenta 101, llamado caja.

Ahora bien, si queremos borrar un registro, el método es muy parecido, pero primero debemos localizar donde está, con las ordenes find.

CODE
Set db= OpenDatabase("Contabil.mdb") ' esto abre la base de datos en Access
Set RS= db.openrecordset("Select * from CUENTA") ' abre la tabla cuenta
rs.find "CTA_NUM='101'"
' Las comillas son necesarias en muchos casos, si no     'indispensables.,
' el 39 indica el carácter comilla simple.
' Si lo ponemos    directo no jala, porque Visual
' Supone que es un comentario.

Esto buscaría la Cuenta numero 101, pero primero debemos ver que esta existe ( no podemos borrar lo que no existe ).

CODE
Dim db as DAO.database
Dim rs as DAO.Recordset
Set db= OpenDatabase("Contabil.mdb") ' esto abre la base de datos en Access
Set RS= db.openrecordset("Select * from CUENTA") ' abre la tabla cuenta
with rs
rs.find "CTA_NUM='101'"
if nomatch then '
  'no existe la cuenta
  msgbox "La cuenta 101 No existe"
else
' si existe ,  la podemos borrar
  .delete
end if
.close
end with
Set rs=nothing ' no lo podemos poner dentro del with.

El código anterior no funciona si no es en dao. El proceso no Dao standard es en SQL sobre una base de datos abierta:

db.execute "delete from CUENTA where CTA_NUM='101'"

en algunos manejadores de datos debe decirse:

db.execute "delete from CUENTA where CTA_NUM='101'"
La gran ventaja es que se borra en una sola linea, y no borra lo que no cumple la condición, y 16 líneas de código se puede volver una.

Ahora bien, para hacer un cambio, el proceso es similar al alta, supongamos que necesitamos de repente cambiar "CAJA" Por "Caja CHICA", el proceso es el siguiente:

CODE
Dim db as DAO.database
Dim rs as DAO.Recordset
Set db= OpenDatabase("Contabil.mdb") ' esto abre la base de datos en Access
Set RS= db.openrecordset("Select * from CUENTA") ' abre la tabla cuenta
with rs
rs.find "CTA_NUM='101'"
if nomatch then '
  'no existe la cuenta
  msgbox "La cuenta 101 No existe"
else
' si existe ,  la podemos cambiar
  .EDIT  ' es el equivalente de editar, así como addnew es de añadir.
  .Fields("CTA_NOMBRE")="Caja CHICA"
.update
end if
.close
end with
Set rs=nothing ' no lo podemos poner dentro del with.


En no dao, sería:
db.execute "update CUENTA set CTA_NOMBRE='Caja CHICA' where CTA_NUM='101'"

Como datos importantes son: Primero, debemos encontrar el registro que queremos cambiar, y segundo, debemos evitar cambiar la clave principal, es decir, aunque podemos cambiarle a Caja el numero 101 x 102, debemos evitarlo, el porqué entra en la categoría de bases de datos relacionales.

Anteriormente dije de DAO:

"Muy sencillo, fácil de usar y práctico; para proyectos chicos a medianos. Espera que usemos acceso local, y usar acceso remoto es muy complicado. Multiusuario, y soporta Bases ISAM"

Ahora les diré que otro punto fuerte que tiene es que su sistema de Búsqueda es muy robusto. Hay opciones para buscar siguiente registro, anterior, primero y ultimo, pero realmente se utiliza muchas veces para facilitar la migración de Clipper a Visual Basic 3, y porque ADO no esta disponible facilmente antes de VB6

En el siguiente correo, veremos un proyecto de ABC de Catálogos de cuentas, es decir, manejaremos Altas, Bajas y cambios de la tabla cuentas.Subiré el archivo, con comentarios.

Saludos.....


--------------------
__________________________
Por la ley y para siempre
For the Rule and forever
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 usuario(s) está(n) leyendo esta discusión (1 invitado(s) y 0 usuario(s) anónimo(s))
0 miembro(s):

 



Versión Lo-Fi Fecha y Hora actual: 31st July 2010 - 11:44 PM