Estoy desarrollando una aplicación con Visual Basic 5 y Access 97 bajo windows 98, pero tengo problemas con la concurrencia de usuarios cuando van a actualizar un numero de secuencia de una tabla, realmente Access es multiusuario, o es necesario programar esa parte y como hacerlo.
En principio no te suele dar problemas que varios usuarios accedan a la misma tabla al mismo tiempo, tendrás que ver si cuando la abres desde visual basic tienes alguna propiedad marcada de forma que te bloquee registros o algo así, puedes tener también una opción en access que pone que trabajas en modo exclusivo de forma que igual solo puedes trabajar tu, vas a herramientas/opciones/avanzadas y en la parte derecha hay un menu que pone algo de como trabajar "compartido/eclusivo" si tienes marcada exclusivo cuando abre uno la base de datos nadie puede trabajar con el. Prueba las 2 cosas y ya me dirás
HOLA, disculpa que no haya contestado antes. Te cuento que sigo con el problema, lo que hice fue atrapar el error de bloqueo y crear un "lazo" controlando con una variable booleana que activo o desactivo (true, false) cada vez que ocurre el error. Trato de actualizar dos tablas: SCMM_PARAMETROS que es de donde leo el numero de secuencia(numeroingreso), y SCMM_NOVEDADES donde grabo un registro cuya clave es: código de empresa+'NC'+numeroingreso+codigodecontrato. El error se presenta cuando dos usuarios al mismo tiempo están usando el programa, no me presenta ningún mensaje pero en la tabla SCMM_NOVEDADES no me graba el registro que crea uno de los 2 usuarios. DISCULPA que te moleste, pero te agradecería si revisas el código y me das alguna sugerencia... Para abrir la base de datos uso: Set vgoConeccion = OpenConnection("", dbDriverNoPrompt, False, "ODBC;DSN=SMC;pwd=""") LA RUTINA PARA ACTUALIZAR ES LA SIGUIENTE: Private Function ObtenerSecuenciaNC() AS STring Dim sEmpresa AS STring Dim vlsSql1 As String Dim vlrConsulta As Recordset Dim sw As Boolean Dim ning As Long On Error GoTo err_ObtenerSecuenciaDoc ObtenerSecuenciaNc = 0 vlsSql1 = "Select par_secuencia As secuencia From SCMM_PARAMETROS" vlsSql1 = vlsSql1 & " WHERE par_empresa = '" & sEmpresa & "'" Set vlrConsulta = vgoConeccion.OpenRecordset(vlsSql1, dbOpenDynaset) If Isnull(vlrConsulta.Fields(0)) Then ning = 1 Else ning = vlrConsulta.Fields(0) + 1 End if vlrConsulta.Close sw = True 'variable booleana que uso para el lazo While sw sw = False 'Actualizo la secuencia vlsSql1 = "UPDATE SCMM_PARAMETROS SET par_secuencia = " & ning & ", par_fecha = cdate('" & TSol_Fecha_NC.Text & "') " vlsSql1 = vlsSql1 & " WHERE par_empresa = '" & sEmpresa & "'" vlsSql1 = vlsSql1 & " AND par_codigo = 'NC'" CALL vgoconeccion.Execute(vlsSql1, dbExecDirect) If Not sw Then 'Inserto en la tabla de Novedades vlsSql1 = "INSERT INTO SCMM_NOVEDADES VALUES ('" & Var_Empresa & "', 'NC', '" vlsSql1 = vlsSql1 & CStr(Format(nin, "000000")) & "', "& Trim(TSol_Contrato.Text) & ", 'RES', " vlsSql1 = vlsSql1 & " CDATE('" & TSol_Fecha_NC.Text & "'), " & CCur(Sdo_Pendiente) & "," vlsSql1 = vlsSql1 & " '" & Txt_Observacion & "', 'A', " vlsSql1 = vlsSql1 & CCur(TXTTotalPagado) & "," vlsSql1 = vlsSql1 & " " & CCur(TXTRetenido.Text) & ")" Call vgoConeccion.Execute(vlsSql1, dbExecDirect) If sw Then ning = ning + 1 End if End If Wend ObtenerSecuenciaNC = ning Exit Function err_ObtenerSecuenciaDoc: If DBEngine.Errors(0).Number = -1605 Then sw = True Resume Next Else If DBEngine.Errors(0).Number = -1102 Then sw = True Resume Next Else MsgBox DBEngine.Errors(0).Number & ":" & DBEngine.Errors(0).Description, vbCritical End If End Function Saludos Blanchi
Igual lo que te falla es el connection echale un vistazo bueno a eso para ver si alguno de los parámetros es en exclusivo. Prueba de todas formas a conectarte de otra forma con el datacontrol, mira en la ayuda que te indicara como conectarte con esto. El código aparentemente no parce mal lotendria que ver con más calma yo creo que el problema puede venir de connection