PDA

Ver la Versión Completa : Detectar error winexec


grotero76
06-06-2008, 12:21:45
Hola a todos,

desde mi aplicación ejecuto un paquete dts de sql server con la siguiente instrucción:

winexec(PChar('dtsrun /S nombreservidor /U usuario /P password /N nombreDTS),SW_SHOW)<31

Mi pregunta es la siguiente:

¿Puedo detectar desde mi aplicación si se ha producido algún error al ejecutar el paquete?. El problema es que tanto si la ejecución del paquete ha ido bien como sino el programa continúa y no se sabe si realmente la ejecución del paquete se llevó a cabo con éxito.

Un saludo y muchas gracias.

xEsk
06-06-2008, 12:32:47
Hasta donde yo sé, si la aplicación al fallar no devuelve un valor indicando que ha fallado, no es possible detectarlo usando sólo el "winexec".

Me refiero, a los famosos "exit code".

Saludos.

grotero76
06-06-2008, 12:41:42
Gracias por tu respuesta,

el caso es que la función winexec devuelve lo mismo tanto si la ejecución fue bien como sino. Por ejemplo pruebo a ejecutar un DTS que existe y uno que no y el resultado de hacer el winexec lo capturo en una variable entera, siempre obtengo el mismo resultado, en mi caso un 33.

La verdad que no sé qué hacer.

Muchas gracias y un saludo.

Khronos
12-06-2008, 13:48:40
Hola!


uses Windows;

var
ExecError: DWORD;
begin

ExecError:=WinExec(pcahr('MiPrograma.exe'), 1);
If ExecError>31 then showmessage('MiPrograma.exe se ha ejecutado satisfactoriamente');

case ExecError of
0: showmessage('Error en la memoria');
ERROR_BAD_FORMAT: showmessage('Error en el formato del archivo');
ERROR_FILE_NOT_FOUND: showmessage('Archivo no encontrado');
ERROR_PATH_NOT_FOUND: showmessage('La dirección especificada no existe');
end;

end;


Salu2 espero que te sirva.

grotero76
14-06-2008, 19:34:58
Hola Khronos,

gracias por tu respuesta, he encontrado otro método de ejecución de DTS sin falta de usar una función DOS...
Lo pongo a continuación por si le sirve a alguien:


procedure EjecutarDTS;
var
pkg: Variant;
i:integer;
begin
pkg:= CreateOleObject('DTS.Package');
try
pkg.LoadFromSQLServer(datasourceName,UserName,Password,,,,,dtsName),'');
for i := 1 to pkg.steps.count do
pkg.steps.Item(i).executeinMainThread := True;
pkg.FailOnError := true;
pkg.Execute;
MessageDlg('La ejecución se ha realizado correctamente',mtInformation,[mbOK],0);
except
on E: Exception do
begin
showmessage('Error = ' + E.Message);
exit;
end;
end;
pkg.uninitialize;
pkg:=UnAssigned;
end;



Un saludo