on 07-31-2010 6:34 PM
En el siguiente codigo, a partir de la fecha de vencimiento del documento, voy colocando los totales en columnas qeu tienen un rango de cada a15 dias y para eso estoy tratando de sacar las fechas cada 15 dias, ejemplo si la fecha de vto. es 31/03 entonces las columnas serian 15-abril, 30-abril, 15-mayo, 31-mayo, 15-junio, 30-junio, etc.
Pero tengo problemas cuando el mes tiene 31 dias o 28 como febrero, ya que la quincena siquiente me resta uno del dia 15. Y asi sucesivamente con los meses siguientes. Me dicen que haga una funcion aparte para calcular los meses pero no se como. O si alguien me podia ayudar como arreglar esta situacion.
Muchas gracias de antemano.
/*SELECT FROM [dbo].[OPCH] T0 */
DECLARE @FechaCorte AS DATETIME
/* WHERE */
SET @FechaCorte = '01-01-2010'--/* T0.docdate */'[%0]'
/*SELECT FROM [dbo].[OPCH] T0 */
DECLARE @FechaCorte1 AS DATETIME
/* WHERE */
SET @FechaCorte1 = '31-03-2010'--/* T0.docdate */'[%1]'
/*SELECT FROM [dbo].[OCRG] T2 */
DECLARE @grupo AS varchar (100)
/* WHERE */
SET @grupo = ' '--/* T2.Groupname */'[%2]'
DECLARE @FECHA AS DATETIME
DECLARE @FECHAA AS DATETIME
DECLARE @FECHA1 AS DATETIME
DECLARE @FECHA2 AS DATETIME
DECLARE @FECHA3 AS DATETIME
DECLARE @FECHA4 AS DATETIME
DECLARE @FECHA5 AS DATETIME
DECLARE @FECHA6 AS DATETIME
SET @FECHA = CONVERT(VARCHAR,@fechacorte1,112) --para quitar horas y minutos
SET @FECHAA = CONVERT(VARCHAR,@fechacorte,112)
SET @FECHA1 = (SELECT DATEADD(day, 15-Day(@FECHA), dateadd(month,1,@FECHA))) --PRIMERA QUINCENA DEL MES SIGUIENTE
SET @FECHA2 = (SELECT DATEADD(day, -Day(@FECHA) , dateadd(month,2,@FECHA))) --ULTIMO DIA DEL MES SIGUIENTE
SET @FECHA3 = (SELECT DATEADD(day, 15-Day(@FECHA), dateadd(month,2,@FECHA))) --PRIMERA QUINCENA DEL MES POSTERIOR
SET @FECHA4 = (SELECT DATEADD(day, -Day(@FECHA) , dateadd(month,3,@FECHA))) --ULTIMO DIA DEL MES POSTERIOR
SET @FECHA5 = (SELECT DATEADD(day, 15-Day(@FECHA), dateadd(month,3,@FECHA))) --PRIMERA QUINCENA DEL MES POSTERIOR
SET @FECHA6 = (SELECT DATEADD(day, -Day(@FECHA) , dateadd(month,4,@FECHA))) --ULTIMO DIA DEL MES POSTERIOR
SELECT T0.CardName AS 'Proveedor', T0.DocDate as 'Fecha Doc', T0.DocDueDate as 'Fecha Vencimiento', T0.DocTotal as 'Totales',
CASE WHEN MONTH(T0.DocDueDate) <= MONTH(@fechacorte1) THEN T0.DocTotal ELSE 0 END,
CASE WHEN (DAY(T0.DocDueDate)) <= DAY(@FECHA1) AND (MONTH(T0.DocDueDate)) = MONTH(@FECHA1) THEN T0.DocTotal ELSE 0 END,
CASE WHEN ((DAY(T0.DocDueDate)) > DAY(@FECHA1) AND (DAY(T0.DocDueDate)) <= DAY(@FECHA2)) AND
((MONTH(T0.DocDueDate)) = MONTH(@FECHA1) OR (MONTH(T0.DocDueDate)) = MONTH(@FECHA2)) THEN T0.DocTotal ELSE 0 END,
CASE WHEN (DAY(T0.DocDueDate)) <= DAY(@FECHA3) AND (MONTH(T0.DocDueDate)) = MONTH(@FECHA3) THEN T0.DocTotal ELSE 0 END,
CASE WHEN ((DAY(T0.DocDueDate)) > DAY(@FECHA3) AND (DAY(T0.DocDueDate)) <= DAY(@FECHA4)) AND
((MONTH(T0.DocDueDate)) = MONTH(@FECHA3) OR (MONTH(T0.DocDueDate)) = MONTH(@FECHA4)) THEN T0.DocTotal ELSE 0 END,
CASE WHEN (DAY(T0.DocDueDate)) <= DAY(@FECHA5) AND (MONTH(T0.DocDueDate)) = MONTH(@FECHA5) THEN T0.DocTotal ELSE 0 END,
CASE WHEN ((DAY(T0.DocDueDate)) > DAY(@FECHA5) AND (DAY(T0.DocDueDate)) <= DAY(@FECHA6)) AND
((MONTH(T0.DocDueDate)) = MONTH(@FECHA5) OR (MONTH(T0.DocDueDate)) = MONTH(@FECHA6)) THEN T0.DocTotal ELSE 0 END,
case when MONTH(T0.DocDueDate) > MONTH(@fechacorte1) THEN T0.DocTotal ELSE 0 END
FROM OPCH T0 INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
INNER JOIN OCRG T2 ON T1.GroupCode = T2.GroupCode
WHERE MONTH(T0.DocDate) between MONTH(@FechaCorte) and month(@fechacorte1)
and YEAR(T0.DocDate) between YEAR(@FechaCorte) and (@fechacorte1)
and (T2.Groupname = @grupo OR @grupo = rtrim(isnull('','')))
GROUP BY T0.CardName, T0.DocDate, T0.DocDueDate,T0.DocTotal,t2.groupname
Tal vez te pueda ayudar, pero podrias exponer mas a detalle lo que necesitar obtener con las fechas??
Saludos
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Voy a explicar lo que se desea en el reporte
1- Por un rango de fechas selecciono de la tabla OPCH las facturas de proveedores, y a partir de su fecha de vencimiento (DocDueDate) determinaria en que rango de fechas caeria. Por ejemplo:
Fecha1 01/03/2010
Fecha2 30/04/2010
No.Doc F.Doc F.Vto. Total Mes Corriente 15-Mayo 31-Mayo 15-Junio 30-Junio 15-Julio 31-Julio
6229 05/03/2010 31/03/2010 260.00 260.00
6230 12/03/2010 12/05/2010 500.00 500.00
6231 05/04/2010 31/05/2010 780.00 780.00
6232 12/04/2010 25/06/2010 600.00 600.00
Se supone que el codigo debe hacerlo. Con el SET @fecha1, @fecha2, @fecha3, etc. debo calcular las quincenas y fin de mes de los 3 meses siguientes al mes de Fecha2, pero cuando el mes tiene 31 dias me quita entonces un dia de la quincena siguiente y me la deja en 14, y asi sucesivamente me va restando.
No se como plantearlo para que me funcione.
Hola, ¿lo que necesitas sacar es el dia 15 y dia ultimo de cada mes?, si es asi, lo que puedes hacer es lo siguiente:
Teniendo en cuenta esas fechas que pones como ejemplo, puedes hacer un ciclo de la fecha1 a la fecha2 y calcularias la fechas de esa manera
set @Fecha1 = '01/03/2010'
set @Fecha2 = '30/04/2010'
set @fechaactual = convert(datetime, cast(year((@fecha) + 1) as varchar) + '/' + Cast(month(@fecha) as varchar) + '/' + '01', 103) - 1
con esa operacion obtienes el dia primero del mes siguiente, a esa variable solo restale un dia y obtienes el dia ultimo del mes antrerior, sea cual sea el dia, en el caso de tus fechas de ejemplo, eso te regresaria 01/04/2010 menos un dia, o sea 31/03/2010, y si necesitas los dias 15, haz lo mismo pero sin sumarle 1 al mes y sumale los dias necesarios para que te de el dia 15, espero eso te sirva, sino cualquier cosa comentala y veo si te puedo ayudar en algo mas.
nota: en esa operacion de fechas, considera cuando el mes sea mes + 1 sea mayor a 12, en ese caso tendrias que sumarle una al año y mes hacerlo 1.
Saludos
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
95 | |
11 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.