IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

variables, curseurs et autres


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut variables, curseurs et autres
    Bonjour à tous,

    j'ai fait une 'petite' erreur sur une BD de traçabilité au boulot. J'ai fait un UPDATE SET sans WHERE Erreur de noob, je sais. 30200 rows affected. glurps.

    Les données perdues sont récupérables ailleurs dans la BD. Ouf. Le problème, c'est qu'à part quelques simples requêtes, je n'y connais pas grand chose

    Pour faire au plus court, les tables qui m'intéressent sont celles-ci :

    lot_stockage (OID, lot_ID, begin_time, end_time, quantité soutirée, etc.)
    lnk_lot_tracing (OID, lot_in, lot_out, begin_time, end_time, quantité, etc.)

    Ce que j'ai fichu en l'air c'est, dans lot_stockage le end_time qui est maintenant null et les quantités soutirées = 0

    les lots de stockage (lot_ID) sont des nVARCHAR(14) du style STO12365000001, ils sont uniques, bien que pas la clé primaire de lot_stockage. Il existe d'autres tables dans lesquelles j'aurai au lieu des STO, des TIR, REC, AAD, CUV etc.

    Dans lnk_lot_tracing, les lot_in et lot_out permettent de tracer tous les mouvements et sont donc des STO, TIR, etc

    Le but du jeu :
    Je dois retrouver chaque STO de lot_stockage dans les lot_in de lnk_lot_tracing (qui peuvent apparaître plus d'une fois) et
    - 1. trouver le plus grand begin_time des lot_out correspondant et retourner cette date dans le end_time de lot_stockage pour ce STO dans lot_stockage
    - 2 si il y a des TIR dans lot_out, additionner les quantités que je retournerai dans quantité soutirée du STO dans lot_stockage.


    Je suppose que je vais devoir utiliser des variables du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE @begin_time_MAX datetime
    DECLARE @quantity_soutirage decimal(10,2)
    Egalement un ou plusieurs curseurs, et peut-être d'autres choses ... mais là j'ai besoin d'aide.

    Merci d'avance pour vos conseils.

    (PS : je retourne à mes lectures rapides, variables, ça devrait aller, je m'attaque aux curseurs. Je sens qu'avant la fin du weekend, j'en connaitrai un rayon sur tout ça )

    (PPS: si j'ai pas posté au bon endroit, merci M Le Modo de me téléporter )

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bon j'ai pondu ça :
    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
    DECLARE @begin_time_MAX datetime
    DECLARE @quantity_TIR decimal(10,2) 
    DECLARE @tmp_lot_id nVARCHAR(14)
     
    DECLARE lot_cursor CURSOR FOR
    SELECT lot_ID FROM lot_Stockage_Cuverie 
     
    OPEN lot_cursor
    FETCH NEXT FROM lot_cursor
    INTO @tmp_lot_id
     
    WHILE @@fetch_status = 0
    	BEGIN 
    		SET @quantity_TIR = 0			/* nécessaire ? */
    		SET @begin_time_MAX = null		/* nécessaire ? */
     
    		SET @begin_time_MAX = (SELECT MAX(begin_time) FROM lnk_lot_tracing WHERE lot_in = @tmp_lot_id)
    		SET @quantity_TIR = (SELECT SUM(quantity) FROM lnk_lot_tracing WHERE lot_in = @tmp_lot_id AND lot_out LIKE 'TIR%')
     
    		UPDATE lot_Stockage_Cuverie
    		SET end_time = @begin_time_MAX , Quantité_soutirée = @quantity_TIR
    		WHERE lot_ID = @tmp_lot_id
    	END
    CLOSE lot_cursor
    DEALLOCATE lot_cursor

    Ca fonctionne si j'applique sur 1 STO particulier, je vais essayer sur une série ... je croise les doigts. Et si vous voyez une connerie, faites signe !

    Parce que ça me paraît trop simple pour que j'ai pas fait une connerie

    EDIT: Arf, déjà trouvé une exception... je peux pas mettre un end_time pour tous les STO qui apparaissent dans lnk_lot_tracing... je peux avoir un STO en cours dont une partie de la quantité a déjà été utilisée ...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Re-arf, ça mouline si @tmp_lot_id n'existe pas dans les lots_in de lnk_lot_tracing ...

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Si vous êtes sous SQL Server 2005, vous pouvez éviter le curseur (quelle horreur !) par :

    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
    ;WITH
    	CTE_BEGIN_TIME AS
    	(
    		SELECT	lot_in
    			, MAX(begin_time) AS max_begin_time
    		FROM	dbo.lnk_lot_tracing
    		GROUP	BY lot_in
    	)
    	, CTE_QUANTITY_TIR AS
    	(
    		SELECT	lot_in
    			, SUM(quantity) AS quantity_TIR
    		FROM	dbo.lnk_lot_tracing
    		WHERE	lot_out LIKE 'TIR%'
    	)
    UPDATE		dbo.lot_Stockage_Cuverie
    SET		end_time = BT.max_begin_time
    		, Quantité_soutirée = QT.quantity_TIR
    FROM		dbo.lot_Stockage_Cuverie AS LSC
    INNER JOIN	CTE_BEGIN_TIME AS BT
    			ON LSC.lot_ID = BT.lot_in
    INNER JOIN	CTE_QUANTITY_TIR AS QT
    			ON LSC.lot_ID = QT.lot_in
    e-arf, ça mouline si @tmp_lot_id n'existe pas dans les lots_in de lnk_lot_tracing ...
    Écrivez toujours du code ensembliste, ce sera plus performant et vous évitera ce genre de désagréments

    @++

Discussions similaires

  1. Récupérer les variables d'une autre fenêtre
    Par chuky dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 20/05/2012, 20h24
  2. Récupérer une variable d'une autre classe
    Par Chris33 dans le forum Général Python
    Réponses: 2
    Dernier message: 06/12/2005, 10h45
  3. Réponses: 5
    Dernier message: 05/04/2005, 11h53
  4. Nom de variable dans une autre variable
    Par lsdInside dans le forum Linux
    Réponses: 5
    Dernier message: 04/12/2004, 19h36
  5. [langage] trouver une variable dans une autre
    Par BEAUJAULT dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2004, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo