Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Una Consulta muy sencilla en DBF. Ayuda!!! (https://www.clubdelphi.com/foros/showthread.php?t=70720)

rogeliogamberro 07-11-2010 18:25:09

Una Consulta muy sencilla en DBF. Ayuda!!!
 
Hola a todos! Recurro a toda la gente de este foro porque estoy realizando un programa muy sencillo (estimo 20 0 30 lineas de código) para una institución sin fines de lucro. La idea es convertir unas tablas que se alojan en una base de datos SQL en tablas .DBF (que las interpreta un programa que ellos tienen).
La idea mia es borrar estas tablas .DBF y luego hacer la copia entera desde SQL.
Pese a que lo estoy programando en C++ Builder mi duda es conceptual y creo que se entenderá por la gran similitud que tiene con el Delphi.
Para intentar borrar las tablas .DBF utilice un componente TTable (como hago siempre) y se muestra en la figura siguiente:

img214.imagevenue.com/img.php?image=48387_Problema1_122_614lo.JPG

Luego agregué un TDataSource, un TDBgrid y un boton (como siempre) y hasta ahi veniamos bien.

img21.imagevenue.com/img.php?image=48638_problema2_122_456lo.JPG

En el boton escribi una instruccion para borrar la tabla pero al compilar y oprimir el boton me aparece este cartel:

img267.imagevenue.com/img.php?image=48640_Compila1_122_126lo.JPG

En realidad probé de muchas formas (borrar una sola linea, etc) y pasa lo mismo. Al modificar valores no sucede esto.
Entonces si aplico TRUE a la propiedad Exclusive me aparece "Table is Busy"

img184.imagevenue.com/img.php?image=48642_exclusive_122_1183lo.JPG

La verdad no se que hacer porque desde el punto de vista de la SQL (que suponia seria lo mas dificil) funciono en 10 minutos pero las DBF siguen con ese cartel.

Agradeceria cualquier tipo de aporte para solucionar el problema.

Atte. Rogelio

marcoszorrilla 07-11-2010 22:44:12

Si fuera en Delphi el problema vendría dado por utilizar las tablas en uso exclusivo en vez de compartido, ya que el IDE es un usuario más.

Parto del supuesto de que las tablas no están abiertas por el otro programa en el momento de la acción.

Un Saludo.

rogeliogamberro 08-11-2010 03:13:49

El C++ Builder es exactamente igual al delphi en casi todo... Creo que una vez me comentaron algo asi como que el compilador transforma el codigo a dellphi y luego compila... En sus carpetas se encuentran muchas cosas de delphi... Ahora hablando de la DB funciona y reacciona igual que en delphi. Hasta el momento con las que he trabajado (paradox y sql) funcionaba asi pero esta dbf no se deja poner el exclusive a true... alguien sabe porque?

rogeliogamberro 08-11-2010 03:15:09

Gracias por responder Marcos!!! y como lo soluciono para que no me tire el cartel??

marcoszorrilla 08-11-2010 07:11:17

Tienes que abrir las tablas en modo compartido como te comentaba.

Un Saludo.

newtron 08-11-2010 09:47:44

Claramente el problema que estás teniendo es que no estás abriendo la tabla en modo exclusivo, cosa que te hace falta para poder borrarla. Seguramente algún componente u otro usuario de la aplicación tiene la tabla abierta. Yo probaría a quitar el datasource y el dbgrid y solamente dejar un botón que abra la tabla en modo exclusivo y borrarla.

Espero haberte ayudado en algo.

Saludos

rogeliogamberro 08-11-2010 15:34:08

Gracias Marcos y newtron.

Sigo leyendo y aprendiendo. Parece ser que la DBF de fox pro tiene un archivo .CDX que no se que es pero estimo que el problema se puede encontrar ahi... o esté relacionado con eso.

Estuve mirando lo del Exclusive y me resulto imposible hacerlo funcionar. Con las bases de datos paradox (que son las que he usado) siempre me funciono. La verdad es que esto me tiene desconcertado y ahora estoy descubriendo que existe algo llamado Maestro/Detalle que relaciona las tablas.

Simplemente soy aficionado al tema y deseo colaborar con este sencillo programita. Agradeceria todo tipo de orientacion u informacion para leer al respecto. Grax

marcoszorrilla 08-11-2010 17:57:01

El archivo CDX corresponde a los índices.

Un Saludo.

gmontes 08-11-2010 23:08:17

consultando nuestros foros, encontre esto:

Cita:

Bueno encontré una solución para eliminar físicamente los registros de una tabla (funciona para tablas DBF). La encontré en el Trucomanía. (para el que no lo conoce http://www.q3.nu/trucomania/).

SOLUCION:
-Incluye 'DBE' en el uses de tu form
-y utiliza esta funcion para compactar la tabla:

Código Delphi [-]
procedure PackDBF(Tabla: TTable);
begin
Check(DbiPackTable(Tabla.DBHandle, Tabla.Handle, nil, szDBASE, True))
end;

Pero cuidado, para poder compactar la tabla, ésta debera estar abierta en modo exclusivo. Ejemplo:

Código Delphi [-]
{Cerramos la tabla/Close table}
Table1.Close;
{En Modo exclusivo/Exclusive mode}
Table1.Exclusive:=True;
{Abrimos tabla/Open table}
Table1.Open;
{Compactar/pack}
PackDBF(Table1);

{Reabrir tabla/reopen table}
Table1.Close;
Table1.Exclusive:=False;
Table1.Open;
post colocado por Roilo
http://www.clubdelphi.com/foros/showthread.php?t=31125


o borrar la tabla con sql

Código:

DROP TABLE
----------

  DROP TABLE nomtabla

Esta sentencia SQL borra una tabla.

Ejemplo:

  ...
  Query1.SQL.Text := 'DROP TABLE "Productos.DBF"';
  Query1.ExecSQL;
  ...



La franja horaria es GMT +2. Ahora son las 21:14:25.

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