Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Dbgrid en blanco (https://www.clubdelphi.com/foros/showthread.php?t=72652)

lafourcade 03-03-2011 21:29:23

Dbgrid en blanco
 
Hola espero por favor me puedan ayudar, he estado buscando una solucion a mi problema pero ninguna de las opciones que encontre aqui me ha funcionado, aqui les va mi problema:

Tengo un formulario con un dbgrid, el cual muestra el resultado de una consulta sql, todo lo hace correctamente, el problema es que al guardar, salir o limpiar el formulario, se quedan los datos en el dbgrid.

Ya probe desactivando el datasource y si lo limpia pero al hacer nuevamente la consulta no la muestra.
Espero haber sido clara. Gracias

P.D. conecto el dbgrid a un data source que a su vez esta conectado a un ibquery y esta a un ibdatabase y un ibtransaction.

rgstuamigo 03-03-2011 21:49:30

Cita:

Empezado por lafourcade (Mensaje 392590)
...
Tengo un formulario con un dbgrid, el cual muestra el resultado de una consulta sql, todo lo hace correctamente, el problema es que al guardar, salir o limpiar el formulario, se quedan los datos en el dbgrid.

Ya probe desactivando el datasource y si lo limpia pero al hacer nuevamente la consulta no la muestra.
...

Podrías decirnos cómo guardas y limpias el formulario???:confused:
¿Con qué propósito haces la limpieza y para que te sirve?:confused:
Explicanos por favor con más detalles...;)
Saludos...:)

ecfisa 03-03-2011 23:16:02

Hola lafourcade.

Para ejemplificar supongamos que ejecutas esta simple consulta:
Código Delphi [-]
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('SELECT * FROM TU_TABLA'); 
  IBQuery1.Open;
Solo después de abierto el IBQuery verás los resultados en el DBGrid. (si no lo has abierto ya, en tiempo de diseño)

Para que el DBGrid deje de mostrar los datos, basta hacer:
Código Delphi [-]
  IBQuery1.Close;

Ahora, si para ocultar el resultado te decidís por usar:
Código Delphi [-]
   DBGrid1.DataSource:= nil; // (la consulta sigue abierta)
Para que la consulta vuelva a visualizarse en el DBGrid deberás usar algo como:
Código Delphi [-]
  DBGrid1.DataSource:= DataSource1;

Mientras el TDBGrid esté relacionado a un TDataSource a su vez relacionado a un TIBQuery activo, el DBGrid mostrará los resultados de la misma.

Un saludo.

lafourcade 07-03-2011 17:27:19

Una disculpa no habia podido checar sus respuestas, para guardar los datos del formulario uso el sig. codigo:
Código Delphi [-]
procedure TForm12.Button1Click(Sender: TObject);
begin
if MessageDlg('DESEA GUARDAR EL TURNO',mtConfirmation, [mbYes, mbNo],0)=mrYes then
begin
    with DataModule1.ibquery1 do
     begin
      close;
      sql.clear;
      sql.Add('insert into C_TURNO(FECHA,TURNO,TOTAL,TOTAL_R,TOTAL_EF,TOTAL_CRE,TOTAL_GA,TOTAL_TAR )');
      sql.add('values(:fec,:tur,:tot,:totr,:tote,:totc,:totg,:tott)');
      paramByName('FEC').ASDATE:=DATETIMEPICKER1.date;
      paramByName('TUR').asstring:=COMBOBOX1.text;
      paramByName('TOT').ASFLOAT:=STRTOFLOAT(edit1.text);
      paramByName('TOTR').asFLOAT:=STRTOFLOAT(edit16.text);
      paramByName('TOTE').asFLOAT:=STRTOFLOAT(edit69.text);
      paramByName('TOTC').asfloat:=strtofloat(edit83.text);
      paramByName('TOTG').asfloat:=strtofloat(edit17.text);
      paramByName('TOTT').asfloat:=strtofloat(edit18.text);
      execsql;
      sql.Clear;
      sql.add('commit');
      execsql;
    end;
    showmessage('EL TURNO SE HA GUARDADO');
    //datamodule1.DataSource10.Enabled:=false;
    Datamodule1.IBQuery1.Close;
    DataModule1.IBQuery1.Open;
end;
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
edit5.Clear;
edit6.Clear;
edit7.Clear;
edit8.Clear;
edit9.Clear;
edit10.Clear;
edit11.Clear;
edit12.Clear;
edit13.Clear;
edit14.Clear;
edit15.Clear;
edit16.Clear;
edit17.Clear;
edit18.Clear;
edit19.Clear;
edit26.Clear;
edit27.Clear;
edit28.Clear;
edit29.Clear;
edit30.Clear;
edit83.clear;
 
end;

Lo q muestra en el dbgrid son concepto y total para obtener totc lo despliego en el edit 83 yes lo q guardo, los datos del dbgrid no los guardo ya que los tengo en otra tabla.

El hecho de limpiarlo es xq al entrar nuevamente al form se hace una nueva consulta y se tienen q desplegar datos nuevos.

Espero haber sido clara y me puedan ayudar.
Gracias

ecfisa 08-03-2011 01:09:27

Hola lafourcade.

Si usas el mismo IBQuery para mostrar y guardar, los datos dejan de mostrarse en el DBGrid luego de realizar commit, ya que almacena
los cambios y finaliza la transacción actual.

De otro modo, si estas utilizando otro IBQuery para mostrar los datos, tendrías que abrirlo al entrar al form (OnShow por ej.) y cerrarlo
despues de realizado el commit o al salir del form (OnClose por ej.).


Un saludo.

lafourcade 08-03-2011 20:34:10

Cita:

Empezado por ecfisa (Mensaje 392850)
...
De otro modo, si estas utilizando otro IBQuery para mostrar los datos, tendrías que abrirlo al entrar al form (OnShow por ej.) y cerrarlo
despues de realizado el commit o al salir del form (OnClose por ej.).

...

para desplegar los datos en el dbgrid si uso un ibquery diferente el codigo es el sig:

Código Delphi [-]
with DataModule1.IBQuery2 do
         begin
           close;
           sql.Clear;
           sql.add('SELECT NOMBRE, TOTAL from CREDITOS');
           sql.add('where FECHA=:d and TURNO=:i');
           params[0].asDATE:=DateTimePicker1.date;
           params[1].asinteger:=strtoint(Combobox1.Text);
           unprepare;
           prepare;
           open;
end;

Y si funciona la solucion q m diste pero mi pregunta es ¿Como hacer para q no sea necesario cerrar el Form? lo que quiero decir es q se puedan realizar las consultas sin q sea necesario cerrar el form para que las pueda mostrar.

Espero explicarme bien y no ser molesta con tantas dudas.

ecfisa 08-03-2011 21:25:09

Hola lafourcade.

Si no te entiendo mál, querés que el ingreso realizado se vea reflejado en el DBGrid sin tener que salir y entrar del form.

Entonces tendrías que agregar lo siguiente al código donde insertas:
Código Delphi [-]
procedure TForm12.Button1Click(Sender: TObject);
begin
      ....
      paramByName('TOTT').asfloat:=strtofloat(edit18.text);
      execsql;
      sql.Clear;
      sql.add('commit');
      execsql;
    end;
    DataModule1.IBQuery2.Close; 
    DataModule1.IBQuery2.Open;
    ...
end;
Por que la consulta lanzada en IBQuery2 es anterior a la inserción del nuevo dato, por lo tanto no esta actualizada.
(Si es necesario encapsula en un procedimiento el código donde asignas los valores a IQuery2 y llamalo en reemplazo de las dos
líneas agregadas.)

Si no entendí tu consulta por favor hacemelo saber, no molestas en absoluto ;)

Un saludo.

lafourcade 09-03-2011 21:59:13

hola ecfisa

mira lo q yo despliego en el dbgrid es de otra tabla llamada "creditos", y es con fines meramente informativos, ya que lo que guardo al presionar el boton, es el total de los creditos del dia, el cual se despliega en un edit.

Lo que yo quiero es que al guardar, el dbgrid quede en blanco para que al realizar una nueva consulta se desplieguen los "creditos" que se otrogaron ese nuevo dia, pero siguen apareciendo los de la consulta anterior, hasta que llega a la linea donde realiza la consulta entonces si cambia.

Auch creo q no m explique muy bien, sino fue asi hazmelo saber porfavor. Muchas gracias.

gatosoft 09-03-2011 22:34:07

Hola Lafourcade, complementando (o aclarando) lo que dicen nuestros compañeros de foro, creo que en tu codigo original (donde insertas el turno) te hace falta el código para "blanquear" o cerrar la tabla...


Código Delphi [-]
procedure TForm12.Button1Click(Sender: TObject);
begin
if MessageDlg('DESEA GUARDAR EL TURNO',mtConfirmation, [mbYes, mbNo],0)=mrYes then
begin
    with DataModule1.ibquery1 do
     begin
      close;
      sql.clear;
      sql.Add('insert into C_TURNO(FECHA,TURNO,TOTAL,TOTAL_R,TOTAL_EF,TOTAL_CRE,TOTAL_GA,TOTAL_TAR )');
      sql.add('values(:fec,:tur,:tot,:totr,:tote,:totc,:totg,:tott)');
      paramByName('FEC').ASDATE:=DATETIMEPICKER1.date;
      paramByName('TUR').asstring:=COMBOBOX1.text;
      paramByName('TOT').ASFLOAT:=STRTOFLOAT(edit1.text);
      paramByName('TOTR').asFLOAT:=STRTOFLOAT(edit16.text);
      paramByName('TOTE').asFLOAT:=STRTOFLOAT(edit69.text);
      paramByName('TOTC').asfloat:=strtofloat(edit83.text);
      paramByName('TOTG').asfloat:=strtofloat(edit17.text);
      paramByName('TOTT').asfloat:=strtofloat(edit18.text);
      execsql;
      sql.Clear;
      sql.add('commit');
      execsql;
    end;
    showmessage('EL TURNO SE HA GUARDADO');
    //datamodule1.DataSource10.Enabled:=false;
    Datamodule1.IBQuery1.Close;
    DataModule1.IBQuery1.Open;
end;
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
edit5.Clear;
edit6.Clear;
edit7.Clear;
edit8.Clear;
edit9.Clear;
edit10.Clear;
edit11.Clear;
edit12.Clear;
edit13.Clear;
edit14.Clear;
edit15.Clear;
edit16.Clear;
edit17.Clear;
edit18.Clear;
edit19.Clear;
edit26.Clear;
edit27.Clear;
edit28.Clear;
edit29.Clear;
edit30.Clear;
edit83.clear;


DataModule1.IBQuery2.Close; 

 
end;

lafourcade 09-03-2011 22:44:51

Siiiiiiiiiiiiiiiiiiiiiii

Justo estaba probando poner esa linea y si funciona Muchas gracias a todos los que me ayudaron.

Por aqui nos seguiremos leyendo.

gatosoft 09-03-2011 22:48:54

hola de nuevo lafourcade,


Como aporte te comento que puedes "mejorar" tu codigo de limpieza de TEdits haciendo algo como:

for i := 0 to form1.ComponentCount - 1 do
if form1.Components[i] is TEdit then
(form1.Components[i] as TEdit).Text := '';

Lo anterior se explica asi:

Linea 1) Recorres con un for la lista de componentes de tu formulario (Form1 o como se llame)
Linea 2) Evaluas si el componente es un TEdit
Linea 3) Si cumple con la condición entonces cambias la propiedad text del componente: text:=''
o como en tu caso ejecutas un metodo Clear (Self.Components[i] as TEdit).Clear


Si no quieres borrar TODOS los controles TEdit, si no solamente una parte de ellos podrias valerte d ela propiedad Tag que tienen todos los controles, asi:

Para cada TEdit que tengas que limpiar, busca en el Object Inspector la propiedad Tag, que por defecto estará en cero y cambiala por cualquier valor, por ejemplo 3.. y modificas el codigo anterior con:

for i := 0 to form1.ComponentCount - 1 do
if form1.Components[i] is TEdit then
if (form1.Components[i] as TEdit).Tag = 3 then
(form1.Components[i] as TEdit).Text := '';


Por otro lado "me preocupa" que tengas un componente llamado Edit83... eso quiere decir que muy probablemente tu pantalla este llena de Edits y seria bueno que replantearas usar otro componente como un DbGrid, o un stringGrid para una captura masiva de datos... bueno no concemos tu codigo pero si nos comentas como es tu pantalla, (y si nos queda tiempo) te asesoramos...

un saludo,

lafourcade 09-03-2011 23:59:31

:S en realidad no son 83 de hecho ese num no se d donde salio pero tampoco son pokos, son 62 :O

por otro lado muchas gracias por tu consejo lo aplicare y lamentablemente no tengo permitido aun cargar imagenes siono subia la de mi form para que le echaras un vistazo y m dijeras q otra cosa puedo hacer.

Gracias y Saludos desde Veracruz, Mexico


La franja horaria es GMT +2. Ahora son las 05:26:26.

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