14 marzo 2007

El ADO Contraataca: inicializando mis objetos y metiéndoselas a la tabla

Ahora que ya comenzamos a hacer un sistema que usa VB 6.0 y ADO para hacer un programita simple, vamos a dar el siguiente paso. En mi mensaje anterior, hablé (bueno, escribí) acerca de la manera de agregar la referencia a los objetos ADO (ActiveX Data Objects), declarar objetos globales de tipo ADODB.Connection, ADODB.Command y ADODB.Recordset, y uno que otro detallito más (si no lo leíste, lo puedes leer aquí).

Hasta allí empezaba la cosa bien, pero nos quedamos a medias (bueno, tampoco es mi intención abarcar todo lo faltante en este mensajito). Ahora voy a hacer dos cosas: voy a inicializar mis objetos ADO desde la subrutina Form_Load() de la primera ventana que abre mi aplicación y voy a programar un botón que da de alta un registro en una tabla. Si quieres el código completo de lo que va hasta ahorita (archivos de formas, de proyecto, íconos y una que otra chuchería más), lo puedes bajar aquí.

Primero, lo primero. El primer form (que yo bauticé como frmPrincipal en lugar de aburrido Form1 que le pone VB por default) tiene una serie de botones que abrirán otras ventanas que llevarán a cabo todo lo que quiere hacer doña Amalia en su taquería. Esta ventana, en mi ambiente de diseño de VB 6.0, se ve así:


Intenté hacerlo lo más sencillo pensando en que los que lo usarán son trabajadores de una taquería, con botones grandes que sean fáciles y rápidos de apretar que tienen iconos. Además tienen ToolTipText, una propiedad de casi todos los controles, para que aparezcan mensajitos explicativos de cada uno y son accesibles presionando la tecla ALT más el de la letra subrayada que tiene cada botón, la cual la asigné anteponiendo el ampersand (&) antes de la letra subrayada.

Dejando esto a un lado, vámonos al código. Como esta es la primera ventana que se carga a la memoria, en cuanto se cargue quiero que inicialice mis objetos ADO. Para esto, escribí este código en la subrutina Form_Load de esta ventana. El código es este:


Con el Set creo un nuevo objeto (lo estoy usando tanto para el Connection, el Command y el Recordset). El ConnectionString es una propiedad que tiene el objeto ADODB.Connection para definir la base de datos a la que se va a conectar y quién es el proveedor del servicio. En nuestro caso, estamos usando una base de datos hecha en Access que se llama Tacos.mdb. Al rato subo un mensaje donde explico mejor como se usa, pero si vas a usar una base de datos de Access, copia el código tal cual. Si te fijas, uso la propiedad App.Path para determinar desde qué carpeta está ejecutándose el programa. El archivo Tacos.mdb lo voy a guardar en el mismo lugar del ejecutable y de esta manera, no importa donde se instale mi programa, va a poder encontrar mi base de datos.

Una vez usado el ConnectionString para decirle con quién conectarse (Data Source) y quién los va a conectar (Provider), abro la conexión (Open). Con esto termino de inicializar mi conexión y puedo usarlo al crear mi objeto Recordset. Después de crearlo (con el New), le digo que la conexión que va a usar es la que acabo de inicializar, en nuestro caso, se llama conConnection (con el ActiveConnection).

Al final estoy creando un objeto Recordset (con el New) y le estoy diciendo que todo el trabajo "pesado" (filtrar datos, unir registros, ordenar, etc.) lo haga en el servidor de la base de datos (CursorLocation=adUseServer). La otra opción, que no recomiendo, es decirle que todo el trabajo lo hace la máquina donde está trabajando el usuario (CursorLocation=adUseClient). No lo recomiendo porque, en casi todas las ocasiones, el servidor de la base de datos es una maquinotototota choncha que tiene mayor capacidad de procesamiento que la PC de un mero mortal.

En fin, con eso termino la inicializadera. Ahora voy a proseguir a insertar un registro desde mi aplicación VB 6.0 por medio del objeto ADODB.Command. Esto lo voy a hacer en la ventana de Proveedores (frmProveedor) que se ve así en la vista de diseño:

Bueno, todavía no decido en un icono chuvidubis para el botón Agregar, pero luego que halle uno, se los paso. Pero eso es lo de menos, ahora nos interesa lo que se puede hacer con ese botón. Por esto, el código relacionado a este botón, que se ejecuta cada vez que un usuario de click sobre él, es este:


¿Se ve medio confuso? ¡No te apures que no lo es tanto! Sólo que vayámonos poco a poco. Para empezar, si no escribe nada en la caja de texto donde va el nombre (que yo nombré txtNombre), le marca error y sitúa el cursor en esa caja para que el usuario le teclee el nombre bien. Había puesto una condición que simplemente viera si no habían escrito nada (o sea, If txtNombre="" Then), pero un alumno, el buen Trank, me sugirió que validara también si da un espacio, cosa que sería válido si hubiera usado el If original. Luego entonces, de manera rauda y veloz, usé la función Trim para eliminar todos los espacios en blanco antes y después de una cadena. Si solo dió puros espacios, de todos modos marca error de nombre inválido.

Si este no es el caso, supongo quetodos los otros campos son opcionales. Ahora sí va lo único que aparenta ser difícil, pero que una vez que le agarres la onda, vas a ver que es sencillo. Todos los comandos SQL que le vamos a enviar a nuestra base de datos por medio de la conexión es usando la propiedad CommandText del objeto ADODB.Command. A esta propiedad se le asigna una cadena que contenga una instrucción SQL válida. Una vez aclarado esto, pasemos a ver que instrucción SQL necesito usar.

La instrucción para insertar un registro en una tabla en SQL es INSERT INTO, cuya sintáxis es así:

INSERT INTO tabla (lista de campos) VALUES (lista de valores)

Por ejemplo, en mi tabla, supongamos que quiero dar de alta a un proveedor. Entonces podría escribir la siguiente instrucción SQL:

INSERT INTO Proveedor (Nombre, Tel, Fax, Email, Web) VALUES ("Textiles Alfonso", "3635-3990", "8111-1112", "http://www.telasponcho.com")

Esto es tal cual lo que hago en mi código, con una pequeña diferencia. En mi programa, tanto como "Textiles Alfonso", "3635-3990", "8111-1112" y "http://www.telasponcho.com" están guardados en txtNombre, txtTel, txtFax, txtEmail y txtWeb, respectivamente. No puedo escribir esta instrucción:

INSERT INTO Proveedor (Nombre, Tel, Fax, Email, Web) VALUES ("txtNombre, "txtTel", "txtFax", "txtEmail", "txtWeb")

porque no tengo un cliente que se llame txtNombre ni su teléfono es txtTel. Lo que quiero es lo que está almacenado en txtNombre, txtTel, etc.

No hay que perder de vista que la propiedad CommandText es de tipo cadena, por lo que voy a armar una cadena de texto que tenga la instrucción tal y como quedar. Un operador básico para armar cadenas es el ampersand (&) el cual une (dicho elegantemente "concatena") dos cadenas para formar una sola. Y si después del ampersand dejo un espacio y escribo un guión bajo (_) quiere decir que puedo seguir concatenando la cadena que viene en el siguiente renglón. Por ejemplo, "Tony " & " Valderrama" sería igual a "Tony Valderrama". Usando esto, puedo armar mi cadena de la siguiente forma: cmdCommand.CommandText = "INSERT INTO Proveedor" & _ " (Nombre, Tel, Fax," & _ " Email, Web) VALUES ('" & _ txtNombre

almacenaría la cadena

INSERT INTO Proveedor, Tel, Fax, Email, Web) VALUES ('Textiles Alfonso

Fíjate que alrededor de valores que son texto le estoy poniendo apóstrofes (') para delimitar cadenas DE LA INSTRUCCIÓN SQL. Usa las comillas (") para delimitar cadenas de VISUAL BASIC.

Siguiendo con nuestro ejemplo anterior, todavía no está cerca de estar terminada. Siguiendo con el merequetengue de ir explicando paso a paso esa instrucción, le agregaría al final un & "','" de la siguiente manera:

cmdCommand.CommandText = "INSERT INTO Proveedor " & _ "(Nombre, Tel, Fax," & _ " Email, Web) VALUES ('" & _ txtNombre & "','"

Esto me almacenaría en la cadena esto:

INSERT INTO Proveedor, Tel, Fax, Email, Web) VALUES ('Textiles Alfonso','

¿Ves? Cierro el texto Textiles Alfonso con apóstrofes para indicar que es un tipo de dato cadena o texto y no se haga bolas. Recuerda que los números no llevan.

Siguiendo esta lógica, podrás imaginar que esta instrucción completa

cmdCommand.CommandText = "INSERT INTO Proveedor " & _ "(Nombre, Tel, Fax," & " Email, Web) VALUES ('" & _ txtNombre & "','" & txtTel & "','" & _ txtFax & "','" & txtEmail & "','" & txtWeb & "')"

Nos devolvería esta cadena:

INSERT INTO Proveedor (Nombre, Tel, Fax, Email, Web) VALUES ('Textiles Alfonso', '3635-3990', '8111-1112', 'http://www.telasponcho.com')

¡Listo! Allí está una instrucción SQL correcta almacenada en la propiedad de mi objeto Command. Ahora le tengo que decir que ejecute esa acción mediante el método Execute (cmdCommand.Execute) y todo está listo.

Todavía falta mucho por hacer y aprender, pero por lo menos están los primeros pasos. ¡Nos vemos en la próxima!
Publicar un comentario
Related Posts Plugin for WordPress, Blogger...