Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/05/2011, 14h17   #1
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
Par défaut [SQL 2k8] Cherche conseils sur l'évolution d'une base pour la gestion du temps

Bonjour,
J'utilise SQL Server 2008
Voici : la base utilisée (http://sqlpro.developpez.com/cours/gestiontemps/) ou fichier joint
et je voudrais ajouter une pondération pour un type de planning
par exemple pour le calendrier à 5 jours je mets tous les samedi et dimanche à 0
et pour le calendrier à 7 jours je mets tous les jours à 1

ça me permettrait de faire des testes sur les délais en fonction du type de planning.

Si je dis qu'une tâche dur 10 jours j'aurais pas la même date de fin en fonction du type de calendrier (5 ou 7 jours) utilisé.

D'une autre manière mon type de calendrier pourrait avoir à certaines dates, une pondération à 0.5 équivalent à la demi-journée

J'aurais aimé vos conseilles sur l'implémentation la plus astucieuse

Merci d'avance
Images attachées
Type de fichier : jpg base de données domaine planning.JPG (73,5 Ko, 3 affichages)
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 15h49   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 668
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 668
Points : 8 718
Points : 8 718
Bonjour,

- Je pense que le plus simple est d'ajouter une entité de semaine à 5 jours en plus de l'entité TR_PLN_JOUR_SEMAINE_JSM, similaire mais peuplée sans le Samedi et le Dimanche, mais je n'aime pas trop, puisqu'il y a duplication des données ...

- Ajouter deux attributs pour marquer quels sont les jours ouvrés pour les semaines à 5 jours, et un autre pour les semaines à 7 jours.
Ce peut être une colonne calculée ou implémenté dans une vue.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 17h49   #3
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
En faite, mon problème est le suivant :

quand je fais cette requête :

Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT COUNT(TASK_ID) AS NOMBRE,
       PJR_DATE 
FROM   TASK
       RIGHT OUTER JOIN T_PLN_JOUR_PJR
            ON PJR_DATE = TASK.DATE_START
WHERE  PJR_DATE BETWEEN ( SELECT MIN(DATE_START) FROM TASK )
                    AND ( SELECT MAX(DATE_FINISH) FROM TASK )
GROUP  BY PJR_DATE HAVING COUNT(TASK_ID)<>0
ORDER  BY PJR_DATE
j'obtiens ce résultat

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
DATE DE DEBUT/FIN              NB JOUR     NB_AN       NB_MOIS   NB_SEMAINE NB_TRIMESTRE
2003-02-20	2003-09-20	212	0.5808	6.9547	30.2857	2.3248
2003-09-22	2003-10-16	24	0.0657	0.7839	3.4286	0.2608
2003-09-22	2003-11-29	68	0.1863	2.2333	9.7143	0.7391
2003-10-16	2004-04-17	184	0.5033	6.0494	27.2857	2.0128
2003-12-01	2004-02-21	82	0.2242	2.6897	12.7143	0.8974
2004-02-23	2004-05-29	96	0.2623	3.1446	13.7143	1.0550
2004-04-19	2004-06-26	68	0.1858	2.2333	9.7143	0.7473
2004-05-31	2004-07-10	40	0.1093	1.3226	5.7143	0.4385
2004-06-28	2004-09-18	82	0.2240	2.6667	11.7143	0.8917
2004-07-12	2004-09-11	61	0.1667	1.9785	8.7143	0.6630
2004-09-13	2005-01-15	124	0.3389	4.0516	17.7143	1.3513
2004-09-20	2004-12-25	96	0.2623	3.1409	13.7143	1.0435
2004-12-27	2005-03-24	87	0.2384	2.9032	12.4286	0.9654
2005-01-17	2005-12-31	348	0.9535	11.4516	49.7143	3.8113
2005-03-24	2005-07-02	100	0.2739	3.2904	14.2857	1.0998
2005-07-04	2005-08-27	54	0.1480	1.7419	7.7143	0.5870
2005-08-29	2005-11-26	89	0.2439	2.9301	12.7143	0.9674
2005-11-28	2006-03-04	96	0.2631	3.1968	14.7143	1.0585
2006-01-02	2006-02-25	54	0.1480	1.8248	7.7143	0.6000
2006-02-27	2006-07-29	152	0.4164	4.9746	21.7143	1.6710
2006-03-06	2006-07-01	117	0.3206	3.8387	16.7143	1.2889
2006-07-03	2008-03-15	621	1.7008	20.3871	88.7143	6.7915
2006-07-31	2006-09-23	54	0.1479	1.7656	7.7143	0.5869
2006-09-25	2007-03-10	166	0.4548	5.4903	23.7143	1.8208
2007-03-12	2007-04-28	47	0.1287	1.5452	6.7143	0.5189
2007-04-30	2007-08-11	103	0.2822	3.3559	14.7143	1.1270
2007-08-13	2007-09-29	47	0.1288	1.5462	6.7143	0.5109
2007-10-01	2007-12-01	61	0.1672	2.0000	8.7143	0.6630
2008-03-24	2008-04-26	33	0.0901	1.0914	4.7143	0.3626
2009-10-26	2009-11-07	12	0.0329	0.3935	1.7143	0.1305
2010-01-04	2010-01-16	12	0.0329	0.3871	1.7143	0.1334
2010-02-22	2010-03-06	12	0.0328	0.4113	1.7143	0.1333
2010-03-04	2010-04-15	42	0.1150	1.3699	6.0000	0.4649
2010-06-07	2010-06-19	12	0.0329	0.4000	1.7143	0.1318
2010-07-26	2010-10-08	74	0.2027	2.4193	10.5714	0.8044
2010-10-08	2010-12-22	75	0.2055	2.4516	10.7143	0.8152
2010-10-14	2010-10-28	14	0.0383	0.4516	2.0000	0.1522
2010-10-28	2010-12-09	42	0.1151	1.3871	6.0000	0.4565
2010-12-09	2011-01-27	49	0.1342	1.5806	8.0000	0.5389
2010-12-22	2011-03-22	90	0.2466	3.0000	13.8572	0.9976
2011-01-27	2011-03-24	56	0.1535	1.9032	8.0000	0.6222
2011-02-01	2011-03-15	42	0.1151	1.4516	6.0000	0.4667
2011-03-15	2011-05-17	63	0.1726	2.0645	9.0000	0.6944
2011-03-21	2011-04-30	40	0.1096	1.3215	5.7143	0.4409
2011-03-22	2011-09-07	169	0.4630	5.5226	24.1428	1.8502
2011-03-24	2011-05-19	56	0.1534	1.8387	8.0000	0.6164
2011-05-02	2011-07-02	61	0.1671	2.0000	8.7143	0.6702
2011-05-16	2011-06-25	40	0.1096	1.3161	5.7143	0.4396
2011-05-17	2011-07-21	65	0.1781	2.1291	9.2857	0.7119
2011-05-19	2011-09-15	119	0.3260	3.8861	17.0000	1.2986
2011-06-27	2011-09-17	82	0.2247	2.6666	11.7143	0.8918
2011-07-04	2011-09-28	86	0.2356	2.8032	12.2857	0.9348
2011-07-21	2011-10-26	97	0.2657	3.1613	13.8571	1.0543
2011-09-07	2012-01-25	140	0.3834	4.5742	20.0000	1.5246
2011-09-15	2012-01-12	119	0.3260	3.8881	17.0000	1.2948
2011-09-19	2011-10-01	12	0.0328	0.4000	1.7143	0.1304
2011-09-19	2011-11-23	65	0.1781	2.1333	9.2857	0.7065
2011-09-28	2011-12-13	76	0.2082	2.4871	10.8572	0.8261
2011-10-03	2011-11-12	40	0.1096	1.3022	5.7143	0.4348
2011-10-26	2012-03-08	134	0.3667	4.4193	19.1429	1.4646
2011-11-14	2012-01-14	61	0.1670	1.9861	8.7143	0.6646
2011-11-23	2011-12-07	14	0.0383	0.4602	2.0000	0.1522
2011-11-23	2012-02-21	90	0.2461	2.9564	12.8572	0.9843
2011-12-07	2012-02-01	56	0.1532	1.8065	8.0000	0.6124
2011-12-13	2012-04-25	134	0.3663	4.4129	19.1428	1.4702
2012-01-16	2012-03-10	54	0.1475	1.8064	7.7143	0.5934
2012-02-01	2012-03-21	49	0.1339	1.6452	7.0000	0.5384
2012-02-21	2012-06-20	120	0.3279	3.9436	17.1428	1.3187
2012-03-12	2012-04-13	32	0.0874	1.0452	4.5714	0.3517
2012-03-15	2012-04-19	35	0.0956	1.1484	5.0000	0.3846
2012-03-21	2012-05-16	56	0.1530	1.8387	8.0000	0.6154
2012-03-27	2012-05-25	59	0.1612	1.9355	8.4285	0.6483
2012-03-30	2012-04-13	14	0.0382	0.4645	2.0000	0.1539
2012-04-13	2012-05-25	42	0.1148	1.3742	6.0000	0.4615
2012-04-13	2012-06-30	78	0.2131	2.5667	11.1429	0.8571
2012-04-25	2012-08-01	98	0.2678	3.2000	14.0000	1.0733
2012-05-16	2012-06-19	34	0.0929	1.1161	4.8572	0.3736
2012-05-25	2012-07-13	49	0.1339	1.6129	7.0000	0.5370
2012-06-19	2012-09-26	99	0.2705	3.2333	14.1428	1.0776
2012-06-20	2012-10-17	119	0.3251	3.8828	17.0000	1.2948
2012-07-02	2012-09-15	75	0.2049	2.4344	10.7143	0.8152
2012-07-13	2012-09-28	77	0.2103	2.5129	11.0000	0.8370
2012-08-15	2012-10-16	62	0.1694	2.0323	8.8572	0.6739
2012-09-26	2012-11-21	56	0.1530	1.8334	8.0000	0.6086
2012-09-28	2012-11-01	34	0.0929	1.1000	4.8572	0.3696
2012-10-02	2012-12-01	60	0.1639	1.9677	8.5714	0.6521
2012-11-01	2013-02-01	92	0.2516	3.0000	13.1428	1.0074
2012-11-19	2013-01-04	46	0.1257	1.4968	6.5714	0.5007
2012-12-18	2013-02-16	60	0.1643	1.9873	8.5714	0.6633
2013-01-23	2013-02-27	35	0.0959	1.2189	5.0000	0.3889
2013-02-01	2013-03-29	56	0.1535	1.9032	8.0000	0.6223
2013-05-31	2013-07-05	35	0.0958	1.1613	5.0000	0.3842
seulement pour la réalité le résultat ne prend pas en compte la valeur des jours... Exemple des plages de date peuvent valoir que 0.5 correspondant à une demi journée d'autre 0 pas de jours travaillé (exemple l'été pour certaines entreprises)
et encore d'autres plages peuvent valoir 2 car il y a deux fois plus d'effectifs pendant cette période.

du coup j'ai crée ce type d'implémentation (je sais vous allez me dire que c'est null ) voir fichier joint
et je me demande si je ne peux pas m'aider de l'implémentation du tuto de sqlpro pour faire plus simple.

Par rapport à mon implémentation j'ai une table TEMPLATE qui a une date de début, une date de fin, une durée et un type de calendrier

et suivant ce qu'il rentre je dois calculer soit la durée soit la date de début soit la date de fin en fonction du type de calendrier

et le calcul se fait comme ça

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
 
 
ALTER PROCEDURE [dbo].[P_I_DF_POND_GENERIC_BETA]
	-- Add the parameters for the stored procedure here
	@SCHEMA    VARCHAR(128) = 'dbo', -- nom du schema de la table (si NULL => dbo).   
	@TABLE varchar(128),						-- nom de la table 
	@KEYCOL    VARCHAR(130),				-- nom de la colonne clef dans la table 
	@KEYCOL_ID  INT,								-- valeur de l'ID de la colonne clef dans la table
	@CAL_TYPE_ID INT,								-- valeur de l'ID du type de calendrier
	@DD DATE,											-- Date de début
	@DUREE INT,											-- Durée
	@ETAT   INT OUTPUT							-- ETAT de retour d'insertion -- 0 = FALSE -- 1 = TRUE 
AS
SET NOCOUNT ON; 
 
-- vérification des paramètres 
IF @TABLE IS NULL  
BEGIN 
   RAISERROR('Nom de table omis (paramètre @TABLE). Insertion dans la procédure générique : dbo.P_I_DF_POND_GENERIC . ', 16, 1) 
   RETURN; 
END 
IF @KEYCOL IS NULL  
BEGIN 
   RAISERROR('Nom de la colonne clef omis (paramètre @KEYCOL). Insertion dans la procédure générique : dbo.P_I_DF_POND_GENERIC . ', 16, 1) 
   RETURN; 
END
IF @KEYCOL_ID IS NULL  
BEGIN 
   RAISERROR(' ID de la colonne clef omis (paramètre @KEYCOL_ID). Insertion dans la procédure générique : dbo.P_I_DF_POND_GENERIC . ', 16, 1) 
   RETURN; 
END
 
IF @CAL_TYPE_ID IS NULL  
BEGIN 
   RAISERROR('Ce type de calendrier n''existe pas (@CAL_TYPE_ID).', 16, 1) 
   RETURN; 
END
 
IF ((@DD IS NULL AND @DUREE IS NULL))
BEGIN 
   RAISERROR('Des variables n''ont pas été renseignées ou Elles sont incohérentes pour le système. (@DD, @DUREE).', 16, 1) 
   RETURN; 
END 
 
IF NOT EXISTS (SELECT * 
               FROM   INFORMATION_SCHEMA.TABLES 
               WHERE  TABLE_SCHEMA = @SCHEMA 
                 AND  TABLE_NAME   = @TABLE) 
BEGIN 
   RAISERROR('Table inconnue (paramètres @SCHEMA et @TABLE, valeurs %s.%s). Insertion dans la procédure générique : dbo.P_I_DF_POND_GENERIC . ', 16, 1, @SCHEMA, @TABLE) 
   RETURN; 
END 
IF NOT EXISTS(SELECT * 
              FROM   INFORMATION_SCHEMA.COLUMNS 
              WHERE  TABLE_SCHEMA = @SCHEMA 
                AND  TABLE_NAME   = @TABLE 
                AND  COLUMN_NAME  = @KEYCOL)
BEGIN 
   RAISERROR('Colonne clef primaire inconnue (paramètre @KEYCOL, valeurs %s). Insertion dans la procédure générique : dbo.P_I_DF_POND_GENERIC . ', 16, 1, @KEYCOL) 
   RETURN; 
END 
DECLARE @SQL varchar(max), @VERIF_POND FLOAT, @DF DATE, @T VARCHAR(257), 
@DUREE_POND FLOAT,@JOUR_ID INT,@JOUR varchar(32),@ERROR varchar(max);
SET @T =  @SCHEMA +'.' + @TABLE; 
SET @ETAT = 0;  
 
-- démarrage transaction 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
BEGIN TRANSACTION; 
 
------------------------------------------------------------------------------------------------------------ 
-- Vérifie si la somme des prondérations de la date maximum d'un type de ------- 
-- calendrier est supérieurs à zéro. Sinon problème de boucle infinie et -----------
-- incohérence vis à vis des règles métiers  --------------------------------------------------
------------------------------------------------------------------------------------------------------------ 
SET @VERIF_POND=(SELECT (T_CAL_P.LUNDI+T_CAL_P.MARDI+T_CAL_P.MERCREDI+T_CAL_P.JEUDI+T_CAL_P.VENDREDI+T_CAL_P.SAMEDI+T_CAL_P.DIMANCHE) 
					FROM T_CAL 
					INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID 
					WHERE CAL_ID=(SELECT CAL_ID FROM T_CAL WHERE CAL_TYPE_ID=@CAL_TYPE_ID 
									AND DATE_START=(SELECT MAX(DATE_START) FROM T_CAL WHERE CAL_TYPE_ID=@CAL_TYPE_ID)))
									-- Obliger de retourner une ligne grace à la contrainte UNIQUE_CAL_TYPE_ID_DATE_START
IF @@ERROR <> 0 GOTO LBL_ERROR;							
IF (@VERIF_POND <= 0 OR @VERIF_POND IS NULL)
BEGIN
   RAISERROR('Problème dans les pondérations du calendrier', 16, 1) 
   RETURN;
END	
 
-- Ma date de fin est décalée à la date de début moins un jour
SET @DF = DATEADD("dd",-1,@DD);
-- je récupère le jour de la semaine
SET @JOUR_ID = DATEPART(weekday,@DD);
SET @DUREE_POND=0;
 
WHILE @DUREE > 0
		BEGIN	
			SET @JOUR=(SELECT COL_NAME(OBJECT_ID('dbo.T_CAL_P'),@JOUR_ID));
			-- Ma date de fin est décalée de 1 jour
			SET @DF = DATEADD("dd",1,@DF);
	-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------		
	-- je récupère la date la plus proche de la date de début de ma tâche(TASK.DATE_START) et je prend la ponduration de chaque jour de la semaine avec la boucle
	-- j'ai pas réussi à faire autrement... on ne peut pas à ce jour passer une variable (@JOUR) directement...
	-- En terme de performance ça aurait été une erreur de le faire avec des curseurs !
	-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
			IF @JOUR ='LUNDI'
				BEGIN
					SET @DUREE_POND=(SELECT T_CAL_P.LUNDI
									 FROM T_CAL INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID
									 WHERE CAL_ID=(SELECT CAL_ID 
																  FROM T_CAL  
																  WHERE DATE_START<=(SELECT MAX(DATE_START) 
																										  FROM T_CAL 
																										  WHERE DATE_START<=@DD AND CAL_TYPE_ID=1) AND CAL_TYPE_ID=@CAL_TYPE_ID))
				END
				ELSE IF @JOUR ='MARDI'
				BEGIN
					SET @DUREE_POND=(SELECT T_CAL_P.MARDI
									 FROM T_CAL INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID
									 WHERE CAL_ID=(SELECT CAL_ID 
																  FROM T_CAL  
																  WHERE DATE_START<=(SELECT MAX(DATE_START) 
																										  FROM T_CAL 
																										  WHERE DATE_START<=@DD AND CAL_TYPE_ID=1) AND CAL_TYPE_ID=@CAL_TYPE_ID))
				END
				ELSE IF @JOUR ='MERCREDI'
				BEGIN
					SET @DUREE_POND=(SELECT T_CAL_P.MERCREDI
									 FROM T_CAL INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID
									 WHERE CAL_ID=(SELECT CAL_ID 
																  FROM T_CAL  
																  WHERE DATE_START<=(SELECT MAX(DATE_START) 
																										  FROM T_CAL 
																										  WHERE DATE_START<=@DD AND CAL_TYPE_ID=1) AND CAL_TYPE_ID=@CAL_TYPE_ID))
				END
				ELSE IF @JOUR ='JEUDI'
				BEGIN
					SET @DUREE_POND=(SELECT T_CAL_P.JEUDI
									 FROM T_CAL INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID
									 WHERE CAL_ID=(SELECT CAL_ID 
																  FROM T_CAL  
																  WHERE DATE_START<=(SELECT MAX(DATE_START) 
																										  FROM T_CAL 
																										  WHERE DATE_START<=@DD AND CAL_TYPE_ID=1) AND CAL_TYPE_ID=@CAL_TYPE_ID))
				END
				ELSE IF @JOUR ='VENDREDI'
				BEGIN
					SET @DUREE_POND=(SELECT T_CAL_P.VENDREDI
									 FROM T_CAL INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID
									 WHERE CAL_ID=(SELECT CAL_ID 
																  FROM T_CAL  
																  WHERE DATE_START<=(SELECT MAX(DATE_START) 
																										  FROM T_CAL 
																										  WHERE DATE_START<=@DD AND CAL_TYPE_ID=1) AND CAL_TYPE_ID=@CAL_TYPE_ID))
				END
				ELSE IF @JOUR ='SAMEDI'
				BEGIN
					SET @DUREE_POND=(SELECT T_CAL_P.SAMEDI
									 FROM T_CAL INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID
									 WHERE CAL_ID=(SELECT CAL_ID 
																  FROM T_CAL  
																  WHERE DATE_START<=(SELECT MAX(DATE_START) 
																										  FROM T_CAL 
																										  WHERE DATE_START<=@DD AND CAL_TYPE_ID=1) AND CAL_TYPE_ID=@CAL_TYPE_ID))
				END
				ELSE IF @JOUR ='DIMANCHE'
				BEGIN
					SET @DUREE_POND=(SELECT T_CAL_P.DIMANCHE
									 FROM T_CAL INNER JOIN T_CAL_P ON T_CAL.CAL_P_ID=T_CAL_P.CAL_P_ID
									 WHERE CAL_ID=(SELECT CAL_ID 
																  FROM T_CAL  
																  WHERE DATE_START<=(SELECT MAX(DATE_START) 
																										  FROM T_CAL 
																										  WHERE DATE_START<=@DD AND CAL_TYPE_ID=1) AND CAL_TYPE_ID=@CAL_TYPE_ID))
				END
 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------		
 
		----------------------------------------------------------------------------------------------------------
		-- ON TEST S'IL Y A UNE ERREUR LORS DE l'EXECUTION D'UNE REQUETE -------------
		----------------------------------------------------------------------------------------------------------		
		IF @@ERROR <> 0 GOTO LBL_ERROR;
		IF (@DUREE_POND IS NULL)  GOTO LBL_ERROR_COUNT;
		----------------------------------------------------------------------------------------------------------
		-- on décrémente la durée en fonction de la pondération
		SET @DUREE -= @DUREE_POND;
		-- si on est à dimanche
		IF @JOUR_ID = 7
			BEGIN
				-- on commence à lundi
				SET @JOUR_ID = 1
			END
		ELSE
			BEGIN
				-- on passe au jour suivant
				SET @JOUR_ID+= 1
			END
	END -- FIN DU WHILE
 
	-------------------------------------------
	-- UPDATE -----------------------------
	-------------------------------------------
	SET @SQL='SET NOCOUNT ON; UPDATE '+@T+' SET DATE_FINISH='''+CAST(@DF AS varchar(32))+''' WHERE '+@KEYCOL+'='+CAST(@KEYCOL_ID AS varchar(max))+';'
	-------------------------------------------
	EXECUTE(@SQL);
	-------------------------------------------
	IF @@ERROR <> 0 GOTO LBL_ERROR;
 
-- succès 
LBL_OK: 
IF @@TRANCOUNT > 0 
   COMMIT TRANSACTION;
GOTO LBL_RESUME; 
-- erreur SQL 
LBL_ERROR: 
IF @@TRANCOUNT > 1 
   COMMIT TRANSACTION; 
ELSE 
   IF @@TRANCOUNT = 1 
      ROLLBACK TRANSACTION; 
RAISERROR('Erreur SQL N°%d dans la procédure : P_I_DF_POND_GENERIC .', 16, 1, @ERROR); 
 
-- erreur aucune insertion 
LBL_ERROR_COUNT: 
IF @@TRANCOUNT > 1 
   COMMIT TRANSACTION; 
ELSE 
   IF @@TRANCOUNT = 1 
      ROLLBACK TRANSACTION; 
RAISERROR('Erreur fonctionnelle : P_I_DF_POND_GENERIC . Aucune ligne insérée', 16, 1); 
--------------------------------------------------------------------------
-- sortie de transaction 
LBL_RESUME:
	SET @ETAT = 1; 
--SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
-------------------------------------------------------------------------
Donc est ce qu'il y a plus simple ???
L'avantage de l'implémentation de sqlpro c'est que c'est bien pour tirer des reportings
et il me faudrait un truc pareil mais qui gère le truc merdique que j'ai fait

(je sais c'est pas bien les boucles dans le SGBDR)

Des idées svp ?

Merci d'avance pour votre précieuse aide
Images attachées
Type de fichier : jpg screen de la modelisation pourrie.JPG (14,3 Ko, 1 affichages)
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h10.


 
 
 
 
Partenaires

Hébergement Web