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 :

AIDE sur requête SQL et champs calculé


Sujet :

MS SQL Server

  1. #1
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    mai 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2005
    Messages : 682
    Points : 387
    Points
    387
    Par défaut AIDE sur requête SQL et champs calculé
    Bonjour,

    je programme sous Windev 17 une appli de GPAO qui exploite une base Sql Server. J'aimerais avoir un champs calculé dans ma requête mais je ne sais pas comment faire.

    Je vous explique ce que je veux : j'ai une table stck qui a la structure suivante :

    *stck_article_id int /* la clé = l'article */
    stck_empl tinyint /* reference de l'emplacement */
    stck_qte float /* la qté en stock actuellement */
    stck_attendu float /* la qté attendue d'après les achats */
    stck_besoin float /* le besoin sur les OF */

    et une table empl qui recense mes emplacements de stocks.

    Je voudrais que ma requete me retourne toutes mes lignes de stocks articles, avec un champs calculé de la manière suivante :

    reappro = -Maxi(0, stck_besoin - stck_qte - stck_attendu)

    La qté à réapprovisionner serait la différence entre ( ce que j'ai en stock + ce que je vais recevoir de mes achats ) - ( ce dont j'ai besoin d'après mes ordres de fabrication ), mais seulement quand le résultat de cette différence est négatif...

    Mais comment traduire ce calcul dans une requête ??? Je ne sais pas faire le Maxi....

    Pour le moment je ne sais obtenir que cela :

    SELECT stck.*, empl.*, (stck_besoin - stck_qte - stck_attendu) AS reappro FROM stck, empl WHERE stck_empl = empl_id;

    Merci de votre aide.

    Bob
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je ne comprend pas, qu'est ce que tu appel le maxi ?
    Peux-tu donner un exemple ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 240
    Points : 210
    Points
    210
    Par défaut
    Même question que Darnold.

    En ce qui concerne le type de données de tes colonnes, évites d'utiliser le type float. Utilises decimal.

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 4 058
    Points : 7 279
    Points
    7 279
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Plutôt que de faire ça directement dans une requête, je ferais une colonne calculée (directement dans la table)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    alter table stck
    add reappro as (case when stck_besoin - (stck_attendu + stck_qte) > 0 then stck_besoin - (stck_attendu + stck_qte) else 0 end)

    Et ensuite :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select stck_article_id, reappro from stck
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    mai 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2005
    Messages : 682
    Points : 387
    Points
    387
    Par défaut
    Interessant cette colonne calculée.

    La colonne se calcule toute seule, donc ça optimise ma requête c'est ça ?

    Ca se passe comment concrètement, j'exécute ce code directement depuis le Sql Server Management Studio une fois, et ma table est affectée une bonne fois pour toute de ce nouveau champ ?

    Ou bien y aurait-il un assistant pour créer une colonne calculée ?

    Merci pour votre aide
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 4 058
    Points : 7 279
    Points
    7 279
    Billets dans le blog
    1
    Par défaut
    Le principal intérêt d'une colonne calculée, c'est que lorsqu'un développeur doit récupérer la valeur du calcul, il n'a pas à se poser la question deux heures pour retrouver la formule.
    => Ça homogénéise le code, puisque tout le monde utilise la même formule, stockée à un seul endroit, et ça évite les bugs stupides.

    Le second intérêt, puisque la formule est présente à un unique endroit, le jour où la règle évolue, on n'a qu'un seul endroit à modifier.

    On peut parfaitement remplacer cette colonne calculée par une vue.

    La colonne calculée est une colonne physique. Une fois créée, on n'a plus à y toucher.
    C'est une colonne en lecture seule (pas d'insert/update dedans), et elle se met à jour automatiquement lorsque les autres colonnes changent.

    Le calcul n'est à ma connaissance pas stocké.

    Elle n'est recalculée que lorsqu'on l'interroge.

    Attention donc aux "select *" qui vont déclencher le calcul de toutes les colonnes calculées, même celles dont on n'a pas besoin !
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    mai 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2005
    Messages : 682
    Points : 387
    Points
    387
    Par défaut
    Parfait, et merci pour le petit cours.

    Résolu
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 240
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Le calcul n'est à ma connaissance pas stocké.

    Elle n'est recalculée que lorsqu'on l'interroge.

    Il est possible de stoker le résultat de la colonne calculée enrépondant à "Oui" dans la propriété "est persistant".
    Il est même possible d'indexer cette colonne.

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

Discussions similaires

  1. Besoin d'aide sur requête Sql
    Par Sekigawa dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 31/12/2009, 16h14
  2. Aide sur requête SQL
    Par Pschittt dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/11/2008, 15h56
  3. Aide sur requête SQL
    Par Mister Paul dans le forum Langage SQL
    Réponses: 14
    Dernier message: 27/10/2008, 12h22
  4. aide sur requête sql
    Par Vodkha dans le forum Langage SQL
    Réponses: 9
    Dernier message: 30/08/2005, 18h53
  5. Aide sur Requête SQL
    Par devdev dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/05/2005, 13h33

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