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.