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

Langage SQL Discussion :

Requête avec condition if pour une gestion de stock FEFO (First Expired First Out)


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Requête avec condition if pour une gestion de stock FEFO (First Expired First Out)
    bonjour à tous,

    je faire une gestion de stock par numéro de lot et par date de péremption et je galère depuis quelques jours sur une requête en sql server 2008 r2. ce que je veux faire c'est que si pour un article j'ai les données suivantes:
    CODART: M0001, DATFABRIC: 10/10/2010 DATPEREMP: 10/10/2015 NUMLOT: 30 QTE: 0
    CODART: M0001, DATFABRIC: 15/10/2010 DATPEREMP: 15/10/2015 NUMLOT: 31 QTE: 100
    CODART: M0001, DATFABRIC: 20/10/2010 DATPEREMP: 20/10/2015 NUMLOT: 32 QTE: 200
    je voudrais que ma requête me ramène les données du NUMLOT qui a la date de péremption la plus proche et dont la quantité restante en stock est différente de zéro c'est à dire dans mon cas le NUMLOT 31 ainsi de suite vu que le NUMLOT 30 à une QTE=0

    voici ma requête qui ne fonctionne pas comme je veux et qui me ramène les données du NUMLOT 30:
    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
     
    SELECT f.NUMLOT,f.DATFABRIC,f.DATPEREMP, CASE WHEN((SUM(CASE WHEN tm.LIBTYPMVT LIKE 'entr% %2%' THEN f.QTEMVT ELSE 0 END)-
    SUM(CASE WHEN tm.LIBTYPMVT LIKE 'sorti% %[^fic2]2%' or tm.LIBTYPMVT like '%ansfert2' or tm.LIBTYPMVT like 'transfertinterne2' THEN f.QTEMVT ELSE 0  END)))<>0
    THEN (SUM(CASE WHEN tm.LIBTYPMVT LIKE 'entr% %2%' THEN f.QTEMVT ELSE 0 END)-
    SUM(CASE WHEN tm.LIBTYPMVT LIKE 'sorti% %[^fic2]2%' or tm.LIBTYPMVT like '%ansfert2' or tm.LIBTYPMVT like 'transfertinterne2' THEN f.QTEMVT ELSE 0  END))
    ELSE 0
    END
     
    FROM FAIRE f INNER JOIN mouvement m ON f.CODMVT = m.CODMVT 
    INNER JOIN TYPE_MOUVEMENT tm ON tm.CODTYPMVT = m.CODTYPMVT 
    INNER JOIN SOUS_SITE ss ON ss.CODSOUSIT = m.CODSOUSIT 
    INNER JOIN SITE s ON s.CODSITE = ss.CODSITE 
    INNER JOIN ARTICLE a ON f.CODART = a.CODART 
    INNER JOIN DESTINATION d ON m.CODDEST = d.CODDEST 
    INNER JOIN EMPLOYER e ON m.MATEMP=e.MATEMP WHERE a.codart='M0001'
    and f.datperemp=(select min(f.datperemp) 
    from faire f INNER JOIN mouvement m ON f.CODMVT = m.CODMVT 
    INNER JOIN TYPE_MOUVEMENT tm ON tm.CODTYPMVT = m.CODTYPMVT 
    INNER JOIN SOUS_SITE ss ON ss.CODSOUSIT = m.CODSOUSIT 
    INNER JOIN SITE s ON s.CODSITE = ss.CODSITE 
    INNER JOIN ARTICLE a ON f.CODART = a.CODART 
    INNER JOIN DESTINATION d ON m.CODDEST = d.CODDEST 
    INNER JOIN EMPLOYER e ON m.MATEMP=e.MATEMP 
    WHERE s.CODSITE= 'PharmaF2')
    PS: je gère toutes les mouvements de stock dans la même table (FAIRE) les type de mouvement sont dans la tables (TYPE_MOUVEMENT)
    toutes les jointure que j'ai fait sont indispensable.

    aidez moi s'ils vous plait

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    hmmm, que penses tu d'une part, de faire un filtre : where QTE > 0
    (d'apres ce que je comprens, ta colonne QTE, c'est ton gros CASE...)

    Ensuite, tu peux trier non par par date de péremption, mais par (date de péremption - sysdate ) (en rajoutant peut etre un filtre du genre date de peremption > sysdate si besoin) du plus petit au plus grand...


    Est ce que ca correspond à ce que tu souhaites faire ? Ou y'a qlq chose qui m'a échappé ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    bonjour bstevy merci de m'avoir répondu
    le filtre sur le QTE est une bonne idée mais le problème est que vu qu'il resulte d'un calcul (SUM) je ne sais pas trop comment gérer ça j'avais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    having 
    SUM(CASE WHEN tm.LIBTYPMVT LIKE 'entr% %2%' THEN f.QTEMVT ELSE 0 END) <>
    SUM(CASE WHEN tm.LIBTYPMVT LIKE 'sorti% %[^fic2]2%' or tm.LIBTYPMVT like '%ansfert2' or tm.LIBTYPMVT like 'transfertinterne2' THEN f.QTEMVT ELSE 0  END)
    mais lors de l'exécution le filtre n'est pas pris en compte. le trie par (date de péremption - sysdate) me parait une très bonne idée
    comment mettre la condition de filtre sur le résultat de mon calcul représenté par QTE?

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Votre requête est illisible !
    En la mettant en forme
    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
    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
     
    SELECT
    	f.NUMLOT,
    	f.DATFABRIC,
    	f.DATPEREMP,
    	CASE
    		WHEN (
    			(
    			SUM(CASE
    				WHEN tm.LIBTYPMVT LIKE 'entr% %2%' THEN f.QTEMVT
    				ELSE 0
    			END) -
    			SUM(CASE
    				WHEN tm.LIBTYPMVT LIKE 'sorti% %[^fic2]2%' OR
    					tm.LIBTYPMVT LIKE '%ansfert2' OR
    					tm.LIBTYPMVT LIKE 'transfertinterne2' THEN f.QTEMVT
    				ELSE 0
    			END))
    		) <> 0 THEN (
    			SUM(CASE
    				WHEN tm.LIBTYPMVT LIKE 'entr% %2%' THEN f.QTEMVT
    				ELSE 0
    			END) -
    			SUM(CASE
    				WHEN tm.LIBTYPMVT LIKE 'sorti% %[^fic2]2%' OR
    					tm.LIBTYPMVT LIKE '%ansfert2' OR
    					tm.LIBTYPMVT LIKE 'transfertinterne2' THEN f.QTEMVT
    				ELSE 0
    			END))
    		ELSE 0
    	END
     
    FROM FAIRE f
    INNER JOIN mouvement m
    	ON f.CODMVT = m.CODMVT
    INNER JOIN TYPE_MOUVEMENT tm
    	ON tm.CODTYPMVT = m.CODTYPMVT
    INNER JOIN SOUS_SITE ss
    	ON ss.CODSOUSIT = m.CODSOUSIT
    INNER JOIN SITE s
    	ON s.CODSITE = ss.CODSITE
    INNER JOIN ARTICLE a
    	ON f.CODART = a.CODART
    INNER JOIN DESTINATION d
    	ON m.CODDEST = d.CODDEST
    INNER JOIN EMPLOYER e
    	ON m.MATEMP = e.MATEMP
    WHERE a.codart = 'M0001'
    AND f.datperemp = (
    	SELECT
    		MIN(f.datperemp)
    	FROM faire f
    	INNER JOIN mouvement m
    		ON f.CODMVT = m.CODMVT
    	INNER JOIN TYPE_MOUVEMENT tm
    		ON tm.CODTYPMVT = m.CODTYPMVT
    	INNER JOIN SOUS_SITE ss
    		ON ss.CODSOUSIT = m.CODSOUSIT
    	INNER JOIN SITE s
    		ON s.CODSITE = ss.CODSITE
    	INNER JOIN ARTICLE a
    		ON f.CODART = a.CODART
    	INNER JOIN DESTINATION d
    		ON m.CODDEST = d.CODDEST
    	INNER JOIN EMPLOYER e
    		ON m.MATEMP = e.MATEMP
    	WHERE s.CODSITE = 'PharmaF2'
    )
    on se rend compte que la partie CASE ... WHEN est inutilement compliquée.
    Sauf erreur de ma part, elle ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CASE WHEN [unCalculCompliqué] <> 0 THEN [unCalculCompliqué] ELSE 0 END
    J'ai du mal à comprendre l’intérêt.

    Concernant votre problème, vous pourriez utiliser une fonction de classement, pour filtrer dessus dans un deuxième temps.

    Au final, quelque chose dans ce gout là, à adapter (quel est le rôle du filtre 'PharmaF2' et pourquoi est-il dans la sous requête mais pas dans la requête principal ? je n'ai pas repris ce filtre dans la requête, je vous laisse le mettre...)

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    WITH Tmp AS (
    	SELECT
    		f.NUMLOT,
    		f.DATFABRIC,
    		f.DATPEREMP,
    		SUM(CASE
    				WHEN tm.LIBTYPMVT LIKE 'entr% %2%' 
    					THEN f.QTEMVT
    				WHEN	tm.LIBTYPMVT LIKE 'sorti% %[^fic2]2%' OR
    						tm.LIBTYPMVT LIKE '%ansfert2' OR
    						tm.LIBTYPMVT LIKE 'transfertinterne2' 
    					THEN -f.QTEMVT
    				ELSE 0
    			END) AS Qte
    	FROM FAIRE f
    	INNER JOIN mouvement m
    		ON f.CODMVT = m.CODMVT
    	INNER JOIN TYPE_MOUVEMENT tm
    		ON tm.CODTYPMVT = m.CODTYPMVT
    	INNER JOIN SOUS_SITE ss
    		ON ss.CODSOUSIT = m.CODSOUSIT
    	INNER JOIN SITE s
    		ON s.CODSITE = ss.CODSITE
    	INNER JOIN ARTICLE a
    		ON f.CODART = a.CODART
    	INNER JOIN DESTINATION d
    		ON m.CODDEST = d.CODDEST
    	INNER JOIN EMPLOYER e
    		ON m.MATEMP = e.MATEMP
    	WHERE a.codart = 'M0001'
    	--ajouter le filtre s.CODSITE = 'PharmaF2' ?
    )
    Rang AS (
    	SELECT
    		NUMLOT,
    		DATFABRIC,
    		DATPEREMP,
    		Qte,
    		ROW_NUMBER() OVER(ORDER BY DATPEREMP) AS Rn
    	WHERE Qte <> 0
    )	
    SELECT
    	NUMLOT,
    	DATFABRIC,
    	DATPEREMP,
    	Qte
    FROM Rang
    WHERE Rn = 1
    Je teste simplement la date de péremption, libre à vous d'adapter la partie ORDER BY sur ce point mais... voulez-vous vraiment que les produits qui périment dans deux jours remontent en priorité sur les produits périmés il y a trois jours ?

    Bref, ce n'est donc qu'une base à adapter à votre besoin

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    bonjour aieeeuuuuu ,

    le filtre 'PharmaF2'est nécessaire dans la mésure ou ma base de données
    gère deux stocks de deux sites différents donc le filtre 'PharmaF2'
    permet de savoir sur quel site nous voulons faire l'opération.

    En réalité je veux que les produits qui périment les premiers et dont le
    stock est différent de zéro remonte en priotité. Aussi je voudrais que le
    mécanisme de ma requête soit automatique de telle sorte que si un produit
    perime premier mais sont stock est=0 alors on passe au produit qui se
    périme automatiquement après.


    je test ta requête afin de voir le resultat renvoyer.

    merci de m'avoir repondu

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    rebonjour aieeeuuuuu

    j'ai testé sa marche super

    merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec condition if pour une connexion
    Par theferret dans le forum Langage
    Réponses: 5
    Dernier message: 16/07/2012, 15h43
  2. [Entité-Association] Problème pour définir le schéma pour une Gestion de Stock
    Par Netzo dans le forum Schéma
    Réponses: 8
    Dernier message: 06/01/2012, 14h41
  3. Trigger pour une gestion de stock
    Par anneso9 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/11/2010, 12h06
  4. Quel langage pour une gestion des stocks-client-caisse ?
    Par plex dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 07/04/2007, 18h56

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