Rutina para tomar la hora del servidor

Y espero me puedan ayudar.. Encontré en internet esta rutina para tomar la hora del servidor.. Global PServerName As String, mifecha1 As Date, mihora1 As Date
Public Declare Function NetRemoteTOD Lib "NETAPI32.DLL" _
(yServer As Any, _
pBuffer As Long) As Long
Public Declare Function NetApiBufferFree Lib "NETAPI32.DLL" _
(ByVal lpBuffer As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, _
hpvSource As Any, _
ByVal cbCopy As Long)
Private Type TIME_OF_DAY
Elapsedt As Long
Msecs As Long
Hours As Long
Mins As Long
Secs As Long
Hunds As Long
Timezone As Long
Tinterval As Long
Day As Long
Month As Long
Year As Long
Weekday As Long
End Type
Const NERR_SUCESS = 0
Public Function fndServerTime() As Date
Dim udttime As TIME_OF_DAY
Dim pudtTime As Long
Dim lResult As Long
Dim abServer() As Byte
Dim dServDate As Date
'Dim PServerName As String
Dim TPTR
Dim msg As Boolean
Dim i As Integer
PServerName = "AAlfaro"
'Procedimientos: controlar que los usuarios no les cambien la fecha en cada PC //Por: Angela Alfaro //Fecha: Junio 2003
For i = 0 To 10000
abServer = "\\" & PServerName
lResult = NetRemoteTOD(abServer(0), pudtTime)
If lResult = NERR_SUCESS Then
Exit For
End If
mifecha1 = 0
mihora1 = 0
Next i
If lResult = NERR_SUCESS Then
'Ahora hay que copiar esa zona de memoria a nuestro udt.
CopyMemory udttime, ByVal pudtTime, Len(udttime)
NetApiBufferFree (TPTR)
'Por ultimo montamos la fecha
With udttime
dServDate = DateSerial(.Year, .Month, .Day)
mifecha1 = DateSerial(.Year, .Month, .Day)
dServDate = dServDate + TimeSerial(.Hours, .Mins - .Timezone, .Secs)
mihora1 = TimeSerial(.Hours, .Mins - .Timezone, .Secs)
fndServerTime = dServDate
'Date = DateSerial(.Year, .Month, .Day) 'dServDate
'Time = TimeSerial(.Hours, .Mins - .Timezone, .Secs)
End With
End If
End Function
Pero cuando la ejecuto en un servidor con terminal server y con access 2000 runtime, esta se toma todos los recursos de la maquina y debido al acceso que hace no deja entrar a nadie. ¿Qué debo hacer? Por favor ayuda! Si alguien tiene por ahí otra rutina menos pesada
1

1 Respuesta

90.125 pts. Ingeniero en Informatica (5 años) Ingeniero Técnico en...
Efectivamente, tienes que llamar a la función fGetServerTime pasándole el nombre del servidor en formato NT (con las dos barras inversas delante), es decir, si tu servidor se llama elservidor, tienes que hacer
msgbox fGetServerTime("\\elservidor")
No te preocupes por lo de NT, pues si vale para NT debe valer para 2000, XP y 2003. Tradicionalmente se pone que es para NT cuando se quiere distinguir entre la serie 'de juguete' (Win95, 98, ME) o seria (NT, 2000, XP, 2003). El NT es el bajo de la serie seria, te servirá para el resto.
Ah! No me puntúes hasta no saber cómo va y listos, resulta que si me pongo como 'disponible' inmediatamente todo el mundo me envía las preguntas a mí, es un poco excesivo. Prefiero verlas en el tablón y si pienso que puedo ayudar entonces contesto.
Hola 1000 Gracias por contestarme.. últimamente en todoexpertos me tienen un poco olvidada, Pues por la ayuda de un "experto" en el trabajo me dijo que lo metiera en una iteración de esa cantidad para el timeout. Porque la rutina original no tenia ese bucle. Estuve mirando tu rutina y es la misma, ¿lo qué me da algo de duda es que preguntan por una variable strServer pero no se donde la capturan y le dan valor? ¿La doy por parámetro cierto? Y por otro lado dice que solo el código trabaja sobre WINNT y yo tengo es WIN2000 vía terminal claro. ¿Sera qué así funciona? Muchisisiisismas Gracias por responderme en tiempo veloz. Voy a probar con tu rutina y espero que con el favor de Dios me funcione. Me gustaría que me contactaras o mejor dicho poder contactarte para decirte como me fue .. ya que una vez que te califique la respuesta no podre preguntarte.
Gracias
8-|
Bueno, veo que eres explicita. En fin.
Por comparación con la rutina casi idéntica que puedes ver en
http://www.mvps.org/access/api/api0039.htm
Me llama la atención que la que indicas no tiene en cuenta la conversión a unicode. Quizá es lo que te provoca errores que hacen que en un equipo vaya y en otro no. Huele a algo de eso. Ah! Y me sorprende muy mucho que la rutina que muestras llame al API en un bucle que se repite 10000 veces si hay error, cosa que por lo visto es lo que sucede. 2 ó 3 veces sería razonable, pero ¿10000? Teniendo en cuenta que esta llamada al API tiene un retardo considerable, llamarla 10000 veces desde luego se puede llevar un ratillo, y dar apariencia de 'colgado'.
Mmmm Prueba con la que te he indicado más arriba, a ver si hay suerte. No tengo Terminal Server para probarlo yo.
Suerte
Hola.. gracias.. te cuento que estoy utilizando tu rutina.. la que me dijiste de la web, te cuento mejor que es lo que me sucede. En esa rutina existe una variable .tod_hours que me imagino trae la hora de la API cuando son las 9 en el servidor esta variable me trae el valor de 14 cuando realiza la operación pues sale unos valores negativos pues de acuerdo a lo que resta. No se si se deba tener unas características para la configuración regional. No se que hacer eso no me funciona.
¿Dónde esta el timeserial? ¿En el llamado de sapiCopyMemory?
No podría usar el net time para, ¿luego de manipular el resultado a través de cadenas obtener de ahí la hora del servidor? ¿De ser así sabes la forma?
Mmm. He probado la rutinita y a mi me funciona perfectamente, pero claro, eso no quiere decir que a ti te tenga que funcionar, aunque debería.
Si te sirve,
shell "cmd /C net time \\aytos_cpd > C:\kk.txt"
Te crea un archivo en c:\ de nombre kk.txt con el resultado de la fecha y la hora del servidor, tendrías que abrirlo y procesarlo a mano.
En cuanto al timeserial, me refería al que tenías en tu rutina original. En la de la página web se hace lo mismo, pero como el resultado devuelto es una cadena, lo hace de otra forma.
Pon un breakpoint (con F9) en la línea que dice
strOut = .tod_month & "/" & .tod_day & "/" _
& .tod_year & " "
(Sitúas el cursor, pulsas F9 y te queda en rojo).
Ejecuta el programa, que se cortará cuando llegue a ese punto con la línea en amarillo.
Ahora puedes ver el valor de las variables dejando el cursor del ratón encima, sin hacer click, te saldrá una etiqueta en amarillo...
En la misma línea en amarillo, comprueba .tod_month, .tod_day, .tod_year, deben contener la fecha actual
Un poco más abajo, comprueba .tod_hours, .tod_mins. Deberían tener la hora GMT EN EL MERIDIANO DE GREENWICH (o como se escriba). Tú sabrás en que país estás y que corresponde.
Comprueba un poco más arriba de la línea amarilla la variable .tod_timezone. Debería contener el número de minutos de diferencia entre GMT y tu hora local, que debería ser múltiplo de 60.
Hecho esto, y supongo que antes, deberías poder ver dónde está el problema (espero)
Hola.. otra vez y gracias por tu paciencia.
Te cuento que todo eso ya lo he probado las variables que están para la fecha salen ok. Pero el de la hora .tod_hours es el que me esta dando el problema hago el seguiento paso a paso y con el watch pero cuando paso el llamado de la API Call sapiCopyMemory(tSvrTime, ByVal lngPtr, Len(tSvrTime)) y miro el valor de las variables de fecha están ok pero cuando llego a la de la hora .. esta sale en blanco cuando la hora del servidor esta en las 7 de la noche.
Eso es lo que no entiendo porque no funciona. La rutina que tenia yo esa es muy pesada y bloquea el acceso a la aplicación aun quitando el ciclo que le puse. En cambio la que tu me enviaste de web esa no demora el acceso el problema radica en la hora.:(
Gracias
Se me ocurre
Abre una ventana de msdos y escribe
net time \\servidor
Y pulsa enter, te debe mostrar la hora del servidor, sólo para sacarte de dudas acerca de si la está dando bien.
Si con net time la da bien, y sólo para probar, donde en la rutina se hace el timeserial quita el .timezone, que es lo que peor me huele de todo lo que veo. A ver si así por lo menos conseguimos que el desfase sea un número entero de horas, fácil de arreglar.
Y me cuentas a ver si llegas a algún sitio útil... y dime si estás usando tu rutina original o la de la web que te pasé, por concretar
Hola.. como estas.. te cuento que probé la rutina y me funciona hasta cierto punto.. cuando le doy el nombre del servidor (\\Servidor), este me trae la fecha bien .. pero siempre que lo ejecuto me dice que es mayor de 12 y trae una hora discordante. Cuando son las 08:00:23 a.m. por decir un ejemplo me muestra 04:39:¿25 p.m. no se porque se deba ...? ¿Qué debo hacer?
¿Me ayudas?
Gracias por tu atención.
Francamente, ya no se. Una diferencia en horas suele venir por la zona horaria, pero a estas alturas ya no sé que decirte, tan sólo que yo he copiado&pegado la rutinita de marras y a mí me funciona perfectamente.
No sé si te vale o es demasiado cutre, pero el caso es que para tomar la hora con net time te valdría
Function lahora(serv$) As Date
Dim t$, i%, fecha As Date
Shell "cmd /C net time " & serv & " > C:\kk.txt"
Open "c:\kk.txt" For Input As 1
Input #1, t$
Close 1
i = InStr(t, "/")
t = Mid(t, i - 2)
lahora = CDate(t)
End Function
Le tienes que pasar, igual que en las otras, el servidor que tengas con dos barritas por delante, y devuelve directamente la fecha y hora correspondiente
Vale ;) Menuda se ha montado con esta preguntita de marras...
Y conste que ya te venía insistiendo con lo de la configuración del meridiano y todo eso porque es uno de los quebraderos de cabeza habituales con estas funciones, pero es que yo estoy en España y aquí tenemos la misma hora que en Greenwich (Inglaterra) por lo que no tenemos estos problemas.
En fin, que hasta la próxima, y me alegro de haber podido ser de ayuda.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas