Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=26)
-   -   Fallo en tarea programada. Lanzar programa con interfaz gráfica (https://www.clubdelphi.com/foros/showthread.php?t=86728)

fjcg02 23-09-2014 18:45:51

Fallo en tarea programada. Lanzar programa con interfaz gráfica
 
Hola amigos,
llevo un rato buscando y no encuentro nada para solucionar un pequeño-gran problema.

Resulta que tengo un programa hecho delphi, que extrae una serie de datos, abre una plantilla en excel, tira los datos al excel y salva el resultado en un fichero.

Este programa lo he movido a un servidor y funciona perfecto cuando lo ejecuto "a mano" desde una sesión abierta.

Ahora quiero planificar su ejecución a una hora de la noche en la que no estoy , y he aquí donde me encuentro el problema.

No funciona, ya que al día siguiente voy a buscar el fichero excel generado y no está. El programa no tiene log de actividad para ver sonde podría pararse ( esa es otra historia ).

Supongo que el problema es que al ejecutarse la tarea programada, a pesar de haberla configurado para que se ejecute con mi usuario, no puede arrancar el interface gráfico ya que no hay sesión de usuario abierta ni escritorio donde arrancar el programa y el excel.

Alguien ha tenido el mismo problema y lo ha solucionado ? Cómo?

Gracias por vuestra ayuda.

Un saludo

gatosoft 26-09-2014 01:57:09

Asumo que no tendrás el código fuente del programa para adaptarlo, lo cual hace irrelevante que esté hecho en Delphi... o en C....

Dices que cuando llegas al otro dia no ves el archivo, pero ¿has hecho la prueba en vivo?, quiero decir: has visto la tarea hacer lo que dice que va a hacer? (con tu sesion abierta), es solo por descartar...

Ya el otro tema es el de la sesion... Solo veo como opción que dejes una sesion de usuario abierta en la noche para que se ejecute....

ahora, si tienes el codigo fuente tendrías que extractar la funcionalidad y programarla como un servicio de windows....

bueno, no se me ocurre mas..

mamcx 26-09-2014 02:25:13

Cita:

Empezado por fjcg02 (Mensaje 481943)
a pesar de haberla configurado para que se ejecute con mi usuario, no puede arrancar el interface gráfico ya que no hay sesión de usuario abierta ni escritorio donde arrancar el programa y el excel.

Exacto. Esa es la razon.

La solucion es poner todo el proceso en un servicio de windows.

nlsgarcia 26-09-2014 03:58:13

fjcg02,

Cita:

Empezado por fjcg02
...un programa hecho en Delphi...extrae una serie de datos...abre una plantilla en Excel...tira los datos al Excel y salva el resultado...Este programa lo he movido a un servidor y funciona perfecto cuando lo ejecuto "a mano" desde una sesión abierta...quiero planificar su ejecución a una hora de la noche...No funciona...Supongo que el problema es que al ejecutarse la tarea programada...no puede arrancar el interface gráfico ya que no hay sesión de usuario abierta...

:rolleyes:

Revisa esta información:
Espero sea útil :)

Nelson.

fjcg02 26-09-2014 08:43:06

Gracias por vuestros consejos.

He llegado un poco más lejos. Por dar más pistas.
- El programa se conecta a varias fuentes de datos, extrae los mismos, abre el excel con un fichero que hace de plantilla y vuelco los datos en varias pestañas. Tiene varios "informes" que se pueden seleccionar, pero también permite lanzarlo desde la línea de comandos con el nombre del informe como parámetro.
- El programa funciona perfectamente cuando tengo la sesión abierta y lo lanzo.
- Para comunicar el programa con excel utilizo los servidores de delphi ( versión 7). Creo que es comunicación COM como se llama.

Cuando lo lanzo desde una tarea programada, no funciona. Lo lanzo desde un .bat, donde trazo los pasos que doy.
A pesar de que el programa no deja log ( no era su cometido inicialmente ) intuyo que el programa no puede conectarse con excel aunque lo arranca ( lo veo en la lista de procesos tras lanzarlo ). Al no poder conectarse, supongo que aparece un mensaje de error y queda esperando para siempre que el usuario invisible pulse el botón de "Aceptar" ese mensaje. El ejecutable está en la lista de procesos en ejecución.

Me queda cambiar toda la aplicación para que no arranque la interfaz gráfica, pero no tengo tiempo, y además llevamos esperando 5 meses que un gurú de java monte un aplicación nueva que sustituya a ésta ( que lo vea yo, todavía no lo creo) que hasta ahora funciona perfectamente aunque con alguna carencia . Por ese motivo tampoco me merece la pena modificarlo, estoy en una encrucijada.

Gracias de nuevo por vuestra ayuda. Seguiré investigando.

Un saludo

mamcx 26-09-2014 18:10:58

Recorde que MS no soporta el uso de automatizacion de office de modo servidor (osea, desatendido).

Aqui algunas ideas para darle vuelta:

http://bharathkumaran.wordpress.com/...ndows-service/

Sin embargo, es mejor y mas eficiente generar los archivos sin pasar por excel. Por ejemplo usando

http://www.tmssoftware.com/site/flexcel.asp

escafandra 28-09-2014 00:23:38

Una tarea programada corre como SYSTEM, un servicio también. El problema de correr como SYSTEM es que el interface gráfico está en otro escritorio que no corresponde con ningún usuario y no es accesible. En algún caso si lo es, como cuando desbloqueamos una sesión o al identificarnos al inicio de ésta. Posiblemente el programa tenga algún otro problema al ser system, además de éste. Para resolver el problema descrito, desarrollé un sistema que permite lanzar una aplicación GUI desde un servicio a nombre del usuario que tenga abierta la sesión activa (que se ejecuta como SYSTEM), no se si puede solucionar tu problema pero puedes intentarlo. Aquí tienes el enlace: Lanzar una aplicación GUI desde un servicio.


Saludos.

fjcg02 28-09-2014 10:43:50

Cita:

Empezado por mamcx (Mensaje 482163)
Recorde que MS no soporta el uso de automatizacion de office de modo servidor (osea, desatendido).

Aqui algunas ideas para darle vuelta:

http://bharathkumaran.wordpress.com/...ndows-service/

[/url]

He intentado esta solución. En un equipo con xp los pasos son exactamente los que indican el punto 4, permitir a otros usuarios sin sesión abierta activar el servidor dcom.

Sin embargo, en equipos con w7 no aparece en la lista de servicios dcom la aplicación excel.

Seguiré investigando a ver como se recogen los servicios dcom en w2008 y office 2010.

Gracias por vuestras observaciones.

Un saludo

nlsgarcia 28-09-2014 19:07:42

fjcg02,

Cita:

Empezado por fjcg02
...Seguiré investigando a ver como se recogen los servicios DCOM en Windows Server 2008 y Office 2010...

:rolleyes:

Revisa este vídeo:



Espero sea útil :)

Nelson.

fjcg02 01-10-2014 22:17:09

Bueno,
Después de probar todas las soluciones posibles, sigue sin funcionar.

Sólo me queda cambiar la aplicación para que no utilice excel o lo haga de otra manera. He encontrado una librería gratuita que lo hace, pero con delphi no es capaz de abrir un fichero para utilizarlo de plantilla. Sin embargo con lazarus sí ¿?.

A ver qué consigo...

Gracias a todos

Casimiro Notevi 01-10-2014 22:21:36

Cita:

Empezado por fjcg02 (Mensaje 482438)
... con delphi no es capaz de abrir un fichero para utilizarlo de plantilla. Sin embargo con lazarus sí ¿?.

¿Estás informando, preguntando o confirmando? :)

fjcg02 01-10-2014 22:57:20

Según el código sí se puede con lazarus, pero con delphi no. Lo que no he hecho todavía es probarlo...

Hay una función readfile o algo así pero está entre directivas de compilación {if FpC} o algo así.

No tengo el código a mano, mañana os confirmo el nombre de la librería...

Saludos

nlsgarcia 02-10-2014 01:27:40

fjcg02,

Cita:

Empezado por fjcg02
...Sólo me queda cambiar la aplicación para que no utilice Excel o lo haga de otra manera. He encontrado una librería gratuita que lo hace, pero con Delphi no es capaz de abrir un fichero para utilizarlo de plantilla...

:rolleyes:

Pregunto:

1- ¿Como se llama la Librería Free que mencionas?, ¿Cual es el link de la misma?.

2- ¿Probastes usar Automatización de Excel (Msg #4 Opción 2) en lugar de los componentes ExcelApplication, ExcelWorkbook y ExcelWorksheet ?.

3- ¿Tienes instalado Excel en el Servidor?, ¿Con que versión de Excel interactúa tu aplicación?, ¿En que versión de Windows Server se ejecuta tu aplicación?.

Espero sea útil :)

Nelson.

fjcg02 02-10-2014 09:22:47

Hola a todos,
intentaré ir por partes.

Mi código se conecta a excel vía servidores. He dejado en el código lo más relevante, tal como está o funciona pero es para que os hagais una idea.

Código Delphi [-]
...
    ExcelApplication1: TExcelApplication;
...

procedure TForm1.LLevaraExcel( Data: TClientDataSet);
var ...;
begin
LCID := GetUserDefaultLCID;
ExcelApplication1.Connect;
ExcelApplication1.Visible[0] := True;
ExcelApplication1.Workbooks.Open(DBEPlantilla.Text, False, False,
                                  EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                  EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                  EmptyParam,EmptyParam,LCID);


ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkBook);

ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0));
ExcelWorksheet1.ConnectTo(ExcelApplication1.Sheets[1] as _WorkSheet);
  try
    Data.First;
    while not(Data.eof) do
    begin
      bla, bla, bla...
      Data.Next;
    end;
  Except
     ShowMessage('Atención, se produjo un error en la transmisión.');
  end;
ExcelWorkbook1.SaveAs(DBEFicheroGenerado.Text,
                              -4143 {51}, emptyParam , emptyParam, false, false,
                              1, emptyParam, false, emptyParam, emptyParam,
                               emptyParam, 0);
ExcelWorkbook1.Close;
ExcelApplication1.Disconnect;
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;

end;

1- ¿Como se llama la Librería Free que mencionas?, ¿Cual es el link de la misma?.
La liberia que he nombrado es ésta

http://avemey.com/
ZEXMLSS for Lazarus, Delphi and C++Builder - Works with OpenDocument Format (ods)/Excel XML Spreadsheet/Office Open XML (xlsx) file format without installed Excel/OO Calc..
ZEXMLSSLIB 0.0.6 (beta)
Lazarus, Delphi 7, C++Builder 6.
Borland Developer Studio 2005, BDS 2006, CodeGear Delphi 2007,
CodeGear RAD Studio 2009, 2010, Delphi XE è Delphi XE2.

Permite crear ficheros en varios formatos.

La librería no permite abrir ficheros en Delphi, sí en Lazarus:
fichero xexlsx.pas de la libreria
Código Delphi [-]
...
{$IFDEF FPC}
function ReadXSLX(var XMLSS: TZEXMLSS; FileName: string): integer; deprecated {$IFDEF FPC}'Use ReadXLSX!'{$ENDIF};
function ReadXLSX(var XMLSS: TZEXMLSS; FileName: string): integer;
{$ENDIF}
...

2- ¿Probastes usar Automatización de Excel (Msg #4 Opción 2) en lugar de los componentes ExcelApplication, ExcelWorkbook y ExcelWorksheet ?.
No he probado la automatización Excel como indicas en el msg#4. Lo probaré. De hecho , me he dado cuenta ahora de que proponías otra solución.

3- ¿Tienes instalado Excel en el Servidor?, ¿Con que versión de Excel interactúa tu aplicación?, ¿En que versión de Windows Server se ejecuta tu aplicación?.
El programa se ejecuta en un equipo con W2008 server R2 y Excel 2007. Se ejecuta bien con la sesión abierta, se queda congelado con la aplicación lanzada desde una tarea programada. He revisado la configuración DCOM completa, dando permisos a todos los usuarios tal como indican en mensajes anteriores.
El programa también funciona en equipos con WXP, W7 y cualquier versión de Office , 2000, 2007 ó 2010, incluso con varias versiones instaladas.

Gracias a todos por vuestra ayuda.

Seguiremos informando...

fjcg02 02-10-2014 12:51:27

Cita:

Empezado por fjcg02 (Mensaje 482461)

2- ¿Probastes usar Automatización de Excel (Msg #4 Opción 2) en lugar de los componentes ExcelApplication, ExcelWorkbook y ExcelWorksheet ?.
No he probado la automatización Excel como indicas en el msg#4. Lo probaré. De hecho , me he dado cuenta ahora de que proponías otra solución.

He probado cambiando la parte de invocar excel sin componentes de la paleta servers y tampoco me funciona. Es decir, con sesión abierta OK, desde el planificador de tareas MAL.

Saludos

nlsgarcia 02-10-2014 18:07:57

fjcg02,

Cita:

...He probado cambiando la parte de invocar Excel sin componentes de la paleta Servers y tampoco me funciona...con sesión abierta OK...desde el planificador de tareas MAL...
:rolleyes:

Pregunto:

1- ¿Probastes la opción 1 del Msg #4?, allí se indica como iniciar un proceso como Administrador y como un Usuario Particular.

2- ¿Has probado hacer un programa de pruebas con acceso a una BD y ejecutarlo con la sesión abierta y cerrada?, la idea es simular las condiciones del programa en cuestión pero eliminando la variable de Excel y ver si el comportamiento es similar al descrito.

Espero sea útil :)

Nelson.

fjcg02 02-10-2014 19:02:09

Lo primero muchas gracias por tu ayuda Nelson.

Del último mensaje que incluyes, tengo una duda. ¿ es lo mismo ejecutarlo como administrador tal y como propones con el código que aportas de RunAs y ejecutar la tarea programada con un usuario con privilegios de administrador del equipo ?
El usuario con el que ejecuto la tarea programada es administrador de la máquina.

Respecto a las pruebas, estoy seguro de que si ejecuto el programa sin invocar a excel, funciona.

nlsgarcia 02-10-2014 19:42:19

fjcg02,

Cita:

...¿es lo mismo ejecutarlo como administrador tal y como propones con el código que aportas de RunAs y ejecutar la tarea programada con un usuario con privilegios de administrador del equipo?...
:rolleyes:

Te comento:

1- En algunas ocasiones realizando trabajos técnicos en Windows, aun teniendo un usuario con privilegios de administrador, he tenido que usar el usuario administrator de Windows que se creo durante la instalación del SO.

2- Te sugiero hacer las pruebas comentadas y ver cual es el comportamiento de la aplicación en cuestión.

3- Te sugiero hacer una prueba con un programa muy básico sin GUI que haga uso de Automatización en Excel y ver cual es el comportamiento de la aplicación en cuestión.

Espero sea útil :)

Nelson.

fjcg02 03-10-2014 09:31:18

Buenas de nuevo.

He realizado varias pruebas. Estos programas los he lanzado desde el task scheduler, es decir desde tareas programadas configurando la sesión con un usuario administrador del equipo donde se ejecuta.
Los resultados han sido los siguientes, a saber:

1.- Programa simple con GUI con un timer que se cierra a los 20 segundos-> Resultado OK.

2.- Programa simple con GUI con una consulta a la bbdd que se cierra tras realizar la consulta-> Resultado OK

3.- Programa de producción con toda la artillería con llamada a excel usando TExcelApplication de la paleta servers de delphi-> Nunca acaba.

4.- Programa de producción con toda la artillería con llamada a excel sin usar TExcelApplication de la paleta servers de delphi y utilizando automatismos como Nelson plantea -> Nunca acaba.

Me falta hacer la última prueba, que es modificar la aplicación para que no tenga GUI, pero no tengo suficiente tiempo para hacerlo. Intentaré hacerlo ( qué remedio ) pero no sé cuando, ya que me supone tirar el actual programa a la basura y hacer uno nuevo.


Si tengo algún avance, os informo.

Gracias a todos por aguantar la paliza... :)

nlsgarcia 03-10-2014 10:21:49

fjcg02,

Cita:

Empezado por fjcg02
...Programa de producción con toda la artillería con llamada a Excel sin usar TExcelApplication de la paleta Servers de Delphi y utilizando Automatismos como Nelson plantea -> Nunca acaba...

Cita:

Empezado por fjcg02
...la última prueba...modificar la aplicación para que no tenga GUI...me supone tirar el actual programa a la basura y hacer uno nuevo...

:rolleyes:

Te sugiero que antes de modificar todo el programa para ver si funciona sin GUI, hagas un ejemplo básico sin GUI que use Excel por medio de los componentes ExcelApplication, ExcelWorkbook, ExcelWorksheet y con Automatización en Excel y ver cual es el comportamiento de la aplicación, para ello sería conveniente incluir un log dentro del programa de pruebas para verificar en que punto falla la aplicación con ambos métodos.

Voy a hacer unas pruebas en un Servidor con Windows 2003 Standard y en lo que tenga los resultados te comento.

Nota: Si te es posible publica un ejemplo del uso de los componentes ExcelApplication, ExcelWorkbook y ExcelWorksheet.

Saludos,

Nelson.


La franja horaria es GMT +2. Ahora son las 23:32:02.

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