Disculpa la tardanza, andaba un pòco ful, haber si esto te ayuda o da una idea sobre lo que quieres hacer, nose si habra una manera mas facil, pero a mi me funciona a la perfeccion para lo que necesito, esto es con MYSQL, saludos...
EN EL xBROWSE uso una VAR que controla el setcheck y en la funcion act_check() hago el cambio dependiendo de lo que quiera o valide, por lo menos si el cliente ya esta adjudicado, y tratan de volverlo adjudicar en el mismo momento, el sistema advierte y no lo permite, aunque tengo varias condiciones en mis validaciones...
// ACT./DES. STATUS SELECCIONADO PARA ADJUDICAR CON D-CLICK
:bLDblClick := {|nRow|IIF( oQryADJ:adj_adjudicar = 0 ,;
( oQryADJ:adj_adjudicar := 1 ) ,;
( oQryADJ:adj_adjudicar := 0 ) ) ,;
act_check( oQryAdj ) ,;
oQryADJ:REFRESH(), oBrw:REFRESH() }
// ACT./DES. STATUS SELECCIONADO PARA ADJUDICAR CON SPACE
:bKeyDown= {|nKey| IF ( nKey == VK_SPACE ,;
IIF( oQryADJ:adj_adjudicar = 0 ,;
( oQryADJ:adj_adjudicar := 1 ) ,;
( oQryADJ:adj_adjudicar := 0 ) ), ) }
PROCEDURE act_check( oQryAdj ) // ACTUALIZA CHECK PARA adjudicar
LOCAL cSql, oError
oQryAdj:REFRESH()
cSql := "UPDATE cronograma SET "
cSql += "adj_adjudicar=" + ClipValue2SQL( IF( oQryAdj:adj_adjudicar == 0, 1, 0 ) )
cSql += " WHERE adj_insc = '" + ClipValue2SQL( oQryAdj:adj_insc ) + "' "
TRY
oDatos:oConex:Execute( cSql )
CATCH oError
MSGALERT( oError:Description + CRLF + ;
"Error Grabando en Tabla (cronograma), Sentencia" + CRLF + CRLF + ;
cSql, oDatos:cTitMsg )
END
RETURN
Dios no está muerto...
Gracias a mi Dios ante todo!