15: Bajas por SQL Pros y Contras.

Se que el titulo de esta lección suena bastante raro. Que puede tener de malo hacer bajas por SQL? La respuesta es sencilla. Es demasiado eficaz. Si alguno de ustedes por error ha usado el del *.* donde no debía, sabrá a lo que me refiero. O para mas detalles, el “virus” sulfbnf.exe o como se escriba. Las bajas SQL pueden ser uno de los modos mas rapidos de darle en la torre a toda una tabla de datos, y sin posibilidad de recuperación.

Esta es su unica desventaja.

Ventajas, pues son bastantes. Rapidez, funciona en SQL server ( el metodo DAO muchas veces no jala en SQL 6.5 ). No hay que aprender ninguna sintaxis en especial, pero al mismo tiempo debe ponerse especial cuidado en lo que se hace.

En Dao Tradicional ( o en ADO no orientado a SQL ) hay un metodo llamado Delete, que pueden buscar en la ayuda de VB, y que tiene como principal problema una serie de ajustes necesarios si se da baja del ultimo registro.

Todos hemos visto en algun programa un aviso que diga “pulse ESC para cancelar”. Si querermos hacer eso en bajas de una base de datos, tenemos que usar la sintaxis DAO, porque la SQL es DEMASIADO Rapida, y antes de liberarse debe hacerse una prueba de lo que realmente estamos borrando. Incluso en casos ideales, deberíamos mostrar al usuario lo que realmente está borrando, si el resultado es mayor a 5 renglones.

En SQL las bajas se hacen como un parámetro del metodo Execute, el mismo que nos hace dar altas. Ustedes recordarán que decíamos que hay dos procesos SQL, filtrar o realizar acciones. Vimos por ejemplo que para filtrar, usabamos una sintaxis de este tipo:

SELECT * from ALUMNOS where EDAD>18

Supongamos que queremos borrar esos alumnos. La orden DAO/ado NO sql sería mas o menos así:

[font=Courier New]dim rs as dao.recordset
set rs= db.opendatabase(“SELECT * from ALUMNOS where EDAD>18”)
with rs
[color=#000000]……do until .eof
[color=#000000]……… .delete
[color=#000000]……… .movenext
[color=#000000]……… doevents
[color=#000000]……. loop
[color=#000000]…… .close
end with
set rs=nothing [/font]

Pero la orden en SQL es muchisimo mas simple:

[font=Courier New]db.execute(“DELETE * from ALUMNOS where EDAD>18”)[/font]

Obviamente este proceso es mucho mas rapido. Sin embargo, por cuestiones de diseño sale un detalle que en SQL es completamente obligatorio, al que se le llama “Llave Primaria”, Por ejemplo, no puden haber dos clientes con la misma clave, estamos de acuerdo? Esto es para evitar que en una baja SQL, demos de baja algo que no queremos dar de baja. Este problema de borrar tablas por error, se aplica sobre todo a la mala costumbre de algunos programadores de usar frases como “select * from alumnos” Que claro se escribe muy rapido y es valida si no nos preocupan los efectos de memoria, pero se imaginan lo que hace un “delete * from ALUMNOS” ?? Si. Exactamente lo que pensaron.

Esta es otra de las razones para usar nombres de campos sencillos, si sabemos por ejemplo que ALUM_CVE es la clave, es mas facil acordarnos que con un ALUMNOS_VIGENTES_ID.

Algo que me ha funcionado muy bien, es crear una rutina especial para dar bajas de datos. Al igual que la que vimos hace unas semanas, aparentemente no funciona por el metodo execute no reconocido. Como les dije en su momento, ese metodo se refiere a la basededatos as database de DAO, o a la conexión de un ADODB.COnnection en ADO.

[font=Courier New]Public Function Elimina_Reg(ByVal Nombre_Tabla As String, & _
[color=#000000]…….. ByVal Campo_Llave As String, ByVal Valor_Llave As String) As Boolean

‘Nombre[color=#000000]……..Elimina_Reg
‘Objetivo[color=#000000]……Eliminar TODOS los registros que tengan una
‘[color=#000000]…………..condición dada ( valor de campo llave )
‘Regresa[color=#000000]…….Verdadero o false segun el resultado
‘Parámetros[color=#000000]….Nombre_Tabla Nombre de la tabla de datos
[color=#000000]……………Campo_Llave Cadena con nombre del campo llave
[color=#000000]……………Valor_Llave Cadena con el valor que debe tener la llave
[/font]

‘Ejemplo:

[font=Courier New]’Eliminará todos los clientes de la colonia Polanco
‘borrado= Elimina_Reg(“CLIENTES”, “COLON”, “POLANCO”, true)

‘ Por razones Obvias debe usarse con cuidado

[color=#000000]……….. Dim strSQL As String
[color=#000000]……….. Dim strMensaje As String
[color=#000000]……….. Dim blnConfirma As Boolean
[color=#000000]……….. If IsNumeric(Valor_Llave) Then
[color=#000000]…………. strSQL = “DELETE FROM ” & Nombre_Tabla & ” WHERE ” & _
[color=#000000]…………….. Campo_Llave & ” = ” & Valor_Llave
[color=#000000]……….. Else
[color=#000000]…………. strSQL = “DELETE FROM ” & Nombre_Tabla & ” WHERE ” & _
[color=#000000]…………….. Campo_Llave & ” = ‘” & Valor_Llave & “‘”
[color=#000000]………. End If
[color=#000000]……….. blnConfirma = Execute(strSQL)
[color=#000000]……….. If blnConfirma = True Then
[color=#000000]…………. strMensaje = “El registro con clave: ” & _
[color=#000000]…………….. Valor_Llave & ” ha sido eliminado”
[color=#000000]………….. Call MsgBox(strMensaje, vbExclamation, “Borrar Registros”)
[color=#000000]……….. Else
[color=#000000]………….. Call MsgBox(“*** Registro No eliminado ***”, vbCritical, “Borrar Registros”)
[color=#000000]……….. End If
[color=#000000]………. Elimina_Reg = blnConfirma
End Function[/font]

Una función de este tipo es mucho mas práctica que tener DELETE por todos lados. Si ustedes necesitan borrar si se cumplen dos o tres campos llave, pues… les recomiendo modificar esta funcion pára manejar varios parámetros, o usar la sintaxis DAO/ADO no SQL.

En la proxima lección, veremos un poco de los cambios en SQL, que si bien son mas rapidos, suelen ser mas complicados, aparentemente.

————————————————–
Alfonso Orozco – Mayo 2001
ICQ 41907900

Comments are Closed