Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema para Actualizar en un VirtualQuery (https://www.clubdelphi.com/foros/showthread.php?t=93273)

darkamerico 09-07-2018 20:17:12

Problema para Actualizar en un VirtualQuery
 
Saludos amigos, estoy haciendo un carrito de compras usando 10.2.1 Tokyo y SQL Server 2014. He aqui la situacion:

Paso 1: Identificación de Componentes Involucrados:

1. cxGrid (nombre=gridCarritoCompra),
2. TVirtualTable (nombre=vt_Carrito)
3. TVirtualQuery (nombre=q_UPDParams)
4. TUniDataSource (nombre=ds_Carrito)
5. TcxTextEdit (nombre=txtCantidad)
6. TcxTextEdit (nombre=txtPrevioVenta)

Paso 2: Descripción del Proceso

1. El Usuario busca y selecciona un producto, el cual se agrega a vt_Carrito y se muestra en gridCarritoCompra. (Esto funciona bien). Por defecto la cantidad del pedido agregado es 1.

2. El usuario al hacer doble clic sobre la fila que contiene el pedido de un producto en vt_Carrito, se permite cambiar la cantidad y el precio de venta en txtCantidad y txtPrecioVenta ubicados en la parte inferior del cxgrid.

3. Se programó el evento OnExit de txtCantidad para ejecutar el siguiente código:
Código Delphi [-]
procedure TfrmCompras.txtCantidadExit(Sender: TObject);
begin
  q_UPDParams.Close;
  q_UPDParams.Params[0].AsString:=txtCantidad.Text;
  q_UPDParams.Params[1].AsString:=txtPrecioVenta.Text;
  q_UPDParams.Params[2].AsString:=FloatToStr(StrToFloat(txtCantidad.Text)*StrToFloat(txtPrecioVenta.Text));
  q_UPDParams.Params[3].AsString:=IntToStr(idNroDetailSelecc);
  q_UPDParams.ExecSQL;
  gridCarritoCompraDBTableView1.DataController.DataSet.Refresh;
  q_CalcTotal.Close;
  q_CalcTotal.Open;
  txtMontoTotal.Text:=q_CalcTotal.Fields[0].AsString;
end;

4. El Codigo SQL de q_UPDParams es:
Código SQL [-]
UPDATE vt_Carrito
SET CANT=:NewCant,
    PRECIOUNIT=:NewPrecio,
    SUBTOTAL=:NewSubTotal
WHERE NRO=:NroX

5. Los Eventos Click y DblClick de la cxGrid los coloco a continuacion:

Código Delphi [-]
procedure TfrmCompras.gridCarritoCompraDBTableView1CellClick(
  Sender: TcxCustomGridTableView; ACellViewInfo: TcxGridTableDataCellViewInfo;
  AButton: TMouseButton; AShift: TShiftState; var AHandled: Boolean);
var
  ColCant,ColPrecioVenta, ColNro:TField;
begin
  ColCant:=gridCarritoCompraDBTableView1CANT.DataBinding.Field;
  ColPrecioVenta:=gridCarritoCompraDBTableView1PRECIOUNIT.DataBinding.Field;
  ColNro:=gridCarritoCompraDBTableView1NRO.DataBinding.Field;
  txtCantidad.Text:=ColCant.AsString;
  txtPrecioVenta.Text:=ColPrecioVenta.AsString;
  idNroDetailSelecc:=ColNro.AsInteger;
end;

procedure TfrmCompras.gridCarritoCompraDBTableView1CellDblClick(
  Sender: TcxCustomGridTableView; ACellViewInfo: TcxGridTableDataCellViewInfo;
  AButton: TMouseButton; AShift: TShiftState; var AHandled: Boolean);
begin
  itemCantidad.Enabled:=True;
  itemPV.Enabled:=True;
  txtCantidad.SetFocus;
end;


El problema es que solo funciona la primera vez la actualización, visualizandose el cambio en la grilla, la segunda vez y subsiguientes no hace ningún cambio.

Agradezco cualquier ayuda en esto.

Americo

Neftali [Germán.Estévez] 10-07-2018 11:15:50

Cita:

Empezado por darkamerico (Mensaje 527545)
El problema es que solo funciona la primera vez la actualización, visualizandose el cambio en la grilla, la segunda vez y subsiguientes no hace ningún cambio.


¿Exactamente del comportamiento que comentas, cual es el que no funciona (intenta concretar)?
Por otro lado, mi recomendación es que no utilices los eventos visuales para realizar tareas en la Base de Datos. En el caso del Exit, yo revisaría los eventos asociados al Dataset (al cambiar el valor del campo).

darkamerico 10-07-2018 15:00:00

Gracias Netftali como siempre
 
Aqui te resumo en 36 segundos el problema. Respecto a tu recomendación, como haría específicamente lo que intento hacer aquí?

Un abrazo

Neftali [Germán.Estévez] 11-07-2018 10:51:58

Cita:

Empezado por darkamerico (Mensaje 527560)
Aqui te resumo en 36 segundos el problema.

1) Pon un ShowMessage de los parámetros de la sentencia, para ver que estás actualizando realmente el valor.
2) Revisa el valor de Base de Datos, para saber (lo primero) si es un problema visual o de Base de Datos (así centras el problema).

Cita:

Empezado por darkamerico (Mensaje 527560)
Respecto a tu recomendación, como haría específicamente lo que intento hacer aquí?

Por lo que he visto en el vídeo, el componente de cantidad no es un componente de Dataware. Pensé que lo estaban modificando sobre el DBGrid. En ese caso no normal para recalculos sería utilizar alguno de los eventos de cambio del Dataset. De esa forma, por ejemplo, funcionaría todo igual si hicieras el cambio por código (de la cantidad).
Al no ser un componente Dataware, yo lo que haría sería poner ese código en un módulo de Datos (procedure ActualizacionLineaDetalle) y hacer la llamada desde el evento.
De esta forma al menos, "separas" la parte visual de la parte lódica/Datos.

darkamerico 11-07-2018 15:36:43

Gracias Neftali
 
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 527566)
1) Pon un ShowMessage de los parámetros de la sentencia, para ver que estás actualizando realmente el valor.
2) Revisa el valor de Base de Datos, para saber (lo primero) si es un problema visual o de Base de Datos (así centras el problema).


Por lo que he visto en el vídeo, el componente de cantidad no es un componente de Dataware. Pensé que lo estaban modificando sobre el DBGrid. En ese caso no normal para recalculos sería utilizar alguno de los eventos de cambio del Dataset. De esa forma, por ejemplo, funcionaría todo igual si hicieras el cambio por código (de la cantidad).
Al no ser un componente Dataware, yo lo que haría sería poner ese código en un módulo de Datos (procedure ActualizacionLineaDetalle) y hacer la llamada desde el evento.
De esta forma al menos, "separas" la parte visual de la parte lódica/Datos.

Si me sale posteo el codigo

Saludos

darkamerico 11-07-2018 17:11:30

Hice los primeros cambios
 
Saludos Neftali, me pareció prudente cambiar los 2 componentes de texto txtCantidad y txtPrevioVenta a componentes DB-Aware, ahora son TCxDBTextEdit y estan conectados a sus respectivos campos correctamente. Aquí los cambios:

Paso 1: En el Evento OnExit de txtCantidad hago el post:

Código Delphi [-]
procedure TfrmCompras.txtCantidadExit(Sender: TObject);
begin
  ds_Carrito.Edit;
  ds_Carrito.DataSet.Post;
  gridCarritoCompraDBTableView1.DataController.DataSet.Refresh;
  q_CalcTotal.Close;
  q_CalcTotal.Open;
  txtMontoTotal.Text:=q_CalcTotal.Fields[0].AsString;
end;

Sin embargo, al intentar cambiar un valor la aplicación arroja un error: Assertion failure (D:\Projects\MemData.pas, line 7161), luego al salir del foco del componente aparece el mensaje de que el DataSet no esta en Edit o Insert Mode...

Recuerda que estoy trabajando sobre un VirtualTable llamado vt_Carrito, de modo que la única forma que conozco de saber que se realizo bien es mediante la visualizacion de sus registros en la grilla.

Saludos

Neftali [Germán.Estévez] 12-07-2018 11:38:12

Cita:

Empezado por darkamerico (Mensaje 527570)
Sin embargo, al intentar cambiar un valor la aplicación arroja un error: Assertion failure (D:\Projects\MemData.pas, line 7161), luego al salir del foco del componente aparece el mensaje de que el DataSet no esta en Edit o Insert Mode...


Normalmente ese error ocurre cuando intentas cambiar un Dataset (un valor de un campo) estando en el estado "incorrecto".
Las líneas en el orden correcto serían algo así; Revisa que las estés haciendo correctamente


Código Delphi [-]
   ...   

   // Cambiar el estado

   Dataset.Edit;
   // Modificar el campo

   Dataset.FieldByname('NOMBRECAMPO').AsString := 'aa';
   ... otras formas de modificar valores
   // Guardar los cambios
   Dataset.Post


Revisa las líneas donde estés cambiando campos del Dataset y asegurate de que el Dataset está en modo Edit;



Haz debug paso a paso y dinos exactamente la línea que está fallando.

darkamerico 12-07-2018 19:52:57

Error Assertion
 
Este es el error...AQUI

El formulario Compras lo subi Aqui

Un abrazo


La franja horaria es GMT +2. Ahora son las 20:39:23.

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