Árvore de páginas

En un entorno multiusuario la probabilidad de que dos usuarios modifiquen el mismo registro de un archivo, simultáneamente, es muy alta. Por esta razón, es necesario impedir el acceso de uno de ellos.

 

El Framework de la línea Microsiga Protheus tiene la función Softlock para esta finalidad. Esta función debe utilizarse para bloquear un determinado registro, en actualización, durante las operaciones de interfaz, como se muestra a continuación:

 


 // SoftLockSample.prw
If SoftLock(cAlias)
RegToMemory(cAlias,.F.,lVirtual)
Define MsDialog ___oDlg Of oFather:oWnd From 0, 0 To 0, 0 Pixel STYLE nOR( WS_VISIBLE, WS_POPUP )
aPosEnch := {,,,}
oEnc01:= MsMGet():New( cAlias, nReg, nOpc, ,"CRA", STR0004, aAcho, aPosEnch ,aCpos,,,,cTudoOk,___oDlg ,,lVirtual,.F.,,,,,,,,cTela) //"¿Cuántas modificaciones?"
oEnc01:oBox:align := CONTROL_ALIGN_ALLCLIENT
bEndDlg := {|lOk| If(lOk:=___oDlg:End(), nOpcA:=1, nOpcA:=3), lOk}
___oDlg:nWidth := aDim[4]-aDim[2]
Activate MsDialog __oDlg On Init ( FaMyBar(__oDlg,{|| If(Obligatorio(aGets, aTela) .And. Eval(bOk) .And. Eval(bOk2, nOpc), Eval(bEndDlg), (nOpcA:=3, .F.))},{|| nOpcA := 3, ___oDlg:End()}, aButtons), ___oDlg:Move(aDim[1], aDim[2], aDim[4]-aDim[2], aDim[3]-aDim[1]) )
(cAlias)->(MsGoTo(nReg))
If nOpcA == 1
Begin Transaction
RecLock(cAlias,.F.)
For nX := 1 TO FCount()
FieldPut(nX, M->&(EVAL(bCampo, nX)))
Next nX
If Type("aMemos") == "A"
For nX := 1 to Len(aCampos)
cVar := aMemos[nX][2]
cVar1:= aMemos[nX][1]
MSMM(&cVar1, TamSx3(aMemos[nX][2])[1], , &cVar, 1, , , cAlias, aMemos[nX][1], cAliasMemo)
Next nX
EndIf
End Transaction
EndIf

 

 La función SoftLock garantiza que la interfaz solamente se elabore para el primer usuario que hizo el intento de actualización o borrado. Mientras la transacción no se aborte o concluya, el registro permanecerá bloqueado para los otros. Observe que aunque la función SoftLock realice un bloqueo, el uso de la función RecLock continúa siendo necesario para la transacción.

  • Sem rótulos