Problemas con dbgrid

He desarrollado un punto de venta con un dbgrid el cual me funciona bien pero
cuando presiono la tecla down (flecha abajo), para recorrer el dbgrid y verificar cada uno
de los registros en lugar de pasar a la linea siguiente, me inserta una nueva linea
a partir de la ultima. Quiero saber como puedo recorrer el dbgrid registro por registron con
la tecla vk_down y que al mismo tiempo el dbgrid realice los cálculos correspondientes sin
desplazarse a la ultima linea. Aquí te presento el código que utilizo:
DATAMODULE2.Auxiliar.FIRST;
Label3.CaptioN := '0';
label23.Caption:='0';
while  datamodule2.Auxiliar.Eof = false do
Begin
LABEL9.CAPTION:=FloatToStr(datamodule2.Auxiliar.FieldByName('Subtotal').AsFloat +StrToFloat(Label3.Caption));
label23.Caption:=floattostr(dbgrid1.Fields[5].AsFloat+strtofloat(label23.Caption));
LABEL10.CAPTION:=FLOATTOSTR(STRTOFLOAT(EDIT6.TEXT)/STRTOFLOAT(EDIT5.Text)*STRTOFLOAT(LABEL9.CAPTION));
Label3.Caption := FloatToStr(datamodule2.Auxiliar.FieldByName('Subtotal').AsFloat +StrToFloat(Label3.Caption)-STRTOFLOAT(LABEL10.CAPTION));
Label18.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label10.caption));
Label17.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label9.caption));
Label19.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label3.caption));
 datamodule2.auxiliar.Next;
 end;

4 Respuestas

Respuesta
1
Lo que te recomiendo es no trabajar directamente la información con el grid conectado a la tabla, seria recomendable cargar los datos en una tabla temporal, y de ahí mostrarlo en la grid, ahí los puedes editar, agregar, eliminar y todo lo que te imaginas, sin problemas.
Aquí un articulo si no tienes muy claro como manejar tablas temporales:
http://delphiallimite.blogspot.com/2007/11/creando-tablas-de-memoria-con.html
Respecto a la tacla Enter.
1) Establecer la propiedad KeyPreview a True en la grilla
2) Ningún botón en el formulario debe estar como Defalut
3) Crear este procedimiento
Procedure Tform1.FormKeyPress(Sender: Tobject; var Key: Char);
Begin
If key = #13 then
    Begin 
    Key:= #0;
    //aki lo que quieres que haga;
     end;
end;
En realidad esto es sencillo y tengo la seguridad que ya lo has hecho, si no te jalaba era por cuestión de la tabla. Si no te late la tabla temporal, igual y prueba poner table. Edit y el table. Post correspondiente.
Cualquier cosa pregunta Saludos
Respuesta
1
¿En qué momento disparas ese proceso?
Hola, Mi problema es el siguiente:
He desarrollado un punto de venta con un dbgrid el cual me funciona bien pero
cuando presiono la tecla down (flecha abajo), para recorrer el dbgrid y verificar cada uno
de los registros en lugar de pasar a la linea siguiente, me inserta una nueva linea
a partir de la ultima. Quiero saber como puedo recorrer el dbgrid registro por registron con
la tecla vk_down y que al mismo tiempo el dbgrid realice los cálculos correspondientes sin
desplazarse a la ultima linea. Aquí te presento el código que utilizo:
DATAMODULE2.Auxiliar.FIRST;
Label3.CaptioN := '0';
label23.Caption:='0';
while  datamodule2.Auxiliar.Eof = false do
Begin
LABEL9.CAPTION:=FloatToStr(datamodule2.Auxiliar.FieldByName('Subtotal').AsFloat +StrToFloat(Label3.Caption));
label23.Caption:=floattostr(dbgrid1.Fields[5].AsFloat+strtofloat(label23.Caption));
LABEL10.CAPTION:=FLOATTOSTR(STRTOFLOAT(EDIT6.TEXT)/STRTOFLOAT(EDIT5.Text)*STRTOFLOAT(LABEL9.CAPTION));
Label3.Caption := FloatToStr(datamodule2.Auxiliar.FieldByName('Subtotal').AsFloat +StrToFloat(Label3.Caption)-STRTOFLOAT(LABEL10.CAPTION));
Label18.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label10.caption));
Label17.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label9.caption));
Label19.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label3.caption));
 datamodule2.auxiliar.Next;
 end;
Pero por si acaso lo que pasa es que al recorrer el qry, te desplazas al a ultima linea,
por eso ves el efecto que se va la ultima linea,
tendría que conocer la estructura de tu tabla para darte una idea, por ejemplo
yo utilizo un correlativo dentro de mi tabla entonces en el evento
after insert de mi qry guardo el correlativo .. hago los cálculos necesarios
y vuelvo al correlativo que guarde.. algo así:
cor := myqryCor.value;
calculos_;
myqryCor.locate('Cor',cor,[]);
//******************************
Esas 3 lineas guardan la ubicación anterior, hace cualquier calculo
y después localiza la posición anterior
Este proceso se ejecuta en el evento onkeydown.
entonces antes del while guarda el registro
reg := datamodule2.Auxiliar.recno;
while
Begin
.
Skip
end;
datamodule2.Auxiliar.recno:= reg;
Respuesta
1
//No había entrado antes pues en estos días ando de vacaciones. :D
Tu problema lo has presentado de una manera bastante pobre y trataré de responderte con lo que he entendido.
Primero, el cursor se posiciona al final de la grid porque al hacer un keydown siempre estás haciendo el while de la sumatoria.
//Esto te llevara siempre al final de la grid.
while not eof do
 ...
 next;
end;
Por otro lado creo que los cálculos debes hacerlos al realizar un cambio, descuento, inserción o eliminación. No al recorrer la grid.
Si quieres evitar recorrer la grid sumando todo, puedes usar otro dataset (SQL) que te haga una sumatoria desde la DB y te devuelva el resultado.
"SELECT SUM(TOTAL) FROM ventas WHERE ID = :ID"
Y actualizar esta consulta al insertar, eliminar, agregar algo.
Cualquier cosa me cuentas y perdona la demora ;)
Respuesta
1
Ok el problema que tienes es que tienes el código del next dentro de un ciclo, por lo que te recorrerá hasta al final en cada ejecución...
Prueba a
Enviar el datamodule2.auxiliar.Next; por cada vez que presionas la tecla que deseas, como un parámetro a tu procedimiento, omitiendo el recorrido por ciclo en este procedimiento... algo así...
Procedimiento_A (DATAMODULE2.Auxiliar)
begin
Label3.CaptioN := '0';
label23.Caption:='0';
if datamodule2.Auxiliar.Eof = false then
Begin
  LABEL9.CAPTION:=FloatToStr(datamodule2.Auxiliar.FieldByName('Subtotal').AsFloat   +StrToFloat(Label3.Caption));
  label23.Caption:=floattostr(dbgrid1.Fields[5].AsFloat+strtofloat(label23.Caption));
  LABEL10.CAPTION:=FLOATTOSTR(STRTOFLOAT(EDIT6.TEXT)/STRTOFLOAT(EDIT5.Text)*STRTOFLOAT(LABEL9.CAPTION));
  Label3.Caption := FloatToStr(datamodule2.Auxiliar.FieldByName('Subtotal').AsFloat +StrToFloat(Label3.Caption)-STRTOFLOAT(LABEL10.CAPTION));
  Label18.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label10.caption));
  Label17.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label9.caption));
  Label19.Caption := FormatFloat ('###,###,##0.00 ;-###,###,##0.00 ;0',STRTOFLOAT(label3.caption));
END;
end
Y lo llamas enviando como parámetro inicialmente una variable con el first... y posteriorpor cada precion del botón, con un next...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas