PDA

Ver la Versión Completa : Campo aggregate dependiente de otro en clientdataset


giulichajari
01-03-2015, 19:40:42
Hola amigos, estoy haciendo la factura de un Terminal de puesto de venta. Es posible colocar en un clientdataset luego de un campo agreggate otro dependiente? por ejemplo: el total es sum(subtotal)(es la suma de todos los precios por sus respectivas cantidades), entonces pongo total2 que es total menos descuento. total2 depende de total. Otro caso es el vuelto es efectivo menos total2.

Cuando hago esto obtengo: Bit index out of range, es decir si dejo un solo aggregate se soluciona.

¿Que puede ser?

ecfisa
01-03-2015, 20:39:51
Hola giulichajari.

No podes usar el nombre de campo "total" en la expresión del campo total2, creo que la expresión que correspondería es:

ClientDataSet1TOTAL2.Expresion:= 'SUM(subtotal) - SUM(descuento)'; // conf. desde el Object Inspector


Saludos :)

giulichajari
01-03-2015, 20:47:22
Hola giulichajari.

No podes usar el nombre de campo "total" en la expresión del campo total2, creo que la expresión que correspondería es:

ClientDataSet1TOTAL2.Expresion:= 'SUM(subtotal) - SUM(descuento)'; // conf. desde el Object Inspector


Saludos :)

Entonces vuelto es:
sum(efectivo) - (sum(subtotal) - sum(descuento))

ecfisa
01-03-2015, 21:07:38
Hola giulichajari.
Entonces vuelto es:
sum(efectivo) - (sum(subtotal) - sum(descuento))
No conozco el cálculo que deseas realizar, pero si se trata de restarle a "efectivo" la suma de "subtotal" y la suma "descuento", no tendrías el resultado esperado.

Debería ser:

SUM(efectivo) - (SUM(subtotal) + SUM(descuento))

Por que al suprimir paréntesis precedidos de signo menos, cambian los signos de los términos incluídos en él.

O expresado de forma mas simple:

SUM(efectivo) - SUM(subtotal) - SUM(descuento)


Saludos :)

giulichajari
01-03-2015, 21:22:57
Hola giulichajari.

No conozco el cálculo que deseas realizar, pero si se trata de restarle a "efectivo" la suma de "subtotal" y la suma "descuento", no tendrías el resultado esperado.

Debería ser:

SUM(efectivo) - (SUM(subtotal) + SUM(descuento))

Por que al suprimir paréntesis precedidos de signo menos, cambian los signos de los términos incluídos en él.

O expresado de forma mas simple:

SUM(efectivo) - SUM(subtotal) - SUM(descuento)


Saludos :)

Me refiero al vuelto para el cliente el total2 es $500 y el cliente entrega $1000
Por lo que dices no puedo colocar total2 en la expresion del campo vuelto entonces debo repetir todo.

ecfisa
01-03-2015, 21:40:30
...
Por lo que dices no puedo colocar total2 en la expresion del campo vuelto entonces debo repetir todo.
Si, así es. La expresión "conoce" los nombres de campos de la tabla, pero no el nombre que le diste al campo persistente.

Saludos :)

giulichajari
01-03-2015, 21:49:17
Si, así es. La expresión "conoce" los nombres de campos de la tabla, pero no el nombre que le diste al campo persistente.

Saludos :)
Bueno no se si esta bien asi:
total: sum(subtotal)
descuento: sum(subtotal) * sum(pdescuento/100)
total2: sum(subtotal) - sum(subtotal) * sum(pdescuento/100)
vuelto: sum(efectivo - (sum(subtotal) - sum(subtotal) * sum(pdescuento/100))

Me dice operation cannot mix aggregate value with record variyng value

ecfisa
01-03-2015, 22:22:10
Bueno, me gustaría tener información mas detallada de lo que estamos hablando pero así, a simple vista, ya veo un problema.

Supongamos que tu tabla tiene estos datos:

ID SUBTOTAL PDESCUENTO
1 100 20
2 110 20
3 90 20
4 50 20
5 150 20


Entonces "total2" y su expresión,

sum(subtotal) - sum(subtotal) * sum(pdescuento/100)

resultan en valor 0 ya que la sumatoria del descuento es igual a 100% y si seguimos agregando filas terminaríamos pagándole al cliente.

Sería importante que expliques con detalle de que se trata lo que estas haciendo, los cálculos y resultados que deseas obtener y los campos involucrados en el asunto.

Saludos :)

giulichajari
01-03-2015, 22:29:48
Bueno, me gustaría tener información mas detallada de lo que estamos hablando pero así, a simple vista, ya veo un problema.

Supongamos que tu tabla tiene estos datos:

ID SUBTOTAL PDESCUENTO
1 100 20
2 110 20
3 90 20
4 50 20
5 150 20


Entonces "total2" y su expresión,

sum(subtotal) - sum(subtotal) * sum(pdescuento/100)

resultan en valor 0 ya que la sumatoria del descuento es igual a 100% y si seguimos agregando filas terminaríamos pagándole al cliente.

Sería importante que expliques con detalle de que se trata lo que estas haciendo, los cálculos y resultados que deseas obtener y los campos involucrados en el asunto.

Saludos :)
Es el detalle de un ticket. yo agrego productos y calculo el total, y si se agrega un cliente se aplcia el descuento, si luego de agregar un cliente se agregan mas productos, tambien se lo vuelve a calcular. Y teniendo el total y el descuento se calcula un nuevo total. Luego se introduce el efectivo del cliente y se calcula el vuelto para cerrar el ticket

ecfisa
01-03-2015, 23:02:35
Es el detalle de un ticket. yo agrego productos y calculo el total, y si se agrega un cliente se aplcia el descuento, si luego de agregar un cliente se agregan mas productos, tambien se lo vuelve a calcular. Y teniendo el total y el descuento se calcula un nuevo total. Luego se introduce el efectivo del cliente y se calcula el vuelto para cerrar el ticket
Entonces pareciera que sólo necesitas obtener la sumatoria del subtotal, el resto son solo operaciones aritméticas...

De donde obtenes el valor del descuento a aplicar, ¿ De la tabla de clientes ?

Saludos :)

giulichajari
01-03-2015, 23:44:28
Entonces pareciera que sólo necesitas obtener la sumatoria del subtotal, el resto son solo operaciones aritméticas...

De donde obtenes el valor del descuento a aplicar, ¿ De la tabla de clientes ?

Saludos :)

Claro, tengo un boton asociar en un form con la tabla clientes. La idea es asignar el valor del descuento de este query al campo pdescuento del clientdataset para obtener el valor del descuento. La idea es usar campos aggregates para que con solo hacer Post, por ejemplo, al asociar el cliente o agregar productos todo se calcula solo. Probe hacerlo manualmente pero no pude.

ecfisa
02-03-2015, 05:50:25
Hola.

Como te dije, no estas dando toda la información necesaria. No sé la organización de tus datos por lo que voy a partir de un supuesto:

CREATE TABLE VENTAS (
ID INTEGER NOT NULL,
COD_FACT VARCHAR(10) NOT NULL,
PRODUCTO_ID INTEGER,
CANTIDAD INTEGER NOT NULL,
SUBTOTAL NUMERIC(18,8),
FECHA DATE,
HORA TIME
);

CREATE TABLE PRODUCTOS (
ID INTEGER NOT NULL,
DESCRIPCION VARCHAR(40),
PRECIO NUMERIC(15,4) --, ...
);

CREATE TABLE CLIENTES (
ID INTEGER NOT NULL,
NOMBRE VARCHAR(40),
DESCUENTO NUMERIC(15,4) --, ...
);


En el ClientDataSet relacionado a la tabla VENTAS crea un campo calculado, llamémosle TotalAgg y su propiedad Expresion igual a: 'SUM(SUBTOTAL)'.

Agrega un query de los componentes que estes usando. Lo que sigue es para la elección del cliente y el descuento correspondiente:

(* Realizado en tiempo de ejecución para clarificar las asignaciones *)

procedure TForm1.FormCreate(Sender: TObject);
begin
with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT ID, NOMBRE, DESCUENTO');
SQL.Add('FROM CLIENTES ORDER BY NOMBRE');
Open;
end;

// configuración de los controles data-aware
with DBEdit1 do // total bruto
begin
DataField := 'TotalAgg';
DataSource:= DataSource1; // -> ClientDataSet (ventas)
ReadOnly := True;
end;

with DBLookupComboBox1 do // Clientes
begin
KeyField := 'ID';
ListField := 'NOMBRE';
ListSource:= DataSource2; // ->IBQuery1 (clientes)
KeyValue := '1';
end;

with DBEdit2 do // Descuento
begin
DataSource:= DataSource2; // -> (clientes)
DataField := 'DESCUENTO';
ReadOnly := True;
end;

Edit1.ReadOnly:= True; // Total neto
end;

// Actualizar valores de descuento y total
procedure TForm1.IBQuery1AfterScroll(DataSet: TDataSet);
begin
Edit1.Text:= FormatFloat('$0.00', CDS1TotalAgg.Value - CDS1TotalAgg.Value *
IBQuery1.FieldByName('DESCUENTO').Value / 100);
end;


Sobre estos valores de prueba,
Productos:

ID DESCRIPCION PRECIO
1 CAFE 60
2 LECHE 5
3 AZUCAR 10
4 MERMELADA 29

Clientes:

ID NOMBRE DESCUENTO
0 CONSUMIDOR FINAL 0 (posición 0 siempre para C. F.)
1 JUAN PEREZ 15
2 PABLO GOMEZ 15
3 ANA FERNANDEZ 18

El resultado inicial:
1)
http://s15.postimg.org/nshxeuk6j/giuli1.jpg

Al seleccionar un cliente:
2)
http://s15.postimg.org/8rfmxl1gr/giuli2.jpg

No incluí la asignación del código de factura, detalle que no hace al ejemplo y queda la implementación a tu criterio.
Por último necesitas otro control para ingresar el pago. Para obtener el vuelto, simplemente basta con restar el total del pago (Vuelto = Pago - Total) y mostrarlo en pantalla.

Saludos :)

giulichajari
02-03-2015, 12:29:19
Claro yo el clientdataset lo uso como una tabla temporal, al menos asi lo estaba haciendo, porque en mi estructura de datos tengo la tabla producto y ticket, que se relacionan por otra tabla(relacion varios a varios) VENTAS, dado que un producto puede aparecer en varios ticket y un ticket puede contener varios productos.

Pero voy a intentar tu modelo.
Saludos :)