Ver Mensaje Individual
  #12  
Antiguo 02-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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 [-]
(* 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:
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 02-03-2015 a las 12:36:41.
Responder Con Cita