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)
-   -   Un DBgrid cabezón (https://www.clubdelphi.com/foros/showthread.php?t=47298)

Cecilio 23-08-2007 20:40:53

Un DBgrid cabezón
 
Hola.
Estoy haciendo mi primera aplicación medio en serio medio de prueba. Un Tpv.

el problema que tengo es que selecciono un ticket, en un dbgrid muestro las lineas de detalle. Cuando inserto o modifico lineas estas no se refrescan aunque lance de nuevo la consulta que las muestra.
Este es código:
Código:

var
  s: string;
begin
 DbGrid1.DataSource:=dm.T.Vacio;
 s:='SELECT CODIGO,DESCRIPCION, UNI, PVP, DTO,TOTAL,POS FROM LINTIK WHERE '+filtro;
 dm.t.DataSource1.DataSet.Close;
 dm.t.IBQuery1.Active:=FALSE;
 dm.t.IBQuery1.Close;

 dm.T.IBTquery.Active:=false;

 dm.t.IBQuery1.SQL.Clear;
 dm.t.IBQuery1.SQL.Add(S);
 dm.T.IBTquery.Active:=true;

 dm.t.IBQuery1.Open;
 dm.t.IBQuery1.Active:=TRUE;
 DbGrid1.DataSource:=dm.T.DataSource1;
 dbGrid1.Refresh;

Como podeis ver, a la desesperada, he reasignado datasource y todo lo que he podido.

¿ como hacer para que se refresque ?

P.D. he buscado en el foro, y no he encontrado en las primera 3 pag. nada.

Caral 23-08-2007 20:47:29

Hola
Me parece que estas haciendo un escabeche.
Para mi ya tienes la informacion y esta ligada al dbgrid.
Con solo esto:
Código Delphi [-]
dm.t.IBQuery1.Active:=False;
dm.t.IBQuery1.Active:=True;
Ya tiene que refrescar, cierras y abres, cual es el problema, no lo veo.
Saludos

Cecilio 23-08-2007 20:55:10

Pues que no se refrescan las lineas del dbgrid

fíjate en mi código:
Código:

dm.T.IBTquery.Active:=false;

 dm.t.IBQuery1.SQL.Clear;
 dm.t.IBQuery1.SQL.Add(S);
 dm.T.IBTquery.Active:=true;

Está como tu me comentas. Pero sin embargo. Las lineas no se refescan hasta que cierro y abro la aplicación.

He probado incluso a realizar un commit por si la transacción no se ha completado.

Caral 23-08-2007 21:05:42

Hola
Para empezar el DBGrid no tiene nada que ver en esto, este es simplemente refleja lo que hay en el query, que es el importante, aqui.
Modificando un poco esto, quedaria asi:
Código Delphi [-]
begin
  dm.t.IBQuery1.Active:=False;
  dm.t.IBQuery1.SQL.Text:='SELECT CODIGO,DESCRIPCION, UNI, PVP, DTO,TOTAL,POS FROM LINTIK WHERE '+filtro;
 dm.T.IBTquery.Active:=true;
Sigo sin entender, se cierra y se abre, el problema debe ser otro.
Sigo pensando que generas codigo innecesario.
Saludos

egostar 23-08-2007 21:09:41

Cita:

Empezado por Caral (Mensaje 225604)
Hola
Para empezar el DBGrid no tiene nada que ver en esto, este es simplemente refleja lo que hay en el query, que es el importante, aqui.
Modificando un poco esto, quedaria asi:

Código Delphi [-]
begin
dm.t.IBQuery1.Active:=False;
dm.t.IBQuery1.SQL.Text:='SELECT CODIGO,DESCRIPCION, UNI, PVP, DTO,TOTAL,POS FROM LINTIK WHERE '+filtro;
dm.T.IBTquery.Active:=true;




Sigo sin entender, se cierra y se abre, el problema debe ser otro.
Sigo pensando que generas codigo innecesario.
Saludos

Solo agregando a la buena participación de nuestro amigo Carlos:), que conste amigo.......

No será que debes de ejecutar el query y no solo abrirlo?

Código Delphi [-]
 
   Query1.ExecSQL;

Salud OS.

Cecilio 23-08-2007 21:50:38

ExecSql no deja para una consulta "Select" dice que se use Open

No consigo que se refresquen las tablas.

Caral Está todo como tu dices, y no se actualiza, ¿ qué otra cosa podría ser

¿Podrían ser las transacciones ?

egostar 23-08-2007 21:52:21

Cita:

Empezado por Cecilio (Mensaje 225642)
ExecSql no deja para una consulta "Select" dice que se use Open

No consigo que se refresquen las tablas.

Caral Está todo como tu dices, y no se actualiza, ¿ qué otra cosa podría ser

¿Podrían ser las transacciones ?

Perdon tienes razon,

Salud OS

egostar 23-08-2007 21:56:58

Parece que se donde está el problema


Código Delphi [-]
 
   DbGrid1.DataSource:=dm.T.Vacio;
   s:='SELECT CODIGO,DESCRIPCION, UNI, PVP, DTO,TOTAL,POS FROM LINTIK WHERE '+filtro;
   dm.t.DataSource1.DataSet.Close;
   dm.t.IBQuery1.Active:=FALSE;
   dm.t.IBQuery1.Close;

   dm.T.IBTquery.Active:=false;

   dm.t.IBQuery1.SQL.Clear;
   dm.t.IBQuery1.SQL.Add(S);
   dm.T.IBTquery.Active:=true;

   dm.t.IBQuery1.Open;
   dm.t.IBQuery1.Active:=TRUE;
   //DbGrid1.DataSource:=dm.T.DataSource1; Estas redeclarando el DBGrid1
   dbGrid1.Refresh;

Salud OS

PD Perdón por la nota anterior, todo por no leer:)

Caral 23-08-2007 21:59:20

Hola
Vamos por pasos, a ver si lo entiendo.
Revisa estos puntos y me comentas.
1- tienes un dbgrid el que esta ligado a un query, este muestra la informacion que necesitas.
2- La informacion que presenta el query contiene el campo clave para actualizarse.
3- Editas el query o la tabla en algun sitio o paso que no veo en tu codigo.
4- Haces un post o guardas los datos.
5- quieres volver a ver el contenido, pero esta vez modificado.
Si estas siguiendo estos pasos, no entiendo cual es el problema..
Saludos

ramiretor 23-08-2007 22:05:20

Hola:
El problema para que veas los datos es que necesitas dejarlos en la base de datos y no en el cliente, como te dicen, editas los datos y los guardas pero solo en el cliente, necesitas hacer un commit en la base de datos, y ahora sí los podrás ver

Saludos a todos

egostar 23-08-2007 22:15:33

Cita:

Empezado por ramiretor (Mensaje 225651)
Hola:
El problema para que veas los datos es que necesitas dejarlos en la base de datos y no en el cliente, como te dicen, editas los datos y los guardas pero solo en el cliente, necesitas hacer un commit en la base de datos, y ahora sí los podrás ver

Saludos a todos

Ciertamente se requiere de hacer el commit para que los datos queden en la base, solo que no es un insert, es un select (cometí el mismo error no se preocupen) el problema que veo yo, como ya lo postee es que está redireccionando el DBGrid antes del refresh, solo hay que borrar ésta línea.

Código Delphi [-]
 
DbGrid1.DataSource:=dm.T.DataSource1;

ya que arriba ya asignó el debgrid con ésta otra

Código Delphi [-]
DbGrid1.DataSource:=dm.T.Vacio;

Salud OS

Cecilio 24-08-2007 13:56:52

Perdón por no haber escrito antes. Estoy a caballo entre dos ciudades.

Os explico mejor los procesos:
  1. Recupero o creo un ticket nuevo. El procedimiento verLineas, me muestra las lineas actuales. (Por ahora todo bien).
  2. Si es un ticket nuevo, agrego un artículo a vender. es decir una linea nueva. O modifico una linea ya existente:
Código:

  Asql.Limpia;
  asql.asigna('CODIGO',Acod.Text);
  asql.asigna('DESCRIPCION',Ades.Text);
  asql.asigna('PVP',Apvp.Text);
  asql.asigna('DTO',Adto.Text);
  asql.asigna('NFACT',IntToStr(i));
  asql.asigna('CAJA',dm.T.Caja);
  asql.asigna('IVA','16');
  asql.asigna('CLIENTE',Edit4.Text);
  asql.asigna('FECHA',dm.T.IbFecha);
  asql.asigna('ALMACEN',dm.T.ALmacen);
  asql.asigna('EJERCICIO',dm.T.ejercicio);
  asql.asigna('ECODIGO',dm.T.ecodigo);

 if mpos.Text='' then  // Si es una linea nueva.
  s:=ASQL.carga('LINTIK')
 else
  begin // Es una modificación.
    asql.Clausula:=' POS='+mPOS.Text;
    s:=ASQL.cargaModif('LINTIK');
    mpos.Text:='';
  end;
  DM.T.IBSQL1.SQL.Clear;
    DM.T.IBSQL1.SQL.Add(s);
    DM.T.IBSQL1.ExecQuery;
    DM.T.IBSQL1.Close;


  s:='update lintik ';
  s:=s+'set parcial_l=uni*pvp, ';
  s:=s+'imp_dto=((parcial_l*dto)/100), ';
  s:=s+'base=parcial_l-imp_dto, ';
  s:=s+'cuota=((base*iva)/100), ';
  s:=s+'total=base-cuota';
  s:=s+' where '+filtro;

  dm.T.IBSQL1.Close;
  dm.T.IBSQL1.SQL.Clear;
  dm.t.IBSQL1.SQL.Add(s);
  dm.T.IBSQL1.ExecQuery;
  dm.T.IBSQL1.Close;

  VerLineas;

  • He puesto el código que agrega o modifica lineas. Como veis todo es por SQL.
  • Tras las modificaciones o inserciones, llamo a VerLineas que es el responsable de actualizar el DBGrid. Pero no se actualiza.
  • No le hagais caso al objeto Asql, es una unidad que diseñe para crear de forma cómoda los insert o los updates. El metodo carga o cargamodif solo retorna la sentencia SQL en funcion de los campos asignados. Esto funciona.
  • Algo significativo es que solo se ver las modificiaciones cuando cierro y abro la aplicación.
Código:

Procedure TForm1.VerLineas;
var
  s: string;
begin
 s:='SELECT CODIGO,DESCRIPCION, UNI, PVP, DTO,TOTAL,POS FROM LINTIK WHERE '+filtro;
 dm.T.IBTquery.Active:=false;
 dm.t.IBQuery1.SQL.Clear;
 dm.t.IBQuery1.SQL.Add(S);
 dm.T.IBTquery.Active:=true;
 dm.T.IBQuery1.Open;
// dbGrid1.Refresh;
// totales;
end;


Caral 24-08-2007 18:42:06

Hola
Dos cosas:
1: Que contiene filtro, que es?
2: Esto es reiterativo o es una u otra, para que las dos:
o es un error de escritura o tienes dos query?
Código Delphi [-]dm.T.IBTquery.Active:=true;
dm.T.IBQuery1.Open;


Me explicas el punto 1?
Saludos

Cecilio 26-08-2007 00:15:52

Perdon por la tardanza.

Al final he conseguido solucionarlo.

Tras enviar la consulta SQL realizo un commit de la transacción.

El código completo sería este:
Código:

    DM.T.IBSQL1.SQL.Clear;
    DM.T.IBSQL1.SQL.Add(s);
    DM.T.IBSQL1.ExecQuery;
    DM.T.IBSQL1.Transaction.commit; // esta es la solución
    DM.T.IBSQL1.Close;

Por si puede servirle a alguien.

Y a Todos los que me han ayudado.. Muchas Gracias.


La franja horaria es GMT +2. Ahora son las 06:13:40.

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