Access - Objetos DAO y multiusuario

   
Vista:

Objetos DAO y multiusuario

Publicado por Jorge javys_veri@hotmail.com (28 intervenciones) el 19/11/2015 21:36:45
Amigos:

Estoy concluyendo un proyecto, y ahora estoy preparándolo para su empleo en ambiente multiusuario.

En un archivo llamado TRESA-Base.accdb puse todas las tablas.

En un archivo TRESA-Operación.accdb puse los formularios involucrados en la operación, en otro archivo TRESA-Administración puse los formularios de la administración, y así con otros temas. Cada uno de estos archivos los he vinculado con las tablas en TRESA-Base que se usan en sus formularios particulares.

Algunos de los archivos (p.ej. el de Operación) los he instalado en más de una PC.

Mi problema consiste en que en algunos formularios utilizo objetos DAO, por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
'    Aquí vienen las operaciones de "Asignar un No" al tractor y sus Quien y Cuando
 
'    StrMensaje = "Inventario de tractores"
 
'    Set rs2 = CurrentDb.OpenRecordset("TractorInventario", dbOpenTable)
 
'    If Not IsNull(Me.NombreEmpresa) Then
'        If Not IsNull(Me.IVACausado) Then
 
'            With rs2
'                rs2.MoveFirst
'                Do Until rs2.EOF
'                    If Nz(rs2.Fields("IdTractorInventario").Value, 0) = Me.IVACausado Then
'                        If Not rs2.EOF Then
'                            rs2.Edit
'                            rs2.Fields("AsignadoATren").Value = 2
'                            rs2.Fields("Quien").Value = J0Quien
'                            rs2.Fields("Cuando").Value = Now()
'                            rs2.Update
'                        End If
'                    End If
'                    rs2.MoveNext
'                Loop
'            End With
 
'        End If
'    End If
 
'    rs2.Close
'    Set rs2 = Nothing


Los formularios que no usan objetos DAO funcionan perfectamente en ambiente multiusuario.

Pero los formularios con objetos DAO marcan error y no ejecutan la instrucción (se salen de la subrutina en On Error GoTo) y dan el mensaje de StrMensaje = "Inventario de tractores".

Hago la aclaración que en el archivo original donde está todo el sistema todos los formularios trabajan bien.

La división de tablas y formularios y demás objetos la hice manualmente; tal vez me faltó algo por hacer.

Mucho agradeceré su apoyo y consejos para resolver este problema. ME URGE.

Gracias, Jorge.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Objetos DAO y multiusuario

Publicado por Jorge (28 intervenciones) el 20/11/2015 03:10:33
Amigos:

Soy nuevamente Jorge.

¡Ya encontré la solución al problema que tenía con los objeto DAO en su uso multiusuario!

Resulta que cuando se trabaja con tablas vinculadas el tratamiento que se les da no es de "tabla" sino que OpenRecordset crea un objeto Recordset de tipo dynaset.

La línea: Set rs2 = CurrentDb.OpenRecordset("TractorInventario", dbOpenTable)
debió ser escrita simplemente como: Set rs2 = CurrentDb.OpenRecordset("TractorInventario")

Todo lo demás funciona según lo esperado.

Ojalá les sea de utilidad.

Un cordial saludo,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Objetos DAO y multiusuario

Publicado por xve (114 intervenciones) el 20/11/2015 07:55:33
Gracias por compartirlo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Objetos DAO y multiusuario

Publicado por Enrique Heliodoro (1663 intervenciones) el 20/11/2015 09:08:51
Lo que me ha llamado la atención de ese código son las líneas diez y veinticuatro (creo que están de adorno), así como las líneas siete y ocho con sus respectivas veintiséis y veintisiete que hacen en dos pasos lo que se puede hacer en uno.

De todas formas eso te funciona porque no utilizas índices, (y con ellos Seek) si los utilizases, rompería en ese punto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Objetos DAO y multiusuario

Publicado por Jorge (28 intervenciones) el 21/11/2015 03:44:56
A tus ordenes xve!

Gracias por tu comentario Enrique Heliodoro. Una consulta:

En relación a las líneas 10 y 24 pensé que eran necesarias para acotar que en las instrucciones ahí incluidas nos referirnos a rs2, ¿Puedo eliminarlas?

Otra consulta: En relación a las líneas 7, 8 y 26, 27, ¿te refieres a usar una sola línea del tipo:

If Not IsNull(Me.NombreEmpresa) AND Not IsNull(Me.IVACausado) Then

o algo por el estilo? [No se si sea correcto]

Finalmente, usando una estructura similar con objetos DAO, pero especificando un SELECT, lleno una matriz de tres dimensiones según los valores que voy leyendo con el SELECT, pregunta: ¿A eso te refieres con lo que mencionas de los índices y Seek? ¿Si los uso, no me funciona con lo que escribí, para multiusuario? ¿Cómo debería hacerlo?

En el caso que describí en mi pregunta inicial, de hecho estoy haciendo una búsqueda de un registro único por medio de su Id, ¿Debería haberlo hecho con Seek? ¿Para uso en multiusuario?

(en su forma actual ¿Podría haber usado un Exit With después de la línea 19? o ¿un GoTo a una etiqueta en la línea 28?)

Te agradezco el tiempo.

Saludos a ambos,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Objetos DAO y multiusuario

Publicado por Enrique Heliodoro (1663 intervenciones) el 21/11/2015 15:28:00
Línea 10:
With rs2 (asigna un valor por defecto)

Línea 11:
rs2.MoveFirst

Lo correcto (mientras no se llega a 'End With')

Línea 11 (y siguientes donde se utilice)
.MoveFirst

En claro:

Antes de la asignación o sin ella: rs2.MoveFirst
Después de la asignación y mientras no finalice: .MoveFirst

Las asignaciones de valores ...
este modo:
rs2.Fields("AsignadoATren").Value = 2

Implica recorrer los nombres de los campos localizando uno (que sabemos cual es) y su propiedad 'Value' que es la que toma por defecto

Como asignamos por defecto lo de 'rs2' se puede quitar (o se asigna por defecto y se utiliza o no se genera asignación y se utiliza, tu decides)
Si se hace referencia a una propiedad se utiliza el punto, si es al contenido a lo que se hace referencia, se utiliza (!) y dado que value es la propiedad por defecto, en limpio y resumido quedaría asi:
!AsignadoATren = 2

utilizar 'Fields' es adecuado cuando el nombre se desconoce o se necesita crearlo en tiempo de ejecución, asi por ejemplo (campos tales como Precio1, precio2, precio3 ....)
For A= 1 to NN
!Fields("Precio" & A) = 2 * A
Next A

En aras de simplificar para hacer lo mismo, creo que una única condición es suficiente, dos solo tendrían sentido en caso de que se aplicase una alternativa

Seek: es el método mas rápido para localizar un dato en un conjunto de datos DAO indexado, pero solo trabaja con tablas en directo (no vinculadas) lo que exige un método de acceso directo a la otra base (la que contiene los datos) y como es lógico .... si se dispone de un acceso directo sobra la vinculación, ese nimio detalle (no vincular tablas) le da mas seguridad a la aplicación, dado que no se tiene un acceso a ellas ni se conoce la ruta.

Si a ello se añade lo de integrar las consultas en la aplicación (desaparecen del editor) y se compila y guarda (lo que impide manipulaciones de formularios, informes, macros y código VBA) ya tenemos una capa de protección básica.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Objetos DAO y multiusuario

Publicado por Jorge (28 intervenciones) el 22/11/2015 04:45:58
Gracias Enrique Heliodoro.

Me ha quedado claro en qué consiste el With y su utilidad para programar más rápido y sin escribir tanto, así como la manera de usarlo.

El ejemplo que me das de Precio1, Precio2, etc. fue muy interesante y me enseñó un par de cosas muy sugerentes.

En relación al uso del Seek y tu mención de las consultas:

- ¿Se pueden aplicar los métodos DAO a una consulta? (en particular una consulta de actualización)

- ¿Podría generar en mi archivo de programas una consulta de actualización de una tabla vinculada a mi archivo de datos, usar la consulta en mi subrutina donde actualizo los tres campos, actualizar los tres campos y, con esto actualizar la tabla que está en mi archivo de datos?

Tal vez de esa forma pudiera aprovechar las ventajas de velocidad del Seek y actualizar de manera indirecta mi tabla en el archivo de datos. ¿Crees que sea posible?

Nuevamente muchas gracias por tu paciencia y apoyo.

Un cordial saludo,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Objetos DAO y multiusuario

Publicado por Enrique Heliodoro (1663 intervenciones) el 25/11/2015 00:42:00
Seek es un método muy eficaz para sus propósitos, pero su utilización requiere índices y los índices aun siendo útiles también para las funciones de dominio tiene su inconvenientes (nada es perfecto).

Par actualizar datos, muchas veces se utiliza el lenguaje SQL (si, el mismo que pulula debajo de las consultas que se generan con el editor grafico de Access) y a estas no les hace falta ni el leguaje nativo de Access (DAO) ni 'la traducción' (capa de abstracción) para conectarse a otros entornos (ADO), solo precisa definir de forma correcta orígenes y destinos.

En líneas generales, una consulta de actualización generada con el editor grafico se puede utilizar para insertar/modificar/borrar datos en las tablas vinculadas sin necesidad de vincularlas, solo necesitaría añadírsele la ubicación de la base remota.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Objetos DAO y multiusuario

Publicado por Jorge (28 intervenciones) el 25/11/2015 06:31:29
Muchas gracias!

Voy a hacer pruebas para ver cómo funciona.

Saludos,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar