Hola magne y gracias por leer esta pregunta. Necesito saber si hay una forma en la que cuando inicio mi programa me pida donde se encuentra la base de datos, después de elegirla la primera vez que no vuelva a pedírmela a menos que se cambie la base de datos de directorio y me vuelva a pedir donde se encuentra. Si pudieras ayudarme te lo agradecería mucho. Gracias de antemano
Gracias
Tienes 2 opciones: 1.- Escribir la ruta en 1 fichero .ini en el directorio en donde se encuentra el ejecutale. 2.- Escribir la ruta en el registro de Windows. Y cada vez que inicies el programa testeas si el archivo existe dejas arrancar la aplicación y sino tienes que dejar al usuario que te la seleccione mediante el Control CommonDialos lo puedes hacer perfectamente. Espero haberte sido de ayuda. Te mando el código para escribir y leer de un fichero ini: Option Explicit #If Win32 Then 'Declaraciones para 32 bits Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" _ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ ByVal lpDefault As String, ByVal lpReturnedString As String, _ ByVal nSize As Long, ByVal lpFileName As String) As Long Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" _ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ ByVal lpString As Any, ByVal lpFileName As String) As Long #Else 'Declaraciones para 16 bits Private Declare Function GetPrivateProfileString Lib "Kernel" _ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ ByVal lpDefault As String, ByVal lpReturnedString As String, _ ByVal nSize As Integer, ByVal lpFileName As String) As Integer Private Declare Function WritePrivateProfileString Lib "Kernel" _ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ ByVal lpString As Any, ByVal lplFileName As String) As Integer #End If '---------------------------------------------------------------------------- 'Función equivalente a GetSetting de VB4. 'GetSetting En VB4/32bits usa el registro. ' En VB4/16bits usa un archivo de texto. 'Pero al usar las llamadas del API, siempre se escriben en archivos de texto. '---------------------------------------------------------------------------- Public Function LeerIni(lpFileName As String, lpAppName As String, lpKeyName As String, Optional vDefault) As String 'Los parámetros son: 'lpFileName: La Aplicación (fichero INI) 'lpAppName: La sección que suele estar entre corchetes 'lpKeyName: Clave 'vDefault: Valor opcional que devolverá ' Si no se encuentra la clave. ' Dim lpString As String Dim LTmp As Long Dim sRetVal As String 'Si no se especifica el valor por defecto, 'asignar incialmente una cadena vacía If IsMissing(vDefault) Then lpString = "" Else lpString = vDefault End If sRetVal = String$(255, 0) LTmp = GetPrivateProfileString(lpAppName, lpKeyName, lpString, sRetVal, Len(sRetVal), lpFileName) If LTmp = 0 Then LeerIni = lpString Else LeerIni = Left(sRetVal, LTmp) End If End Function '---------------------------------------------------------------------------- 'Procedimiento equivalente a SaveSetting de VB4. 'SaveSetting En VB4/32bits usa el registro. ' En VB4/16bits usa un archivo de texto. 'Pero al usar las llamadas del API, siempre se escriben en archivos de texto. '---------------------------------------------------------------------------- Sub GuardarIni(lpFileName As String, lpAppName As String, lpKeyName As String, lpString As String) 'Guarda los datos de configuración 'Los parámetros son los mismos que en LeerIni 'Siendo lpString el valor a guardar ' Dim LTmp As Long LTmp = WritePrivateProfileString(lpAppName, lpKeyName, lpString, lpFileName) End Sub
Uff, se cortó la respuesta, segundo intento... Vamos a ver, más que darte todo el código seguido, voy a explicar todas las funciones necesarias, que así se aprende más :) - Open <fichero> for <ModoApertura> As #Id Con la instrucción Open podrás abrir el ficher tanto en lectura como en escritura (según el modoapertura especificado). Por ejemplo, para abrir un fichero para lectura sería Id = freefile() ' Devuelve un número con el primer id para fichero libre ( para evitar conflictos ) Open "fichero.txt" For Input as #id En lugar de fichero.txt, coloca la ruta completa del txt (si no está en el mismo directorio que el ejecutable) Para leer TODO el fichero se úes la siguiente instrucción: Cadena = Input(LOF(id), id) También se pueden leer los ficheros de otras formas, línea a línea por ejemplo, pero para este caso usamos este código que es más simple y suficiente. Al fianl de usar un archivo acuerdata siempre de cerrarlo ! Close #id - Para escribir es similar : Open "fichero.txt" for Output as #id Print #id, texto ' para escribir lo deseado en el texto. Y cerrarlo siempre! Close #id Espero que ahora ya tengas tu problema solucionado. Si tienes alguna otra duda ya sabes :) Magne
Vamos a ver, más que mandarte el código, voy a esxplicarte todas las funciones que necesitas, que así se aprende más. - Open : con esta instrucción abrirás el fichero para utilizarlo (input, output o appending según lo que quieras hacer con él) Para leer el fichero :
A ver, podrías hacer lo siguiente : - En el mismo directorio donde tengas la aplicación, guardar un fichero con el path de la base de datos en cuestión. Al abrir el programa, compruebas si el fichero existe, si no existe pides la ubicación de la base de datos, creas el fichero y guardas la ruta dentro de él. Si el fichero existe, lees la ruta, compruebas que la base de datos esté en la dirección suministrada por el archivo, si no es así, vuelves a pedir la ubicación y la guardas en el archivo. Si la base de datos está donde indica el archivo, se abre normalmente. Con esto debería bastar para que si se cambia la base de datos de sitio, automáticamente pida la nueva ubicación y la guarde. Espero que te haya ayudado la respuesta. Si necesitas alguna ayuda más no dudes en preguntar. Magne