Ir al contenido



Foto

Problema con el borrado de tablas


  • Por favor identifícate para responder
1 respuesta en este tema

#1 jacapu

jacapu

    Member

  • Miembros
  • PipPip
  • 41 mensajes

Escrito 30 abril 2010 - 02:59

Hola a todos.
El problema es que tengo una aplicación hecha con Delphi7 con la que calculo estructuras de edificación. Los datos de la estructura los guardo en un archivo de texto.
Cuando cargo la estructura paso los datos del archivo de texto a tablas Paradox. El cálculo de la misma genera resultados y datos que tambien guardo en tablas del mismo tipo. A veces se me cuelga el programa debido a un 'key violation' o cuando el proceso de cálculo es muy largo y decido cancelarlo.
He preparado un procedimiento para vaciar los datos de las tablas desde el programa recorriendolas una por una y vaciandolas con el método EmptyTable del BDE, (para no tener que vaciarlas manualmente desde el DataBaseDesktop, ya que si la salida del programa es forzada quedan tablas con datos y al volver a cargar una estructura desde el fichero de texto que guarda los datos principales se produce un 'key violation').
El método usando EmptyTable del BDE funciona mientras no encuentra una tabla vacía, pues si la encuentra se rompe y de aquí no salgo.
Una posible solución sería crear las tablas en memoria al arrancar el programa y destruirlas al salir o cancelar el proceso de cálculo, pero tengo un montón de tablas  ya que el fichero de texto se dirtribuye en varias de ellas y los resultados en otro conjunto, aparte de tener que modificar todo el código ya que las tablas están en un módulo de datos.
Mi idea es crear un método que emule las acciones que se hacen manualmente desde el DataBaseDesktop al usar la utilidad EmptyTable desde él, (o sea seleccionar la tabla y vaciarla), desde mi programa de un modo automático para ahorrame esta tediosa labor.
Os mando el fragmento de código que uso para que veais si su mecánica es acertada o errónea:



delphi
  1. //nudos
  2.     if DM1.SNudoT.State in [dsinsert,dsEdit] then DM1.NudoT.Cancel;
  3.     DM1.NudoT.Close;
  4.     DM1.NudoT.IndexName:='';
  5.     DM1.NudoT.Open;
  6.     if DM1.NudoT.IsEmpty=False then
  7.         begin
  8.         StatusBar1.Panels[4].Text:='Vaciando datos Nudos ';
  9.         StatusBar1.Update;
  10.         DM1.NudoT.Close;
  11.         DM1.NudoT.EmptyTable;
  12.         DM1.NudoT.Open;
  13.         end;
  14.     //nudos seleccionados


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 01 mayo 2010 - 05:46

Te falta colocar la propiedad Exclusive antes de ejecutar EmptyTable, algo así:



delphi
  1. //nudos
  2.     if DM1.SNudoT.State in [dsinsert,dsEdit] then DM1.NudoT.Cancel;
  3.     DM1.NudoT.Close;
  4.     DM1.NudoT.IndexName:='';
  5.     DM1.NudoT.Open;
  6.     if DM1.NudoT.IsEmpty=False then
  7.         begin
  8.         StatusBar1.Panels[4].Text:='Vaciando datos Nudos ';
  9.         StatusBar1.Update;
  10.         DM1.NudoT.Close;
  11.         DM1.NudoT.Open;
  12.         DM1.NudoT.Exclusive := True;
  13.         DM1.NudoT.EmptyTable;
  14.         DM1.NudoT.Exclusive := False;
  15.         end;
  16.     //nudos seleccionados



Saludos.
  • 0