Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-03-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Campo aggregate dependiente de otro en clientdataset

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?
Responder Con Cita
  #2  
Antiguo 01-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 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:
Código Delphi [-]
  ClientDataSet1TOTAL2.Expresion:= 'SUM(subtotal) - SUM(descuento)'; // conf. desde el Object Inspector

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 01-03-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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:
Código Delphi [-]
  ClientDataSet1TOTAL2.Expresion:= 'SUM(subtotal) - SUM(descuento)'; // conf. desde el Object Inspector

Saludos
Entonces vuelto es:
Código Delphi [-]
sum(efectivo) - (sum(subtotal) - sum(descuento))
Responder Con Cita
  #4  
Antiguo 01-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 giulichajari.
Cita:
Empezado por giulichajari Ver Mensaje
Entonces vuelto es:
Código Delphi [-]
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:
Código:
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:
Código:
SUM(efectivo) - SUM(subtotal) - SUM(descuento)
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 01-03-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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:
Código:
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:
Código:
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.
Responder Con Cita
  #6  
Antiguo 01-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
Cita:
Empezado por giulichajari Ver Mensaje
...
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 01-03-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
ayuda

Cita:
Empezado por ecfisa Ver Mensaje
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
Responder Con Cita
  #8  
Antiguo 01-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
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:
Código:
ID    SUBTOTAL   PDESCUENTO
1     100	 20
2     110	 20
3      90	 20
4      50	 20
5     150	 20
Entonces "total2" y su expresión,
Código SQL [-]
 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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 01-03-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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:
Código:
ID    SUBTOTAL   PDESCUENTO
1     100	 20
2     110	 20
3      90	 20
4      50	 20
5     150	 20
Entonces "total2" y su expresión,
Código SQL [-]
 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
Responder Con Cita
  #10  
Antiguo 02-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
Cita:
Empezado por giulichajari Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 02-03-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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.
Responder Con Cita
  #12  
Antiguo 02-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 13:36:41.
Responder Con Cita
  #13  
Antiguo 02-03-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
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
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
Campo aggregate ClientDataSet en runtime Dclase Conexión con bases de datos 6 14-02-2014 14:17:25
buscar registros de un ClientDataSet a otro clientDataSet novato_erick Conexión con bases de datos 2 02-02-2013 21:48:09
TClientDataSet + Campo Tipo Aggregate mjjj Varios 0 11-08-2012 01:36:07
Asignar el valor de un campo aggregate a un campo de la base TrUnkS Conexión con bases de datos 1 23-02-2010 06:17:42
Copiar Campos de un ClientDataSet a Otro linsua Conexión con bases de datos 4 06-11-2003 22:25:00


La franja horaria es GMT +2. Ahora son las 11:45:38.


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