Ir al contenido


Foto

Evento para recalcular ClientDataSet


  • Por favor identifícate para responder
13 respuestas en este tema

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 05 febrero 2015 - 02:54

Hola amigos, tengo una ClientDataSet funcionando como tabla temporal, para hacer un ticket de un terminal de puesto de venta. Queria saber si hay algun evento para recalcular la suma total y por ende el descuento el iva,etc de la tabla.

Porque tengo los sigtes problemas:

Que sucederia si quito productos,
Que sucederia si deseo cambiar de cliente, y el mismo tiene un porcentaje de descuento distinto.
Si quito el cliente y no hay descuento, si quiero agregar mas unidades del mismo producto, etc
  • 0

#2 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 05 febrero 2015 - 03:19

No con un método activado con un evento (explícitamente especificado)
Existe un tipo de campo llamado TAggregate, con él podés calcular usando una expresión ese total.
Se llega al definir los campo del ClientDataSet (doble clic sobre el icono). Agregás los campos y agregás un nuevo campo de tipo aggregate.
la expresión puede ser, por ejemplo: "sum(precio x iva / 100)"
No olvides aggregate activo
podés especificar el formato. Es útil en tu caso el formato predefinido currrency.

Saludos

  • 0

#3 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 05 febrero 2015 - 03:37

Lo intente pero me dice Name not unique in this context... Habia creado el datset antes de introducir los campos y luego se desactivo, pero no se porque al intentarlo de vuelta pasa esto
  • 0

#4 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 05 febrero 2015 - 04:00

Podrías borrar los campos y volver a crearlos, pero no la definición de los campos, sino los que se atan a estas definiciones.
Yo prefiero hacer los cálculos en el evento afterpost que hacerlos en oncalculatedfield. Luego de hacer los cálculos y dejarlos en un campo del dataset, realizo la suma con este valor intermedio calculado.

Cuando tengo problemas del tipo que decís, suelo recrear todo. Porque a veces quedan definiciones que no se borran y se arma un lío por falta de sincronía. Es mi experiencia, quizá haya forma de solucionarlo más elegantemente.

Saludos.

  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 05 febrero 2015 - 04:20

Yo creo que para recalcular todas esas variables es mejor crear un procedimiento que haga todos esos cálculos. Yo siempre uso un form modal para asignar o cambiar un cliente y para agregar o modificar líneas de factura, eso me permite reclacular todo cuando el form modal devuelve MrOk, al igual que cuando se borra una línea de factura.

Saludos.
  • 0

#6 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 05 febrero 2015 - 07:55

Hola, yo usualmente lo hago por medio de un procedimiento, utilizando la función de Clonar el DataSet, de esta manera puedo recorrerlo y hacer todas las operaciones sin alterar el DataSet original.

Saludos.
  • 0

#7 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 08 febrero 2015 - 07:53

Podrías borrar los campos y volver a crearlos, pero no la definición de los campos, sino los que se atan a estas definiciones.
Yo prefiero hacer los cálculos en el evento afterpost que hacerlos en oncalculatedfield. Luego de hacer los cálculos y dejarlos en un campo del dataset, realizo la suma con este valor intermedio calculado.

Cuando tengo problemas del tipo que decís, suelo recrear todo. Porque a veces quedan definiciones que no se borran y se arma un lío por falta de sincronía. Es mi experiencia, quizá haya forma de solucionarlo más elegantemente.

Saludos.


Para utilizar AfterPost basta con que sean campos InternalCalc entonces? y antes del Post solo se colocan los campos de datos simples. y entonces al agregar un cliente si tiene descuento debo hacer el Post, de modo que se ejecute AfterPost, para lo mismo tengo el descuento en el ClientDataSet.
  • 0

#8 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 09 febrero 2015 - 02:33


Podrías borrar los campos y volver a crearlos, pero no la definición de los campos, sino los que se atan a estas definiciones.
Yo prefiero hacer los cálculos en el evento afterpost que hacerlos en oncalculatedfield. Luego de hacer los cálculos y dejarlos en un campo del dataset, realizo la suma con este valor intermedio calculado.

Cuando tengo problemas del tipo que decís, suelo recrear todo. Porque a veces quedan definiciones que no se borran y se arma un lío por falta de sincronía. Es mi experiencia, quizá haya forma de solucionarlo más elegantemente.

Saludos.


Para utilizar AfterPost basta con que sean campos InternalCalc entonces? y antes del Post solo se colocan los campos de datos simples. y entonces al agregar un cliente si tiene descuento debo hacer el Post, de modo que se ejecute AfterPost, para lo mismo tengo el descuento en el ClientDataSet.


No necesariamente, pueden ser de cualquier tipo.

Yo creo que para recalcular todas esas variables es mejor crear un procedimiento que haga todos esos cálculos. Yo siempre uso un form modal para asignar o cambiar un cliente y para agregar o modificar líneas de factura, eso me permite reclacular todo cuando el form modal devuelve MrOk, al igual que cuando se borra una línea de factura.

Saludos.


Como dice Wilson, puedes crear un procedimiento para hacer los cálculos. Yo, cuando hago eso, no creo un método, ni menos una unidad, solo los realizo en el cuerpo de un método del form (uno activado por el evento AfterPost).
Pero, prefiero usar Aggregates para el total, por razones de simpleza y la riqueza que ofrecen los objetos tipo TField, que permiten ser exhibidos con formato de una forma transparente y simple, mientras que los cálculos intermedios lo hago en el procedimiento y elijo afterppost, porque es obvio que se debe actualizar luego de haber aceptado los cambios.

(b) Acá 40°, más (b) (b) (b)
  • 0

#9 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 13 febrero 2015 - 11:19

Dentro del evento AfterPost debo poner en Edit el ClientDataSet, porque me dice DataSet not in edit or insert mode. Sino deberia usar BeforePost, entonces calcularia los campos y luego hace el Post.



delphi
  1. procedure TClientModule1.cdsticketAfterPost(DataSet: TDataSet);
  2. var
  3. x:integer;
  4. begin
  5.  
  6.     cdsticketsubtotal.AsFloat:=cdsticketcantidad.AsFloat * cdsticketprecio.AsFloat;
  7.         cdsticket.First;
  8.         cdstickettotal.AsFloat:=0;
  9.   while not Eof do
  10.  
  11.       begin
  12.  
  13.         cdstickettotal.AsFloat:=cdstickettotal.AsFloat + cdsticketsubtotal.AsFloat;
  14.         cdsticket.Next;
  15.       end;
  16.  
  17.           cdsticketdescuento.AsFloat:=cdstickettotal.AsFloat * (cdsticketpdescuento.AsFloat/100);
  18.           cdstickettotal2.AsFloat:=cdstickettotal.AsFloat - cdsticketdescuento.AsFloat;
  19.  
  20.       cdsticketvuelto.AsFloat:=cdsticketefectivo.AsFloat - cdstickettotal2.AsFloat;
  21.     Form2.StringGrid1.Cells[1,0]:=CurrToStrF(StrToCurr(ClientModule1.cdsticketsubtotal.AsString),ffCurrency,2);
  22.       Form2.StringGrid1.Cells[2,0]:=CurrToStrF(StrToCurr(ClientModule1.cdsticketdescuento.AsString),ffCurrency,2);
  23.       form2.StringGrid1.Cells[3,0]:=CurrToStrF(StrToCurr(ClientModule1.cdstickettotal2.AsString),ffCurrency,2);
  24.  
  25.     end;


Ese es el codigo..
  • 0

#10 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 13 febrero 2015 - 01:02

Supongo que sí, ya que no puedes editar un campo si el dataset no está en modo edición.
Pero hay que tener en cuenta en estos casos (generalizando) que no solo puede estar en modo edición, sino que puede estar en modo inserción. Conviene preguntar, si el dataset no está en modo inserción o edición, ponerlo en uno de estos modos según el caso, supongo que en mo do edición. La lista de los estados de un dataset se encuentra en la ayuda (empiezan con ds, por dataset state).

Saludos

  • 0

#11 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 15 febrero 2015 - 07:09

Supongo que sí, ya que no puedes editar un campo si el dataset no está en modo edición.
Pero hay que tener en cuenta en estos casos (generalizando) que no solo puede estar en modo edición, sino que puede estar en modo inserción. Conviene preguntar, si el dataset no está en modo inserción o edición, ponerlo en uno de estos modos según el caso, supongo que en mo do edición. La lista de los estados de un dataset se encuentra en la ayuda (empiezan con ds, por dataset state).

Saludos


Bueno lo que no puedo hacer es llamar a Post de vuelta ovbiamente.

Pero me gustaria tener un ejemplo de AfterPost de este tipo, estoy buscando en la red.. Muchas gracias, si lo logro lo comparto con uds.
  • 0

#12 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 15 febrero 2015 - 07:27

En realidad es una segunda forma de solucionar el problema.
La mejor manera es siempre utilizando los campos calculados, los aggregates, etc. Te recomiendo que busques la manera de implementarlo por esta vía antes que la segunda opción, todo es más limpio, la solución es más elegante (en otras palabras irías más por el camino correcto, que con la opción de los eventos).

Si puedo pondré unas pantallas y algo de texto para explicarte como se implementa fácilmente.  ;)

Saludos
(b)
  • 0

#13 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 01 marzo 2015 - 08:30

En realidad es una segunda forma de solucionar el problema.
La mejor manera es siempre utilizando los campos calculados, los aggregates, etc. Te recomiendo que busques la manera de implementarlo por esta vía antes que la segunda opción, todo es más limpio, la solución es más elegante (en otras palabras irías más por el camino correcto, que con la opción de los eventos).

Si puedo pondré unas pantallas y algo de texto para explicarte como se implementa fácilmente.  ;)

Saludos
(b)

Amigo una cosa: se puede colocar un campo aggregate dependiente de otro, por ej: el total es sum(subtotal) y el total2 es el total menos el descuento, y el vuelto es efectico ingresado - total2. Es decir el clientdataset debe calcular el total primero, luego total2 luego y por ultimo el vuelto, pero me permite solo un aggregate
  • 0

#14 Azidrain

Azidrain

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 22 mayo 2015 - 04:38

Lo más seguro es que estés editando el dataset en un grid (no lo mencionas). Recordemos que un grid hace post de forma automática al cambiar de fila por lo que la estrategia de usar "afterpost" para recalcular no tiene razón de ser. Los campos "aggregate" en tu caso son la solución y NO no pueden hacer referencia unos a otros, tienes que definirlos por separado aunque repitas operaciones. Si dieras mas datos de tu caso de uso sería más fa´cil


  • 0




IP.Board spam blocked by CleanTalk.