No puedo ejecutar la aplicación
Estoy haciendo una pequeña aplicación con VB. Ya hice el paquete de instalación pero al querer ejecutar la aplicación me da el error de "no se encuentra el ISAM instalable". El programa tiene controles "control data" y "DBGrid" pero no tiene informes. Trabajo con VB 6 y tengo puesto el service pack 4.La version de windows es XP, y no se si es que tengo que poner el SP5 o q.
Me dijeron q tenia q añadir las referencias de acceso a los datos, pero creo q eso ya lo he hecho. Aunque te agradecería q me explicaras como se hace eso por si acaso, ya q no llevo mucho tiempo con esto y tampoco se mucho.
Me dijeron q tenia q añadir las referencias de acceso a los datos, pero creo q eso ya lo he hecho. Aunque te agradecería q me explicaras como se hace eso por si acaso, ya q no llevo mucho tiempo con esto y tampoco se mucho.
1 Respuesta
Respuesta de wolfverine
1
1
En primer lugar comprueba en el registro de Windows si tienes instalado
elISAM para Texto. Para la versión 4.0 del motor Jet estaría en la clave:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\ISAM Formats\Text Si no tienes
instalado el ISAM
Tendrás que instalar las mdac 2.6 y el motor jet de acceso a datos 4.0. Probablemente sea esto imagino que donde quieres instalar la aplicación no esta el motor jet instalado lo puedes bajar de aquí. http://www.informatix.li/Spanish/Windows/ADO%20Installation%20SP.htm
O En la web de microsoft.
elISAM para Texto. Para la versión 4.0 del motor Jet estaría en la clave:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\ISAM Formats\Text Si no tienes
instalado el ISAM
Tendrás que instalar las mdac 2.6 y el motor jet de acceso a datos 4.0. Probablemente sea esto imagino que donde quieres instalar la aplicación no esta el motor jet instalado lo puedes bajar de aquí. http://www.informatix.li/Spanish/Windows/ADO%20Installation%20SP.htm
O En la web de microsoft.
Ya instale el mdac y lo otro. Creo que el mdac que yo estaba usando era el 2.0.Pero sigue sin ejecutarse bien. Cuando lo ejecuto, se produce el error del ISAM, y después cuando intento darle a algún botón de la aplicación me da este otro error "La variable de tipo Object o la variable de bloque Whith no esta establecida", y entonces se cierra la aplicación. Le he dado muchísimas vueltas pero no se que puede ser.
Bueno seria conveniente me zipees el programa y su código si no es muy pesado y me lo envíes a [email protected] para que le eche un vistazo ya que el error probablemente es por que no esta encontrando algún componente, pero no puedo indicarte cual es sin el.
Bien ya tengo tu comix, el programa de instalación hecho instalado y funcionando, creo que tu problema es que alguna instalación de algún programa a sobreescrito algún componente o dll, creo que tu problema se solucionara si desinstalas y reinstalas visual basic y después de la instalación le aplicas el Service Pack 5 que puedes bajarte de la web de microsoft gratuitamente. Bueno si aun tuviese problemas des pues de esto coméntamelo a ver Saludos.
Bien he comprobado que en tu aplicación no controlas los errores y que trabajas con datacontrols así que es conveniente que los controles un ejemplo para evitar tu problema de la variable widht no esta establecida seria lo siguiente uso como ejemplo una parte de tu código modificada de formulario frmAgregarComic.
Como ultimo comentarte que el datacontrol al establecer la ruta en tiempo de diseño esta abierto permanentemente y no es necesario utilizar la sentencia close, ya que se descarga al descargar el formulario, y ese es el error que te esta dando. Saludos
Private Sub Form_Unload(Cancel As Integer)
On Error GoTo ErrorHandler
'cerramos los dispositivo de sonido
agregarComic.Command = "Stop"
agregarComic.Command = "Close"
agregarComic2.Command = "Stop"
agregarComic2.Command = "Close"
'cerramos la base de datos
datNumeros.Database.Close
ErrorHandler:
If Err.Number = 91 Then
'Controlamos el error en tu caso la base de datos no esta abierta.
End If
End Sub
Como ultimo comentarte que el datacontrol al establecer la ruta en tiempo de diseño esta abierto permanentemente y no es necesario utilizar la sentencia close, ya que se descarga al descargar el formulario, y ese es el error que te esta dando. Saludos
Private Sub Form_Unload(Cancel As Integer)
On Error GoTo ErrorHandler
'cerramos los dispositivo de sonido
agregarComic.Command = "Stop"
agregarComic.Command = "Close"
agregarComic2.Command = "Stop"
agregarComic2.Command = "Close"
'cerramos la base de datos
datNumeros.Database.Close
ErrorHandler:
If Err.Number = 91 Then
'Controlamos el error en tu caso la base de datos no esta abierta.
End If
End Sub
Bueno a ver.Si te he entendido bien lo que tengo que hacer es controlar ese error. Y a parte tengo que abrir la base de datos porque no la abro en ningún sitio. Y si tengo que hacer eso, entonces tengo un gran problema, porque cuando he empezado con Visual Basic no me han enseñado a hacerlo y por mucho que intento no se.
El principal tema es que el método de conexión con data control esta muy obsoleto pero bueno aun no entiendo como os siguen enseñando a programar con el ya que en la vida real nunca lo vas a volver a usar pero bueno en fin para solucionar tu problema actual te he creado una función para hacer una conexión Dao a un datacontrol
Public Sub abrir_enlazar(ByVal nombre_tabla As String)
On Error GoTo error '** ""
'abrir base de datos
Set mydb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\datos\dat.mdb")
Set setbd = mydb.OpenRecordset(nombre_tabla, dbOpenDynaset)
'setbd.Sort = "[nombre]" 'ordena
'Set setbd = setbd.OpenRecordset() ' guarda ordenado
With Form1
.Data1.Connect = "access"
.Data1.DatabaseName = App.Path + "\datos\dat.mdb"
.Data1.RecordSource = nombre_tabla
.Data1.Refresh
' Set .Data1.Recordset = setbd 'pasamos el recordset ordenado
.Data1.Refresh
End With
error:
Resume Next
End SubPublic Sub abrir_enlazar(ByVal sTabla As String, ByRef mYform As Form)
On Error GoTo error '** ""
'abrir base de datos
Set mydb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\datos\dat.mdb")
Set setbd = mydb.OpenRecordset(sTabla, dbOpenDynaset)
'setbd.Sort = "[nombre]" 'ordena
'Set setbd = setbd.OpenRecordset() ' guarda ordenado
With Form
.Data1.Connect = "access"
.Data1.DatabaseName = App.Path + "\datos\dat.mdb"
.Data1.RecordSource = sTabla
.Data1.Refresh
' Set .Data1.Recordset = setbd 'pasamos el recordset ordenado
.Data1.Refresh
End With
error:
Resume Next
End Sub
A la función la llamas para conectar el data control de la siguiente manera abrir_enlazar Nombredelatabla(ejemp "Articulos", Formulario (ejemp Form1)
También puedes pasar el datacontrol por referencia y así la función te servirá para conectarlos todos, bata con que cambies el data1 por una variable que pases por referencia pero te lo he dejado así para que lo veas más claro.
Public Sub abrir_enlazar(ByVal nombre_tabla As String)
On Error GoTo error '** ""
'abrir base de datos
Set mydb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\datos\dat.mdb")
Set setbd = mydb.OpenRecordset(nombre_tabla, dbOpenDynaset)
'setbd.Sort = "[nombre]" 'ordena
'Set setbd = setbd.OpenRecordset() ' guarda ordenado
With Form1
.Data1.Connect = "access"
.Data1.DatabaseName = App.Path + "\datos\dat.mdb"
.Data1.RecordSource = nombre_tabla
.Data1.Refresh
' Set .Data1.Recordset = setbd 'pasamos el recordset ordenado
.Data1.Refresh
End With
error:
Resume Next
End SubPublic Sub abrir_enlazar(ByVal sTabla As String, ByRef mYform As Form)
On Error GoTo error '** ""
'abrir base de datos
Set mydb = DBEngine.Workspaces(0).OpenDatabase(App.Path + "\datos\dat.mdb")
Set setbd = mydb.OpenRecordset(sTabla, dbOpenDynaset)
'setbd.Sort = "[nombre]" 'ordena
'Set setbd = setbd.OpenRecordset() ' guarda ordenado
With Form
.Data1.Connect = "access"
.Data1.DatabaseName = App.Path + "\datos\dat.mdb"
.Data1.RecordSource = sTabla
.Data1.Refresh
' Set .Data1.Recordset = setbd 'pasamos el recordset ordenado
.Data1.Refresh
End With
error:
Resume Next
End Sub
A la función la llamas para conectar el data control de la siguiente manera abrir_enlazar Nombredelatabla(ejemp "Articulos", Formulario (ejemp Form1)
También puedes pasar el datacontrol por referencia y así la función te servirá para conectarlos todos, bata con que cambies el data1 por una variable que pases por referencia pero te lo he dejado así para que lo veas más claro.
Veamos, he puesto la función.Me daba algunos errores al compilar, no se si lo habré hecho bien.Me decía que dos variables no estaban declaradas creo, y entonces las puse en la primera linea así:
Dim mydb As Database
Dim setbd As Database
aunque no se si las tenia q poner de ese tipo. En esta linea tambien me daba error:
End SubPublic Sub abrir_enlazar(ByVal sTabla As String, ByRef mYform As Form), asi q lo q supuse era q dos lineas diferentes se habian juntado y las separe entre Sub y Public.y entonces veo como 2 funciones, q al compilar me dice q los nombres son los mismos y tampoco. Asi q a una le puse abrir_enlazar2 para no confundir. Pero solo he usado la de abrir_enlazar llamandola cuando se carga el formulario (he puesto abrir_enlazar "Editoriales").Por ultimo puse Access 2000 y sustitui el directorio q era, pero cuando pulso algun boton q tiene q ver con la base de datos me da el error de la variable de tipo object o de tipo with no esta establecida.
Dim mydb As Database
Dim setbd As Database
aunque no se si las tenia q poner de ese tipo. En esta linea tambien me daba error:
End SubPublic Sub abrir_enlazar(ByVal sTabla As String, ByRef mYform As Form), asi q lo q supuse era q dos lineas diferentes se habian juntado y las separe entre Sub y Public.y entonces veo como 2 funciones, q al compilar me dice q los nombres son los mismos y tampoco. Asi q a una le puse abrir_enlazar2 para no confundir. Pero solo he usado la de abrir_enlazar llamandola cuando se carga el formulario (he puesto abrir_enlazar "Editoriales").Por ultimo puse Access 2000 y sustitui el directorio q era, pero cuando pulso algun boton q tiene q ver con la base de datos me da el error de la variable de tipo object o de tipo with no esta establecida.
bien las declaraciones son correctas y en cuanto a la linea End SubPublic Sub abrir_enlazar
deve quedar asi Public Sub abrir_enlazar se me pego un trozo no devido al pasartelo.
Se me olvido decirte que las propiedades del data database y data source debes dejarlos en blanco en tiempo de diseño.
en cuanto a la llamada debe ser a abrir_enlazar "editoriales", frmAgregarEditorial
De todas formas por si tienes un rato te pongo unos ejemplos abaja de como manejar un recordset en Dao (para que te hagas una idea el recordset viene a ser un data pero sin ser un objeto, en tiempo de diseño, echale un vistazo y vete cambiando, después de ver un poco de Dao lo suyo es que utilices Ado pero la filosofía es muy parecida y es un buen puente para aprender a pasar entre el data y Ado. Suerte
Sub OpenRecordsetX()
Dim wrkJet As Workspace
Dim wrkODBC As Workspace
Dim dbsNeptuno As Database
Dim conEditores As Connection
Dim rstTemp As Recordset
Dim rstTemp2 As Recordset
' Abre Microsoft Jet y el espacio de trabajo ODBCDirect, la base de datos
' Microsoft Jet y la conexión ODBCDirect.
Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
Set wrkODBC = CreateWorkspace("", "admin", "", dbUseODBC)
Set dbsNeptuno = wrkJet.OpenDatabase("Neptuno.mdb")
Set conEditores = wrkODBC.OpenConnection("", , , _
"ODBC;DATABASE=eds;UID=sa;PWD=;DSN=Editores")
' Abre cinco objetos Recordset diferentes y muestra
' el contenido de cada uno.
Debug.Print "Abriendo el recordset de tipo Forward-only" & _
"donde el origen es un objeto QueryDef..."
Set rstTemp = dbsNeptuno.OpenRecordset( _
"Los diez productos más caros", dbOpenForwardOnly)
SalidaAbrirRecordset rstTemp
Debug. Print " Abriendo el recordset de sólo lectura de tipo Dynaset " & _
"donde el origen es una instrucción SQL..."
Set rstTemp = dbsNeptuno.OpenRecordset( _
"SELECT * FROM Empleados", dbOpenDynaset, dbReadOnly)
SalidaAbrirRecordset rstTemp
' Utiliza la propiedad Filter para recuperar sólo ciertos
' Registros con la siguiente llamada OpenRecordset.
Debug.Print "Abriendo el recordset de un objeto" & _
"Recordset existente para filtrar..."
rstTemp.Filter = "Apellidos >= 'M'"
Set rstTemp2 = rstTemp.OpenRecordset()
SalidaAbrirRecordset rstTemp2
Debug.Print " Abriendo el recordset de tipo Dynamic de" & _
"una conexión ODBC..."
Set rstTemp = conEditores.OpenRecordset( _
"SELECT * FROM almacenes", dbOpenDynamic)
SalidaAbrirRecordset rstTemp
' Utiliza la propiedad StillExecuting para determinar cuando está
' el Recordset preparado para manipular.
Debug.Print " Abriendo el recordset de tipo Snapshot basado" & _
"en una consulta asíncrona a una conexión ODBC..."
Set rstTemp = conEditores.OpenRecordset("editores", _
dbOpenSnapshot, dbRunAsync)
Do While rstTemp.StillExecuting
Debug.Print " [todavía en ejecución...]"
Loop
SalidaAbrirRecordset rstTemp
RstTemp. Close
DbsNeptuno. Close
ConEditores. Close
WrkJet. Close
WrkODBC. Close
End Sub
Sub SalidaAbrirRecordset(rstOutput As Recordset)
' Enumera el objeto Recordset especificado.
With rstOutput
Do While Not .EOF
Debug.Print , .Fields(0), .Fields(1)
.MoveNext
Loop
End With
End Sub
Copyright (c) 1996 Microsoft Corporation
deve quedar asi Public Sub abrir_enlazar se me pego un trozo no devido al pasartelo.
Se me olvido decirte que las propiedades del data database y data source debes dejarlos en blanco en tiempo de diseño.
en cuanto a la llamada debe ser a abrir_enlazar "editoriales", frmAgregarEditorial
De todas formas por si tienes un rato te pongo unos ejemplos abaja de como manejar un recordset en Dao (para que te hagas una idea el recordset viene a ser un data pero sin ser un objeto, en tiempo de diseño, echale un vistazo y vete cambiando, después de ver un poco de Dao lo suyo es que utilices Ado pero la filosofía es muy parecida y es un buen puente para aprender a pasar entre el data y Ado. Suerte
Sub OpenRecordsetX()
Dim wrkJet As Workspace
Dim wrkODBC As Workspace
Dim dbsNeptuno As Database
Dim conEditores As Connection
Dim rstTemp As Recordset
Dim rstTemp2 As Recordset
' Abre Microsoft Jet y el espacio de trabajo ODBCDirect, la base de datos
' Microsoft Jet y la conexión ODBCDirect.
Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
Set wrkODBC = CreateWorkspace("", "admin", "", dbUseODBC)
Set dbsNeptuno = wrkJet.OpenDatabase("Neptuno.mdb")
Set conEditores = wrkODBC.OpenConnection("", , , _
"ODBC;DATABASE=eds;UID=sa;PWD=;DSN=Editores")
' Abre cinco objetos Recordset diferentes y muestra
' el contenido de cada uno.
Debug.Print "Abriendo el recordset de tipo Forward-only" & _
"donde el origen es un objeto QueryDef..."
Set rstTemp = dbsNeptuno.OpenRecordset( _
"Los diez productos más caros", dbOpenForwardOnly)
SalidaAbrirRecordset rstTemp
Debug. Print " Abriendo el recordset de sólo lectura de tipo Dynaset " & _
"donde el origen es una instrucción SQL..."
Set rstTemp = dbsNeptuno.OpenRecordset( _
"SELECT * FROM Empleados", dbOpenDynaset, dbReadOnly)
SalidaAbrirRecordset rstTemp
' Utiliza la propiedad Filter para recuperar sólo ciertos
' Registros con la siguiente llamada OpenRecordset.
Debug.Print "Abriendo el recordset de un objeto" & _
"Recordset existente para filtrar..."
rstTemp.Filter = "Apellidos >= 'M'"
Set rstTemp2 = rstTemp.OpenRecordset()
SalidaAbrirRecordset rstTemp2
Debug.Print " Abriendo el recordset de tipo Dynamic de" & _
"una conexión ODBC..."
Set rstTemp = conEditores.OpenRecordset( _
"SELECT * FROM almacenes", dbOpenDynamic)
SalidaAbrirRecordset rstTemp
' Utiliza la propiedad StillExecuting para determinar cuando está
' el Recordset preparado para manipular.
Debug.Print " Abriendo el recordset de tipo Snapshot basado" & _
"en una consulta asíncrona a una conexión ODBC..."
Set rstTemp = conEditores.OpenRecordset("editores", _
dbOpenSnapshot, dbRunAsync)
Do While rstTemp.StillExecuting
Debug.Print " [todavía en ejecución...]"
Loop
SalidaAbrirRecordset rstTemp
RstTemp. Close
DbsNeptuno. Close
ConEditores. Close
WrkJet. Close
WrkODBC. Close
End Sub
Sub SalidaAbrirRecordset(rstOutput As Recordset)
' Enumera el objeto Recordset especificado.
With rstOutput
Do While Not .EOF
Debug.Print , .Fields(0), .Fields(1)
.MoveNext
Loop
End With
End Sub
Copyright (c) 1996 Microsoft Corporation
- Compartir respuesta
- Anónimo
ahora mismo