Bonjour à tous,
Le contexte :
Je suis en train de reprendre une appli de rdv pour un centre de controle technique, il me faut conserver l'historique des rdv et ajouter certaines fonctionnalités à l'appli actuelle, seulement certaines de ces nouvelles fonctionnalités m'obligent à transformer une partie des données de la BDD
La problèmatique :
Un dessin valant mieux qu'un long discours, je vous présente un schéma (simplifié) de ma table RDV
TABLE RDV
ID_RDV----ID_CRENEAU--------NUMLIGNE
1--------------1-------------------3
2--------------1-----------------NULL
3--------------1-----------------NULL
4--------------2-------------------1
6--------------2-------------------2
7--------------3-----------------NULL
10-------------4-----------------NULL
22-------------4-----------------NULL
- Les 3 champs sont des integer
- ID_RDV est la clé primaire IDENTITY(1,1)
- Le champ ID_CRENEAU est une clé étrangère faisant référence à une table CRENEAU;
- NUMLIGNE permet de positionner le rdv sur l'agenda; si on prend l'exemple du ID_CRENEAU 1, on voit que le numligne ne peut pas dépasser 3 c'est le cas avec le RDV 1, les RDV 2 et 3 étant placé par l'appli actuelle là ou il y a des trous dans le planning.
TABLE CRENEAU
ID_CRENEAU------------DATE----------HEURE_DEB-----------NB_LIGNE
1---------------------11/07/2013--------08:00----------------3
2---------------------11/07/2013--------08:30----------------3
3---------------------11/07/2013--------09:00----------------4
4---------------------11/07/2013--------10:00----------------4
- NB_LIGNE est le nombre maximal de RDV pour chaque créneau
Ma problématique vient de ce fameu champ NUMLIGNE de ma table RDV. J'ai besoin que TOUT les NUMLIGNE soit remplit mais sans modifier les NUMLIGNE déjà attribué.
Pour l'exemple, une fois que j'aurais réussi (ou plutôt que vous m'aurait bien orienté parce que là je galère :-) ) que ma table RDV ressemble à ça :
TABLE RDV
ID_RDV----ID_CRENEAU--------NUMLIGNE
1--------------1-------------------3
2--------------1-------------------1
3--------------1-------------------2
4--------------2-------------------1
6--------------2-------------------2
7--------------3-------------------1
10-------------4-------------------1
22-------------4-------------------1
J'ai bien réussit à trouver un mo yen de combler ces trous, mais de manière pas assez performante;
plus de 20 minutes pour mettre à jour 3000 lignes sur 3 000 000 au total, ça va me prendre des heures !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 DECLARE @NUMLIGNE INT; DECLARE @ID_RDV INT; DECLARE @ID_CRENEAU INT; WHILE EXISTS(SELECT TOP 1 * FROM RDV WHERE NUMLIGNE IS NULL ) BEGIN SELECT TOP 1 @ID_CRENEAU = ID_CRENEAU, @ID_RDV = ID_RDV FROM RDV WHERE NUMLIGNE IS NULL ORDER BY ID_CRENEAU SET @NUMLIGNE = (SELECT TOP 1 * FROM ( SELECT I FROM dbo.FN_GET_SERIE (1, 10) S WHERE NOT EXISTS (SELECT ISNULL(NUMLIGNE,0) FROM RDV R2 WHERE R2.ID_CRENEAU =@ID_CRENEAU AND S.I=R2.NUMLIGNE) ) OQP ORDER BY OQP.I ) UPDATE RDV SET NUMLIGNE= @NUMLIGNE WHERE ID_RDV =@ID_RDV ; END
Donc si quelqu'un à une idée plus performante à me soumettre, je suis preneur.
Merci d'avance !!
Partager