12 Último

[VB] Variable de tipo object o la variable del bloque with no esta establecida

      • 5,546
      • mensajes
      • miembro desde
      • 07/11/02
    25/01/2005
    #1 [VB] Variable de tipo object o la variable del bloque with no esta establecida

    Me 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:

    Cita Escrito por Codigo AccessDB
    Option Explicit
    Public AccessConexion As ADODB.Connection
    Global Session As String
    Public Function AbrirConexion(ByVal NombreBD As String)
    '_________________________________________________ ___________________________
    'Esta función lo que permite es abrir y establecer la conección con Access.
    '_________________________________________________ ___________________________
    Dim ErrorBD As ADODB.Error
    On Error GoTo Error
    Set AccessConexion = New ADODB.Connection

    With AccessConexion
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & App.Path & "\Base de Datos\" & NombreBD & ";"
    .Open
    End With

    Exit Function

    Error:
    For Each ErrorBD In AccessConexion.Errors
    MsgBox ("Error VB:" & ErrorBD.Number & vbCrLf _
    & "Error Access:" & ErrorBD.NativeError & vbCrLf _
    & "Error SQL:" & ErrorBD.SQLState & vbCrLf _
    & "Generado Por:" & ErrorBD.Source & vbCrLf _
    & "Descripción:" & ErrorBD.Description)
    Next
    End Function
    Public Function ConsultaSQL(ByVal StrSQL1 As String, Optional StrSQL2 As String, Optional StrSQL3 As String) As Recordset
    '_________________________________________________ _________________________________________
    'Esta función lo que hace es ejecutar una consulta SQL y devolver el resultado de la misma
    '_________________________________________________ _________________________________________
    Dim ErrorBD As ADODB.Error
    On Error GoTo Error
    Set ConsultaSQL = New Recordset

    ConsultaSQL.Open StrSQL1 & StrSQL2 & StrSQL3, AccessConexion, adOpenDynamic, adLockOptimistic

    Exit Function
    Error:
    For Each ErrorBD In AccessConexion.Errors
    MsgBox ("Error VB:" & ErrorBD.Number & vbCrLf _
    & "Error Access:" & ErrorBD.NativeError & vbCrLf _
    & "Error SQL:" & ErrorBD.SQLState & vbCrLf _
    & "Generado Por:" & ErrorBD.Source & vbCrLf _
    & "Descripción:" & ErrorBD.Description)
    Next

    End Function
    Public Function ActualizarBD(ByVal StrSQL As String)
    '_________________________________________________ __________________________________________________ ____________
    'Esta funcion actualiza la base de datos ya sea el agregado de un nuevo registro como modificacion o eliminacion
    '_________________________________________________ __________________________________________________ ____________

    Dim ErrorBD As ADODB.Error
    On Error GoTo Error

    AccessConexion.Execute (StrSQL)

    Exit Function

    Error:
    For Each ErrorBD In AccessConexion.Errors
    MsgBox ("Error VB:" & ErrorBD.Number & vbCrLf _
    & "Error Access:" & ErrorBD.NativeError & vbCrLf _
    & "Error SQL:" & ErrorBD.SQLState & vbCrLf _
    & "Generado Por:" & ErrorBD.Source & vbCrLf _
    & "Descripción:" & ErrorBD.Description)
    Next
    End Function
    Public Function CerrarConexion()
    '_________________________________________________ ___________________
    'Esta función lo que hace es cerrar la conexión con la base de datos.
    '_________________________________________________ ___________________
    Dim ErrorBD As ADODB.Error
    On Error GoTo Error

    AccessConexion.Close
    Set AccessConexion = Nothing

    Exit Function

    Error:
    For Each ErrorBD In AccessConexion.Errors
    MsgBox ("Error VB:" & ErrorBD.Number & vbCrLf _
    & "Error Access:" & ErrorBD.NativeError & vbCrLf _
    & "Error SQL:" & ErrorBD.SQLState & vbCrLf _
    & "Generado Por:" & ErrorBD.Source & vbCrLf _
    & "Descripción:" & ErrorBD.Description)
    Next

    End Function
    Public Function GenerarId(ByVal StrTabla As String, ByVal StrCampo As String, ByVal StrCodigo As String) As String
    '_________________________________________________ _____________________________________
    'Esta función genera un codigo de identificación para una tabla
    '_________________________________________________ _____________________________________
    Dim Consulta As ADODB.Recordset
    Dim StrSQL As String
    Dim StrNumero As String
    Dim StrTexto As String
    Dim LngNumero As Long
    Dim i As Long

    On Error GoTo Error

    Set Consulta = New ADODB.Recordset
    StrSQL = "SELECT " & StrCampo
    StrSQL = StrSQL & " FROM " & StrTabla
    StrSQL = StrSQL & " WHERE " & StrCampo & " LIKE '" & StrCodigo & "%'"
    Set Consulta = ConsultaSQL(StrSQL)
    If Not Consulta.EOF And Not Consulta.BOF Then
    Consulta.MoveLast
    StrTexto = Consulta.Fields(StrCampo)
    StrNumero = Right(StrTexto, (Len(StrTexto) - Len(StrCodigo)))
    LngNumero = CLng(StrNumero)
    LngNumero = LngNumero + 1
    GenerarId = StrCodigo & CStr(LngNumero)
    Else
    GenerarId = StrCodigo & "1"
    End If

    Exit Function
    Error:
    MsgBox Err.Description, vbOKOnly, Err.Number
    End Function
    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 dramas

    Cita Escrito por Load Form
    Private Sub Form_Load()
    Dim StrSQL1 As String
    Dim StrSQL2 As String
    Dim StrSQL3 As String
    Dim Consulta As ADODB.Recordset
    Set Consulta = New ADODB.Recordset
    StrSQL1 = "SELECT Usuarios.Nombre, Soporte.Nombre, Incidentes.Incidente"
    StrSQL2 = " FROM ((SolicitudesST INNER JOIN Usuarios AS Soporte ON SolicitudesST.IdSoporteTecnico = Soporte.IdUsuario) INNER JOIN Usuarios ON SolicitudesST.IdUsuariosFinales = Usuarios.IdUsuario) INNER JOIN Incidentes ON SolicitudesST.IdIncidente = Incidentes.IdIncidente"
    StrSQL3 = " WHERE SolicitudesST.Asignado = 0"

    Set Consulta = AccessDB.ConsultaSQL(StrSQL1, StrSQL2, StrSQL3)

    If Not Consulta.BOF And Consulta.EOF Then

    Consulta.MoveFirst

    End If

    TxtIncidencia.Text = Consulta.Fields("Incidente")
    TxtSoporte.Text = Consulta.Fields("Soporte.Nombre")
    TxtUsuarioFinal.Text = Consulta.Fields("Usuarios.Nombre")

    AccessDB.CerrarConexion


    End Sub
    Cuando hace el SET Consulta y llama la consulta me tira lo siguiente:

    "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
  1. ¿Este tema te pareció interesante? Compártelo!

    ¿No es lo que buscabas? Intenta buscar un tema similar

    12 comentarios / 132146 Visitas

      • 5,242
      • mensajes
      • miembro desde
      • 17/02/02
    25/01/2005
    #2 Re: Problema VB 6.0 & Access.

    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!!!

      • 5,546
      • mensajes
      • miembro desde
      • 07/11/02
    25/01/2005
    #3 Re: Problema VB 6.0 & Access.

    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.

      • 2,035
      • mensajes
      • miembro desde
      • 06/01/05
    26/01/2005
    #4 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecida

    No 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 siguiente

    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
    lo 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 .

    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.
      • 5,546
      • mensajes
      • miembro desde
      • 07/11/02
    26/01/2005
    #5 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecida

    Desde 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.

      • 2,035
      • mensajes
      • miembro desde
      • 06/01/05
    26/01/2005
    #6 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecida

    Creo 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[

      • 5,242
      • mensajes
      • miembro desde
      • 17/02/02
    26/01/2005
    #7 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecida

    Consulta = 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 funque con 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");

      • 2,035
      • mensajes
      • miembro desde
      • 06/01/05
    26/01/2005
    #8 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecida

    Si 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.

      • 5,242
      • mensajes
      • miembro desde
      • 17/02/02
    26/01/2005
    #9 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecida

    si si, pero para un proyecto para la facu, access SOBRA... jajajaja...


    salute

      • 76
      • mensajes
      • miembro desde
      • 01/05/04
    10/02/2005
    #10 Re: [VB] Variable de tipo object o la variable del bloque with no esta establecida

    Dim 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)

12 Último