Las funciones DbSeek y MsSeek tienen básicamente la misma funcionalidad, la diferencia está en que la función MsSeek tiene la ventaja de no necesitar acceder nuevamente a la base de datos para ubicar una información ya utilizada por la thread (conexión) activa.
De esta manera, la thread mantiene en memoria los datos necesarios para reposicionar los registros ubicados por medio del comando DbSeek (en este caso, el Recno()), de tal manera que la aplicación puede simplemente realizar la marcación sin ejecutar la búsqueda nuevamente.
La diferencia entre el DbSeek() y el MsSeek() se nota en aplicaciones con gran volumen de marcaciones, como informes, que necesitan referenciar diversas veces el mismo registro, durante una ejecución.
Realizamos una prueba comparando los dos desempeños en una repetición de 100.000 veces.
Tiempo utilizado con la función DbSeek: 45.17
Tiempo utilizado con la función MsSeek: 21.93
Prueba:
// DbSeekVsMsSeekTest.prw
#INCLUDE "TOTVS.CH"
Static nVezes := 100000
// Llama la función por separado probando cada escenario
Function TestSeek()
// Realiza la preparación de entornos
RpcSetEnv("T1","D MG 01") // Empresa y Sucursal
Sleep(5000)
// Prueba con DbSeek
TestDbSeek()
// Prueba con MsSeek
TestMsSeek()
// Fecha entorno
RPCClearEnv()
Return
Static Function TestDbSeek()
Local nSeconds:= 0 // Segundos en que se inició la
Local nX := 0 // Contador de repeticiones
nSeconds := Seconds()
For nX := 1 To nVezes
DbSelectArea("SA1")
DbSetOrder(1) // SIX -> A1_FILIAL+A1_COD+A1_LOJA
DbSeek(XFilial("SA1") + "000001" + "01" )
Next
ConOut("Tiempo: " + AllTrim(Str(Seconds() - nSeconds)) )
Return
Static Function TestMsSeek()
Local nSeconds:= 0 // Segundos en que se inició la
Local nX := 0 // Contador de repeticiones
nSeconds := Seconds()
For nX := 1 To nVezes
DbSelectArea("SA1")
DbSetOrder(1) // SIX -> A1_FILIAL+A1_COD+A1_LOJA
MsSeek(XFilial("SA1") + "000001" + "01" )
Next
ConOut("Tiempo: " + AllTrim(Str(Seconds() - nSeconds)) )
Return