Discussion:
DataEnvironment, VisData y form
(demasiado antiguo para responder)
Carlos Santa Maria
2005-01-16 01:02:31 UTC
Permalink
¡ Saludos a Todos !

Sigo con mis pasitos en VB 6.0 y les solicito su ayuda con lo siguiente:

He aprendido hacer una conexión con access (DataEnvironment), a esta
conexión le llamo conexionAndromeda, la cual incluye las siguientes tablas:
FiListadoGeneralDeAfiliados, FiListadoGeneralDePadrinos,
FiDescripcionFamiliar... con sus respectivos campos.

Hice varios DataReport desde la conexión ( tablas ) y me funciona bien,
ahora quiero crear un form de la tabla: FiListadoGeneralDeAfiliados, pero,
cuando agrego el control Data ( anterior, siguiente, último..) en la
propiedad: connect, databasename....... me pide información..... Por eso
solicito su ayuda con las siguientes interrogantes:

1. ¿Se puede utilizar la conexiónAdrómeda y seleccionar una de esas tablas
para el Data que se encuentra en el form, o tengo que buscar a través de
databasename?
2. En un form ¿qué código tengo que escribir en un botón comando, para
desplazarme de un registro al siguiente, al anterior.. sin utilizar el
control Data?
3. ¿Qué diferencia hay entre DataEnvironment y VisData, ya los he usado para
conectarme a las base de datos, pero, no encuentro la diferencia, pueden
darme una pequeña explicación ?
4. ¿Cada cuando se debe compactar la Base de datos de Access, o en VB no es
necesario hacerlo?

Gracias de antemano a todos.

Carlos Santa María
Guatemala Centro América
CarlossantamariaQUITAESTOaitelgua.com
SoftJaén
2005-01-16 13:42:22 UTC
Permalink
Post by Carlos Santa Maria
1. ¿Se puede utilizar la conexiónAdrómeda y seleccionar una de esas tablas
para el Data que se encuentra en el form, o tengo que buscar a través de
databasename?
Hola, Carlos:

El control de datos «Data» no lo puedes utilizar con el diseñador de entorno
de datos (DataEnvironment). Para ello, deberás de utilizar el control de
datos de la biblioteca de ADO «Microsoft ADO Data Control 6.0 (OLEDB)». De
esta forma, puedes seleccionar la tabla que deseas utilizar:

With Adodc1
.ConnectionString = _
DataEnvironment1.conexionAndromeda.ConnectionString
.RecordSource = "FiListadoGeneralDePadrinos"
.Refresh
End With
Post by Carlos Santa Maria
2. En un form ¿qué código tengo que escribir en un botón comando, para
desplazarme de un registro al siguiente, al anterior.. sin utilizar el
control Data?
Si en el DataEnvironment tienes configurado un comando, una vez que lo hayas
abierto, te moverías por los registros de la siguiente manera:

' Abrimos el Recordset
'
DataEnvironment1.rsCommand1.Open

Siguiente: DataEnvironment1.rsCommand1.MoveNext

Anterior: DataEnvironment1.rsCommand1.MovePrevious

Primero: DataEnvironment1.rsCommand1.MoveFirst

Último: DataEnvironment1.rsCommand1.MoveLast
Post by Carlos Santa Maria
3. ¿Qué diferencia hay entre DataEnvironment y VisData?
Pues tal y como dice la ayuda, el Diseñador de entorno de datos
(DataEnvironment) proporciona un entorno interactivo en tiempo de diseño
para crear un acceso a datos en tiempo de ejecución por programa. En tiempo
de diseño se establecen los valores de las propiedades de los objetos
Connection y Command, se escribe código para responder a los eventos de la
interfaz de objetos de datos de ActiveX® (ADO), se ejecutan comandos y se
crean campos agregados y jerarquías. También es posible arrastrar y colocar
objetos de entorno de datos en formularios o informes para crear controles
enlazados a datos.

El Administrador Visual de Datos (VisData), es una aplicación que te permite
crear y manipular base de datos Access, y de otros formatos con los que
puede interactuar el motor Microsoft Jet. Pero trabajas con los datos fuera
de tu aplicación, en cambio, el DataEnvironment te permite manipular los
datos desde dentro de tu aplicación. El VisData, podemos decir que es igual
a Microsoft Access, pero en pequeñito. :-)
Post by Carlos Santa Maria
4. ¿Cada cuando se debe compactar la Base de datos de Access, o en VB no
es necesario hacerlo?
No hay un tiempo definido que nos diga cuando hay que compactar una base de
datos, pero se debe de recomendar y facilitar a los usuarios de tu
aplicación, que a menudo se compacte la misma.

Un saludo
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Carlos Santa Maria
2005-01-17 00:05:02 UTC
Permalink
Saludos Enrique Martínez!

Me funciona de maravillas!!!!

Gracias Enrique!!!!

1...Solo hice dos correcciones del nombre de Conexion me hacia falta 2000 y
la tabla era Afiliados.
Detallo el código por si a alguien le sirve (tu me lo distes):

Private Sub Form_Load()

With Adodc1
.ConnectionString = _
DataEnvironment1.ConexionAndromeda2000.ConnectionString
.RecordSource = "FiListadoGeneralDeAfiliados"
.Refresh
End UIT

end sub

2...mover registros tu indicas:
DataEnvironment1.rsCommand1.Open
pero, me da error que no se puede ejecutar porque esta abierto... entonce lo
hice así:

DataEnvironment1.rsFiListadoGeneralDeAfiliados.MoveNext
.. y me funciona bien! si tienes comentarios sobre esto serán bienvenidos.

3... Con relación a DataEnvironment y VisData ya quedé claro con la
comparación que me hiciste, gracias!!

4... Gracias por la aclaración de Compactar la Bd


Abusando de tu confianza quiero consultarte lo siguiente:

EnDataEnvironment (ConexionAndromeda2000)
En las propiedades, Connectionsource aparece lo siguiente:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and
Settings\Carlos\Mis documentos\Andromeda.mdb;Persist Security Info=False

Lo anterior significa que esta base de datos deberá siempre de estar en esta
dirección.

1. Cómo hago para que a través de código me compruebe la dirección al abrir,
y si no está me dé un dialogo para establecer una Dirección para
DataEnvironment?

Gracias Nuevamente!

Carlos Santa María
Guatemala Centro América
Post by SoftJaén
Post by Carlos Santa Maria
1. ¿Se puede utilizar la conexiónAdrómeda y seleccionar una de esas tablas
para el Data que se encuentra en el form, o tengo que buscar a través de
databasename?
El control de datos «Data» no lo puedes utilizar con el diseñador de entorno
de datos (DataEnvironment). Para ello, deberás de utilizar el control de
datos de la biblioteca de ADO «Microsoft ADO Data Control 6.0 (OLEDB)». De
With Adodc1
.ConnectionString = _
DataEnvironment1.conexionAndromeda.ConnectionString
.RecordSource = "FiListadoGeneralDePadrinos"
.Refresh
End With
Post by Carlos Santa Maria
2. En un form ¿qué código tengo que escribir en un botón comando, para
desplazarme de un registro al siguiente, al anterior.. sin utilizar el
control Data?
Si en el DataEnvironment tienes configurado un comando, una vez que lo hayas
' Abrimos el Recordset
'
DataEnvironment1.rsCommand1.Open
Siguiente: DataEnvironment1.rsCommand1.MoveNext
Anterior: DataEnvironment1.rsCommand1.MovePrevious
Primero: DataEnvironment1.rsCommand1.MoveFirst
Último: DataEnvironment1.rsCommand1.MoveLast
Post by Carlos Santa Maria
3. ¿Qué diferencia hay entre DataEnvironment y VisData?
Pues tal y como dice la ayuda, el Diseñador de entorno de datos
(DataEnvironment) proporciona un entorno interactivo en tiempo de diseño
para crear un acceso a datos en tiempo de ejecución por programa. En tiempo
de diseño se establecen los valores de las propiedades de los objetos
Connection y Command, se escribe código para responder a los eventos de la
interfaz de objetos de datos de ActiveX® (ADO), se ejecutan comandos y se
crean campos agregados y jerarquías. También es posible arrastrar y colocar
objetos de entorno de datos en formularios o informes para crear controles
enlazados a datos.
El Administrador Visual de Datos (VisData), es una aplicación que te permite
crear y manipular base de datos Access, y de otros formatos con los que
puede interactuar el motor Microsoft Jet. Pero trabajas con los datos fuera
de tu aplicación, en cambio, el DataEnvironment te permite manipular los
datos desde dentro de tu aplicación. El VisData, podemos decir que es igual
a Microsoft Access, pero en pequeñito. :-)
Post by Carlos Santa Maria
4. ¿Cada cuando se debe compactar la Base de datos de Access, o en VB no
es necesario hacerlo?
No hay un tiempo definido que nos diga cuando hay que compactar una base de
datos, pero se debe de recomendar y facilitar a los usuarios de tu
aplicación, que a menudo se compacte la misma.
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
SoftJaén
2005-01-17 10:05:17 UTC
Permalink
Post by SoftJaén
DataEnvironment1.rsCommand1.Open
pero, me da error que no se puede ejecutar porque esta abierto... entonce
Por supuesto que, si el objeto Recordset ya se encuentra abierto, no lo
puedes abrir de nuevo hasta que no lo hayas cerrado previamente. Solamente
te lo indiqué para que supieras cómo abrirlo.
Post by SoftJaén
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and
Settings\Carlos\Mis documentos\Andromeda.mdb;Persist Security Info=False
Lo anterior significa que esta base de datos deberá siempre de estar en
esta dirección.
Lógicamente, en el parámetro «Data Source» debes de indicar la ruta donde se
encuentra la base de datos, y no tiene por qué estar en la carpeta «Mis
documentos» correspondiente al usuario que ha iniciado la sesión; puede
encontrarse en cualquier otra carpeta del disco duro.
Post by SoftJaén
1. Cómo hago para que a través de código me compruebe la dirección al
abrir, y si no está me dé un dialogo para establecer una Dirección para
DataEnvironment?
Si la base de datos no se encuentra en la ruta que has indicado en el
parámetro «Data Source», se producirá un error interceptable a la hora de
abrir la conexión. Esto quiere decir que dicho error lo puedes capturar,
pero para ello, en el procedimiento donde estableces la conexión, debes de
habilitar una rutina de control de errores mediante la oportuna instrucción
«On Error ...». Una vez capturado el error, puedes habilitar otra rutina
para que te aparezca un cuadro de diálogo de búsqueda de la base de datos.

Por ejemplo, imagínate que en el siguiente procedimiento estableces la
conexión:

Private Sub OpenConnection ()

' Activamos la rutina de control de errores
'
On Error Goto ErrorConnection

' Aquí escribirías el código para establecer la conexión
' ....
' ....
' ....


Exit Sub

ErrorConnection:
' Aquí escribirías el código para interceptar el error, y
' dependiendo de éste último, actuarías en consecuencia.
'
If Err.Number = -2147467259 Then
' No se ha encontrado la base de datos
'
MsgBox Err.Description, , Err.Number

' Procedimiento para buscar la ruta de la base de datos
' ...
' ...
' Intentamos de nuevo abrir la base de datos
Resume
End If

End Sub

Una vez que hayas habilitado el procedimiento para introducir la ruta
correcta de la base de datos, para que se reanude la ejecución del código
por la misma línea que ha producido el error, únicamente tienes que llamar a
la instrucción «Resume».

Pero para que puedas indicar la ruta en el parámetro «Data Source» de la
cadena de conexión, deberás de guardar en una variable local de tipo
«String», el valor de la ruta de la base de datos, por lo que la cadena de
conexión se quedaría más o menos de la siguiente manera:

Dim strPathDB As String
Dim strCnnString As String

strPathDB = "C:\Documents and Settings\Carlos\Mis documentos\Andromeda.mdb"

strCnnString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPath & " _
";Persist Security Info=False"

Una vez establecido el valor de la variable «strCnnString», es el que le
debes de pasar a la propiedad «ConnectionString» del diseñador
«DataEnvironment».

Y una vez llegado aquí, ¿no será mejor que te olvides del «DataEnvironment»
y del control de datos, y trabajes directamente con los objetos de la
biblioteca de ADO? El objeto «Connection» para establecer la conexión con la
base de datos, y el objeto «Recordset» para trabajar directamente con los
registros de una tabla de la base de datos. :-)

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
Carlos Santa Maria
2005-01-19 03:48:12 UTC
Permalink
Saludos Enrique Martínez!!

Te agradezco muchísimo por el seguimiento que le brindas al tema y por tu
amplia explicación que brindas.

Me costó ordenar el código y probarlo.... ahora sí .....

Me funciona muy bien todo código, pero me han surgido nuevas inquietudes que
las detallo:

Hice ciertos arreglos al código porque no quería funcionar, a continuación
lo detallo:

Private Sub Form_Load()
Static Contador As Integer

On Error GoTo conexionErr
With Adodc1
.ConnectionString = _
DataEnvironment1.ConexionAndromeda2000.ConnectionString
.RecordSource = "FiListadoGeneralDeAfiliados"
.Refresh
End With
Exit Sub


conexionErr:
'NO se encuentra la BD....
'Establezco un máximo de 3 Revisiones y luego se Cierra...
Contador = Contador + 1
If Contador > 3 Then
MsgBox "....¡¡¡¡ LO SIENTO NO SE PUDO TENER ACCESO A LA BASE DE
DATOS....!!!", vbCritical, "Administrador"
Unload Me
Exit Sub

Else
End If

If Err.Number = -2147467259 Then
' No se ha encontrado la base de datos

MsgBox "No es Posible Encontrar la Base de Datos... Se Intentará
Nuevamente....!!!!", vbExclamation
' Procedimiento para buscar la ruta de la base de datos
RevisarDireccion
' Intentamos de nuevo abrir la base de datos
Resume


End If

End Sub

Private Sub RevisarDireccion()

Dim DireccionBD As String
Dim strCnnString As String

DireccionBD = "C:\Documents and Settings\Carlos\Mis
documentos\Andromeda.mdb"
strCnnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DireccionBD
& ";Persist Security Info=False"


End Sub


1. En la ventana de diálogo que aperece..... " Introduzca la información de
inicialización de MS JET OLE DB ", en el campo Origen de datos, aunque
cambie la dirección o el nombre de la Base de Datos, no la busca, ¿ Cómo
hago para que busque la Dirección y la BD y si es correcta que actualice la
conexión?

<Y una vez llegado aquí, ¿no será mejor que te olvides del «DataEnvironment»
<y del control de datos, y trabajes directamente con los objetos de la
<biblioteca de ADO? El objeto «Connection» para establecer la conexión con
la
<base de datos, y el objeto «Recordset» para trabajar directamente con los
<registros de una tabla de la base de datos. :-)

He visto el código ADO generado desde VB Data form Wizard, y es casi similar
al que hemos creado, y tienes razón en hacer la pregunta.

2. Aunque no tengo la respuesta te pregunto lo siguiente: si te tocara que
conectar varias tablas desde una Base, para el llenado de varios form, ¿Qué
método utilizarías...?, el DataEnvironment ó conectarías independientemente
cada form a la base de datos ADO.

3. Qué excelente es lo On err goto.... y Resume, tratamiento de errores y
intentarlo abrir... Gracias por tu amplia explicación ahora sí comprendí
como utilizarlos y lo valioso que me han sido.

Gracias de antemano Enrique y a todos por hacer esto posible, Cualquier
comentario será bienvenido.

Carlos Santa María
Guatemala Centro América
***@itelgua.com
SoftJaén
2005-01-21 14:41:54 UTC
Permalink
1. En el Código te refieres a una variable ..... strCnnString ( Private
strCnnString As String ), ¿Qué diferencia hay entre Private y Dim ?
Ambas palabras clave se utilizan para declarar variables privadas y
asignarles un espacio de almacenamiento en memoria, con la diferencia que
«Private» sólo puede aparecer en la sección «Declaraciones» de cualquier
módulo (formulario, módulo estándar, módulo de clase, etc.), y «Dim» puede
aparecer tanto en la sección «Declaraciones» de un módulo, como en cualquier
procedimiento o función que se encuentre incluido en aquel.

Si deseas declarar una variable privada, cuyo alcance o ámbito de
visibilidad sea un módulo cualquiera de tu proyecto, puedes utilizar tanto
«Dim» como «Private», pero se aconseja utilizar ésta última palabra clave en
contraposición a la palabra clave «Public», que también se utiliza para
declarar variables, pero en éste caso, con un ámbito público o global, que
alcanza a todos los procedimientos de todos los módulos que conforman tu
proyecto de Visual Basic.

Aunque te repito que puedes utilizar tanto «Private» como «Dim», mi consejo
es que utilices la palabra clave «Private» si tu intención es declarar una
variable privada a nivel de módulo, y usar la palabra clave «Dim» sólo para
declarar variables locales en cualquier procedimiento «Sub» o «Function», de
ésta manera, tu código fuente será un poco más legible, porque al estudiar
el código, en todo momento se sabrá cual ha sido tu deseo. El uso de la
palabra clave «Dim» para declarar variables privadas, se mantiene por
compatiblidad con el código fuente escrito con las versiones previas de
Visual Basic, donde no existían las palabras clave «Private» y «Public».
2. En el código que te envié utilicé Static, y en el ejemplo utilizas Dim,
¿Cuál es la diferencia...?
Dentro de un procedimiento «Sub» o «Function», podemos usar tanto las
palabras clave «Static» como «Dim», para declarar variables locales, es
decir: aquellas cuyo ámbito de visibilidad será el procedimiento o función
donde han sido declaradas.

La diferencia se encuentra en que, si la declaras con «Dim», el valor de la
variable se eliminará de la memoria cuando el código abandone el
procedimiento. En cambio, si has usado «Static», el valor de la variable
local se conservará entre distintas llamadas al mismo procedimiento o
función donde aparezca declarada. Más o menos sería como una variable
“Private”, pero que sólo estaría disponible en el procedimiento «Sub» o
«Function» donde haya sido declarada.

Te modifiqué el tipo de declaración que aparecía en tu ejemplo, porque no
tiene sentido declarar una variable local como «Static» en el evento
«Form_Load» de un formulario, dado que este evento sólo se desencadena
cuando el formulario es cargado en memoria, por tanto, hasta que no
descargues el formulario de la memoria, y no lo vuelvas a cargar, no se
volverá a producir el citado evento, por lo que utilizar la palabra clave
«Static» para declarar una variable local, para lo único que puede servir es
para hacer más confuso el código fuente.

Aunque tampoco soy muy partidario de utilizar la palabra clave
«Static», -porque entiendo que hay otras maneras para simular que las
variables locales de un procedimiento “conserven” sus valores entre
distintas llamadas (por ejemplo, pasar los valores correspondientes en los
parámetros existentes en la declaración del procedimiento)-, si deseas
utilizarla, hazlo en un procedimiento o función que conozcas de antemano que
se va a ejecutar varias veces, pero si solo se va a ejecutar una sola vez,
¿para que vas a declarar la variable como «Static»? :-)
3. Al utilizar la función BrowseForFolder la puedo llamar desde
Form_Load(), pero con la función OpenCommDlg("1", ""), me da
error y tuve que llamarla desde Form_Activate(), ¿porqué?
¿Y qué error obtienes? Si por casualidad es el error número 364 (Se ha
descargado el objeto), es porque desde el propio evento «Form_Load» del
formulario «frmListadoDeAfiliados», estás descargando el formulario con la
instrucción «Unload Me», si el valor de la variable «Contador» es superior a
3. Como el formulario no está cargado del todo, porque no ha terminado el
evento «Form_Load», y como llamas a dicho formulario desde el formulario de
control, es cuando se produce dicho error, de ahí que no se produzca el
error si ejecutas el código desde el evento «Form_Activate», porque en éste
caso, el formulario ya se encuentra cargado en memoria.

Si esto último es el motivo de tu error, mejor será que en el evento
«Form_Activate» no introduzcas el código para establecer la conexión, porque
el mismo se ejecutará cada vez que el formulario se active.
4. En Access, podía Guardar la Dirección de una mdb en una Tabla, y la
que tenía disponible ( sin preguntarme cada vez que abra el formulario )
hasta que fallara la dirección o no se encontrara la base de datos, en
VB 6.00 ¿Cómo podría guardar esta información en VB 6.00 ?
Bueno, desconozco lo que hacías en Access para guardar la dirección de la
base de datos. Si en la base de datos tienes disponible una tabla para
guardar dicha información, puedes utilizar los métodos correspondientes de
un objeto Recordset previamente abierto, para guardar y leer la información
que desees.

También, puedes guardar la información en un archivo privado de
inicialización (los famosos archivos con extensión *.ini), y leer la
dirección de la base de datos cuando inicies tu aplicación, pero para ello,
tendrías que utilizar funciones de la API de Windows.

Si no deseas utilizar la API de Windows, Visual Basic te proporciona la
instrucción «SaveSetting» y la función «GetSetting», para guardar y leer
respectivamente los valores en el registro de Windows de una manera fácil.
Para mayor información, consulta dichas instrucciones en la ayuda de Visual
Basic.
5. ¿Cómo hago para que si se selecciona una mdb que no tiene la tabla
FiListadoGeneralDeAfiliados, me dé un error personalizado y vuelva a
intentarlo?
Para eso tendrás que habilitar algún mecanismo que te indique si existe una
tabla en la base de datos. Si deseas capturar el error en el supuesto de que
no exista la tabla, lo más sencillo es intentar abrir un objeto Recordset
con los datos de la tabla.

Por ejemplo, la siguiente función te devolverá True/False, dependiendo de si
existe o no una tabla cualquiera en una base de datos. Para ello, lo único
que deberás de pasar a la función es un objeto «ADODB.Connection»
previamente abierto, y el nombre de la tabla que deseas localizar:


Private Function ExisteTabla(ByVal cnn As ADODB.Connection, _
ByVal NombreTabla As String) As Boolean

' Si no existe una referencia válida al objeto Connection,
' abandonamos el procedimiento
'
If cnn Is Nothing Then Exit Function

' Si el objeto Connection está cerrado, también abandonamos
' el procemiento.
'
If cnn.State = adStateClosed Then Exit Function

' Si hemos llegado hasta aquí, es porque la conexión es válida.
'
' Declaramos un nuevo objeto Recordset
'
Dim rst As New ADODB.Recordset

' Activamos una rutina de control de errores
'
On Error Resume Next

' Intentamos abrir el objeto Recordset
'
rst.Open NombreTabla, cnn, , , adCmdTable

' Comprobamos el objeto «Err». Si no se ha producido
' un error, es porque la tabla existe, por lo que
' la función devolverá el valor «True»; en caso
' contrario, la función retornará «False», que es el
' valor que devolverá por defecto.
'
If Err.Number = 0 Then

ExisteTabla = True

' Cerramos el objeto Recordset

rst.Close

End If

End Function
....agregué el siguiente código, pero, si selecciono una mdb que no es la
correcta me vuelve a intentar buscar la correcta, pero aunque seleccione
la correcta no la acepta.
No sé. He revisado tu código, y si en la base de datos seleccionada se
encuentra la tabla «FiListadoGeneralDeAfiliados», el código abandona el
procedimiento.
tengo algunas dudas y te solicito nuevamente tu ayuda ( espero no
cansarte ... de veras... tu me dices hasta dónde terminar con
este tema....)
Como observo que tienes dudas en lo fundamental del lenguaje de Visual Basic
(Dim, Private, Static, eventos Form_Load y Form_Activate), no estaría de más
que le echaras un vistazo a algún manual de los muchos existentes por
internet, si lo crees conveniente y oportuno, claro está. :-)

En la web del amigo Rubén Vigón tienes disponibles los siguientes manuales:

Aprenda Visual Basic 6.0 como si estuviera en primero
Curso de 104 páginas en español de aprendizaje de Visual Basic 6.0, en
formato PDF
Autor: Escuela Superior de Ingenieros Industriales - Universidad de Navarra

Fundamentos de programación en Visual Basic
Documento de 88 páginas en español de aprendizaje de Visual Basic, en
formato Word 97 (*.doc)
Autor: Danny A. Matta Gonzales

Los encontrarás en el siguiente enlace:
http://mvp-access.com/rubenvigon/manuales.htm
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Carlos Santa Maria
2005-01-23 23:36:47 UTC
Permalink
Saludos cordiales Enrique!!

Gracias por continuar con este tema, ya he aprendido muchísimas cosas y te
agradezco.

Continuando con el tema..........

1 y 2 Seguiré tus recomendaciones: Dim y Private; Gracias por tu amplia
explicación.


3 Modifiqué el código ( form_load en vez de Form_Activate ) y ahora sí me
funciona correctamente.


4 Me llamó la atención SaveSetting y Getsetting y la estoy revisando,
gracias por tus tips de ayuda.


5 >¿Cómo hago para que si se selecciona una mdb que no tiene la tabla
FiListadoGeneralDeAfiliados, me dé un error personalizado y vuelva a
intentarlo?
He tratado de seguir los pasos de ExisteTabla, pero, me termino perdiendo,
te solicito tu ayuda con lo siguiente:

1. La función ExisteTabla Me da........ error de compilación: el argumento
no es opcional...., no sé qué me falta?
2. Desde dónde llamo a: ExisteTabla, para que haga esta verificación?
3. La variable "NombreTabla" debo de ingresarle el nombre de la tabla que
quiero verificar ("FiListadoGeneralDeAfiliados")?


6. Hice un ejecutable sobre este tema, y me funciona bien el máquina que
tiene instalado VB 6.0, pero si la llamo desde otra pc, me da los errores:
---Run-time error 339 Component MSADOCD.OCX or one of its dependencies not
correctly registered: a file is missing or invalid
---Run-time error 339 Component MSADOCD.OCX or one of its dependencies not
correctly registered: a file is missing or invalid

.... posteriormente creé un instalador, pero, me dá el error.....
---An error occurred while registering the file
'C:\windows\system32\msado20.tlb....Anular... Reintentar.....Omitir.......
interrumpiendo la instalación, Qué debo de hacer para que funcione en
cualquier pc?

Gracias por la Dirección y los manuales, los he estado revisando.

Gracias por continuar brindando esta valiosísima ayuda!!
Carlos Rolando Santa María Saucedo
***@itelgua.com
Guatemala Centro América
SoftJaén
2005-01-24 09:53:03 UTC
Permalink
"Carlos Santa Maria" escribió.
Post by Carlos Santa Maria
1. La función ExisteTabla Me da........ error de compilación: el argumento
no es opcional...., no sé qué me falta?
2. Desde dónde llamo a: ExisteTabla, para que haga esta verificación?
3. La variable "NombreTabla" debo de ingresarle el nombre de la tabla que
quiero verificar ("FiListadoGeneralDeAfiliados")?
La declaración de la función de usuario «ExisteTabla» es la siguiente:

Private Function ExisteTabla(ByVal cnn As ADODB.Connection, _
ByVal NombreTabla As String) As Boolean

Como podrás observar, necesita que se le pasen OBLIGATORIAMENTE dos
parámetros: el primero (cnn), una variable objeto que referencie a un objeto
ADODB.Connection previamente abierto, y el segundo (NombreTabla), una
variable alfanumérica con el nombre de la tabla que deseas comprobar su
existencia, en tu caso, deberías de pasar el nombre
"FiListadoGeneralDeAfiliados".

Si omites pasar alguno de los dos parámetros, obtendrás el error que
comentas en tiempo de ejecución: el argumento no es opcional.
Post by Carlos Santa Maria
6. Hice un ejecutable sobre este tema, y me funciona bien el máquina que
---Run-time error 339 Component MSADOCD.OCX or one of its dependencies
not correctly registered: a file is missing or invalid
---Run-time error 339 Component MSADOCD.OCX or one of its dependencies
not correctly registered: a file is missing or invalid
En las restantes PCs, deberás de procurar instalar y registrar debidamente
todos los componentes ActiveX que utilice tu ejecutable, porque de lo
contrario, ya has comprobado lo que ocurre. :-)
Post by Carlos Santa Maria
.... posteriormente creé un instalador, pero, me dá el error.....
---An error occurred while registering the file
'C:\windows\system32\msado20.tlb....Anular... Reintentar.....Omitir.......
interrumpiendo la instalación, Qué debo de hacer para que funcione en
cualquier pc?
Prueba lo siguiente. En la carpeta donde hayas grabado los archivos de
distribución, abre el archivo «Setup.lst» con el Bloc de Notas, por ejemplo,
y busca una línea como la siguiente:

File=@msado20.tlb,$(WinSysPath),$(DLLSelfRegister),$(Shared),.....

La línea continúa con más datos que no vienen al caso. Donde dice
«(DLLSelfRegister)», cámbialo por «(TLBRegister)». Una vez guardados los
cambios del archivo, prueba de nuevo a ejecutar el programa de instalación.

Carlos, si las nuevas dudas que te surgan están relacionadas con problemas
de instalación, registro de componentes, etc., te aconsejaría que iniciaras
un nuevo «hilo» con distinto «Asunto», porque esta conversación ya no tiene
nada que ver con la que iniciastes el pasado 16 de enero con el asunto
«DataEnvironment, VisData y Form». :-)
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Carlos Santa Maria
2005-01-25 03:40:57 UTC
Permalink
Saludos Enrique!!

Gracias por el apoyo que me sigues brindando!!

Perdón!! por esta gran cabezota!!!, siempre me da error de compilación: el
argumento no es opcional...., perdona!!

1. ¿Podrías brindarme un ejemplo sobre la función ExisteTabla y desde dónde
la llamo...?

Depués de hacer la corrección que me indicaras al instalable, por fin lo
instalé en otra pc, ahora me dá otro error al cargar el Ejecutable.... ADO
no encontró el proveerdor especificado. Error No. 3706.....Aceptar...

2. ¿Qué me hace falta hacer.... para que funcione correctamente en cualquier
pc...?

He creado un nuevo hilo "Instalación, Registro de Componentes de un
ejecutable", tengo más dudas sobre esto.

Gracias por continuar brindando esta valiosísima ayuda!!
Carlos Rolando Santa María Saucedo
***@itelgua.com
Guatemala Centro América
Carlos Santa María
2005-01-30 03:47:52 UTC
Permalink
Saludos Enrique!!

Gracias por tu valiosísima ayuda.

Disculpa la tardanza en continuar, se debió a unas carreras que teníamos en
la Organización para la cual laboro.

Gracias por tu ejemplo, descubrí mi error, se debió a que no le había
colocado el if....end if, a que ciego estaba, pero ya lo corregí; en mi
pregunta..
1. ¿dónde llamarlo...? me refería después de qué línea de código, la he
colocado en la siguiente....(te agradecería me brindaras tu opinión,
sugerencia...)

Private Sub Form_Load()
Dim Contador As Integer
Dim cnn As ADODB.Connection ' Objeto Connection

On Error GoTo conexionErr

' Creamos un nuevo objeto Connection
Set cnn = New ADODB.Connection
' Configuramos el objeto Connection, pero NO
' le indicamos la ruta de la base de datos
'
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"

' Lógicamente, al no especificar la cadena de
' conexión, se producirá un error de autenticación.
'
.Open strCnnString

' Si se ha abierto es porque la ruta es correcta.
' Si vas a utilizar el control de datos, puedes
' cerrar la conexión


MsgBox "1--- Ya hay conexión....verificamos si existe la tabla"

If ExisteTabla(cnn, "FiListadoGeneralDeAfiliados") = True Then
MsgBox "La tabla existe."
Exit Sub
Else
MsgBox "La tabla no existe. comprobación tabla errónea.",
vbCritical
DireccionBD = ""
RevisarDireccion
........
........
Después de seleccionada la Mdb errónea, en vez de volver a empezar con el
código, continúa ejecutándose, ¿Cómo hago para que vuelva a ejecutarse el
código si no se encuentra la tabla... Es decir, después de RevisarDirección,
me vuelva acomprobar todo....?

2. ADO no encontró el proveerdor especificado. Error No. 3706.....Aceptar...
Gracias por las direcciones de descarga, he actualizado mi equipo, volveré a
tratar de instalarlo en las otras PC y te cuento el lunes.

Gracias nuevamente por tu ejemplo y por tu gran ayuda.

Carlos Rolando Santa María Saucedo
***@itelgua.com
Guatemala Centro América
SoftJaén
2005-01-30 10:08:30 UTC
Permalink
Post by Carlos Santa María
1. ¿dónde llamarlo...? me refería después de qué línea de código, la he
colocado en la siguiente....(te agradecería me brindaras tu opinión,
sugerencia...)
Private Sub Form_Load()
....
MsgBox "1--- Ya hay conexión....verificamos si existe la tabla"
...
If ExisteTabla(cnn, "FiListadoGeneralDeAfiliados") = True Then
Sí, está bien que verifiques si existe la tabla una vez que hayas abierto la
conexión.

Pero lo que yo no entiendo es la preocupación que tienes porque exista la
tabla. ¿Qué sucede? ¿Estás preocupado porque alguien te elimine la tabla de
la base de datos? :-)

Te envié la función «ExisteTabla» para que conocieras la manera de verificar
la existencia de una tabla, pero que no es necesario que la llames, porque
cuando intentes abrir un objeto Recordset, si no existe la tabla, se
producirá un error interceptable. Para atrapar dicho error, en el
procedimiento donde abres el objeto Recordset, debes de activar una rutina
de control de errores, y actuar en consecuencia, tal y como ya te indiqué en
un mensaje anterior. Pero que si tu deseo es comprobar que exista la tabla,
no pasa nada porque llames a la función «ExisteTabla» antes de abrir el
objeto Recordset.
Post by Carlos Santa María
Después de seleccionada la Mdb errónea, en vez de volver a empezar con el
código, continúa ejecutándose, ¿Cómo hago para que vuelva a ejecutarse el
código si no se encuentra la tabla... Es decir, después de
RevisarDirección, me vuelva a comprobar todo....?
Desde luego, a mi entender te estás complicando la vida demasiado. El código
de la aplicación debe saber dónde se encuentra la base de datos: si no se
encuentra en dicho sitio, se le comunica al usuario y la aplicación
finaliza, sin darle oportunidad al usuario para que indique la ruta de la
base de datos. Personalmente opino, que dejar al usuario que busque la base
de datos, es signo de que la aplicación no es muy profesional que digamos.

Como después de tanto tiempo, desconozco como tienes escrito el evento
«Form_Load», y si utilizas el control de datos de ADO o un objeto Recordset,
te diré lo que yo haría, y si lo deseas, aplicas el ejemplo a tu aplicación.
Para ello, la base de datos «Andromeda.mdb» se supone que se encuentra en la
misma carpeta del archivo ejecutable de tu aplicación. ¿OK?


Private Sub Form_Load()

Dim strCnnString As String
Dim cnn As ADODB.Connection

On Error GoTo conexionErr

' Creamos un nuevo objeto Connection
'
Set cnn = New ADODB.Connection

' Configuramos el objeto Connection, indicándole
' la ruta de la base de datos
'
strCnnString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;" & _
"Data Source=" & App.Path & "\Andromeda.mdb"

With cnn
.ConnectionString = strCnnString
.Open

' Si se ha abierto es porque la base de datos existe.
' Si vas a utilizar el control de datos, puedes
' cerrar la conexión
.Close
End With

' Configuramos el control de datos
'
With Adodc1
.ConnectionString = strCnnString
.RecordSource = "FiListadoGeneralDeAfiliados"
.Refresh
End With

Exit Sub

conexionErr:

Select Case Err.Number
Case -2147217843, -2147467259
MsgBox "No se ha encontrado la base de datos." & vbCrLf & _
"Póngase en contacto con el Administrador del sistema."

Case -2147217900
MsgBox "No se ha encontrado la tabla." & vbCrLf & _
"Póngase en contacto con el Administrador del sistema."

Case Else
MsgBox Err.Description & " No. " & Err.Number, vbCritical

End Select

' Cualquier error producido hace que el formulario
' se descarge, y que finalice la aplicación,
' siempre y cuando sea el formulario de inicio de
' la aplicación
'
Unload Me

End Sub

Vuevo a insistirte que es un ejemplo, y que a mi saber y entender es como se
debería de actuar, y no andar dándole oportunidades al usuario para que
busque la base de datos o la tabla. O existe la base de datos, y por tanto
la tabla, o no existe: Punto.

Si tu preocupación es si alguien mueve la base de datos a otra carpeta, o
elimina una tabla de la misma, ese no debe ser tu problema; debería ser
problema del responsable del equipo. El programador ha realizado su trabajo,
bien o mal, pero lo ha realizado, y no tiene por qué ser el guardián de la
base de datos. ¿Comprendes? Si se pierde la base de datos por motivos ajenos
a tu aplicación, no debe ser tu problema, por lo que puedes dormir
tranquilo. :-)

Por si quieres evitar que alguien abra la base de datos con Microsoft
Access, por ejemplo, y elimine la tabla «FiListadoGeneralDeAfiliados»,
deberás de activar en la base de datos la seguridad a nivel de usuario que
nos proporciona el motor Microsoft Jet. Si deseas conocer cómo activar dicho
nivel de seguridad, consulta el siguiente enlace:

http://groups.google.com/groups?hl=es&lr=&threadm=%23N37rQQuEHA.3788%40TK2MSFTNGP09.phx.gbl&rnum=1&prev=/groups%3Fhl%3Des%26lr%3D%26q%3DCrear%2Bun%2Bnuevo%2Barchivo%2Bde%2Binformaci%25C3%25B3n%2Bde%2Bgrupos%2Bde%2Btrabajo%2Bauthor%253Asoftja%25C3%25A9n
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Carlos Santa María
2005-01-31 12:50:23 UTC
Permalink
Saludos Enrique!!

Gracias por tu valioso apoyo...!!

Tienes razón..!!, me estaba complicando la vida, la responsabilidad
significa que también el usuario debe de poner de su parte.

Vaya, vaya... el App.Path....es la solución perfecta..!!!, pues me busca la
base de datos en la carpeta actual.... no importando si se mueve la
carpeta...Excelente...!!!

Gracias por tu código ejemplo...muy bueno... esta será mi base para abrir
mdb.. y también gracias por el enlace de seguridad de access, me he
inclinado por colocar contraseña a las mdbs, y me funciona bien..!!!

Bueno gracias a tu amplia explicación y hacerme ver que en una aplicación
debe de estar divida la responsabilidad entre el Programador y el Usuario,
ahora ya puedo domir tranquilo.....¡¡¡hoooooooooooo!!!

El día de mañana lo probaré en las otras máquinas, y te cuento.

Gracias nuevamente por tu ejemplo y por tu amplia explicación.

Carlos Rolando Santa María Saucedo
***@itelgua.com
Guatemala Centro América
Carlos Santa María
2005-02-02 04:00:53 UTC
Permalink
Saludos Enrique!!

Siiiiii!!!

He descargado el jet40sp8_9xnt y lo he instalado en las PCs que me daban el
error 3760... y me funcionan correctamente!!.

Gracias nuevamente por tus ejemplos, por tu paciencia y por tu amplia
explicación que me brindastes!!!

Carlos Rolando Santa María Saucedo
***@itelgua.com
Guatemala Centro América

Loading...