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

roman 13-08-2012 20:40:07

¡Ah! Ok.

// Saludos

Casimiro Noteví 13-08-2012 20:40:12

No, necesita que se le añada la tabla, el "from loquesea" y devuelve los registros que tenga la tabla o los que devuelva el filtro que le pongas, o sea, añade ese valor numérico como un campo más a todos los registros.

egostar 13-08-2012 20:45:30

Cita:

Empezado por Casimiro Notevi (Mensaje 439499)
No, necesita que se le añada la tabla, el "from loquesea" y devuelve los registros que tenga la tabla o los que devuelva el filtro que le pongas, o sea, añade ese valor numérico como un campo más a todos los registros.

Asi es, pero la sentencia

Código SQL [-]
Select first 1 from tablaX

Entonces si sólo muestra 1 registro de la tablaX, lo cual me parece un tanto lógico, ¿ los otros motores que muestran roman ?, me parece interesante ver lo que produce la sentencia Select 1 digamos en MySQL

Saludos

ecfisa 13-08-2012 20:48:34

Cita:

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

Código SQL [-]
select 1

// Saludos

Hola roman.

Así sin más, no.

Si se puede como en el código de la imágen de Casimiro (y supongo que en el de egostar) haciendo referencia a una tabla.

O para evitar referenciar una tabla se podría hacer algo como:
Código SQL [-]
SELECT FIRST 1 NULL FROM RDB$DATABASE

Pero una consulta que no devuelva ni siquiera una constante, nada de nada ... la verdad no lo se. :confused:

Saludos. :)

roman 13-08-2012 20:49:41

Cita:

Empezado por egostar (Mensaje 439502)
me parece interesante ver lo que produce la sentencia Select 1 digamos en MySQL

Pues eso, produce 1:

Código:

mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

// Saludos

roman 13-08-2012 20:51:21

O más claro:

Código:

mysql> select 1 as uno;
+-----+
| uno |
+-----+
|  1 |
+-----+
1 row in set (0.00 sec)

// Saludos

ecfisa 13-08-2012 20:54:15

Cita:

Empezado por roman (Mensaje 439506)
O más claro:

Código:

mysql> select 1 as uno;
+-----+
| uno |
+-----+
|  1 |
+-----+
1 row in set (0.00 sec)

// Saludos

Esa consulta, o escrita de ese modo, no la soporta Firebird. Puede ser que exista otro modo de formularla pero no tengo conocimiento de ello.

Saludos. :)

egostar 13-08-2012 20:54:28

Ah ok.

Y si la sentencia es Select 10 produce diez registros ¿?

Saludos

egostar 13-08-2012 20:59:49

Cita:

Empezado por egostar (Mensaje 439508)
Ah ok.

Y si la sentencia es Select 10 produce diez registros ¿?

Saludos

Bueno me auto respondo, debería de regresar un registro con el valor 10, mas bien la pregunta es, ¿ que utilidad se obtiene de una consulta así ?

Saludos

roman 13-08-2012 21:04:14

Exacto. Es bastante directo, tú le dices "selecciona 84" y él te regresa exactamente eso, 84 :D También puedes hacer

Código SQL [-]
select 'hola mundo'

o bien

Código SQL [-]
mysql> select concat('hoy es ', curdate());
+------------------------------+
| concat('hoy es ', curdate()) |
+------------------------------+
| hoy es 2012-08-13            |
+------------------------------+
1 row in set (0.01 sec)

// Saludos

ecfisa 13-08-2012 21:05:38

Hola.

Me quedé pensando... aún si ejecutara:
Código SQL [-]
SELECT 1
En el DBgrid aparecería la selección ¿ o no ?

Sinceramente yo había entendido que quería eliminar los datos de la tabla (mensaje #3):
Cita:

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.
Saludos.

egostar 13-08-2012 21:16:10

Regresando al tema en cuestión.

No será mejor que se use una tabla en memoria (CDS) y usarla para agregar los registros y "borrarla" cuando ya no se requiera ¿? eso nos permitiría usarla para cualquier tabla y cualquier base de datos, el problema es que hay mucho más trabajo en tiempo de ejecución, pero así se evitaría afectar físicamente los datos de las tablas utilizadas.

Saludos

ElMug 13-08-2012 21:29:40

Cita:

Empezado por Casimiro Notevi (Mensaje 439484)
¡¡¡Cómo que no vas a saber qué tabla o base de datos vas a abrir!!!


¿Y a qué bug haces referencia?


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

Bueno, una base de datos tendra que estar conectada, pero no se necesita saber el nombre, cuando ya esta uno conectado.

Igualmente, SQL queries son independientes de estar atados a una tabla. La tabla se especifica en el SQL query. Mi aplicacion arranca sin nombre de base de datos, y sin tablas, y el usuario especifica ya al usarla.

El problema que me encontre es con SQLite3, al correr codigo que abre Blobs o Memos durante OnColEnter. Y es que para jalar los datos usa el nombre de la columna (manda un Query).

Eso trabaja bien, pero al mandar un query a OTRA tabla, se regresa un error diciendo que la columna "X" no existe. La columna X pertenece a la tabla anterior.

Monitoreo el SQL que manda la aplicacion, y NO TIENE NADA que ver con la columna X.

La verdad es que esto ya lo doy por "bug" (despues de muchismos analisis y pruebas) de DBGrid de Lazarus, pues la aplicacion trabaja perfectamente mientras no mande un query a otra tabla. Y por lo pronto no le veo el merito a discutir esto mas alla. Tal vez despues.

Gracias por el interes.

P.S., tambien, con el codigo identico, mientras no se accesen Blobs(imagenes) ni Memos (dentro de OnColEnter), SI SE PUEDE mandar queries a OTRA tabla, perfectamente.

ElMug 13-08-2012 21:37:47

A proposito, a mi esto, en Lazarus, usando SQLite3, vacia el grid:

select * from basurax31429cdr

Pero tal vez no en todos los motores sea asi.

Casimiro Noteví 13-08-2012 21:37:55

Cita:

Empezado por ElMug (Mensaje 439516)
Eso trabaja bien, pero al mandar un query a OTRA tabla, se regresa un error diciendo que la columna "X" no existe. La columna X pertenece a la tabla anterior.
Monitoreo el SQL que manda la aplicacion, y NO TIENE NADA que ver con la columna X.
La verdad es que esto ya lo doy por "bug" (despues de muchismos analisis y pruebas) de DBGrid de Lazarus, pues la aplicacion trabaja perfectamente mientras no mande un query a otra tabla.

Hombre, si vas a hacer un select de unos campos a una tabla y pretendes hacer el mismo select a otra tabla que tiene otros campos... pues es normal que diga que no exista algún campo si, efectivamente, no existe. Eso es lo lógico, no es ningún bug.

ElMug 13-08-2012 22:15:42

Cita:

Empezado por Casimiro Notevi (Mensaje 439520)
Hombre, si vas a hacer un select de unos campos a una tabla y pretendes hacer el mismo select a otra tabla que tiene otros campos... pues es normal que diga que no exista algún campo si, efectivamente, no existe. Eso es lo lógico, no es ningún bug.

Ya explique que el query es correcto, y que funciona perfectamente en otra tabla, mientras no se accesen Blobs en OnColumEnter de la tabla anterior.

Y ESO si seria un bug. Lo que tu describes seria algo muy bobo de hacer, si asi fuese.

ElMug 13-08-2012 23:02:16

.....ademas, el Query ni siquiera menciona las columnas de la Tabla siguiente.

egostar 13-08-2012 23:11:00

Cita:

Empezado por ElMug (Mensaje 439523)
Ya explique que el query es correcto, y que funciona perfectamente en otra tabla, mientras no se accesen Blobs en OnColumEnter de la tabla anterior.

Y ESO si seria un bug. Lo que tu describes seria algo muy bobo de hacer, si asi fuese.

Pues.... me parece que en el evento OnColumnEnter, deberías trabajar un poco más para validar el tipo de campo, dependiendo del campo que actué en consecuencia, digo, es lo más lógico.

Saludos

ElMug 14-08-2012 01:01:14

Cita:

Empezado por egostar (Mensaje 439526)
Pues.... me parece que en el evento OnColumnEnter, deberías trabajar un poco más para validar el tipo de campo, dependiendo del campo que actué en consecuencia, digo, es lo más lógico.

Saludos

Es buena observacion, mas eso ya esta validado, y como se ha dicho, el codigo trabaja y muestra imagenes, o Memos, perfectamente, MIENTRAS no se mande un query a otra tabla.

Creo yo que hay un escurrimiento de memoria, o le falta alguna validacion cuando en OnColEnter del DBGrid se accede a Imagenes o a Memos en la rutina de algun componente; creo you que en DBGrid de Lazarus.

Aparte, las tablas son de 3 o 4 tiras, y ninguna tiene campos vacios, y las imagenes son tipicas de camara de 3 megapix y los memos son un parrafo o dos tipicos de texto. Todo se muestra correcto. No hay basura en la data,ni nada asi.

En caso de encontrar algo mas tangible, con gusto se los reporto, aun si fuese defecto de mi desarrollo.

Delphius 14-08-2012 01:14:39

¿Y digo yo porqué en lugar de asumir ciertas cosas (como pensar que se trata de un bug) y ser demasiado esquivo al señalar puntualmente cuales son tus problemas, y ni que decir... que en ningún momento has mostrado siquiera como es que efectivamente estás desarrollando no te tomas en serio y contribuyes al explicarte? Porque muchas palabritas, pero con muy poco sentido, totalmente dispersas, muchas asunciones y de temas tan aislados que al final no se entiende a lo que va la cosa.

ElMug, si deseas recibir ayuda debes explicarte y ceder en brindar la información lo más ordenada y completa posible. Y sin ver al menos pedacito de tu código la tienes IMPOSIBLE.
¡Déjate ayudar! Porque así como lo pones... ¿que más quieres que hagamos? :o


La franja horaria es GMT +2. Ahora son las 06:51: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