Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   consulta sql para resumen de cuenta corriente (https://www.clubdelphi.com/foros/showthread.php?t=82077)

pjacob80 24-01-2013 01:54:15

consulta sql para resumen de cuenta corriente
 
Hola amigos, estoy desarrollando un soft para control de clientes, y me encargaron que tenga un resumen del tipo, "concepto, debe, haber, saldo", o sea, una tabla en donde muestre los trabajos realizados y los pagos que fue haciendo el cliente. Mi problema es que uso un qreport en delphi para hacerlo con consulta sql, pero no se me ocurre como comenzar. tengo la tabla de clientes con su codigo, nombre, etc. una tabla de pagos, donde esta el codigo del cliente, fecha. y una tabla de trabajos en donde esta la fecha, valor del trabajo, etc.
La consulta deberia ir ordenando esto por fecha, pero el problema es que los trabajos deberan ir en el "debe" y los pagos en el "haber" en las columnas del reporte. y en la columna saldo debera ir restando o sumando.
no se si se entiende mas o menos.
el reporte seria algo asi:


| fecha | concepto | debe | haber | saldo |
|xx/xx/xx | trabajo x | 100 | | 100 |
|xx/xx/xx | pago x | | 100 | 0 |
|xx/xx/xx | trabajo x | 100 | | 100 |
|xx/xx/xx | trabajo x | 100 | | 200 |

algo asi deberia tirar el reporte para imprimir.

alguien me puede tirar una idea? se puede hacer directamente con un select?

Desde ya muchas gracias.

olbeup 24-01-2013 11:22:03

Cita:

Mi problema es que uso un qreport en delphi para hacerlo con consulta sql, pero no se me ocurre como comenzar
¿Cual es el problema?

¿Empezar hacer que?, ¿el diseño de QuickReport?, ¿la consulta SQL?, ¿ambas cosas?

¿La fecha cual es?, ¿la del pago, la del trabajo o ambas?, para eso debes de hacer una UNION en la SQL

¿La tabla trabajos también está relacionada con el cliente?, como lo has puesto, me imagino que si.

En la tabla Pagos y Trabajos, ¿cómo se llama el campo donde guardas los valores?, ¿Se llama IMPORTE, VALOR, PAGO, DEBE, HABER?

Haz saber los campos que están relacionado unos con otros, esto ayuda a realizar la SQL que te pueda ayudar.

Un saludo.

fjcg02 24-01-2013 11:45:21

Hola,

Qué motor de bbdd estás usando?

Cliente
Trabajos
Pagos

Código SQL [-]
select cliente.nombre, trabajo.nombre, sum(trabajo.importe) as debe,sum( pago.importe) as haber, sum(trabajo.importe- pago.importe) as saldo
from trabajo
inner join cliente on cliente.id= trabajo.id
left join pago on pago.id=trabajo.id
group by cliente.nombre, trabajo.nombre

se aproxima a lo que necesitas ?

qué pasa si añades la fecha del trabajo y agrupas por esa fecha ? Podrías quitar la tabla de clientes ... tiene sentido ?

Cuéntano cómo te va.

Saludos

pjacob80 24-01-2013 11:45:57

Cita:

Empezado por olbeup (Mensaje 453950)
¿Cual es el problema?

¿Empezar hacer que?, ¿el diseño de QuickReport?, ¿la consulta SQL?, ¿ambas cosas?

¿La fecha cual es?, ¿la del pago, la del trabajo o ambas?, para eso debes de hacer una UNION en la SQL

¿La tabla trabajos también está relacionada con el cliente?, como lo has puesto, me imagino que si.

En la tabla Pagos y Trabajos, ¿cómo se llama el campo donde guardas los valores?, ¿Se llama IMPORTE, VALOR, PAGO, DEBE, HABER?

Haz saber los campos que están relacionado unos con otros, esto ayuda a realizar la SQL que te pueda ayudar.

Un saludo.


En principio me interesaria la consulta SQL, el diseño del quick creo que lo podre armar. de ultima lo vemos mas adelante.
Las fechas son correlativas, o sea, irian una a una. por ej, el cliente quiere saber entre 2 fechas que movimientos hubo. Ahi se deberia poner si existe un saldo anterior, y luego detallar una a una las actividades, ya sea, de trabajos realizados, o pagos realizados, ambos tienen fecha distinta.
la tabla trabajos si esta relacionada, cada trabajo tiene un cliente asignado para saber a quien se lo hizo. el campo que se usa para eso es codcliente.
en ambas tablas, Pagos y Trabajos, el campo se llama MONTO, se guarda el valor de lo que se refiere, en la tabla pagos de los pagos y en la tabla trabajos de los trabajos realizados, quiero aclarar, que los pagos no siempre pueden ser iguales a los montos de los trabajos, o sea, el cliente puede dar un adelanto y luego pagar el resto. por eso me encargaron hacer este listado, para ver como ha ido la operacion con el cliente.

pjacob80 24-01-2013 11:48:36

Cita:

Empezado por fjcg02 (Mensaje 453951)
Hola,

Qué motor de bbdd estás usando?

Saludos

Perdon por no aclarar, estoy usando firebird.


En cuanto al codigo que me pasas, no estoy seguro que sea asi, en realidad mi nivel de sql es basico, pero la tabla pagos la relacionas con la de trabajo? no necesariamente, como aclare antes, los pagos pueden ser distintos y se pueden hacer en varias veces.
todas las tablas serian relacionadas con el cliente, o sea, los trabajos que se le realizaron al cliente, y los pagos que realizo el mismo.
mi problema fundamentalmente es como poner en el qreport que me muestre en la columna del debe los trabajos y en el haber los pagos. y si muestro un pago por ejemplo, en la columna del debe tendria que estar vacia. no se si se entiende.

pjacob80 24-01-2013 12:49:55

creo que deberia tener un "order by fecha", tanto de la tabla trabajos como la de pagos (ya que apareceran mezclados en el listado), y que se puede elegir un rango entre x fechas.

fjcg02 24-01-2013 14:17:43

Bueno,

supongo que los pagos se corresponderán a un trabajo realizado o futuro, no?

Depende de cómo tengas la información distribuida por las tablas, deberás utilizar una consulta o un procedimiento almacenado.

Si quieres saber el acumulado anterior, ya vas dando más pistas, lo que parece que nos lleva a un p.almacenado.

Confirmanos si es así para que te podamos orientar.

Un saludo

pjacob80 24-01-2013 14:30:14

los pagos son pagos de trabajos, pero supongamos que un trabajo valio 100, el cliente puede pagar 50, mas adelante pagar 20, y mas adelante 30. en la tabla que quiero deberia mostrarse asi:


fecha | descripcion | debe | haber | saldo
| saldo anterior | | | 0
1/1/13 | trabajo realizado | 100 | | 100
2/1/13 | pago cuota 1 | | 50 | 50
3/1/13 | pago cuota 2 | | 20 | 30
4/1/13 | pago cuota 3 | | 30 | 20

pjacob80 24-01-2013 14:31:48

aqui un ejemplo de un reporte impreso de un veterinario. lo subo para que se vea la idea.


fjcg02 24-01-2013 17:10:46

Aprovechando que no está la jefa, aunque tengo mucho trabajo ....

prueba con esto, no está probado ni depurado pero creo que te puede poner en la pista. Para los puristas, es pseudocódigo sin probar !!:D
1. Calculamos el saldo hasta la fecha
2. Seleccionamos los trabajos y los pagos, por cada registro calculamos el saldo y lo sacamos.

Notas:
for select ... into variables;
suspend;
hace una select, por cada regsitro obtenido asigna las columnas a las variables, y suspend las presenta.

Por cada registro calculamos el saldo.
Sacamos los resultados

Espero que te sirva.

Código SQL [-]
CREATE OR ALTER PROCEDURE SP_PRUEBA (
    fechaDesde, FechaHasta date,
  idcliente integer)
  returns(
  fecha date,
  articulo varchar(50),
  debe numeric(10,2),
  haber numeric(10,2)
  saldo numeric(10,2)
  )
as
declare variable 
montante numeric(10,2);

begin
  /* Procedure Text */
/* inicializacmos las variables de salida */
  fecha = null;
  articulo='';
  debe= 0;
  haber= 0;
  saldo= 0;

  /* Calculamos los trabajos */
  SELECT SUM(TRABAJO.IMPORTE) FROM TRABAJO
  WHERE IDCLIENTE=:IDCLIENTE AND FECHA < :FechaDesde
  INTO montante;
  saldo= montante;
  /* Calculamos los pagos */
  SELECT SUM(PAGO.IMPORTE) FROM PAGO
  WHERE IDCLIENTE=:IDCLIENTE AND FECHA < :FechaDesde
  INTO montante;
  saldo= saldo - montante;
  /* ya tenemos la primera linea, es decir el saldo hasta la fecha desde, la sacamos */
  suspend;
  
  for select fecha, articulo, debe, haber 
  from (
    /* importes de los trabajos del cliente entre las fechas */
    select fecha, trabajo, importe, 0 
    from trabajo
    where 
      fecha >= :FechaDesde and fecha <= :FechaHasta
      and idcliente=:idCliente
    group by fecha
    UNION
    /* importes de los pagos del cliente entre las fechas */
    select  fecha, articulo, 0, importe
    from pago
    where 
      fecha >= :FechaDesde and fecha <= :FechaHasta 
      and idcliente=:idCliente
    group by fecha
      )
  order by fecha
  into fecha, articulo, debe, haber;
  saldo=saldo +debe-haber;
  /* sacamos los datos por cada registro */
  suspend;  
   
end^


La franja horaria es GMT +2. Ahora son las 04:52:54.

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