Reporting : comment générer un calendrier pour y insérer des données ?

0000002806     -      03/04/2018

Pour certains rapports, il est parfois demandé de montrer, pour une période, la liste de toutes les dates et d'indiquer, le cas échéant, un total de vente (par exemple).

Il faut donc générer la liste des dates même si aucun document n'existe.

Dans l'exemple ci-joint, sur base de la sélection d'un mois, nous générons d'abord une table temporaire reprenant un enregistrement par jour.

Ensuite, nous retrouvons les documents de gestion commerciale concernés pour les relier aux différentes dates concernées.

Le résultat donnera alors un calendrier complet avec les montants en regard de certaines dates.

Cet exemple peut servir de base pour des rapports avec des listes de jours, de semaines, de mois, de périodes, ... .

 

SET dateformat dmy

declare @mois char(7), @annee char(4), @debutmois date, @finmois date, @cntNbrJours int = 1, @DateToAdd datetime

select @mois = left(@mois_1, 2),
@annee = right(@mois_1, 4),
@debutmois = CAST('01/' + @mois_1 as DATE),
@finmois = dateadd(day, -1, dateadd(month, 1, @debutmois)),
@cntNbrJours = day(@finmois) - day(@debutmois) + 1, @DateToAdd = CAST('01/' + @mois_1 as DATE)

/*----- Génération tableau des jours du mois ----*/
CREATE TABLE [dbo].[#TmpJours](
[COMPTEUR] [INT] NULL,
[DATE] [datetime] NULL,
[ANNEE] [INT] NULL,
[MOIS] [INT] NULL,
[JOUR] [INT] NULL
) ON [PRIMARY]

declare @cnt int = 1

while @cnt <= @cntNbrJours
begin
INSERT INTO #TmpJours (COMPTEUR, DATE, ANNEE, MOIS, JOUR)
VALUES (@cnt, @DateToAdd, YEAR(@DateToAdd), MONTH(@DateToAdd), DAY(@DateToAdd));
set @DateToAdd = DATEADD(day,1,@DateToAdd)
set @cnt = @cnt + 1
end

/*---- Récupérer les données de gestion commerciale ----*/ select pieds_v.date as date, round(sum(pieds_v.TOT_TTC_FB), 2) as tot_ttc_fb into dbo.#tmpVente
from pieds_v
where pieds_v.type = 1 and month(pieds_v.DATE) = @mois and year(pieds_v.DATE) = @annee
group by pieds_v.date

/*---- Regrouper les données ----*/
select dbo.#TmpJours.compteur, #TmpJours.date, dbo.#tmpVente.tot_ttc_fb
from dbo.#TmpJours
left join dbo.#tmpVente on dbo.#tmpVente.date = dbo.#TmpJours.date
order by dbo.#TmpJours.compteur

drop table #TmpJours
drop table dbo.#tmpVente