Bonjour à tous.

J'ai une table Ordo_Recipe correspondant à cette structure :
- PK_IK (clé primaire)
- Time_Period (datetime)
- FK_ID_Resource (clé étrangère de ressource)
- Quantity (float)
- StopProduction (Bit)

Au sein d'une procédure stockée, je parcours la liste de mes ressources en base et je cumule les quantités dont le champ StopProduction est à 1 dans un intervalle de dates. La première date est fournie en paramètre de la procédure, la deuxième date correspond à la dernière fois où le champ StopProduction est à 0.

Voici l'extrait de code correspondant :
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
21
22
23
24
25
26
27
28
29
30
31
32
SET @CumulatedProduction = 0;
 
DECLARE myCurrentResource CURSOR FOR
   SELECT DISTINCT FK_ID_Resource
   FROM Ordo_Recipe
   WHERE FK_ID_Ordo = @idToUpdate;
 
OPEN myCurrentResource;
FETCH myCurrentResource INTO @FK_ID_Resource;
 
WHILE @@FETCH_STATUS = 0 
BEGIN
    SELECT @CumulatedProduction += ISNULL(SUM(ISNULL(Quantity,0)),0)
    FROM Ordo JOIN Ordo_Recipe ON Ordo_Recipe.FK_ID_Ordo = Ordo.PK_ID AND Ordo_Recipe.FK_ID_Resource = @FK_ID_Resource
    WHERE
        FK_ID_Depository = @FK_ID_Depository
        AND FK_ID_Item = @FK_ID_Item
        AND StopProduction = 1
        AND Time_Period < @Time_Period
        AND Time_Period > (
            SELECT TOP 1 Time_Period
            FROM Ordo JOIN Ordo_Recipe ON Ordo_Recipe.FK_ID_Ordo = Ordo.PK_ID AND Ordo_Recipe.FK_ID_Resource = @FK_ID_Resource
            WHERE
                FK_ID_Depository = @FK_ID_Depository AND FK_ID_Item = @FK_ID_Item
                AND StopProduction = 0 AND Time_Period < @Time_Period
            ORDER BY Time_Period DESC
        )
 
    FETCH myCurrentResource INTO @FK_ID_Resource;
END
CLOSE myCurrentResource;
DEALLOCATE myCurrentResource;
Comme ce code est au sein d'une grosse procédure qu'on m'a demandé d'optimiser, je souhaiterais le convertir en un "gros" SELECT, en évitant de passer par les curseurs... Malheureusement, je n'arrive pas à refaire cette requête car la requête imbriquée remontant le Time_Period dépend de la ressource en cours...
Si vous avez des pistes, ça serait super !

Merci à vous.