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:
Código SQL
[-]
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:
Código Delphi
[-]
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;
with DBEdit1 do begin
DataField := 'TotalAgg';
DataSource:= DataSource1; ReadOnly := True;
end;
with DBLookupComboBox1 do begin
KeyField := 'ID';
ListField := 'NOMBRE';
ListSource:= DataSource2; KeyValue := '1';
end;
with DBEdit2 do begin
DataSource:= DataSource2; DataField := 'DESCUENTO';
ReadOnly := True;
end;
Edit1.ReadOnly:= True; end;
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:
Código:
ID DESCRIPCION PRECIO
1 CAFE 60
2 LECHE 5
3 AZUCAR 10
4 MERMELADA 29
Clientes:
Código:
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)
Al seleccionar un cliente:
2)
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