Bienvenido, invitado ( Identificarse | Registrarse )
![]() ![]() |
Apr 2 2009, 06:59 PM
Publicado:
#1
|
|
|
Lobo Alfa ![]() 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 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.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 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 |
|
|
|
![]() ![]() |
| Versión Lo-Fi | Fecha y Hora actual: 31st July 2010 - 11:44 PM |