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 :

Besoin de requête pour ETAT Rave


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut Besoin de requête pour ETAT Rave
    Bonjour,
    je développe une petite application qui gère les analyses dans un centre médicale, j'ai les tables avec les schémas ci-dessous :




    J'ai besoin d'interroger ces tables pour obtenir le résultat suivant :


    Où la jointure entre la table "Entête analyses" et "Détail analyses" se fait par le "Code", alors si quelqu'un sait comment formuler ces requêtes je serai ravi de le savoir (avec mes propres tests il m'a fallu créer une table intermédiaire le truc que je veux pas le faire)
    n'hésiter pas à poser des questions pour mieux comprendre mon système.

    Merci d'avance

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Y'a un truc que je trouve bizarre dans votre modèle de donnée c'est que dans la table du détail des analyses il y a une redondance d'informations à savoir que le CCat et Lib_Analyse on peut les récupérer en jointant entre "détail analyse" et "analyse" mais bon admettons, peut-être pour optimiser les traitements.

    1 et 2)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT cat.Lib_Categorie, da.Lib_Analyse, COUNT(*)
    FROM entete_analyse ea
    INNER JOIN detail_analyse da ON da.Code = ea.Code
    INNER JOIN categorie cat ON cat.CCat = da.CCat
    WHERE Type_med = 'I' // 'E'
    AND // conditions sur dates
    GROUP BY cat.Lib_Categorie, da.Lib_Analyse

    3)

    j'imagine qu'un patient correspond à une ligne dans la table des entête d'analyse.

    Pour cette dernière requête, il y a plusieurs façon de voir les choses surtout si c'est pour un report. On peut notamment voir deux jeux d'enregistrements un donnant les valeurs pour les Internes et un autre pour les Externes. Et un troisième jeu contenant toutes les villes, ce dernier servant de maître dans une relation maître-détail avec les deux autres jeux.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Pour le 3eme point, peux-tu me dire comment définir ces jeux d'enregistrements et quelle est la requête à appliquer (plus de détails S.T.P)

    Merci

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    En faites pour le 3em point il va te falloir faire une requête assez complexe

    Code sql : 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
     
    Select 
      e.Ville,
      (
        Select Count(*) 
        from Entete as e1 
        where e1.Code = e.Code and e1.Type_med = 'I'
      ) as NbPatient_Interne,
      (
        Select Count(*) 
        From Entete as e2 
        inner join Analyse as a2 on e2.code = a2.Code 
        Where e2.Code = e.Code and e2.Type_med = 'I'
      ) as NbAnalyse_Interne,
      (
        Select Count(*) 
        from Entete as e3 
        where e3.Code = e.Code and e3.Type_med = 'E'
      ) as NbPatient_Externe,
      (
        Select Count(*) 
        From Entete as e4 
        inner join Analyse as a4 on e4.code = a4.Code 
        Where e4.Code = e.Code and e2.Type_med = 'E'
      ) as NbAnalyse_Externe
    From Entete as e
    Where Date_Saisie Between @PDateDebut and @PDateFin
    Group By Ville

    Pas sur que ca fonctionne et il faut mettre les bon nom de champs et de table, mais l'idée est là
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Merci Beaucoup pour votre aide je vais tester et je vous tiendrais au courrant

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Salut tout le monde, comme j'ai promis de vous tenir informé,
    La deuxième solution ne marche pas le SELECT imbriqué ne trouve pas une correspondance avec le SELECT global (des total avec 0) que faire si c'est possible

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Quelle solution de fonctionne pas :

    Le 2) de Aka Guymelef
    ou la requête que je t'ai fourni ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Bonjour Rayek
    je parle de ta solution, elle me donne des totaux nuls (égal à 0) comme si une ville donnée n'a eu aucun patient et aucune analyse subie alors que les données existent réellement

    Citation Envoyé par Rayek Voir le message
    Quelle solution de fonctionne pas :

    Le 2) de Aka Guymelef
    ou la requête que je t'ai fourni ?

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Affiche nous la requete correcte pour tes tables que je puisse vérifier si tu n'as pas oublié quelques choses.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Bonjour Rayek,
    Voilà les requêtes que j'ai testé :
    1) Des totaux erronés
    Code sql : 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
    SELECT
      e.Ville,
      (SELECT Count(*)
       FROM "Ent_anal.db" AS e1
       WHERE e1.Code = e.Code AND e1.Type_med = 'I') AS NbPatient_Interne,
      (SELECT Count(*)
       FROM "Ent_anal.DB" AS e2 INNER JOIN "Det_anal.db" AS a2 ON e2.code = a2.Code
       WHERE e2.Code = e.Code AND e2.Type_med = 'I') AS NbAnalyse_Interne,
      (SELECT Count(*)
       FROM "Ent_anal.db" AS e3
       WHERE e3.Code = e.Code AND e3.Type_med = 'E') AS NbPatient_Externe,
      (SELECT Count(*)
       FROM "Ent_anal.db" AS e4 INNER JOIN "Det_anal.db" AS a4 ON e4.code = a4.Code
       WHERE e4.Code = e.Code AND e4.Type_med = 'E') AS NbAnalyse_Externe
    FROM "Ent_anal.db" AS e
    WHERE Date_Sai Between @PDateDebut AND @PDateFin
    GROUP BY Ville

    2)Des totaux nuls
    Code sql : 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
    SELECT
      e.Ville,
      (SELECT Count(*)
       FROM "Ent_anal.DB" AS e1
       WHERE e1.Code = e.Code AND e1.Type_med = 'I' AND Date_Sai BETWEEN @D1 AND @D2) AS NbPatient_Interne ,
      (SELECT Count(*)
       FROM "Ent_anal.DB" AS e2 INNER JOIN "Det_anal.DB" AS a2 ON e2.code = a2.Code
       WHERE e2.Code = e.Code AND e2.Type_med = 'I' AND Date_Sai BETWEEN @D1 AND @D2) AS NbAnalyse_Interne ,
      (SELECT Count(*)
       FROM "Ent_anal.DB" AS e3
       WHERE e3.Code = e.Code AND e3.Type_med = 'E' AND Date_Sai BETWEEN @D1 AND @D2) AS NbPatient_Externe ,
      (SELECT Count(*)
       FROM "Ent_anal.DB" AS e4 INNER JOIN "Det_anal.DB" AS a4 ON e4.code = a4.Code
       WHERE e4.Code = e.Code AND e4.Type_med = 'E' AND Date_Sai BETWEEN @D1 AND @D2) AS NbAnalyse_Externe
    FROM "Ent_anal.db" AS e
    GROUP BY Ville

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    As tu testé chaque sous requete indépendamment pour voir si ca te retourne le bon résultat ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Bien sur et le résultat differt de celui donné par la requête qui englobe les SELECT de comptage (totaux erronés ou nuls) mais c'est celui qui est exact.
    Citation Envoyé par Rayek Voir le message
    As tu testé chaque sous requete indépendamment pour voir si ca te retourne le bon résultat ?

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Peux tu montrer ton code Delphi ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    il n' y a rien de spécial dans mon code juste deux TQUERY (puisque la requête globale ne marche pas) auxquels j'affecte des paramètres à partir d'autres objets comme un DATETIMEPICKER et aussi par code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //************** Query 1 **************
    Labodata.DecVilQuery1.Params[0].AsString:=Labodata.TVilleLibelle.Value;
    Labodata.DecVilQuery1.Params[1].AsString:='I';
    Labodata.DecVilQuery1.Params[2].AsDate:=DTPicker01.Date;
    Labodata.DecVilQuery1.Params[3].AsDate:=DTPicker02.Date;
    //************** Query 2 **************
    Labodata.DecVilQuery2.Params[0].AsString:=Labodata.TVilleLibelle.Value; 
    Labodata.DecVilQuery2.Params[1].AsString:='I';
    Labodata.DecVilQuery2.Params[2].AsDate:=DTPicker01.Date;
    Labodata.DecVilQuery2.Params[3].AsDate:=DTPicker02.Date;
    //*****   Execution des Querys    ***********
    Labodata.DecUniQuery1.ExecSQL; Labodata.DecUniQuery2.ExecSQL;
    Labodata est la fiches données qui contient toutes mes Tables et Querys
    Requête de Query 1:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Count(*) AS Nb1
    FROM "Ent_anal.DB" AS e
    WHERE e.Ville = :Ville AND e.Type_med = :Typ AND Date_Sai BETWEEN :D1 AND :D2
    Requête de Query 2:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Count(*) AS Nb2
    FROM "Ent_anal.DB" AS e INNER JOIN "Det_anal.DB" AS d ON e.code = d.Code
    WHERE e.Ville = :Ville AND e.Type_med = :Typ AND Date_Sai BETWEEN :D1
    et j'insère le résultat des deux requêtes pour chaque ville dans une table pour l'utiliser ensuite avec Rave Reports, voilà j'espère que c'est ce que tu voulais savoir.
    Citation Envoyé par Rayek Voir le message
    Peux tu montrer ton code Delphi ?

  15. #15
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Au lieu de mettre les données dans une table autant utiliser directement la ou les requetes avec Rave Report.

    Déjà, on n'utilise jamais ExecSQL avec une requete de type Select, mais Open ou Active := True.

    Il vaut mieux utlilser ParamByName que Params[] car il suffit qu'il y est changement de place dans la requete d'un des critères pour que cela ne fonctionne plus.

    Code delphi : 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
     
    With Labodata do
    begin
      With DecVilQuery1 do
      begin
        ParamCheck := True;
        With Parameters do // Seulement si c'est des composants Ado sinon supprimer la ligne
        begin
          ParamByName('Ville'). Value := TVilleLibelle.Value;
          ParamByName('Type').Value   :='I';
          ParamByName('D1').Value     := DTPicker01.Date;
          ParamByName('D2').Value     := DTPicker02.Date;
        end;
        Open;
      end;
     
      With DecVilQuery2 do
      begin
        //************** Query 2 **************
        ParamCheck := True;
        With Parameters do // Seulement si c'est des composants Ado sinon supprimer la ligne
        begin
          ParamByName('Ville'). Value := TVilleLibelle.Value;
          ParamByName('Type').Value   :='I';
          ParamByName('D1').Value     := DTPicker01.Date;
          ParamByName('D2').Value     := DTPicker02.Date;
        end;
        Open;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  16. #16
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Bien vu Rayek pour le paramétrage des Querys mais il faut que je te précise une chose, l'exécution des deux Querys est incluse dans une boucle While qui parcours la table des ville, alors pour chaque ville j'execute les deux requêtes pour faire le décompte et j'insère le résultat dans une table, si t'as quelque chose pour contourner ça je t'en serais reconnaissant

  17. #17
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    tu peux ne faire qu'une requete dans ce style

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT 'NbPatient' as TypeCount,e.Ville,e.Type_med,Count(*) AS Nb1
    FROM "Ent_anal.DB" AS e
    WHERE Date_Sai BETWEEN :D1 AND :D2
    Group by Ville,Type_med
     
    union
     
    SELECT 'NbAnalyse' as TypeCount,e.Ville,e.Type_med,Count(*) AS Nb2
    FROM "Ent_anal.DB" AS e INNER JOIN "Det_anal.DB" AS d ON e.code = d.Code
    WHERE Date_Sai BETWEEN :D3 and :D4
     
    Order by Ville,Type_med

    Cette requete affichera le nombre de patient/Analyse par type de consultation et par villes sur une période allant de D1 à D2.
    D3 et D4 sont identiques respectivement à D1 et D2 mais avec Ado tu ne peux pas avoir plusieurs fois le même paramètres et simplement le remplir avec ParamByName, ca ne fonctionne pas.

    Après avec cette requete tu peux :
    - Soit l'exploiter directement dans un RaveReport
    - Soit (par exemple) utiliser un TJvMemoryTable (Composant gratuit de la JVCL) pour formatter comme tu veux les données puis utiliser RaveReport.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  18. #18
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup Rayek, je vais tester et je te tiendrais informé

    PS : Comment ajouter le paquet JVCL

  19. #19
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par blue_bird Voir le message
    PS : Comment ajouter le paquet JVCL
    Euh .. normalement il y a un installable pour cela.
    Tu installes la JCL, puis après la JVCL, ca doit se faire tout seul.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  20. #20
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Bonjour Rayek
    voilà le résultat que m'a donné ta requête



    il n y a pas un moyen de mettre les résultats NbPatient et NbAnalyse sur une même ligne pour les deux types de médecine.
    excuse-moi si je n'arrête pas de t'ennuyer avec mes demandes et merci beaucoup pour ton aide précieuse

Discussions similaires

  1. [AC-2003] Tester 52 étiquettes avec Requête pour Etat.
    Par Max02 dans le forum IHM
    Réponses: 14
    Dernier message: 12/02/2013, 20h00
  2. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  3. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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