Pregunta sobre sistema Multiusuario

Quisiera saber como tengo que hacer con ADO sin data control para que mi sistema al detectar que esta siendo accedido por otro usuario muestre un mensaje.
Te paso de nuevo mi código en el que declaro como optimista a mi sistema
'Declaraciones publicas de la base de datos y tablas
Public cnSistemaFlowers As ADODB.Connection
Public rstCliente As ADODB.Recordset
Public rstFacturas As ADODB.Recordset
Public rstProductos As ADODB.Recordset
Public rstRubros As ADODB.Recordset
Public rstRubrosProductos As ADODB.Recordset
Public rstProvincia As ADODB.Recordset
Public rstLocalidad As ADODB.Recordset
Public rstRespIva As ADODB.Recordset
Public rstDatosEmpresa As ADODB.Recordset
Public rstFVentaPago As ADODB.Recordset
Public rstDetalleFactura As ADODB.Recordset
Public rstTipoOperac As ADODB.Recordset
Public rstUsuarios As ADODB.Recordset
Public rstProveedores As ADODB.Recordset
Public rstEstadoFactura As ADODB.Recordset
Public rstCompras As ADODB.Recordset
Public rstDetalleCompra As ADODB.Recordset
Public rstGraficoCompra As ADODB.Recordset
Public rstTipoFactura As ADODB.Recordset
Public rstTipodeUsuario As ADODB.Recordset
Public P As Integer
Public F As Integer
Public MontoTotal As Double 'Monto Total de Factura
Public n As Integer
Public Fuente As StdFont
Public Texto As String
Public DetalleFactura As String
Public FF As Integer
Public ValorFila As Integer
Public MontoTotalCompra As Single 'Monto Total de Compra
Public CodProveedor As Integer 'CodProveedor para rstCompras
Public CodTipoPago As Integer 'CodTipoPago para rstCompras
Public AgregarStock As Integer 'Cantidad Agregada al Stock
Public RestarStock As Integer 'Cantidad Restada al Stock
Public StockActual As Integer 'Cantidad Actual del Stock
Public Num_DetCompra As Integer 'Numero del detalle de compra
Public NombreUsuario As String
Public ConvertirNU As String
Public NumeroCompra As String 'Numero de la compra a los proveedores
Public GuardarCantidad As Integer
Public NuevaCantidad As Integer
Public NombProducto As String
Public kkl As Integer
Public GTipoFactura As String * 1
Public ResponsableIva As String
Public Iva As Double
Public agr As Integer
Public ContadorEntradas As Integer
Public CodTipoUsuario As Integer
Sub Main()
On Error GoTo Falla 'control de errores en tiempo de ejecucion
'Crea Instancias y Conecta Abre la Base de Datos
Const sPathBase As String = "c:\Tesis Gris\BDFlowers\SistemaFlowers.mdb"
Set cnSistemaFlowers = New ADODB.Connection
Set rstCliente = New ADODB.Recordset
Set rstProvincia = New ADODB.Recordset
Set rstLocalidad = New ADODB.Recordset
Set rstRespIva = New ADODB.Recordset
Set rstDatosEmpresa = New ADODB.Recordset
Set rstFacturas = New ADODB.Recordset
Set rstProductos = New ADODB.Recordset
Set rstRubrosProductos = New ADODB.Recordset
Set rstRubros = New ADODB.Recordset
'Set rstFVP = New ADODB.Recordset
Set rstFVentaPago = New ADODB.Recordset
Set rstDetalleFactura = New ADODB.Recordset
Set rstTipoOperac = New ADODB.Recordset
Set rstUsuarios = New ADODB.Recordset
Set rstCompras = New ADODB.Recordset
Set rstProveedores = New ADODB.Recordset
Set rstEstadoFactura = New ADODB.Recordset
Set rstDetalleCompra = New ADODB.Recordset
Set rstGraficoCompra = New ADODB.Recordset
Set rstTipoFactura = New ADODB.Recordset
Set rstTipodeUsuario = New ADODB.Recordset
With cnSistemaFlowers
.Provider = "ADODB"
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sPathBase & ";"
.Open
.CursorLocation = adUseClient
End With
'Abrir el conjunto de registros
RstCliente. Open "SELECT * FROM Clientes ", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstFacturas. Open "SELECT * FROM Facturas", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstProductos. Open "SELECT * FROM Productos", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstRubros.Open "SELECT * FROM Rubros_Productos_SF", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstRubrosProductos.Open "SELECT * FROM Rubros_Productos_SF", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstProvincia. Open "SELECT * FROM Provincia", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstLocalidad. Open "SELECT * FROM Localidad", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstRespIva. Open "SELECT * FROM Responsable_Iva", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstDatosEmpresa. Open "SELECT * FROM DatosEmpresa", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstDetalleFactura. Open "SELECT * FROM Detalle_Factura", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstFVentaPago. Open "SELECT * FROM F_VP", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstTipoOperac.Open "SELECT * FROM Tipos_Operaciones_Audit", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstUsuarios. Open "SELECT * FROM Usuarios ORDER BY Usuarios.Nombre_Usuario", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstCompras.Open "SELECT * FROM Compras_A_Proveed", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstProveedores. Open "SELECT * FROM Proveedores", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstEstadoFactura. Open "SELECT * FROM Estado_Factura", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstDetalleCompra. Open "SELECT * FROM Detalle_Compra", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstGraficoCompra. Open "SELECT Mes, Año, MontoTotal FROM GraficoCompra WHERE Año Between #1-1-2002# and #12-31-2002# ", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstTipoFactura. Open "SELECT * FROM TipoFactura", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
rstTipodeUsuario.Open "SELECT * FROM Tipos_Usuarios", cnSistemaFlowers, adOpenDynamic, adLockOptimistic
'Ruta de acceso
ChDir App.Path
On Error GoTo 0 'detiene el control de errores
Falla: 'instruccion del mensaje de error
If Err.Number = Falla Then Exit Sub
MsgBox "Problemas con la Base de Datos, por favor verifique!!!", vbCritical, "ERROR"
Set cnSistemaFlowers = Nothing
Err.Clear
End Sub
No se en que lugar poner ese mensaje,

1 Respuesta

Respuesta
1
Cuando se trabaja con sistemas multiusuario lo que mejor conviene y funciona es el utilizar transacciones, para que cuando se realice una modificación, baja o alta, se un único usuario el que la haga, pero esto debe de manejarse de buena forma, no como lo tienes de todos los recordsets de datos abiertos.
Se trabaja con la apertura y extracción de la información requerida, se trabaja en pantalla y se actualiza lo que se haya cambiado con un update de información en tu base de datos.
Ya que si sigues la forma en que estas trabajando, en el momento en que un usuario se olvide de terminar su trabajo o se vaya y no regrese en unos días por enfermedad y deje su máquina bloqueada todo se queda bloqueado.
Imagina si tienes que obtener información todo se bloquea, ni siquiera las consultas funcionan.
Hola David!
Mi sistema es multiusuario. Supongamos que estoy ocupando mi sistema (estoy borrando o grabando), otro usuario intenta hacer lo mismo, ahí es donde quiero poner un mensaje.No se si en el borrar y en el grabar para que le avise que por el momento no puede ocupar el sistema. No se en que lugar.
Yo ya declare en el modulo para que mi sistema sea multiusuario, pero no se si se me permite poner ese mensaje.
Te pregunto porque esto lo había visto en mi mastering 5, pero no dice nada de como hacer eso.
Espero alguna respuesta.
Gracias
Griselda
Todo depende del tipo de consulta de datos que hagas, se declara el recordset en un archivo global y también la conexión, esto ya lo puedes utilizar en cualquier forma.
Porque no mejor mandas en un zip tu proyecto, le hago algunos cambios y te lo regreso para que sigas con él
Saludos
David Enciso
[email protected]
Hola David!
Hace poco que estoy trabajando con ADO,
yo al principio había declarado en cada formulario y abría cada recordset, y me dijeron que había otra forma de declarar para que no este abriendo a cada rato mis tablas, pero intente hacer abriendo y cerrando, pero no me salio. La verdad es que no se como poner. Porque hay varias tablas relacionadas. Me podrías indicar como hacer o enviarme un ejemplo de como declarar correctamente abriendo y cerrando los recordsets.
En cuanto a las transacciones, intente ponerlas pero te pregunto si tengo que ponerlas con el evento WillChangeRecord, ¿tengo un ejemplo pero para el borrar.Y si tengo el de guardar tengo que realizar esta transacción con otro evento? Yo estoy trabajando con ADO sin Data Control.
Gracias.
Saludos
Griselda
Me volví a confundir, que es lo que quieres hacer al mandar un mensaje.
Hola David!
Estoy intentando empaquetar mi sistema, pero es muy grande. Con decirte que tres formularios me dan 8 Mb, me podes decir por que, esos formularios son mis pantallas de entrada, de salida y la principal. Y tienen botones, con sus respectivos gráficos y una animación.
Espero una respuesta.
Gracias
Saludos
Griselda
Por el tamaño de la animación, eso da un tamaño muy grande.
Sugiero que me lo envíes a esta otra cuenta:
[email protected]
Hola David!
Voy a intentar mandarte mi sistema mañana Lunes, pero hay alguna posibilidad de que me mandes algún ejemplo para que yo lo haga (declarar el archivo global y la conexión) porque es bastante pesado (casi 80 Mb).
Gracias, saludos.
Griselda
La forma de trabajo es colocar en un módulo vas el método de conexión, la conexión, el recordset a utilizar en forma global y listo. Solo lo defines ahí y después lo usas, insisto, no deberías de abrir todo, ya que esto quita tiempo, usa memoria y desperdicia recursos.
Lo que debes de evaluar en forma correcta es el proceso de trabajo de cada usuario, los datos los trabajas en memoria del cliente, cuando lo subas a la base de datos simplemente verificas que no hayan sido actualizados anteriormente o reemplazas los datos de acuerdo a como debas de trabajar.
Como te lo he comentado todo el tiempo y lo aclaras tu misma, debes de abrirlos, usarlos y cerrarlos en cada lugar que los ocupes, no es necesario tener abiertos los recordsets y desperdiciar recursos, memoria por sobretodo.
En cada forma que utilices un recordset, lo abres, realizas la extracción de información solamente de lo que requieras, no es necesario tener un recordset con 100000 datos y solo usar uno.
Pero, insisto, tienes que abrir todos los recordsets al mismo tiempo, no existe alguna forma en que lo hagas de forma secuencial y cuando lo requieras.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas