PDA

Ver la Versión Completa : Problema copiando Archivo de BD en Paradox... T.T


Vinicio
15-07-2006, 02:54:14
Hola Colegas Amigos...

Estoy haciendo un wizzard para entrenamientos dinamicos en delphi , se oye muy aca pero la verdad es algo demasiado sencillo, el problema k tengo es a la hora de copiar un archivo de base de datos de paradox a otra carpeta... el archivo si se copia pero el contenido de la tabla no, es decir los datos de la misma, se copia el archivo pero sin registros de datos!!!! y en la ubicacion original si estan los datoss...cabve mencionar k el proceso de copiado lo hago en tiempo de ejecucion al termonar de llenar la tabla.. anexo el codigo para ver si alguno me puede dar una opinon o si saben por ke causa motivo razon o circunstancia se presenta este problema k me tiene my agoviadoo....T.T
de antemano muchas gracias...:D

codigo delphi:

if Scene=2 then
begin
U_DM.DataModule1.Table1.Open;
U_DM.DataModule1.Table1.Close;
CopyFile(PChar('C:\wizzard\Molde.db'),PChar('C:\'+Nombre_Carpeta+'\'+Nombre_Carpeta+'.db'),TRUE)
end
Else
Scene:=Scene+1;
limpia();
end;

roman
15-07-2006, 04:41:25
Dices que copias la tabla al terminar de llenarla así que supongo que en un principio está vacía y posiblemente al momento de copiar el archivo en disco aún no se termina de grabar. Quizá usando Table1.FlushBuffers te ayude.

// Saludos

Vinicio
15-07-2006, 04:54:07
jeje no creo k el problema sea eso, lo kpasa es k mando a insertar un registro en la tabla cada vez k e crea una escena, son 30 escenas en total, y cuando se termina la ultima escena entonces es donde se supone debo copiar el archivo de BD a otra carpeta, la base de datos en su ubicacion original si esta llena, es decir si tiene todos los datos k anteriormente le inserte.... el problema es k cuando la copio los datos no se copian es decir solo se copia la tabla vacia...!! T.T no se k pueda ser ...:S
Lei en otro mensaje de un pr0oblema parecido donde decial algo de cerrar el archivo antes de copiarlo, mencionaban una funcion LockFile, pero nu se como usarla si alguien sabe porfavor diganme... u otra solucion cualkiera k esta sea
Muchas gracias por tu respuesta men XD...
seguire intentando...

Lepe
15-07-2006, 12:36:43
¿pero lo has probado?... decir "no creo que sea eso" no es una buena respuesta para alguien que está intentando ayudarte.

Yo también creo que vaya por esa línea el problema, pero ¿para qué voy a darte una respuesta si "tu crees que no es eso"? ;) :cool:

Saludos

roman
15-07-2006, 19:51:13
CopyFile copia un archivo cualquiera, independientemente de si es una tabla de paradox o la música de mi compadre. Así que si no hay registros en la copia es porque no se está copiando el archivo que pensamos o bien porque los cambios aún no se guardan, para lo cual serviría el FlushBuffers. Pero el caso es que no hay manera que CopyFile copie una tabla sin registros.

// Saludos

Vinicio
15-07-2006, 20:46:40
Hola amigos..

Primero k nada una disculpa por la expreson "Creo k no es eso", siendo sincero kreo k no fue la correcta, y una vez mas siendo sincero no eh probado el FlushBuffer, lo k pasa es k el proyecto esta en otra parte de donde estoy ahora...
Tambien encontre esto k kreo k se relaciona con mi problema en otro post de este mismo foro...
Julià T. (http://www.clubdelphi.com/foros/member.php?u=353) http://www.clubdelphi.com/foros/images/statusicon/user_offline.gif vbmenu_register("postmenu_11653", true);
Conde nado
Fecha de Ingreso: May 2003
Localización: en el teclado
Mensajes: 311


El problema de que se rompan los archivos puede ser que en el momento que estes copiando un archivo *.db o qualquier otro que sea tabla o base de datos, esté abierto por alguna aplicación y no se haya volcado la información que contiene en la memória de la aplicación a la tabla/base de datos.

Los ficheros los debes copiar cuando las tablas esten completamente inactivas, o bien con un Bachmove cuando estén en qualquier estado.

Quisiera saber k opinan, y si saben algo de el llamado "Bachmode", por k siendo sincero la tabla de paradox en su ubicacion original si esta llena, lo se por k cada vez k inserto la reviso y si estan los datos , es mas antes de copiar el archivo en al otra carpeta reviso y si esta llena...no se si sera cuestion de cerrar el archivo antes de copiarlo o algo asi....
Ustedes k opinan???

y una vez mas una disculpa, no fue mi intencion expresarme asi, de hecho hace ya muhco tiempo k consulto este foro y siempre me ayuda...
estoy muy agradecido de k existan este tipo de foros pues a nosotros los programadores nos es de mucha ayuda

De antemano gracias...

Lepe
16-07-2006, 10:20:44
Siguiendo la línea de roman, usa FlushBuffers en el AfterPost, despues cierra la tabla y la copias.

Si aún sigue dando fallos, puedes ir por la caché de escritura de windows en segundo plano, por defecto está activa y no fuerza la escritura a disco.

Acabo de subir el truco 352 (http://www.clubdelphi.com/trucos/index.php?id=352) que permite ver el estado de la caché en windows y desactivarla.

En cuanto al TBatchMove, es un método del TTable, simplemente tienes que darle un Dataset con los datos a insertar, y el método de inserción, (la tabla de destino debe existir, es decir, usa el Database desktop para copiarla, y despues borra sus registros):

En el siguiente ejemplo, creo una Qry seleccionando los datos, y despues se añaden a la tabla tblFacturasH (histórico de facturas).

Ten cuidado con el orden al insertar registros si usas relaciones Master-Detail, como siempre, primero se inserta en el Maestro y despues en el Detalle:


qry := Tquery.Create(NIL);
try
qry.DatabaseName := DTM.tblFacturas.DatabaseName;
qry.SessionName := DTM.tblFacturas.SessionName;
qry.SQL.Clear;
qry.SQL.Add('select * from Factura where nfactura = ' + QuotedStr('22235') + ';');
qry.Prepare;
qry.Open;
if not qry.IsEmpty then
dtmH.tblFacturasH.BatchMove(qry, batAppendUpdate);
// pasamos la factura desde el qry al tblFacturasH
qry.Close;
finally
FreeAndNil(qry);
end; // finally


Estudia los parámetros que lleva el BatchMove para usar el que necesites.

Saludos y suerte.

Vinicio
17-07-2006, 23:16:00
Hola amigos...

Ya intente con el Flushbuffer en el metodo afterpost del query y de ahi cierro la tabla e inbtento copiar con copyfile, pero aun sigue copiandome el archivo vacio, y los datos solo se kedan en su ubicacion original...

Tambien intente con el batchmove, pero con este necesito tener una tabla creada en el datamodule y estipulado el alias etc etc.. lo k yo keria o necesitaba era solo copiar un archivo .db de una ubicacion a otra en tiempo de ejecucion...

E intentado copiar el archivo de otra forma y me dice k no se peude copiar por k este esta en uso por otra aplicacion...

Habia leido tambien en este foro k una posible solucion seria hacer un lockfile al archivo .db, copiarlo y despues darle un unlock, pero no se usar estas funciones...

Alguien tiene otra idea...
Yo por lo pronto seguire intentano...
:(

Vinicio
18-07-2006, 01:26:48
Je je je... Por fin me salio esto amigos, intente de todo, y al final una combinacion de todas sus sugerencias fue lo k me ayudo, estoy muy agradecido y muchas gracias a todos los k me tubieron paciencia y me mandaron sus sugerencias, a final termine utilizando el BatchMove el flush buffer

Muchas gracias!!!!