Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/10/2013, 13:16
gasgodoy
 
Fecha de Ingreso: octubre-2013
Ubicación: San Carlos de Bariloche
Mensajes: 3
Antigüedad: 10 años, 6 meses
Puntos: 0
Exclamación ERROR Access 2007 al usar bloqueo por registro

Ante todo, y para guardar las buenas costumbres mis Saludos desde Argentina... Un poco de mi? Me Llamo Gastón Godoy, Libriano de nacimiento :), algunos dicen que buen tipo y un gran entusiasta de adquirir conocimientos. en futuros post y respuestas os conoceré mejor a todos.

El motivo de este post es solicitar su ayuda en algo que me trae rompiendo mi cabecita desde hace ya varios días. y como considero que si lo resolvemos quiza también ayude a alguien mas con mi pregunta, discución y sus respuestas es que he decidido abrir este hilo.

He desarrollado con access 2007 un sistemita de turnos para un lugar donde hacen analisis clinicos; la idea es optimizar el tiempo de los pacientes y que no tengan que esperar en vano en cada analisis; Os explico un poco mejor:

En este lugar se realizan 6 practicas medicas diferentes; a Saber:
* Analisis Clinicos
* Rayos X
* Fonoaudiologia
* Psicologia
* Electrocardiogramas
* Analisis de Laboratorio (Sangre, Etc)

el sistema consta de una base de datos access alojada en una carpeta compartida en un servidor (back End) y un archivo de access independiente en cada terminal (Front End)

Cada paciente puede realizar diferentes practicas medicas, puede sr una, dos o todas, acorde al caso. de modo tal que en las terminales puedan llamar a cada paciente acorde a si éste esta disponible para ser atendido (campo estado) y si no esta siendo atendido en ninguna de las áreas.

En la tabla de practicas médicas tengo por cada paciente los campos:
Nombre, Apellido, Orden de Llegada, Estado, y un campo por cada práctica, osea electro, laboratorio, etc, etc, de modo que voy gurdando registro de donde esta el paciente usando el campo pertinente a cada practica medica y por otro lado si esta disponible para ser llamado (campo estado) este ultimo es consultado y editado por todas las terminales

Básicamente si yo llamo a juan desde electro, y en rayos hacen click en llamar al proximo paciente y el proximo era juan mediante una consulta el sistema ve que juan no esta disponible y lo saltea para llamar a pedro que es el proximo paciente que esta disponible para ser atendido; hasta ahi todo funciona correctamente, escepto por que a veces sucede que en dos terminales se consulta el mismo registro casi al mismo tiempo y mientras uno estaba escribiendo no disponible el otro terminal lo sigue viendo como dsiponible; pense que lo solucionaria con lo de registro bloqueado, pero no ha sido una soluci{on definitiva. puesto que al intentar bloquear el mismo registro ambas terminales me devuelve un error en una de ellas diciendo que el registro no puede ser modificado por estar bloqueado y otras veces me devuelve que el registro ha cambiado; cuando lo que quiero es que ante este error tambi{en saltee el registro.
espero haber sido lo mas explicito posible; copio y pego el codigo que uso a ver si les da una vista un poco mas clara de mi situaci{on

Código:
Private Sub Llamar_Click()
On Error GoTo Err_Llamar_Click

'<<<< Definición de variables >>>>>
Dim varTerminal As String
Dim NoPacientes As String
varTerminal = "Laboratorio"
NoPacientes = "No hay pacientes disponibles por el momento"

Evaluacion:
'evaluamos si hay registros diponibles antes de comenzar con las opciones
If Me.Recordset.RecordCount = 0 Then
    DoCmd.Requery
        If Me.Recordset.RecordCount = 0 Then
        MsgBox NoPacientes
        GoTo Exit_Llamar_Click
        Else
        GoTo Comienzo
        End If
End If

Comienzo:
DoCmd.RunCommand acCmdRefresh 'Refresco los datos por si algun registro cambió
If Me.Estado = varTerminal Then 'chequeo las condiciones del estado para decidir que hago a partir de acá
    GoTo LiberarPaciente
    ElseIf Me.Estado = "1" Then GoTo BloquearPaciente
    Else:
    GoTo BuscarProximo
End If

LiberarPaciente:
    Me.Estado = "1" 'habilito el usuario antes de llamar al próximo
    DoCmd.RunCommand acCmdRefresh 'Guarda y refresca los registros

BuscarProximo:
Me.Recordset.MoveNext 'Voy al siguiente registro
    If Me.Recordset.EOF Then
        'MsgBox "Este es su último paciente por el momento"
        DoCmd.Requery
        GoTo Evaluacion
        Exit Sub
    Else:
    If [Estado] <> "1" Then 'Si ese registro está bloqueado avanzar con el loop hasta el próximo registro disponible
    Do While [Estado] <> "1"
        DoCmd.RunCommand acCmdRefresh 'Refresco datos
        Me.Recordset.MoveNext
        Loop
    End If 'final del loop
End If

'Procedimiento para el bloqueo de un registro de paciente
BloquearPaciente:
    Me.Estado = varTerminal 'bloqueo el nuevo registro
    DoCmd.RunCommand acCmdRefresh 'actualizo registros y guardo los cambios


Exit_Llamar_Click:
Exit Sub

Err_Llamar_Click:
If Err.Number = 3021 Then 'ultimo registro disponible
    DoCmd.Requery
    Resume Evaluacion
    End If
    
If Err.Number = -2147352567 Then
    Resume Exit_Llamar_Click
    End If
    
MsgBox Err.Number & ": " & Err.Description
Resume Exit_Llamar_Click
End Sub

Espero su pronta ayuda, porque mi cabecita ya no da mas
Muchas Gracias