Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas lanzando el ejecutable desde tarea programada (https://www.clubdelphi.com/foros/showthread.php?t=95092)

juggern 24-02-2021 10:23:18

Problemas lanzando el ejecutable desde tarea programada
 
Buenos días chicos,

Os traigo otro problemilla de estos raros que me pasan.

Verán, tengo una aplicación que se puede ejecutar normal o lanzarla desde tarea programada para que lo haga todos los días a cierta hora.
Lo tengo en muchos clientes y en todos funciona, salvo en uno, que de repente ha empezado a no funcionar a medias.
Verán, cuando arranco yo el programa y lanzo el proceso desde un botón que tengo, funciona bien, pero cuando lo lanza la tarea programada, no funciona bien.

El fallo principal, es que coge una fecha guardada en un .ini. Cuando lo lanzo desde el botón, coge bien esa fecha, pero cuando lo lanza la tarea programada, no me reconoce la fecha y me guarda la fecha mínima de sql.
La tarea tira del mismo ejecutable y del mismo .ini, lo he comprobado.
Para leer esta fecha hago lo siguiente:
Código Delphi [-]
fecha:= oArchivo.ReadDateTime('FECHA', 'UltimaFecha', 31/12/2000);

Como os comento, esto me funciona en todos los clientes, incluso en este llevaba funcionando un año hasta que ha empezado a pasar esto.

Dándole vueltas a alternativas, he probado a guardar la fecha como string y luego pasarla a fecha. De esta manera, el string me lo guarda bien, pero a la hora de pasarlo a Date, el programa se para.
De nuevo es muy raro, porque si lo lanzo manualmente funciona, pero a través de la tarea programada, no funciona.
Código Delphi [-]
    fechastring:= oArchivo.ReadString('FECHA', 'UltimaFecha', '31/12/2000');
    fechadate:= StrToDate(fechastring);

Se para en el guardado en fechadate, lo he comprobado guardando logs.

Me tiene un poco loco esto.

Se os ocurre algo?

Muchas gracias

kuan-yiu 24-02-2021 10:56:47

Sin más datos parece que se debe a una actualización reciente de Windows, seguramente un tema de permisos.

juggern 24-02-2021 11:05:28

Lo tengo puesto como administrador y ejecutar con los privilegios más altos.

Igualmente es que es muy raro, porque no funcionan cosas como strtoDate, que no entiendo en que puede influir que lance el proceso con un botón o con tarea programada.

Estoy bastante perdido.

En el botón le tengo puesto simplemente lanzar el procedimiento y en la tarea programada, lanzo el procedimiento que lo puse como parámetro dentro del ejecutable.

:(

Casimiro Notevi 24-02-2021 11:27:34

¿El formato de fechas en ese equipo?

kuan-yiu 24-02-2021 11:32:54

Esos errores que surgen de la noche a la mañana no suelen ser por nada de tu aplicación sino por el entorno en el que se ejecuta.
Revisa (solo por descartar) si la tarea se ejecuta correctamente en otro puesto que tenga el mismo sistema operativo y la misma actualización, la misma versión de tu programa, de tu base de datos, de fecha.
Si yo te contara la de cosas extrañas que me han sucedido por actualizaciones: pdfs que ya no abre acrobat, impresoras que solo imprimen la primera hoja o que dejan de imprimir después de x veces, mensajes que quedan por detrás de otra ventana...

juggern 24-02-2021 11:34:40

Voy a revisar todo eso a ver, sobre todo lo del formato de fechas porque si que veo que cuando me coge la fecha base de sql que es 30/12/1899, me pone 12/30/1899, puede ir por ahí, pero no entiendo porqué entonces falla cuando lo lanzo de una manera y no falla de la otra.

Me edito:

Nada, la fecha no parece ser, es un windows server 2008.

No entiendo nada, es un simple StrtoDateTime que funciona al ejecutarlo de una forma y de la otra no. No se.
Debe de ir por ahí porque si hago, al coger el dato del ini. ReadString, me lo lee bien, pero si hago un .ReadDateTime para guardarlo en un TDateTime, no lo coge bien.

juggern 24-02-2021 12:47:08

Os enseño más pruebas que estoy haciendo.

El .ini tiene lo siguiente:
Cita:

[FECHA]
UltFecha=24/02/2021 12:36:13
En el código me he creado 2 variables, una string sUltFecha y otra datetime dUltFecha.

He hecho que me escriba mensajes en un fichero.

El código es:
Código Delphi [-]
    sUltFecha:= oArchivo.ReadString('FECHA', 'UltFecha', '31/12/1999');
    WriteLN(Fich, 'FECHA STRING : '+sUltFecha);
    dUltFecha:= oArchivo.ReadDateTime('FECHA', 'UltFecha', 31/12/1999);
    WriteLN(Fich, 'FECHA DATETIME: '+DateTimetoStr(dUltFecha));

Si lo lanzo arrancando el exe y dándole al botón que llama al procedimiento, me escribe esto en el fichero:

Cita:

FECHA STRING : 24/02/2021 12:35:02
FECHA DATETIME: 24/02/2021 12:35:02
Si lanzo el procedimiento a través de la tarea programada, me escribe esto en el fichero:

Cita:

FECHA STRING : 24/02/2021 12:36:13
FECHA DATETIME: 12/30/1899 12:01:51 AM
No lo entiendo, en el equipo no veo nada raro y no se ha actualizado.

juggern 24-02-2021 13:48:17

Perdón, copié mal la primera cita de las 2 de abajo, las horas son 12:36:13, es decir, coge bien el dato ejecutándolo así.

movorack 24-02-2021 14:50:04

Hace unos días tuve un inconveniente parecido con el consumo de un servicio.

Al hacerlo el consumo desde la sesión de usuario el formato de decimales era con coma ",". Pero al hacerse por medio de un tarea programada el formato de decimales era con punto ".".

La solución fue copiar la misma configuración regional a todos los demás usuarios y cuentas del sistema.

Aplicar la configuración regional y de idioma a cuentas reservadas


Casimiro Notevi 24-02-2021 15:08:49

Además de lo que comenta movorack, ¿Esto está bien o falta las comillas?
Código Delphi [-]
dUltFecha:= oArchivo.ReadDateTime('FECHA', 'UltFecha', 31/12/1999);  // ¿Faltan comillas?
dUltFecha:= oArchivo.ReadDateTime('FECHA', 'UltFecha', '31/12/1999');  // así

juggern 24-02-2021 15:51:51

Hola chicos,

En cuanto pueda pruebo lo que comenta movorack y os digo.

Respecto a lo otro, está bien, funciona sin comillas, si le pongo comillas da error porque no espera un string.

Un saludo

movorack 24-02-2021 15:58:08

Cita:

Empezado por juggern (Mensaje 540175)
está bien, funciona sin comillas, si le pongo comillas da error porque no espera un string.
Un saludo

Debes tener en cuenta que la fecha en Delphi es un valor decimal, por ello no te genera error.


Cita:

Empezado por Casimiro Notevi (Mensaje 540173)
Código Delphi [-]
dUltFecha:= oArchivo.ReadDateTime('FECHA', 'UltFecha', 31/12/1999);  // ¿Faltan comillas?

Pero lo que haces aquí es pasar como fecha el resultado de la división entre 31, 12 y 1999 = 0,00129 = 30/12/1899 12:01:51 a.*m.

Si quieres pasar el valor de fecha por defecto con una cadena puedes convertir el string a date

juggern 24-02-2021 16:18:10

Hola de nuevo,

Acabo de probarlo y tienen todas la misma configuración. Aún así, por si acaso, lo he hecho pero nada, no funciona.

Si lo paso asi
Código Delphi [-]
oArchivo.ReadDateTime('FECHA', 'UltFecha', StrToDateTime('31/12/1999'));

No pasa de ahí, pero ese no es el principal problema, porque esa es la fecha por defecto si no hubiera nada en el .ini, pero si que tiene datos, el problema es que no me está cogiendo bien esos datos como fecha cuando lo ejecuto desde tarea.

En vista de que sí que me coge el dato del .ini como string, he probado a guardarlo en string y luego ese valor, guardarlo en otra variable TDateTime haciendo la conversión
Código Delphi [-]
WriteLN(Fich, '1');
fechacadena:= oArchivo.ReadString('FECHA', 'UltFecha', '31/12/1999');
WriteLN(Fich, '2');
fecha:= StrtoDateTime(fechacadena);
WriteLN(Fich, '3');

Pero haciendo esto, el programa se para en la instrucción como si diera error. En el fichero solo guarda hasta el 2, al 3 no llega. Esto, al igual que antes, pasa si lo lanzo desde el programador de tareas, si lo lanzo desde el botón, funciona bien, pinta el 3.

movorack 24-02-2021 21:58:16

Cita:

Empezado por juggern (Mensaje 540179)
Código Delphi [-]
WriteLN(Fich, '1');
fechacadena:= oArchivo.ReadString('FECHA', 'UltFecha', '31/12/1999');
WriteLN(Fich, '2');
fecha:= StrtoDateTime(fechacadena);
WriteLN(Fich, '3');

Pero haciendo esto, el programa se para en la instrucción como si diera error.

¿Qué error te genera?

--

Una prueba que puedes hacer es establecer el formato que debe manejar la función StrToDateTime enviándole el formato de fecha que tienes en el .ini por medio del parámetro AFormatSettings.

juggern 25-02-2021 12:00:25

Pues nada, parece que se ha arreglado solo. Estaba haciendo pruebas y nada pero en una de las veces que he reiniciado el equipo, y han sido muchas, de repente parece que ya va bien.

Casimiro Notevi 25-02-2021 12:38:57

:confused::confused::confused::confused::confused::confused::eek:

juggern 25-02-2021 13:17:31

Cita:

Empezado por Casimiro Notevi (Mensaje 540192)
:confused::confused::confused::confused::confused::confused::eek:

Si si, no entiendo nada, y el equipo no lo ha tocado nadie, asique no han cambiado nada.

Ni idea.


La franja horaria es GMT +2. Ahora son las 17:46:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi