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 |
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.. |
Cita:
La solucion es poner todo el proceso en un servicio de windows. |
fjcg02,
Cita:
Revisa esta información: Cita:
Nelson. |
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 |
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 |
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. |
Cita:
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 |
fjcg02,
Cita:
Cita:
Espero sea útil :) Nelson. |
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 |
Cita:
|
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 |
fjcg02,
Cita:
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. |
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.
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
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... |
Cita:
Saludos |
fjcg02,
Cita:
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. |
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. |
fjcg02,
Cita:
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. |
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... :) |
fjcg02,
Cita:
Cita:
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. |
Retroalimentando el problema.
He hecho una prueba simple. 1.- Programa simple que invoca a excel y crea un archivo CON SERVERS, finalmente se cierra de forma automática.
2.- Programa simple que invoca a excel y crea un archivo con automatización, finalmente se cierra de forma automática.
LOS DOS FUNCIONAN cuando los programo como tareas planificadas. Ya no sé por dónde pegarle, estoy más confundido que antes... Saludos |
He ampliado las pruebas, y he añadido poner unos valores en algunas celdas.
Quería descartar que el error se provocara al dar los valores. También funciona. Saludos |
fjcg02,
Cita:
Pregunto: 1- ¿Puedes incluir en dichos programas que la creación de los archivos de Excel sea con datos de la BD de la forma más simple posible y ver su comportamiento?. 2- ¿Que versión de Excel esta instalada en el Servidor?, ¿Es la misma del problema en cuestión?. Espero sea útil :) Nelson. |
Cita:
Respecto a la interface GUI, ... Los programas que he realizado la tienen ( tform1 ). No sé, estoy un poco desorientado... :confused: Saludos |
fjcg02,
Cita:
Pregunto: ¿Puedes incluir todos los controles del programa original en los programas de prueba pero sin darle ninguna funcionalidad a ver cual es el comportamiento?, recuerda en lo posible realizar la prueba sugerida en el Msg #23 Espero sea útil :) Nelson. |
Sigo probando...
He metido un log al programa, y observo que no hace nada!!!! Me parece que lo he pillado, al intentar abrir una bbdd local no la encuentra. Voy a modificarlo para que le meta la ruta completa del archivo. Es un mdb que se encuentra en la misma ruta que el ejecutable. Os informo con el resultado. Me parece que esta es la buena... Saludos PD: Nelson, he metido controles en las pruebas simples que hice ayer y sigue funcionando todo. Eso es lo que me ha llevado meter la traza. |
POR FIN...
queda demostrado que soy un verdadero burro. EL problema era que al arrancar el programa de forma desatendida, no sabía en qué directorio estaba la bbdd local en la que están definidos todos los informes con los archivos de plantillas, los archivos de salida, con las pestañas correspondientes y sus querys . Añadiendo al arranque del programa que me coja la bbdd del path del ejecutable, y construyendo la cadena de conexión en tiempo de ejecución, zas, funcionamiento al canto!! Muchísimas gracias a todos los que me habeis ayudado, especialmente a Nelson. Lo que queda demostrado es que un programa a pesar de tener interfase gráfica puede ejecutarse perfectamente como una tarea programada. Obviamente, este programa lanzado así, deberá disponer de los mecanismos necesarios para que haga lo que tenga que hacer sin intervención del usuario. En mi caso, le envío un parámetro, que es el informe que quiero lanzar. Si hay parámetro, llamo a una función que me localiza el informe en el dataset y "simula" hace rclick al botón que dispara el procedimiento. Finalmete, cierra la aplicación de forma ordenada. Muchas gracias a todos de nuevo y un saludo |
fjcg02,
Cita:
Cita:
Cita:
Saludos, Nelson. |
La franja horaria es GMT +2. Ahora son las 08:38:27. |
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