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)
-   -   DBGrid1.Free como re-obtener DBGrid1 ? (https://www.clubdelphi.com/foros/showthread.php?t=79772)

ElMug 09-08-2012 03:04:09

DBGrid1.Free como re-obtener DBGrid1 ?
 
Hola amigos,

ando investigando como vaciar de data un DBGrid de manera expedita.

DBGrid1.Free lo hace, pero luego como volverlo a obtenener vacio de data? Como se restaura?

Free, en este caso, que hace?

DBGrid1.Clear parece que en Lazarus no hace nada. Que hace Clear en Delphi?

O, alternativamente, como vaciar de data a DBGrid1?

Estoy en Windows 7 usando Lazarus de 32 bits.

Gracias de antemano.

roman 09-08-2012 03:17:19

Bueno, un dbgrid no hace otra cosa que reflejar los datos de un dataset. Vaciarlo significa una de dos: desconectarlo del dataset (asignando su datasource a nil), o bien vaciando el dataset, esto es, la tabal asociada. Como ves, son dos cosas muy distintas. ¿Qué es lo que tu quieres?

// Saludos

ElMug 09-08-2012 03:32:51

Cita:

Empezado por roman (Mensaje 439185)
Bueno, un dbgrid no hace otra cosa que reflejar los datos de un dataset. Vaciarlo significa una de dos: desconectarlo del dataset (asignando su datasource a nil), o bien vaciando el dataset, esto es, la tabal asociada. Como ves, son dos cosas muy distintas. ¿Qué es lo que tu quieres?

// Saludos

Tienes razon. Lo que quiero es vaciar el dataset de records, lo cual verificaria viendo el DBGrid vacio, tambien.

Desconectarlo, no me funciona, porque al conectarlo de nuevo, se muestra de nuevo la data.

Gracias.

roman 09-08-2012 03:50:04

No recuerdo si hay un método específico para eso. Creo que sólo con el componente TTable, que tiene el método EmptyTable. Si no, tendrías que hacer una consulta SQL directo sobre la tabla que alimente tu dataset, algo así como:

Código SQL [-]
delete from tabla

que borra todos los registros.

// Saludos

ElMug 09-08-2012 03:58:08

En la base de datos, no quiero cambios fijos. Solo quiero que el dataset este vacio antes de mandar un Query.

Me encontre esto apenas:

Código:

var 
ds : TSomeDataSet
begin 
ds.First; 
while NOT ds.Eof do 
begin   
if TRUE then
ds.Delete;             
ds.Next; 
end;
end;

En Lazarus el dataset equivale al SQLQuery1, a ver si esto se ve factible como principio.

A mi me parece que si y (lo voy a tratar al rato) relacionando esto:
sqlquery1.DataSource.DataSet.delete;
con el codigo arriba citado.

Gracias.

ecfisa 09-08-2012 05:13:29

Hola ElMug.

No conozco el componente dataset de Lazarus, pero si es similar al TSQLQuery podrías lanzar una sentencia SQL como te menciona roman.

Con un TSQLQuery sería:
Código Delphi [-]
...
  SQLQuery1.Close;
  SQLQuery1.SQL.Text:= 'DELETE FROM NOMBRE_DE_TU_TABLA';
  SQLQuery1.ExecSQL(True);
...

Saludos.

roman 09-08-2012 17:02:35

Cita:

Empezado por ElMug (Mensaje 439189)
En la base de datos, no quiero cambios fijos. Solo quiero que el dataset este vacio antes de mandar un Query.

Me encontre esto apenas:

Código:

var 
ds : TSomeDataSet
begin 
ds.First; 
while NOT ds.Eof do 
begin   
if TRUE then
ds.Delete;             
ds.Next; 
end;
end;

En Lazarus el dataset equivale al SQLQuery1, a ver si esto se ve factible como principio.

A mi me parece que si y (lo voy a tratar al rato) relacionando esto:
sqlquery1.DataSource.DataSet.delete;
con el codigo arriba citado.

Gracias.

El código que pones, suponiendo que funciona (*), lo que hace es borrar todos los registros del query, pero, según comentas, no es lo que quieres hacer, y, si así fuera, entonces sería mejor una sentencia como la que te puse en mi último mensaje.

(*) Esto lo digo porque no toda consulta SQL es modificable, es decir, una consulta SQL deuelve un conjunto de registros pero no necesariamente podemos editar o borrar estos registros a partir del componente.

Aunque creo que te falta explicar con mayor claridad lo que quieres hacer, creo que lo que deseas hacer, corresponde, en realidad, a cerrar el SQLQuery:

Código SQL [-]
SQLQuery1.Close; // Cierras la consulta y con ello el DBGrid asociado se pone en blanco.
SQLQuery1.SQL.Text = 'aquí el texto de la nueva consulta';
SQLQuery1.Open; // Lanzas la nueva consulta

// Saludos

roman 09-08-2012 17:03:58

Cita:

Empezado por ecfisa (Mensaje 439192)
No conozco el componente dataset de Lazarus

Supongo que, al igual que en delphi, dataset es la clase base de todos los components de acceso a datos. SQLQuery sería un de sus derivados.

// Saludos

ElMug 13-08-2012 06:29:02

Hola amigos,

Una manera de vaciar el dataset es mandar un query de select que retorne NADA.

El problema es si se va a hacer por codigo, tal vez hay que hallar un query que lo haga. Si se hace manual, ya corriendo el programa, se llena una frase con algo que garantice que no califca el query. Por ejemplo, para Empleado "Salario = 0.001".

O tal vez un query a una tabla que no existe, con un nombre muy remoto, como "Select * from sdfasdu2cc42 where ..." Esto, si trabaja, si se puede codificar, creo.

ecfisa 13-08-2012 18:57:08

Cita:

Empezado por ElMug (Mensaje 439447)
Una manera de vaciar el dataset es mandar un query de select que retorne NADA.

Hola.

A ver... por vaciar el dataset yo interpreto borrar sus datos, pero si lo que deseabas era realizar una consulta vacía ("que retorne NADA"), basta con hacer:
Código SQL [-]
SELECT * FROM NOMBRE_DE_TU_TABLA WHERE 1 = 2

Saludos.

ElMug 13-08-2012 19:48:03

Cita:

Empezado por ecfisa (Mensaje 439478)
Hola.

A ver... por vaciar el dataset yo interpreto borrar sus datos, pero si lo que deseabas era realizar una consulta vacía ("que retorne NADA"), basta con hacer:
Código SQL [-]SELECT * FROM NOMBRE_DE_TU_TABLA WHERE 1 = 2


Saludos.

Si, hay muchas maneras, pero si se quiere codificar, el problema es que no siempre sabras que tabla o que base de datos se va a abrir.

Esto se me ha ofrecido para rodearle a un bug que creo que se relaciona con algun(os) componentes base (creo que el DBGrid) de Lazarus, y no lo pude solucionar.

Tampoco vaciar el dataset me resolvio el problema. Algo dificil de explicar, y ya lo ando resolviendo usando otros componentes.

Gracias!

Casimiro Noteví 13-08-2012 19:58:18

Cita:

Empezado por ElMug (Mensaje 439480)
Si, hay muchas maneras, pero si se quiere codificar, el problema es que no siempre sabras que tabla o que base de datos se va a abrir.

¡¡¡Cómo que no vas a saber qué tabla o base de datos vas a abrir!!!

Cita:

Empezado por ElMug (Mensaje 439480)
Esto se me ha ofrecido para rodearle a un bug que creo que se relaciona con algun(os) componentes base (creo que el DBGrid) de Lazarus, y no lo pude solucionar.

¿Y a qué bug haces referencia?

Cita:

Empezado por ElMug (Mensaje 439480)
Tampoco vaciar el dataset me resolvio el problema. Algo dificil de explicar, y ya lo ando resolviendo usando otros componentes.

¿Difícil de explicar?, ¿otros componentes? :confused:

roman 13-08-2012 20:00:22

Cita:

Empezado por ElMug (Mensaje 439480)
Si, hay muchas maneras, pero si se quiere codificar, el problema es que no siempre sabras que tabla o que base de datos se va a abrir.

En algunos motores (SQLite, MySQL, por ejemplo) puede hacerse esto:

Código SQL [-]
select 1 limit 0;

que regresa un resultado vacío sin tener que referirse a una base o tabla específica.

// Saludos

Casimiro Noteví 13-08-2012 20:13:50

Cita:

Empezado por roman (Mensaje 439485)
Código SQL [-]select 1 limit 0;

Qué curioso, sin especificar ninguna tabla.
En firebird se puede hacer que devuelva cero registros indicando alguna tabla del sistema:

Código SQL [-]
select first 0 * from RDB$DATABASE

No es lo mismo :)

roman 13-08-2012 20:27:22

¿Estas seguro que firebird no admite esta consulta?

Código SQL [-]
select 1

// Saludos

egostar 13-08-2012 20:36:09

Cita:

Empezado por roman (Mensaje 439490)
¿Estas seguro que firebird no admite esta consulta?

Código SQL [-]
select 1

// Saludos

De poder se puede, pero no tiene sentido

Saludos

Casimiro Noteví 13-08-2012 20:36:49

1 Archivos Adjunto(s)
Sí, lo admite, pero para otra cosa, fíjate en el ejemplo:

EDITO: se me adelantó egostar :)

roman 13-08-2012 20:37:37

¡Qué curioso! ¿Cuántos registros devuelve? ¿O es infinito?

// Saludos

roman 13-08-2012 20:38:58

Cita:

Empezado por Casimiro Notevi (Mensaje 439493)
Sí, lo admite, pero para otra cosa, fíjate en el ejemplo:

EDITO: se me adelantó egostar :)

¿Cuál otra cosa?

Y si lo admite, ¿a poco no admite esto?

Código SQL [-]
select first 0 1

// Saludos

egostar 13-08-2012 20:39:26

Cita:

Empezado por roman (Mensaje 439494)
¡Qué curioso! ¿Cuántos registros devuelve? ¿O es infinito?

// Saludos

Rectifico,

Código SQL [-]
Select 1 from tablaX

Devuelve la cantidad de registros que tenga la tabla

Código SQL [-]
Select 1

No se puede, genera un error

Cita:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Unexpected end of command.
Saludos


La franja horaria es GMT +2. Ahora son las 14:55:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi