Hola amigo.
Yo tengo una rutina que la uso para saber cuales son los usuarios que están en el sistema a la hora de generar los indices.
Para verificar que solo se está en la PC que van a ejecutar tal operación.
Basicamente la función lo que hace es guardar en una tabla los usuarios que ingresan al sistema. (Nombre de PC y Usuario de Windows)
La tabla solo tiene esos dos campos.
NI bien ingreso al sistema hago lo siguiente:
- Code: Select all Expand view RUN
USE ENUSO NEW
DATABASE oDbfUso
oDbfUso:bEof:=nil
oDbfUso:GoTop()
oDbfUso:Blank()
oDbfUso:PCNOMBRE:=GetEnv("COMPUTERNAME")
oDbfUso:PCUSER :=GetEnv("USERNAME")
oDbfUso:Append()
oDbfUso:Save()
oDbfUso:UnLock()
oDbfUso:CLOSE()
Al salir del sistema hago lo siguiente para borrar el registro de que indica que el usario está en el sistema.
- Code: Select all Expand view RUN
USE ENUSO NEW
DATABASE oDbfUso
oDbfUso:bEof:=nil
oDbfUso:SetOrder(1)
oDbfUso:GoTop()
DO WHILE !oDbfUso:Eof()
IF ALLTRIM(oDbfUso:PCNOMBRE)=ALLTRIM(GetEnv("COMPUTERNAME")) .AND.;
ALLTRIM(oDbfUso:PCUSER)=ALLTRIM(GetEnv("USERNAME"))
oDbfUso:RecLock()
oDbfUso:Delete()
oDbfUso:UnLock()
ENDIF
oDbfUso:Skip()
ENDDO
oDbfUso:CLOSE()
Lo hago secuecialmente ya que generalmente no van a haber muchos usuarios en el sistema. Si fueran 100 esto igual sería muy rápido.
Bueno a la hora de ejecutar la función de generar índices ejecuto antes la siguiente función:
- Code: Select all Expand view RUN
Function VerificaUsuarios(SiUser)
Local oDbfUso,C,PC,User
C:=0
USE ENUSO NEW
DATABASE oDbfUso
oDbfUso:bEof:=nil
oDbfUso:GoTop()
DO WHILE !oDbfUso:Eof()
IF ALLTRIM(oDbfUso:PCNOMBRE)<>ALLTRIM(GetEnv("COMPUTERNAME")) .AND.;
ALLTRIM(oDbfUso:PCUSER)<>ALLTRIM(GetEnv("USERNAME"))
C++
IF C=1
PC :=ALLTRIM(oDbfUso:PCNOMBRE)
User :=ALLTRIM(oDbfUso:PCUSER)
SiUser:=.t.
MsgStop("El usuario: ''"+User+"'' en la PC de la red: ''"+PC+"'' se encuentra utilizando el sistema"+CHR(13)+;
"Por favor, cierre el sistema en todas las PCs de la Red para poder realizar esta operación",;
"Imposible reindexar sistema")
EXIT
ENDIF
ENDIf
oDbfUso:Skip()
ENDDO
oDbfUso:CLOSE()
Return nil
Luego dentro de mi función reindexar la llamo asi:
- Code: Select all Expand view RUN
Function Reindexa()
Local SiUser:=.f.
VerificaUsuarios(@SiUser)
IF SiUser
Return nil
ENDIF
// Sigue el proceso
...
...
...
Return nil
Quizá hay formas más sencillas de hacer esto, pero es la forma que a mi se me ocurrió.
Espero puedas adaptar esto a tus necesidades.
Saludos,
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda