[VB] Variable de tipo object o la variable del bloque with no esta establecida
-
-
* El Hombre de la Estrella * -
25/01/2005#1 [VB] Variable de tipo object o la variable del bloque with no esta establecidaMe sucede lo siguiente dentro del proyecto que estoy desarrollando para la facultad.
Realize un modulo que por una funciones administro la conexión a la base de datos, el alta, baja, modificación y consultas mediante las sentencias SQL:
Aca dejo el modulo:El tema con el codigo no tengo ningún tipo de drama salvo cuando lo llamo de la siguiente función, en el resto del programa lo uso el modulo sin ningun tipo de dramasEscrito por Codigo AccessDB
Cuando hace el SET Consulta y llama la consulta me tira lo siguiente:Escrito por Load Form
"Error '91' en tiempo de ejecucion:
variable de tipo object o la variable del bloque with no esta establecida"
La verdad que me encuentro queno entiendo :s
Caulquier ayuda es mas que bienvenida!
saludos
Nos estamso viendo
El Rengo -
-
esos errores son porq el objeto no esta inicializado...
fijate solo para probar esta linea.
Public Function ConsultaSQL(ByVal StrSQL1 As String, Optional StrSQL2 As String, Optional StrSQL3 As String) As Recordset
cambiala por esta
Public Function ConsultaSQL(ByVal StrSQL1 As String, Optional StrSQL2 As String, Optional StrSQL3 As String) As ADODB.Recordset
no creo q haga nada, pero despues decime q onda....
salute!!! -
Voy hacer el intento y te comento, pero me parece que el error no viene de ese lado, ya que esa funcion la llamo desde otros lugares del programa y anda perfecto, tengo la ligera sospecha que viene asociado de por que uso los 3 StrSQL en lugar del primero. Osea es el unico string de SQL que tuve que uso los 3 por que la sentencia SQL es demasiado larga.
Pero vamos a hacer el intento
EDIT
Bueno hice el cambio y sigue tirando el mismo error. Creo que tira para el lado que digo. -
-
RPG Adict -
26/01/2005#4 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecidaNo es por nada .. pero limpia un poco el codigo.. es un poco , como puedo decir chancho..
yo ed VB no se mucho, pero de programacion y objetos , tengo un poquito de idea..
siguiendo el programa vez mas o menos lo siguientelo que creo que pasa... si miras la explicacion pro ahi la entendes.. estas usando un objeto escondido de ADo como es el recorset para ejecutar una consulta , usando una coneccion que esta en un avariable global , por lo tanto no poeds saber si esta creada o no.. para colmo cacheas los errores y esas casi convencido que es un error de SQL .Código:Dim Consulta As ADODB.Recordset Set Consulta = New ADODB.Recordset ---> Aca lo creas al pedo, se sobre escribe despues , fijate que acas lo inicializas la variable, despues la funcion ConsultaSQL.Open crea una adentro y sobreescribe la tuya :P, y la lona la memoria que habias inicializado aca. StrSQL1 = bla bla bla StrSQL2 = bla bla bla StrSQL3 = bla bla bla // Ahora cambiemos esto por lo que hace la funcion // Set Consulta = AccessDB.ConsultaSQL(StrSQL1, StrSQL2, StrSQL3) Set ConsultaSQL = New Recordset ConsultaSQL.Open AccessConexion, adOpenDynamic, adLockOptimistic Aca ,No se como es VB , pero te conviene en realidad usar el modelo puro ed objetos de ADO o sea Dim qry Adoquery = new ADOquery qry.Connection=AccessConexion ( por cirto acceso conecction como variable global es una chanchada , tenes que acrodarte de inicializarla y esas cosas .. asi no se hace ) qry.sql = StrSQL1 & StrSQL2 & StrSQL ConsultaSQL = qry.Open Porque? es simple Recordset es un objeto para guardar datos no para ejecutar un sql If Not Consulta.BOF And Consulta.EOF Then Consulta.MoveFirst
a) Inicializa en algun lado la coneccion, trata de mantenerla y pasarla como parametros asi no te olvidas
c) No uses ADODB.Recorset, usa un adoqury o ADODb.Command que cuando lo abris devuelven el resultado en un ADODb.Recorset
b) La variable ErroDb que declaras.. en ningun lado la asignas o la pasas como parametros para que alguien la asigne , error despues la usas para ver los errores, si la asignas o la pasa no va atener nada.
c) Traten ed parametrizar las cosas , no usen sql embebido
d) No usen variables globales
e) Indenten. -
-
-
* El Hombre de la Estrella * -
26/01/2005#5 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecidaDesde ya muchas gracias por la respuesta. Ahroa paso a comentarte unas cosas que se me mezclaron. y por sierto el codigo lo tengo identado, me imposible escribir codigo si no esta identado, pero cuadno lo postie perdió dicha caracteristica.
El Set que me haces referencia lo cree más que nada por que me dijeron que lo haga y agregue ese código.
Y despues me decis que muchas cosas asi no se hacen lo que te voy a pedir es que me expliques como es que se hacen asi no cometo los errores.
Desde ya muchas gracias. -
-
-
RPG Adict -
26/01/2005#6 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecidaCreo que las explique ? por ahi no quedaron claro.
No usen variables globales ( molestanm y son dificiles de controlar )
Si a una variable le vas a asignar un valor no hace falta que la inicialices
ej
Consulta = New ADODB.Recordset
Consulta = getConsulta("Select lo que sea");
estas asignado a Consulta dos veces cosas distintas
la primera queda sobreescrita y si estubieras programando Orientado a aobjetos en serio.. estarias dejando un objketo perdido en el ether, ocupando memoria etc etc.
No embeban sql , traten de hacer stored procedures o consultas en el acces o donde sea con parametros.
lo de la indentacion me imagine. para que aca funcione la identacion tenes que poner el tag de [code] y no el de [quote[ -
-
-
100% Geek -
26/01/2005#7 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecidaConsulta = New ADODB.Recordset
Consulta = getConsulta("Select lo que sea");
la segunda linea se la hice poner yo para q prueve a ver q onda, por el error el objeto no esta inicializado, tonce le dije q haga eso solo para probar, no inicializa todo como esa linea, y el te lo explico el arriba...
sgundo es un access, y tirar los store adentro es una bosta, y no hay seguro q funquecon los access prefiero usar el sql plasmado en el form...
salute
Off topic: se te escapa C# o C++ o java o delphi, o el q sea... jajajajaja
por esta linea lo digo Consulta = getConsulta("Select lo que sea"); -
-
-
RPG Adict -
26/01/2005#8 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecidaSi se me escapa, programo en java y delphi principlamnte ... que queres que haga
.
el la empresa en delphi y en mi casa para afuera en java , y a veces en c# .. por ahi me pegos unos mames entre lenguaje y lenguaje que ni te cuento.
con respecto a esto , me parece barbaro que intentes forzar la inicializcion perooo..
Consulta = New ADODB.Recordset
Consulta = getConsulta("Select lo que sea");
si getConsulta("Select lo que sea" devuelve nil o su similar en VB
Consulta va aquedar en nil y sin inicializar igualmente
trata de Inicializar el valor en la funcion getConsulta().
Yo se que es acces.. pero ... No es mejor usar alguna otra base de datos un poco mas polenta como firebird.. o el MSDE . porque Acces apesta...
para Firebird a la hora de instalacion alcanza con mandar una dll de 400K junto al proyecto. -
-
-
Member -
10/02/2005#10 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecidaDim Consulta as ADODB.Recordset ' aca lo declaraste
Set Consulta = New ADODB.Recordset 'aca lo instanciaste
Set Consulta = AccessDB.ConsultaSQL(StrSQL1, StrSQL2, StrSQL3) ' ACA EL RECORDSET YA ESTA INSTANCIADO TE VA A DAR UN ERROR EN TIEMPO DE EJECUCION NO LE PODES ASIGNAR ESO A UN PUNTERO (NI A NINGUN OBJETO) (TENES QUE INVOCAR A LOS METODOS )
'Si ya lo instanciaste y _
queres realizar una operacion con el cursor (recordset) , que en este caso creo _
que queres poblar _
el recorset con el query ese que armas con los tres string's (No se me ocurre por _
que lo dividiste en tres)
'Ademas No definiste ni instanciaste la conexion en el FormLoad donde levantas _
el recordset asi que ya desde el vamos no deberia andar
'entonces =>
'con esto vas a poblar el recorset con el query que armas con los tres strings
Consulta.Open StrSQL1 & StrSQL2 & StrSQL3 ,AccessConexion, adOpenKeyset, _
adLockOptimistic
'acordate de instanciar declarar, instanciar y abrir AccesConexion en el FormLoad si no no _
te va a funcar
'bueno cualquier cosa no dudes en preguntar
'salu2 (je je) -
