Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-07-2018
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 10-07-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por darkamerico Ver Mensaje
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).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 10-07-2018
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
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

Última edición por darkamerico fecha: 10-07-2018 a las 15:03:31.
Responder Con Cita
  #4  
Antiguo 11-07-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por darkamerico Ver Mensaje
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 Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 11-07-2018
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
Gracias Neftali

Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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
Responder Con Cita
  #6  
Antiguo 11-07-2018
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
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

Última edición por darkamerico fecha: 11-07-2018 a las 17:28:00.
Responder Con Cita
  #7  
Antiguo 12-07-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por darkamerico Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 12-07-2018
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 225
Poder: 14
darkamerico Va por buen camino
Error Assertion

Este es el error...AQUI

El formulario Compras lo subi Aqui

Un abrazo
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema para actualizar fecha oscarac OOP 3 31-01-2018 02:33:27
Actualizar freepascal para programar con XE2 para iOS PacoPepe FireMonkey 0 18-04-2013 12:19:21
Problema con Stored Procedure para actualizar tabla con datos de otra tabla. Adrian Murua MySQL 4 04-02-2012 03:54:49
Problema para actualizar el servidor papulo Firebird e Interbase 42 04-09-2008 12:15:28
Problema Para Actualizar Un Registro sdiaz1983 Conexión con bases de datos 3 21-01-2008 05:00:10


La franja horaria es GMT +2. Ahora son las 13:31:11.


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
Copyright 1996-2007 Club Delphi