Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-08-2011
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
Talking 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?
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.
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #2  
Antiguo 21-08-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 21-08-2011
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
Wink

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
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #4  
Antiguo 21-08-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 21-08-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 21-08-2011
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
Exclamation

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
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #7  
Antiguo 21-08-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #8  
Antiguo 22-08-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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.
__________________
Siempre Novato
Responder Con Cita
  #9  
Antiguo 22-08-2011
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
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.
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #10  
Antiguo 22-08-2011
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
Tablas

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

2. cobros
nro factura
fecha pago
valor

3. cliente
codcliente
nombre
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #11  
Antiguo 22-08-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #12  
Antiguo 22-08-2011
Avatar de ingabraham
ingabraham ingabraham is offline
Miembro
 
Registrado: ago 2007
Posts: 614
Poder: 17
ingabraham Va por buen camino
Lightbulb

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
__________________
Enseñar es la virtud de un sabio.
Responder Con Cita
  #13  
Antiguo 22-08-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
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.
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 01:40:43.


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