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

WebDev Discussion :

Problème parcours requête


Sujet :

WebDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut Problème parcours requête
    Bonjour,
    J'ai un soucis depuis ce matin que je tente de résoudre.
    J'ai deux tables:lignebudgétaires et bondecomande relié par 0,1------->0,1 via le numérobondecomande
    Le bondecomande possède les champs:
    QuantitéCommandéeInitiale
    QuantitéDepotée
    QuantitéApelée

    La ligne budgétaire possède les champs:
    CoutDemandedachat
    CoutQtéAppelée
    CoutQtéDépotée
    prixUnitaire

    le but est de: pour chaque enregistrement correspondant via le numérobondecomande on doit avoir :
    CoutDemandedachat=QuantitéCommandéeInitiale *prixUnitaire
    CoutQtéAppelée=QuantitéApelée*prixUnitaire
    CoutQtéDépotée=CoutQtéDépotée*prixUnitaire

    Sans tarder, j'ai d'abord pensé à une requête SQL qui le ferait directement,mais j'ai pas pu.C'est ainsi que j'ai fait cette requête:
    REQ_CalculCoût=
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
    	BondeComande.NuméroBondeComande AS NuméroBondeComande,
    	SUM(BondeComande.QuantitéCommandéeInitiale) AS CoutAchat,
    	SUM(BondeComande.QuantitéDepotée) AS coutdépot,
    	SUM(BondeComande.QuantitéApelée) AS coutappl
     
     
    FROM
    	LigneBudgétaire,
    	BondeComande
    WHERE BondeComande.NuméroBondeComande=LigneBudgétaire.NuméroBondeComande
    GROUP BY 
    		BondeComande.NuméroBondeComande
    puis j'ai implémenté ça: pour affecter à lignebudgétaire
    (c'est temporaire l'utilisateur ne le verrait pas)

    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
    SI HExécuteRequête(REQ_CalculCoût,hRequêteDéfaut)=Faux ALORS
    	Erreur("Echec requête"+RC+HErreurInfo())
    	RETOUR
    FIN
     
    HLitPremier(REQ_CalculCoût)
    TANTQUE PAS HEnDehors()
    // Traitement sur l'enregistrement de la requête
    	POUR TOUT LigneBudgétaire 
    		SI REQ_CalculCoût.NuméroBondeComande=TABLE_LigneBudgétaire.COL_NuméroBondeComande ALORS
    			TABLE_LigneBudgétaire.COL_CoutDemandedachat=REQ_CalculCoût.CoutAchat
    			TABLE_LigneBudgétaire.COL_CoutQtéAppelée=REQ_CalculCoût.coutappl
    			TABLE_LigneBudgétaire.COL_CoutQtéDépotée=REQ_CalculCoût.coutdépot
    		FIN
    	FIN
    	HLitSuivant(REQ_CalculCoût)
     
    FIN		
     HAnnuleDéclaration(REQ_CalculCoût)
    l'astuce ici serait d'affecter les valeurs temporaires sur le tableau et après de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    table_lignebudgétaire.col_CoutDemandedachat=table_lignebudgétaire.col_CoutDemandedachat*table_lignebudgétaire.col_PrixUnitaire;
    table_lignebudgétaire.col_CoutQtéAppelée=table_lignebudgétaire.col_CoutQtéAppelée*table_lignebudgétaire.col_PrixUnitaire;
    table_lignebudgétaire.col_CoutQtéDépotée=table_lignebudgétaire.col_CoutQtéDépotée;
    Ainsi j'obetiendrais les valeurs recherchées.Mais Quand je test ma page avec l'avant dernier code, il ne me fait les affectations que pour le premier enregistrement,ignorant ainsi les autres.
    Je réfléchis depuis ce matin sur ce problème et toujour pareil.
    Si quelqu'un a une piste je l'accepte volontier.

    Paul Nero

  2. #2
    Membre chevronné
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Par défaut
    Bonjour,

    N'y aurait-il pas une ambiguïté entre LigneBudgétaire (le fichier) et TABLE_LigneBudgétaire au niveau de la boucle POUR TOUT ?

    Pour la requête, avez vous testé: :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT
    	BondeComande.NuméroBondeComande AS NuméroBondeComande,
    	SUM(BondeComande.QuantitéCommandéeInitiale * LigneBudgétaire.PrixUnitaire) AS CoutAchat,
    	SUM(BondeComande.QuantitéDepotée * LigneBudgétaire.PrixUnitaire) AS coutdépot,
    	SUM(BondeComande.QuantitéApelée * LigneBudgétaire.PrixUnitaire) AS coutappl
     
     
    FROM
    	LigneBudgétaire,
    	BondeComande
    WHERE BondeComande.NuméroBondeComande=LigneBudgétaire.NuméroBondeComande
    GROUP BY 
    		BondeComande.NuméroBondeComande
    Sinon, pour l'affectation dans la table voir éventuellement:
    FichierVersTableMemoire,
    ou bien TABLE_LigneBudgétaire..FichierParcouru="REQ_CalculCoût"

    La table est temporaire et ne sert qu'au calcul?
    sinon, pour mémoriser dans LigneBudgétaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    POUR TOUT REQ_CalculCoût
     SI HLitRecherchePremier(LigneBudgétaire,NuméroBondeCommande,REQ_CalculCoût.NuméroBondeCommande)
        LigneBudgétaire.Coutxxx = REQ_calculCoût.Coutxxx
        //etc
        HModifie(LigneBudgétaire)
      FIN
    FIN

    Patrick

  3. #3
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut Re
    Bonjour sevensoftWare,
    désolé pour la réponse tardive,j'ai du refléchir longtemps sur un autre soucis que je viens de résoudre à peine.

    En effet, ta requête est ce qu'il me fallait.Ce qui a entrainé ma confusion est le sum (a)*sum(b) qui en fait est tout simplement sum(a*b).Car en faisant sum (a)*sum(b) j'avais un problème d'agrégat selon webdev.

    Pour le parcour de la requête rien à dire ta méthode est tout simplement rapide,efficace et sûr!!

    Merci encore une fois

    Paul nero

  4. #4
    Membre chevronné
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Par défaut
    Bonjour,

    Juste une dernière remarque, si je peux me permettre.

    Perso, sauf impératifs particuliers, je ne mémorise jamais les montants en base de données, seulement les qtés et prix unitaires, les montants étant recalculés à la volée à l'affichage, dans un état ou dans une requête SQL.
    Mémoriser le prix unitaire, la qté ET le montant constitue une redondance au sens de la base de données.

    Mais il peut y avoir des cas où c'est necessaire (en compta par exemple)

  5. #5
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut Re
    Une remarque est toujours la bienvenue si elle est constructive et non dénigrante,c'est le cas de la tienne!!

    En effet, il pourrait être inutile de calculer les montants.Mais là, j'ai cette contrainte:
    coutlignebudgétaire= quantité comandé (dans le bon de commande)*prix unitaire (dans ligne budgétaire).
    Il faut nécessairement passer par une requête, et qui dit requête dit traitement dans un fichier de données.Par conséquent, les quantité comandé et prix unitaire necessitent d'être sauvegardés.Les coutXXX dans ce cas pourraient ne pas être sauvegardé dans la base( là vous avez raison).
    Donc dans ce cas, il suffirait d'enlever le Hmodifie(lignebudgétaire).Et de ce fait les Table_coûtXXX ne devraient plus être reliée au fichier.
    Je vais implémenter tout ça,merci.

    Paulnero

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/08/2003, 15h32
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 16h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 14h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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