PDA

Ver la Versión Completa : Ejecutar dts si no se realiza copia en ftp!!


Melissa_12
13-11-2012, 18:21:24
Hola tengo un problema en el que llevo varios dias trabajando y buscando pero no encuentro nada. Me seria muy muy util su ayuda y de antemano agradezco.
El problema es el siguiente:
Tengo un metodo que copia en un ftp un determinado archivo con TIdFTP, eso lo hace correctamente. Quiero que cuando no se pueda producir esa copia debido a alguna falla que pueda presentar el sistema se active un dts que copie el archivo en el ftp, eso ya lo tengo hecho tambien, o sea el dts funciona correctamente cuando lo hago de forma manual. Ahora el problema seria que cuando no se pudiera realizar la copia mediante el metodo que tengo implementando el dts se ejecute hasta que la copia se realice correctamente, porque puede ser que lo intente la primera vez y no se copie el archivo en el ftp, o sea que siga intentandolo hasta que el archivo se haya copiado correctamente.
Muchas Gracias desde ya por la atencion brindada.

Casimiro Notevi
13-11-2012, 18:26:56
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

¿Y qué tiene que ver esto con SQL?

Melissa_12
13-11-2012, 21:22:10
Pense que si mi pregunta trataba sobre los dts quizas el mejor lugar para ponerla era en el foro de sql pero ya que la movieron pues debe ser aqui el mejor sitio.
Concretamente quisiera saber si existe alguna forma de ejecutar un dts hasta que realice la copia de la informacion a un ftp de forma satisfactoria. Gracias.

roman
13-11-2012, 21:47:39
¿Qué es un dts?

// Saludos

movorack
13-11-2012, 21:48:37
Que pena... pero que es exactamente un dts?

Ahora si lo que entendí es correcto. lo que necesitas es validar el resultado de la operación para intentar repetirla si fué fallida.

Podrías crear una función para subir al ftp que te devuelva el resultado de la carga (True/False) y si es false validar para volver a ejecutar n veces hasta obtener el resultado correcto.

Algo así:


function SubirEnFTP : boolean;
begin
try
//lineas para subir
Result := True;
except
//Lineas para el manejo del error
Result := False;
end;
end;

procedure SubirArchivos
var
CanIntentos : Smallint;
begin
CanIntentos := 5;
while CanIntentos > 0 do
begin
if SubirEnFTP then
Break;
dec(CanIntentos);
end;
end;

ecfisa
13-11-2012, 21:54:23
Me extraña, roman y movorac... : DTS (http://es.wikipedia.org/wiki/Digital_Theater_System) :)

Saludos.

Melissa_12
13-11-2012, 22:11:39
Hola, gracias por responder. Los DTS, por sus siglas en ingles son Data Transformation Services, y vienen incluidos dentro de SQL Server 2000, son paquetes de ejecucion de tareas, que como ya dije anteriormente mediante uno ya logro que me copie un archivo en el ftp en caso que mi metodo implementado falle.
Pero el problema es el siguiente: puede ser que el usuario quiera copiar el archivo en el ftp y en ese momento el sitio no este disponible, el usuario cierra la aplicacion y el dts debe ser capaz, de continuar con la copia del archivo, hasta que la realice correctamente, no parará, el usuario cerró el sistema pero la base de datos se mantiene corriendo en el servidor.

ecfisa
13-11-2012, 22:19:50
Hola.

Aclarado el término, moví el hilo al foro MS SQL Server.

Saludos.

ecfisa
14-11-2012, 03:31:52
Hola Melissa_12.

Como te habrás dado cuenta mi conocimiento sobre MS SQL Server (y sobre todo de DTS) es muy pobre, pero te pongo unos enlaces donde se relaciona a Delphi con ellos:

Ejecutar DTS SQL Server desde Delphi (http://neftali.clubdelphi.com/?p=185)
Ejecución de un DTS de SQL Server (http://www.clubdelphi.com/foros/showthread.php?t=57261)
Correr un DTS de sql server desde delphi (http://www.clubdelphi.com/foros/showthread.php?t=27083)

Espero que alguno te sea de utilidad.

Saludos. :)

Casimiro Notevi
14-11-2012, 10:52:57
Yo tampoco sabía qué era eso de DTS, está claro.

Melissa_12
14-11-2012, 14:40:56
Hola!, gracias por responder.
Esos ejemplos estan muy buenos, de hecho si creo que me sirvan para llamar al DTS la primera vez si la copia falla cuando lo trate hacer desde mi metodo, pero el problema es que necesito que cuando el usuario cierre la aplicacion SQL Server continue tratando de realizar la copia en el ftp. He leido algo que se puede hacer con los Jobs de SQL pero no se muy bien como hacerlo, ademas que no se como parar cuando la copie se realice de forma correcta en el ftp. Alguien me dijo que el ftp puede tener variables que se activan cuando la copia se hace correctamente y se desactivan cuando se produce algun error pero la verdad es que no se me ocurre como hacerlo. Alguna idea se los agradecere. Graciassssss.

movorack
14-11-2012, 15:44:35
Hola melissa_12

Pues, básicamente es una mezcla de los aportes que te hemos dado y un poco mas de investigación de tu parte.

EL primer paso es: Si al subir al FTP falla ejecute el DTS si no trabaje normalmente. Esto se puede conseguir muy fácil. Solo debes agregar un manejo de errores al proceso de subida y puedes si quieres meterlo dentro de una función para que te sea mas fácil.


function SubirEnFTP : boolean;
begin
try
//lineas para subir al FTP
Result := True;
except
//Lineas para el manejo del error
Result := False;
end;
end;

procedure SubirArchivos
begin
//Aqui ejecutara la subida de archivos y si no
//es satisfactoria ejecutará el dts
if not SubirEnFTP then
FuncionParaEjecutarDTS; //Aqui colocarás el codigo que realices para ejecutar el DTS desde delphi con el cual te ha ayudado Ecfisa
end;


Esto es solo el comienzo. el resto debes completarlo, investigando, programando e intentando.

A mi me queda la duda si al finalizar el programa como finaliza la transacción que llamó al DTS, finalizaría ese DTS. No se como digo me queda esa duda y si llegase a ser así entonces deberás atacar el problema con otra solución.

Se me ocurriría crear una tabla donde recibiera información de tareas ftp a ejecutar y un job de SQL estuviese revisando periódicamente esta tabla y una vez lo halla ejecutado marque su estado como tarea inactiva.

En este escenario, delphi trataría de ejecutar la subida de archivos y en caso de fallar registraría la tarea en la tabla. así al finalizar el programa se cierra la transacción pero la tarea que se ejecuta continuamente en el servidor haría su trabajo en el momento necesario. Esto también brindaría un mecanismo de revisión de las tareas ftp programadas.

Saludos, y como dije es apenas el comienzo.

Melissa_12
14-11-2012, 16:03:37
Muchas Gracias por responder movorack, ciertamente la idea que me has dado puede ser un camino viable para darle solucion a mi problema. Pero no se mucho acerca de programar un job, de hecho trate de hacer uno mediante una pagina donde lo explicaba y me dio error, tienes algun enlace donde pueda encontrar algo que sea de ayuda?

movorack
14-11-2012, 16:16:02
Permiteme y te lo busco en google:
http://lmgtfy.com/?q=MS-SQL+Create+a+job

Melissa_12
16-11-2012, 15:00:52
Hola!, pues ya hice el job y funciona bien, con un problema ya que bloqueo el ftp que tengo y el job me dice que la tarea se ha ejecutado correctamente, y no es asi ya que el archivo no esta en el ftp, pues claro este esta bloqueado. No se que podra ser?

Melissa_12
16-11-2012, 18:24:44
Hola, pues ya he resuleto el problema que he planteado anteriormente, he puesto en una tabla el resultado que arroja el dts y problema resuelto.
Ahora se me ha presentado otro ya que quiero que en el job que he hecho tengo dos pasos, el primero para determinar si el ftp esta disponible y el otro para copiar el archivo al ftp, quiero que si el ftp no esta disponible(o sea el paso 1) el job no ejecute el paso 2 y vuelva a intentar en el tiempo que yo le indique. Gracias!!!!!!!!