Un lugar por donde empezar...

Ejecutando la consulta contra la BD

Una vez establecida la conexión a la BD como lo explicamos en este post, lo que sigue es armar nuestro query SQL que puede ser una consulta o una ejecución para alterar la bd ya sea insertando registros, modificando o eliminando, como también manipular las tablas.
El query SQL puede estar escrito en el mismo aplicativo VB6, puede estar en alguna DLL la cual la recuperaremos como un string o puede estar en un archivo externo (obviemos de momento los SP y triggers). En este caso asumiremos que el query SQL está en el mismo aplicativo.
El query debe construirse y almacenarse en una variable de tipo String y con ella se abrirá un recordset para que dicho recordset recupere los registros solicitados por dicha consulta y que luego volcaremos en un control de presentación.
Vamos a ver el tema en dos partes: Consultando y Manipulando.
1.- Consultando
Entonces, si necesitamos consultar a la base de datos ¿Quienes son los clientes registrados? nuestra consulta SQL seria esta:

SELECT * FROM Clientes

Alli indicamos que queremos TODOS (*) los registros de la tabla Clientes. Pero el codigo puesto asi el VB6 no lo va a entender y nos emitira un error. Para ello esta consulta debemos ponerla en una variable con el nombre que prefieran de tal forma que quede asi:

Dim SQL As String
SQL = "Select * From Clientes"

En este momento la variable SQL tiene una cadena que basicamente VB6 no entiende, es mas, no le interesa entender, para el es solo un string, un conjunto de caracteres. Recien cobra sentido cuando lo asignamos al recordset (parte del ADO). De esta forma:

Dim rs  As New ADODB.Recordset
Dim SQL As String
SQL = "Select * From Clientes"
rs.Open SQL, dB, 1, 1

En la primera linea declaramos una variable llamada rs (la pueden llamar como quieran) del tipo ADODB.Recordset (no confundir con el control ADODC).
En la cuarta linea abrimos el recordset pasándolo la variable SQL que contiene una consulta SQL, le pasamos también el parámetro de conexión a la BD (llamada dB) establecida en el módulo que ya explicamos en el post anterior y finalmente con el 1, 1 le indicamos el tipo de cursor y el tipo de bloqueo el cual explicare en otro post.
Con esto tenemos lo siguiente: Si la tabla Clientes tiene 1000 registros y ejecutamos la consulta la variable rs va a contener esos 1000 registros, recuerden que no hicimos ninguna restricción, no escogimos campos ni filtramos por ello estarán los 1000 en la variable rs.
Con esta variable rs llena mientras este en memoria podemos recorrerla o volcarla totalmente en un control de presentación.
Y ¿Como hacemos si queremos que de esos 1000 clientes traer solo aquellos que viven en un departamento o estado especifico?. En ese caso debemos crear un filtro. Vamos a suponer que en la tabla Clientes existe un campo llamado Departamento, usualmente no se hace así ya que para esto se usa un esquema de ubigeo relacionando tablas pero para fines explicativos vamos a asumir que existe ese campo y que es un string (o varchar), o sea, en ese campo habrá: “LIMA”, “CUZCO”, “AREQUIPA”, etc. Entonces lo que deseamos es que el usuario escriba en un Textbox por ejemplo el departamento por el cual quiere hacer la consulta, el SQL quedaria asi:

Dim rs  As New ADODB.Recordset
Dim SQL As String
SQL = "Select * From Clientes Where Departamento = '" & Text1.Text & "'"
rs.Open SQL, dB, 1, 1

Nótese que solo hemos manipulado la variable SQL, aquí empiezan las concatenaciones y el armado engorroso de las consultas SQL sobre VB6, en lo personal tengo las consultas SQL en módulos un poco para separar la sintaxis SQL de la sintaxis VB6 y tenerlo mas ordenado (tipo capas) de tal forma que la consulta del ejemplo anterior me queda asi:

Public Function sqlClientes(Departamento As String)
sqlClientes= "Select * From Clientes"
If Len(Departamento) > 0 Then
   sqlClientes= sqlClientes & " Where Departamento = '" & Departamento  & "'"
End If
End Function
Dim rs  As New ADODB.Recordset
rs.Open sqlClientes(Text1.Text), dB, 1, 1

El primer código es una función pública que puedo reutilizar en todo el proyecto y me exige un parámetro que es el de Departamento. Si ese parámetro es una cadena vacía no se ejecutará el Where y me traerá todos los registros de la tabla Clientes, pero si esa variable tiene alguna cadena ejecutará el Where.
Luego en el segundo código a parte de que lo reducimos es mas “leible” (al menos para mi) y en el invocamos la función sqlClientes pasando en el parámetro lo que tengamos en el Text1. Si el usuario no escribe nada y ejecuta la consulta traerá todos los registros, si escribe algo ejecutara el Where. ¿Complicado? no lo creo.
Recuerde que las variables del tipo String deben usar los apostrofes (los simples) ‘ y las variables de tipo numérico sin apostrofe alguno.

2.- Manipulando
Me refiero con esto a alterar la base de datos. En este caso recomiendo no usar Open sino Execute. Entiendo que Execute es mas rapido porque no espera registros de retorno como si lo hace el Open. Por ello que para los Insert, Update y Delete uso Execute y para los Select uso el Open.
Supongamos que quiero insertar un nuevo registro a la tabla clientes. El código entonces seria mas o menos de esta manera (digo mas o menos porque es una tabla inventada):

Dim SQL As String
SQL = "INSERT INTO Clientes (NOMBRE, DEPARTAMENTO) " & _
"VALUES ('" & txtNombre.Text & "', '" & txtDepartamento & "')"

dB.BeginTrans
dB.Execute SQL, adCmdText
dB.CommitTrans

Bien, primero armamos la consulta en donde insertaremos el Nombre y el Departamento y estos datos provienen de controles textboxes. Nótese que no pongo el Id porque se presume que ya se tiene un trigger para ello (o si están en Access un campo Id declarado como autonumerico). También utilizo db.BeginTrans y db.CommitTrans porque es bueno que siempre usen transacciones para alterar la BD de esa forma protegemos la integridad de los datos, si se tiene una transacción que implica la alteración de varias tablas esto nos protegerá de que se graben en todas.. o no se grabe en ninguna si por alguna razon se interrumpió la alteración.

Escrito el código anterior a la manera YAcosta quedaría así:

Código en el módulo

Public Function sqlGrabCliente(Nombre As String, Departamento As String)
sqlGrabCliente= _
"INSERT INTO Clientes (NOMBRE, DEPARTAMENTO) " & _
"VALUES ('" & Nombre & "', '" & Departamento & "')"
End Function

Código en algún botón para grabar:

dB.BeginTrans
dB.Execute sqlGrabCliente(txtNombre.text, txtDepartamento.text), adCmdText
dB.CommitTrans

Para el tema de grabacion el asunto ya termino aqui, pero para la lectura de registros la parte de interactuar con la BD ya termino puesto que ya tenemos los registros en memoria (rs), ya los tiene el aplicativo, ahora toca mostrarlos en controles de presentación, dicho en provinciano, para que el usuario puedar verlo con sus ojos.

Continua en este post.

No se han encontrado comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Protected by WP Anti Spam

Gracias por su visita.