Problema al abrir archivos con rutas absolutas desde estaciones de trabajo que tienen mapeos distintos de las unidades de red.

Tengo varias aplicaciones complejas que funcionan a la perfección en local pero pretendo ejecutarlas en red accediendo a ellas desde distintas estaciones de trabajo. En red todo va bien salvo una opción existente que consiste en poder guardar el nombre y ruta de archivos para posteriormente poderlos abrir mediante un botón. El problema es a causa de que los mapeos de las unidades de red son distintos en cada estación de trabajo, por lo que en unas la ruta es ejemplo: P:\CARPETA PRIMERA\CARPETA SEGUNDA\CARPETA APLICACIÓN ... Y en otras estaciones cambia el mapeo y acceden mediante la ruta Q:\CARPETA PRIMERA\CARPETA SEGUNDA\CARPETA APLICACIÓN ... E incluso en otras la ruta es K:\CARPETA APLICACIÓN ... Si entra una estación y guarda una ruta con la letra P: Ejemplo: P:\CARPETA PRIMERA\CARPETA SEGUNDA\CARPETA APLICACION\CARPETA ARCHIVOS\ARCHIVO1.pdf cuando otro usuario en otra estación en la que NO existe la unidad P: pues en esa unidad se llama Q: y se intenta abrir el archivo la aplicación no encuentra la ruta y por lo tanto da error. En resumen si un usuario guarda la ruta SI puede abrir el archivo pero si es otra estación la que lo intenta NO existe la ruta.

¿Cómo puedo solventar el problema?. Muy agradecido por la atención y el tiempo que dedicáis a ayudar. Un gran merito por vuestra parte y un gran gran servicio el vuestro.

1 Respuesta

Respuesta
1

Se me ocurren varias formas en que puedes solucionar el problema, que dependerán un poco de la forma de trabajar que tengáis.

Una opción sería almacenar en una tabla todas las ubicaciones (sin el nombre del archivo) donde se guarden los archivos. Quedaría una cosa así:

ID Ruta

1     P:\CARPETA PRIMERA\CARPETA SEGUNDA\CARPETA APLICACION\CARPETA ARCHIVOS\

2     Q:\CARPETA PRIMERA\CARPETA SEGUNDA\CARPETA APLICACION\CARPETA ARCHIVOS\

3     K:\CARPETA APLICACION\CARPETA ARCHIVOS\

El siguiente paso sería, en el código que tengas para abrir el archivo, que compruebe una a una las rutas de la tabla para ver cual existe y abrir el archivo en esa ruta. Algo así:

Private Sub cmdVer_Click()
On Error GoTo sol_err
Dim i As Integer
Dim numRutas As Integer
Dim miRuta As String
Dim mRutas() As String
Dim miArchivo As String
numRutas = DCount("ID", "TUbicaciones")
ReDim mRutas(1 To numRutas)
'Rellenas la matriz con las rutas de la tabla
For i = 1 To numRutas
    mRutas(i) = Nz(DLookup("Ubicacion", "TUbicaciones", "[ID]=" & i), "")
Next i
'Aquí cogerías solamente el nombre del archivo, porque la ruta ya la tienes en la matriz mRutas()
miArchivo = ...
If miArchivo = "" Then Exit Sub
'Compruebas qué ruta existe y en cuál está el archivo
For i = 1 To numRutas
    miRuta = mRutas(i)
    If Dir(miRuta, vbDirectory) <> "" Then
        If Dir(miRuta & miArchivo) <> "" Then Exit For
    End If
Siguiente:
Next i
'Abres el archivo
Application.FollowHyperlink miRuta & miArchivo
Exit Sub
sol_err:
    If Err.Number = 52 Then Resume Siguiente
End Sub

Otra opción que se me ocurre, si la estructura de archivos es siempre la misma, es que uses alguna de estas APIs para ver los nombres de unidades que tienes disponibles, construyas la ruta completa uniendo el nombre de la unidad, la "estructura de carpetas fija" y el nombre del archivo y lo abras.

Un saludo.


Muchisimas gracias por tu pronta respuesta y el trabajo que has realizado al suministrarme hasta el código completo. Esta solución de introducir en una tabla los distintos nombres y letras de esas unidades de redes ( sin poner el nombre de archivos ) me parece muy original y no había pensado en ella. Incluso si se fueran incrementando las estaciones de trabajo con nuevas letras y nombres para esa unidad, solo habría que poner una opción de mantenimiento de la tabla para poder incluir esas nuevas ubicaciones. 

Hoy he estado trabajando en el tema pero en el procedimiento de guardar y tu planteas la solución en el procedimiento de abrir.  Lo pruebo de inmediato y comento..Muchas gracias nuevamente.

Quedo pues a la espera de tus comentarios.

Por mi parte, quisiera ampliar un poco más la opción 1, con otra posibilidad que se me acaba de ocurrir:

Si a la tabla le añades otro campo para guardar, por ejemplo el nombre del equipo, te evitas tener que comprobar todas las rutas posibles, pues con un simple DLookup() puedes buscar la unidad (y ruta) que le corresponde al equipo. Eso te facilitaría tanto la rutina de guardar el archivo como la de cargarlo, y además te evita tener que guardar en la tabla donde "guardas" los archivos la ruta completa, llegando con guardar solo el nombre y extensión de los mismos.

La función Environ("ComputerName") te devuelve el nombre del PC, que si están todos en la misma red, deberían ser únicos (si no lo fueran, tendrías que volver a hacer bucles para comprobar las posibles ubicaciones)

Un saludo.


Resuelto el problema! Examinando el código que me has suministrado y con la idea de las apis para ver el nombre de las unidades de red me ha surgido la idea de pasar a una variable el nombre real o IP  de la unidad de red en la que se encuentra cada aplicación. Como tu desarrollas en tu código, pasando el nombre DFT del servidor a una variable para que al buscar los archivos y guardar la ruta NO guarde la letra que en cada estación de trabajo aparece y que guarde en la tabla la ruta pero con el nombre Standar ( para todas las estaciones)  de esa unidad de red.

En el proceso de captura de la ruta del archivo le he incluido que se posicione  en lugar de en una unidad P:\ruta Q:\ruta o W: \ruta en una carpeta determinada (he elegido la raiz de las subcarpetas donde se ubique la aplicación), que se posicione con el nombre de la unidad de red:

 "\\RedIntersic207-1\Empresa matriz\Servidor Corporativo\Gestión Interna\Datos\Expedientes"

La busqueda la realizo a través de apiGetOpenFileName Lib "comdlg32.dll" y en el procedimiento onclick del botón es donde le paso el nombre por donde debe comenzar a buscar. Queda guardada esa ruta con ese nombre y al seleccionar el archivo concreto y guardarlo, lo guarda con el nombre real de la unidad de red y no con la letra particular que cada estación tiene para esa unidad de red.

\\RedIntersic207-1\Empresa matriz\Servidor Corporativo\Gestión Interna\Datos\Expedientes\CARPETA PRIMERA\CARPETA SEGUNDA\CARPETA APLICACION\CARPETA ARCHIVOS\archivo.pdf

La idea me la has dado al pasar las rutas a variables. Funciona perfectamente y ya cada estación guarda de la misma manera las rutas y por lo tanto abre los archivos sin problema de ningún tipo. Eso sí, hay que tener presente que el nombre de la unidad suele ser muy muy largo y sumado al nombre del archivo puede sobrepasar los 255 caracteres y entonces volvemos a tener problemas pues no puede exceder de esa longitud.

Muchísimas gracias, no he usado exactamente el codigo que me has suministrado pero si que he usado la idea de guardar las rutas en variables y guardar el nombre de la unidad de red y del archivo solucionando el problema. Gracias de nuevo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas