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ésultat bizarre d'une requête


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut Résultat bizarre d'une requête
    bonjour,

    je travail sous delphi 7 avec la BDE je mets cette requette dans la query :

    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
    29
    30
    31
    32
    33
    34
    select nom,prenom,nbr_emprunt,
           max(date_restitution-date_emprunt) Duree_Max,
    	   min(date_restitution-date_emprunt) Duree_Min,
    	   avg(date_restitution-date_emprunt)  Duree_Avg
    from personne P,emprunt E,view1 V
    where ( (P.code_personne = E.code_personne) and (P.code_personne = V.code_personne) )
    group by P.code_personne
     
     union
     
    select nom,prenom,0,0,0,0
    from personne P,membre M
    where (( P.Code_personne = M.Code_personne) and P.Code_Personne Not In (Select Code_Personne 
                                  From   Emprunt
     							  )
           )
     
      union
     
    select nom,prenom,0,  
    	   max(date_restitution-date_emprunt) Duree_Max,
    	   min(date_restitution-date_emprunt) Duree_Min,
    	   avg(date_restitution-date_emprunt)  Duree_Avg
    from personne P,membre M,emprunt E
    where ( (P.code_personne = E.code_personne) 
          and 
    	  (P.code_personne not in (
             select code_personne 
    		 from emprunt 
             where ( date_restitution is null )
    )
    ) )
    group by P.code_personne	    
    	   ;


    sachant que j'ai créé la vue suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create view view1
        as 
    	  select P.code_personne,count(*) nbr_emprunt 
    	  from personne P,emprunt E
          where ((P.code_personne=E.code_personne) And (date_restitution is null))	  
          group by P.code_personne;


    et j'affiche le résultat dans une DbGrid , et je j'ai un résultat bizarre, dans les colonne nom et prenom les valaure affichés sont toutes à : (memo)
    je n'arrive pas à comprendre pourquoi il m'affiche ceci , sachant que sous mysql serveur les nom et prenom s'affichent correctement..

    est ce que quelqu'un peut m'aider SVP

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 106
    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 106
    Points : 41 220
    Points
    41 220
    Billets dans le blog
    63
    Par défaut
    peut-être en étant plus explicite avec les champs recupérés , ce qui enttre-nous est une bonne habitude à prendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select P.nom,P.prenom,V.nbr_emprunt,
    etc ....
    where ( (P.code_personne = E.code_personne) and (P.code_personne = V.code_personne) )
    group by P.code_personne

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    j'ai fais ce que vous avez demandé et toujours le meme resultat tous les champs nom et prenom sont à (memo),(memo)...

    deja d'ou viens ce "memo" !!!! et qu'est ce que ça veut dire ?

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Question bête Tes champs Nom et Prenom sont bien de type CHAR ou VARCHAR ?

    @+

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    elle n'est pas bete ils sont de type varchar , on m'a deja dis qu'avec char normalement j'aurais pas ce problème mais je ne suis pas convaincu , quelqu'un peut m'expliquer la difference ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    j'ajoute une remarque , chaque requete fonctionne correctement toute seule, donc je me suis dis que ça peut venir de l'union.. mais j'ai deja utilisé l'union dans d'autres requetes et ça marche bien.

    donc je suis un peu perdu

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Ceci est normal. Le dbgrid ne sait pas afficher un champ memo. Pour afficher un champ memo tu as une bande répétitive DBCtrlGrid sur laquelle tu places un DBMemo
    Ceci dit tu peux t'arranger pour que le resultat de ta requête ne manipule que des champs texte.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Ceci est normal. Le dbgrid ne sait pas afficher un champ memo. Pour afficher un champ memo tu as une bande répétitive DBCtrlGrid sur laquelle tu places un DBMemo
    Ceci dit tu peux t'arranger pour que le resultat de ta requête ne manipule que des champs texte.
    non tu n'as pas compris, je vais vou illustrer le resultat par un exemple .
    au lieu de m'afficher ceci par exemple ( j'affiche que les colonnes concernés par le problème )

    Nom Prenom

    jean paul
    lalonde nina
    nom3 prenom3 ...
    il m'affiche ceci :

    Nom Prenom

    (MEMO) (MEMO)
    (MEMO) (MEMO)
    (MEMO) (MEMO) ...
    et j'ai pas compris ou esr ce qu'il est aller chercher ce ( MEMO ) ??!!!!!

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    mtn je crois que je sais d'ou viens l'erreur mais le pb c'est pourquoi


    j'ai fais cette requette pour tester l'union de 2 attributs de type varchar


    select P.nom,P.prenom
    from personne P,membre M
    where ( P.code_personne=M.code_personne )

    union

    select P.nom,P.prenom
    from joue_dans J,personne P
    where ( P.code_personne=J.code_personne )

    ;
    j'ai eu le meme problème les colonnes nom et prenom sont à ( memo )

    quelqu'un pour me dire pourquoi et comment remedier à ce problème ?

  10. #10
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    je vais dire une bêtise
    l'union de deux table génère une résulta de donnée sans type, résulta de 2 table différent (à peut prés)
    je crois pour remédier à sa, de crée une dataset en mode conception qui contient cette requête, et de crée de nouveau champs de type string résultat de ces champs (bricolage ), si c'est pas vraie, alors oublie ce que j'ai dis

  11. #11
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Ceci est normal. Le dbgrid ne sait pas afficher un champ memo. .
    +1
    Les blob style mémo sont multilignes, or un DBGrid affiche sur une seule ligne...
    Essaye de placer un TDBMemo lié avec ton TQuery quelque part dans ta fenetre, et tu verras que normalement tes noms et prénoms se trouveront dedans, sur la ligne courante du TDBGrid.

  12. #12
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    pour tictacto:
    Citation Envoyé par yesil08 Voir le message
    j'ajoute une remarque , chaque requete fonctionne correctement toute seule, donc je me suis dis que ça peut venir de l'union.. mais j'ai deja utilisé l'union dans d'autres requetes et ça marche bien.

    donc je suis un peu perdu

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 106
    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 106
    Points : 41 220
    Points
    41 220
    Billets dans le blog
    63
    Par défaut
    Ah !!! C'etait des VARCHAR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    dans ce cas une seule solution un cast sur la premiere union .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT  CAST(P.nom AS CHAR(30)),CAST(P.prenom AS CHAR(30)) ......

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 29
    Points
    29
    Par défaut
    ca n'a pas marché avec les

    SELECT CAST(P.nom AS CHAR(30)),CAST(P.prenom AS CHAR(30)) ......
    en tous cas j'ai fini par revoir la déclaration de mes tables et j'ai mis du char au lieu de varchar et puis c'est tout et ça marche bien maintenant .

    merci

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 106
    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 106
    Points : 41 220
    Points
    41 220
    Billets dans le blog
    63
    Par défaut
    je voulais dire sur le premier SELECT pas la première UNION , il était tôt et ma syntaxe n'était pas testée (c'etait juste l'idée : forcer le premier ou les SELECT a prendre des CHAR en remplacement des VARCHAR)

  16. #16
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    En complément d'information lorsque le BDE affiche
    il indique qu'il a perçu le champ comme étant un BLOB (Binary Large Object) qui peut être tout sauf du texte sur une seule ligne ou un nombre. Tu as résolu le problème en changeant le type du champ. Si tu utilises un objet TQuery pour stocker le contenu de ta requête tu aurais pu forcer le type du champ résultant comme suit :
    - Placer la requête dans le composant,
    - Mettre Active à true en mode conception,
    - Clic droit sur l'objet TQuery
    - Choisir "Ajouter tous les champs"
    - Modifier le type du ou des champs concernés pour les considérer comme des "asString"

  17. #17
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Si tu utilises un objet TQuery pour stocker le contenu de ta requête tu aurais pu forcer le type du champ résultant comme suit :
    - Placer la requête dans le composant,
    - Mettre Active à true en mode conception,
    - Clic droit sur l'objet TQuery
    - Choisir "Ajouter tous les champs"
    - Modifiier le type du ou des champs concernés pour les considérer comme des "asString"
    Tu es sûr que ce ça marche ça ?
    Parce que pour moi, quand on ouvre un DataSet et que ce dernier doit lier ses TFields à la source de donnée, il vérifie que la définition des TField correspond bien à la source de données. Si les types ne correspondent pas, si un champ a changé de taille dans la base... c'est une exception à l'exécution.

  18. #18
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Tu es sûr que ce ça marche ça ?
    Ci joint extrait de la dfm en mode texte
    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
      object Table1: TTable
        OnCalcFields = Table1CalcFields
        TableName = 'T1.DB'
        Left = 56
        Top = 40
        object Table1C1: TSmallintField
          FieldName = 'C1'
        end
        object Table1C2a: TStringField
          FieldKind = fkCalculated
          FieldName = 'C2a'
          Calculated = True
        end
        object Table1C2: TMemoField
          FieldName = 'C2'
          Visible = False
          BlobType = ftMemo
          Size = 1
        end
      end
    Et l'événement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
      Table1C2a.Value := Table1C2.AsString ;
    end;
    Ce qui revient à faire du transtypage au niveau du frontal.

  19. #19
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Effectivement, comme ça ça doit le faire. Mais ton post précédent méritait quelques explications supplémentaires car ce n'est pas ce que tu avais écrit.

    En fait, tu ajoutes un champ calculé de type string qui retourne le memo.

    Moi, j'allais plutôt proposer de coder l'événement GetText du TMemoField pour renvoyer la valeur AsString du memo.

    Car en fait, ce n'est pas la DBGrid qui ne sait pas afficher les memo, c'est le composant TBlobField (et donc TMemoField qui en dérive) qui renvoit spécifiquement TField.AsString (plus exactement inherited GetText) plutôt que TMemoField.AsString sur le GetText du champ. Et comme la grille appelle GetText pour formater le texte à afficher...

  20. #20
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Franck Soriano à écrit
    ton post précédent méritait quelques explications supplémentaires car ce n'est pas ce que tu avais écrit
    J'avais en effet rédigé un peu vite ma réponse. Il faudrait en effet surcharger certains objets pour arriver au résultat Modifier par exemple la propriété DisplayText en implémentant la procedure 'OriginalSetText' et en l'interceptant dans l'événement DBGrid1DrawDataCell sur un test

Discussions similaires

  1. [MySQL] Résultat absent après une requête
    Par flash_math dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/11/2007, 18h21
  2. [MySQL] Résultat bizarre pour une requête
    Par masseur dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/05/2007, 11h46
  3. [Requête]Résultat capricieux d'une requête
    Par Heureux-oli dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/04/2007, 09h36
  4. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05
  5. Affecter résultat SQL d'une requête à une variable
    Par bozolozo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/01/2005, 17h37

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