Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   sql cobros atrasados (https://www.clubdelphi.com/foros/showthread.php?t=75417)

ingabraham 21-08-2011 18:06:51

sql cobros atrasados
 
1. utilizo delphi 7 y firebird 2.0
componentes ib , como ibquery

tengo dos tablas
1. ventas
nro factura
tipocobro(semanal, quincenal o mensual)
detalles y de mas campos...

2. cobros
nro factura
fecha pago
valor


QUE QUIERO?:confused:
1. Quiero sacar los cobros atrasados ( son aquellos que estan atrasado de 2 meses, o semanas o quincenas en adelante).


a) osea, si un cobro es semanal. a lo que pasen dos semanas reporte el cobro atrasado

b) si un cobro es quincenal. a lo que pasen dos quincenas reporte el cobro atrasado

c) si un cobro es mensual. a lo que pasen dos meses reporte el cobro atrasado

puedo aplicar un sql, como seria, o no se una consulta uner o un procedure almacenado, nose algo que me pueda hacer esto?

espero haber sido claro.

Caral 21-08-2011 19:14:16

Hola
No seria mas facil si la tabla Ventas ademas del numero de factura tuviera la fecha de la factura ?.
Asi simplemente se podria ligar:
ventas:
Nfactura + Fecha emisión
Con
Cobros:
Nfactura + Fecha vencimiento.
El tipo de cobro me parece irrelevante ya que se pueden modificar las condiciones segun el cliente.
Saludos

ingabraham 21-08-2011 20:20:21

1. Si se me olvido la fecha de emsion sila tiene la tabla. Ventas
2. Es necesario el tipopago debido a k un cliente puede realizar varias comprar de diferentes formas de pago.


Quien me colabora con el sql

Caral 21-08-2011 20:37:28

Hola
Yo hago algo parecido, asi:
Código SQL [-]
SELECT CxCobrar.CodTransac, CxCobrar.Secuencia, CxCobrar.TipoTransac,
CxCobrar.FechaTransac, CxCobrar.FechaVencimiento,
(Date()-[CxCobrar]![FechaVencimiento]) AS Dias, CxCobrar.CodCliente,
Clientes.NombreCliente, Clientes.LimiteCredito, Clientes.DiasCredito,
[Balance]-[PagosRec] AS Saldo, IIf((Date()-[CxCobrar]![FechaVencimiento]>0)
And (Date()-[CxCobrar]![FechaVencimiento]<31),[Saldo],0) AS ME30dias,
IIf((Date()-[CxCobrar]![FechaVencimiento]<61)
And (Date()-[CxCobrar]![FechaVencimiento]>30),[Saldo],0) AS E3160dias,
IIf((Date()-[CxCobrar]![FechaVencimiento]<91)
And (Date()-[CxCobrar]![FechaVencimiento]>60),[Saldo],0) AS E6190dias,
IIf(Date()-[CxCobrar]![FechaVencimiento]>91,[Saldo],0) AS MA90dias
FROM Clientes INNER JOIN CxCobrar ON Clientes.CodCliente = CxCobrar.CodCliente
WHERE (((CxCobrar.TipoTransac)="FA" Or (CxCobrar.TipoTransac)="ND")
AND (([Balance]-[PagosRec])>0))
ORDER BY CxCobrar.CodCliente, CxCobrar.FechaTransac, CxCobrar.CodTransac;
Solo que el reporte se ve pro fechas no por semana, quincena o mes.
Me parece que algo parecido a esto es lo que necesitas.
Saludos

Caral 21-08-2011 21:02:11

Hola
Asi lo hago en firebird:
Código SQL [-]
SELECT CxCobrar.CodTransac, CxCobrar.Secuencia, CxCobrar.TipoTransac,
CxCobrar.FechaTransac, CxCobrar.FechaVencimiento, (current_date - CxCobrar.FechaVencimiento) AS Dias,
CxCobrar.CodCliente, Clientes.NombreCliente, Clientes.vendedor,  Clientes.LimiteCredito,
Clientes.DiasCredito, Balance-PagosRec AS Saldo,
IIf((current_date - CxCobrar.FechaVencimiento >0)
And (current_date - CxCobrar.FechaVencimiento <31), Balance-PagosRec,0) AS ME30dias,
IIf((current_date - CxCobrar.FechaVencimiento <61)
And (current_date - CxCobrar.FechaVencimiento >30), Balance-PagosRec,0) AS E3160dias,
IIf((current_date - CxCobrar.FechaVencimiento <91)
And (current_date - CxCobrar.FechaVencimiento >60), Balance-PagosRec,0) AS E6190dias,
IIf(current_date - CxCobrar.FechaVencimiento >91, Balance-PagosRec,0) AS MA90dias
FROM Clientes INNER JOIN CxCobrar ON Clientes.CodCliente = CxCobrar.CodCliente
WHERE (((CxCobrar.TipoTransac)='FA' Or (CxCobrar.TipoTransac)='ND') AND ((Balance-PagosRec)>0))
ORDER BY CxCobrar.CodCliente, CxCobrar.FechaTransac, CxCobrar.CodTransac;
Tiene sus diferencias.
Saludos

ingabraham 21-08-2011 21:13:40

En realidad companero companera graciAs pero me. Gustaria con palabras
Me explicaras un poco como funciona y si el resultado es por dias o meses
K no he podido entendert el sql. Gracias

Caral 21-08-2011 21:29:31

Hola
El resultado de la consulta es por DIAS:
Que muestra:
1: Dias de credito del cliente.
2: Facturas con 30 dias de vencimiento.
3: Facturas de 31 a 60 dias de vencimiento.
4: Facturas de 61 a 90 dias de vencimiento.
5: Facturas con mas de 91 dias.
NOTA:
Esta consulta no es la que requieres pero creo que seria sencillo adaptarla y mostrarla por semana, quincena y mes, que en si son 8, 16 y 31 dias (vencidos).
En tu caso el tipocobro es simplemente un parametro mas, no entraría en juego dentro de la consulta, no se necesita, es simplemente informativo.
Saludos

Caral 22-08-2011 01:42:47

Hola
Se me ocurre algo asi:
Me imagino que tienes ligada alguna tabla clientes con cobros.
Código SQL [-]
SELECT cobros.nrofactura, cobros.fechapago,
(current_date - cobros.fechapago) AS Dias, cobros.CodCliente, Clientes.NombreCliente,
IIf((current_date - cobros.fechapago >0) And (current_date - cobros.fechapago <8), valor,0) AS E8dias,
IIf((current_date - cobros.fechapago <9) And (current_date - cobros.fechapago >16), valor,0) AS E8A15dias,
IIf((current_date - cobros.fechapago <17) And (current_date - cobros.fechapago >30), valor,0) AS E16A30dias,
IIf(current_date - cobros.fechapago >31, valor,0) AS MA30dias
FROM Clientes INNER JOIN cobros ON Clientes.CodCliente = cobros.CodCliente
WHERE cobros.valor >0
ORDER BY cobros.nrofactura;
Por lo menos creo que podría guiarte en lo que necesitas aunque no sea lo mismo.
Saludos
PD: Hay que esperar a algún maestro que sepa de SQL, yo apenas lo mastico.:)

ingabraham 22-08-2011 02:24:32

creo que si es necesario tener encuenta del tipo de cobro debido aque si yo digo
una semana (7 dias)
es diferente a un mes (contaria con 30 dias)

numero de dias 28. no sabria el sql si es el tipo de dato un(a) (semana o un mes) de atraso.

el cod del cliente lo tiene la tabla ventas.

ingabraham 22-08-2011 02:26:22

Tablas

1. ventas
nro factura
tipocobro(semanal, quincenal o mensual)
fechaventa
codcliente

2. cobros
nro factura
fecha pago
valor

3. cliente
codcliente
nombre

fjcg02 22-08-2011 10:52:05

Prueba a ver qué tal te va esta sentencia...


Código SQL [-]
select  C.nfactura, C.fechapago, V.tipoCobro,  current_date - C.fechapago as DIAS,
case when V.tipoCobro = 'SEMANAL' and (current_date - C.fechapago > 14)
   then 'ATRASADO'
else
  case when V.tipocobro = 'QUINCENAL' and (current_date - C.fechapago > 30)
    then 'ATRASADO'
  else
    case when current_date - C.fechapago > 60
      then 'ATRASADO'  /* 'MENSUAL' */
     end
  end
end  AS ESTADO

from cobros C
inner join ventas V on (C.nfactura=V.nfactura)
where C.valor is null

y nos cuentas.

Qué hace:
- une la tabla ventas y cobros...
- filtra los cobros con valor = nulo ( supongo que son los que no están cobrados)
- dependiendo del tipo de cobro (semanal, quincenal, mensual ) calcula si ha pasado el tiempo suficiente para considerarlo pendiente.

Para comprobar, quita el filtro de pago nulo, y comprobarías si calcula bien para todo tipo de pago....

Añadir la tabla de clientes te lo dejo a ti si el resultado es el bueno.

Saludos

ingabraham 22-08-2011 13:54:49

Ok excelente bueno el codigo
1. Si no esta atrasado el cobro de una factura que valor
Toma el estado

2. Una factura puede tener varios cobros asi.
Tabla cobro



001
01/08/11
2000

001
15/08/11
3000

... Asi

Osea hay k buscar la ultima fecha de cobro

fjcg02 22-08-2011 15:27:08

Ok excelente bueno el codigo
Gracias.

1. Si no esta atrasado el cobro de una factura que valor Toma el estado
Ninguno, en tu exposición buscas cobros retrasados. Faltaría añadir la condición de retraso en el where para que solo salgan los atrasados.

2. Una factura puede tener varios cobros asi. Osea hay k buscar la ultima fecha de cobro.
discrepo, un cobro está atrasado o no. Si tengo una factura con 35 cobros, puedo tener desde 0 a 35 cobros atrasados. En otro caso, no es eso lo que buscas, es decir, la premisa de los resultados sería distinta.

Espero haberte puesto sobre la pista...

Saludos
Nota: el case que he escrito se puede simplificar mucho si se restringe sólo a cobros atrasados, pero he puesto la estructura completa para que con un poco de ganas y paciencia se puedan contemplar todos los casos, es decir, los cobros atrasados y no atrasados. Si tienes problemas, nos comentas para echarte una mano.


La franja horaria es GMT +2. Ahora son las 13:40:05.

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