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

Bases de données Delphi Discussion :

Résoudre un problème SQL


Sujet :

Bases de données Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 28
    Points : 0
    Points
    0
    Par défaut Résoudre un problème SQL
    J'ai une table qui est rempli Avec l'aide du code ci-dessous :
    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
    datas.Table14.First;
    trouver:=false;
    while not (datas.Table14.Eof) do
    begin
    if datas.Table14.FieldByName('ref_prod').asinteger=datas.table1.FieldByName('ref_prod').AsInteger then
    trouver:=true;
    datas.Table14.Next;
    end;
    if trouver then
    ShowMessage('La liste des pré-préparés')
    else
    begin
    datas.table1.First;
    while not (datas.table1.Eof) do
    begin
    datas.Table14.Append;
    datas.Table14.fieldbyname('ref_prod').asinteger:=datas.table1.fieldbyname('ref').AsInteger;
    datas.Table14.fieldbyname('designation').AsString:=datas.table1.fieldbyname('designation').AsString;
    datas.Table14.fieldbyname('Nn').asfloat:=datas.table1.fieldbyname('NN').Asfloat;
    datas.Table14.fieldbyname('reper').AsString:=datas.table1.fieldbyname('reper').AsString;
    datas.Table14.fieldbyname('Unit').AsString:=datas.table1.fieldbyname('Type_p').AsString;
    datas.Table14.fieldbyname('code_detai').asinteger:=fiche_vente.table1.fieldbyname('ref_v').AsInteger;
    datas.Table14.fieldbyname('empl').AsString:=datas.table1.fieldbyname('empl').AsString;
    //quantite a livrer**************************************************
    datas.Table14.fieldbyname('qte_a_alivr').asfloat:=
    fiche_vente.Table1.FieldByName('s_1').Asfloat*datas.table15.FieldByName('s_1').Asfloat+
    fiche_vente.Table1.FieldByName('s_2').Asfloat*datas.table15.FieldByName('s_2').Asfloat+
    fiche_vente.Table1.FieldByName('s_3').Asfloat*datas.table15.FieldByName('s_3').Asfloat+
    fiche_vente.Table1.FieldByName('s_4').Asfloat*datas.table15.FieldByName('s_4').Asfloat+
    fiche_vente.Table1.FieldByName('hs_4').Asfloat*datas.table15.FieldByName('Hts_4').Asfloat;
    //le pois a livrer**************************************************
    datas.Table14.fieldbyname('poid_a_livr').asfloat:=
    round(((fiche_vente.Table1.FieldByName('s_1').Asfloat*datas.table15.FieldByName('s_1').Asfloat)*datas.table15.FieldByName('poid').Asfloat)+
    ((fiche_vente.Table1.FieldByName('hs_4').Asfloat*datas.table15.FieldByName('Hts_4').Asfloat)*datas.table15.FieldByName('poid').Asfloat) / 1000);
    datas.table14.Post;
    datas.table1.Next;
    end;
    end;
    Nom : Sans titre.png
Affichages : 349
Taille : 47,3 Ko
    pour sélectionner les produits de la liste qui ont a la référence de 1 à 10, par exemple ,J'ai mis ce code suit dans une query:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select ref_aff_v,ref_prod,nn,reper,designation,empl,qte_a_alivr,poid_a_livr
    from detaille_aff_v
    where (ref>=:a)and(ref<:=b)
    Le problème est qu'ils ne sélectionnent que les valeurs correspondantes des deux conditions,
    Ne pas sélectionner l'intervalle entre la valeur des deux conditions.
    Pour expliquer :
    Je veux sélectionner les produits de la liste qui ont un code de 1 à 10, par exemple, et de calculer le poids
    Est-ce possible avec l'aide d'une seule requête.

  2. #2
    Membre régulier Avatar de Coudrak
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    Pas sûr de comprendre, pour un poids total tu peux utiliser SUM :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select SUM(poid_a_livr)
    from detaille_aff_v
    where ref >= :a and ref <= :b

    ou si tu veux dire calculer le poids pour chaque ligne, juste ajouter dans select la multiplication :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select ref_aff_v,ref_prod,nn,reper,designation,empl,qte_a_alivr,poid_a_livr, qte_a_livr * poid_a_liv AS poids

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 170
    Points : 41 356
    Points
    41 356
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    en SQL on ne peut pas avoir un ensemble de ligne et ces mêmes lignes groupées.
    On ne pourra obtenir qu'un ensemble par Groupe dés que l'on utilise cette clause

    par exemple : pour reprendre le code de Coudrak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select SUM(poid_a_livr)
    from detaille_aff_v
    where ref >= :a and ref <= :b
    pas de group juste l'aggrégat donc une seule ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select ref, SUM(poid_a_livr)
    from detaille_aff_v
    where ref >= :a and ref <= :b
    GROUP BY ref
    une ligne par ref et un cumul par ref

    ceci étant votre code est une beaucoup trop de boucles ! et apprennez à utiliser la clause with ! par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    datas.Table14.First;
    trouver:=false;
    while not (datas.Table14.Eof) do
    begin
    if datas.Table14.FieldByName('ref_prod').asinteger=datas.table1.FieldByName('ref_prod').AsInteger then
    trouver:=true;
    datas.Table14.Next;
    end;
    if trouver then
    ShowMessage('La liste des pré-préparés')
    peut se transformer de façon je pense plus lisible en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with datas do
     begin
        With Table14 do begin
          First;
          Trouver:=False;
          While not EOF do
           begin
             Trouver:=Trouver OR  FieldByName('ref_prod').asinteger=table1.FieldByName('ref_prod').AsInteger;
             Next; 
           end;
        end;
     end;
    mais surtout ce traitement peut être remplacer par une seule requête !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 AS TROUVE FROM table14 WHERE  ref_prod=:ref_prod
    avec un paramètre Ref_prod = qui sera soit en liaison avec le datasource de table1 soit passer avant d'ouvrir la requête
    un simple test pour savoir si la colonne TROUVE est nulle et plus besoin de boucle !

    et pour faire "propre" la Query peut être crée au runtime ! par exemple ainsi

    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
    var AQuery : TQuery;
         Trouve : Boolean;
    ...
    begin
    AQuery:=TQuery.Create(nil);
    try
      AQuery.databaseName:=Datas.Database1.DatabaseName; // à modifier selon 
      AQuery.SQL.Text:='SELECT 1 AS TROUVE FROM table14 WHERE  ref_prod=:ref_prod'; // changer table14 par le nom de la table 
      AQuery.ParamByName('ref_prod').asInteger:=datas.table1.FieldByname('ref_prod').asInteger;
      AQuery.Active:=True;
      Trouve:=not AQuery.FieldByName('TROUVE').isNull;
      AQuery.Active:=False;
    finally
     AQuery.Free;
    end;
    PS. comment pouvez vous vous y retrouver avec ces noms de composants tables ? table1, table14 ..... pensez à quelqu'un qui prendrai votre suite !

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 28
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    Monsieur, sont toujours un problème
    Il est de ma faute parce que je ne mets pas le code de requête droite au débutة
    Code que je devais le mettre est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select ref_aff_v,ref_prod,nn,reper,designation,empl,qte_a_alivr,poid_a_livr
    from detaille_aff_v
    where empl>=:a and empl<=:b and ref_aff_v=:p
    Le requête fonctionne efficacement,Cependant il ne montre pas certains des enregistrements.Nom : Sans titre.png
Affichages : 405
Taille : 216,4 KoNom : Sans titre2.png
Affichages : 373
Taille : 214,0 Ko
    Figure 1
    Elle représente les résultats de 1 à 10,Il doit être démontré entre 1 à 10 (1,2,3,4,5,6,7,8,9,10),Mais seulement 1 et 10 montrent.
    Figure 2
    Elle représente les résultats de 1 à 22,Il doit être démontré 1-22,Et toujours de 3 à 9 ne montre pas.
    Je n'ai pas de problème avec la charge de poids parce que je l'ai résolu son problème par le code Delphi.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 170
    Points : 41 356
    Points
    41 356
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    vos explications sont pour le moins confuses. La requête semble correcte, si les résultats attendus ne correspondent pas au résultat de votre requête deux possibilités :
    - des erreurs dans vos données
    - quelque chose dans votre programme

    Dans les deux cas le meilleur moyen pour vérifier est de passer par DBExplorer ou autre programme indépendant afin de voir le résultat obtenu par la requête. Tant qu'à faire, pour cette dernière mettez la clause ORDER BY EMPL

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 441
    Points : 5 861
    Points
    5 861
    Par défaut
    salut

    tu n'aurais pas inversé tes paramètre ?

    essai l'instruction between

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ref_aff_v,ref_prod,nn,reper,designation,empl,qte_a_alivr,poid_a_livr
    FROM detaille_aff_v
    WHERE empl BETWEEN :a AND  :b 
    AND  ref_aff_v=:p

Discussions similaires

  1. Problème SQL à résoudre
    Par alexmartin dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/04/2014, 11h02
  2. SQL : résoudre ce type de problème sql.
    Par LESOLEIL dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/10/2005, 13h48
  3. Problèmes SQL
    Par stampe dans le forum Bases de données
    Réponses: 2
    Dernier message: 06/07/2004, 21h02

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