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 d'aide sur les relations entre mes tables


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut Projet Hippodrome, besoin d'aide.
    Bonjour,

    Je dois créer un programme qui gère des paris sportifs pour mon examen. Je réussi avec difficulté à établir une relation master/slave ( d'ailleurs si quelqu'un à un cours sur le net qui parle de ça je lui serai reconnaissant de me le communiquer) et me voila devant un problème. J'ai mis ma table tcourse comme maître de ma table tparticiper (table secondaire). Donc d'abord je sélectionne une course ensuite je sélectionne les chevaux qui participeront à la course. Cependant pour la sélection des chevaux cela doit se faire par la table tparticiper qui a comme clé étrangère et primaire idcheval. J'ai donc lié mon dblookupcombobox à la table tparticiper et au champ idcheval (clé étrangère) mais comment faire pour que le dblookup aille chercher les informations dans la table tcheval? L'idcheval fait le lien entre les deux tables mais ce lien doit me servir à afficher le champ nomcheval dans la dblookup.

    Merci d'avance de me répondre.

    Edit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure Tgestionparis.DBNavigator1Click(Sender: TObject;
      Button: TNavigateBtn);
    begin
    if button = nbpost then
    dm.tparticiper.FieldByName('NomCheval').asstring:= dm.QueryChevaux.fieldbyname('NomCheval').asstring;
    J'ai changé de méthode. J'ai lié mon dblookupcombobox à la table tchevaux pour commencer. Puis j'ai essayé avec ce code mais ça me dit que je ne suis pas en monde insertion ou édition.Je précise également que le champ 'NomCheval' de la table participer est un champ calculé comme demandé dans l'exercice.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Si c'est pour un examen je te suggère, de faire en premier, une structure correcte pour ta base de données.

    créé une table TCourse, une table TCheval et une table TParticiper. Pour la table TParticiper, il faut mettre l'id de la course + l'id du cheval comme clé primaire.

    pas en monde insertion ou édition
    j'ai déjà vu ce message d'erreur mais c'etait pour un autre genre d'utilisation. Quel est le message d'erreur exact ?

  3. #3
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    J'ai essayé ça également mais ça ne fonctionne pas non plus

    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
     
    begin
    if button = nbpost then
    begin
    with dm.QueryExe do
     begin
       sql.clear;
       sql.add('insert into tparticiper (nomcheval) values (');
       SQL.add(quotedstr(dblookupcombobox2.text)+')');
       ExecSQL;
       sql.text:= 'select * from tparier';
       open;
      end;
    end;
    end;
    LE message pour celui la c'est nom de champ incorrect. Pourtant le champ semble bon mais c'est un champ calculé.

  4. #4
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par popo Voir le message
    Si c'est pour un examen je te suggère, de faire en premier, une structure correcte pour ta base de données.

    créé une table TCourse, une table TCheval et une table TParticiper. Pour la table TParticiper, il faut mettre l'id de la course + l'id du cheval comme clé primaire.



    j'ai déjà vu ce message d'erreur mais c'etait pour un autre genre d'utilisation. Quel est le message d'erreur exact ?
    La structure est correcte, elle respecte à la lettre le dictionnaire des données que le prof nous a fourni.
    Quant au message d'erreur exact c'était du style 'Impossible car pas en mode édition ou insertion'. Mais je pense que c'est parce que ma méthode n'était pas bonne. La deuxième m'a l'air plus sensée mais ça coince toujours (voir post ci-dessus)

    Edit http://djvlad.free.fr/Vision%20du%20programme.JPG Voici un screen du programme peut être que ça pourra aider à y voir plus clair.

  5. #5
    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
    Bonjour,

    Quand on utilise un TDBLookupComboBox en fait il y a deux notions à prendre en compte niveau source de données.

    Il y a d'un côté la source qui va permettre de générer la liste qui va appaître et d'un autre côté la cible qui va recevoir la valeur sélectionnée par l'utilisateur dans la liste.

    Ce qui implique d'avoir deux DataSet (+DataSource) à disposition.

    Côté Source :

    Un DataSet qui contient la liste des valeurs possibles que l'utilisateur va pouvoir sélectionner dans la liste déroulante. Voici les propriétés du TDBLookUpComboBox qui vont utiliser ce DataSet :

    • ListSource : affecter le DataSource lié au DataSet source
    • ListField : contient la liste des champs du DataSet source à afficher à l'utilisateur (séparé par des ";")
    • KeyField : le nom du champ dans le DataSet source qui sera utilisé pour faire le lien entre les DataSets source et cible (généralement clé primaire/étrangère)
    • ListFieldIndex (optionnel) : l'index du champ dans la liste ListField qui est utilisée pour la recherche incrémentale de l'utilisateur


    Côté Cible :

    Un DataSet qui contient le ou les enregistrements que l'on souhaite modifier. Voici les propriétés du TDBLookUpComboBox qui vont utiliser ce DataSet :

    • DataSource : affecter le DataSource lié au DataSet cible
    • DataField : le champ dans le DataSet cible qui va recevoir la valeur sélectionnée (provenant du champ spécifié dans KeyField) par l'utilisateur
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  6. #6
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Je ne connais pas le composant dataset. C'est un objet qui n'a pas été vu en cours et je devrais également expliquer les choix que j'ai pu faire pour ce programme.
    Pourrais tu m'indiquer ou se trouve l'objet dataset dans delphi s'il-te-plait?

    J'ai mis mon programme a disposition si vous souhaitez avoir une meilleure vision de ce qu'il y à lieu de faire afin de m'éclairer peut-être plus précisément.
    Fichiers attachés Fichiers attachés

  7. #7
    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
    DataSet est un terme générique si on peut dire il faut le comprendre au premier degrés c'est à dire "jeu d'enregistrement" soit un composant capable de contenir des jeux d'enregistrement.

    Et cela plusieurs composants en sont capable même s'ils ne portent pas le nom DataSet (bien que si on regarde l'héritage on finira par trouver un TDataSet ou TCustomDataSet parmi les parents ). Pour faire plus simple tout composant que tu peux ajouter à la propriété DataSet de ton DataSource est un DataSet

    Donc ici des TTable ou TQuery sont les "DataSets" dont je parle dans mon explications.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  8. #8
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    DataSet est un terme générique si on peut dire il faut le comprendre au premier degrés c'est à dire "jeu d'enregistrement" soit un composant capable de contenir des jeux d'enregistrement.

    Et cela plusieurs composants en sont capable même s'ils ne portent pas le nom DataSet (bien que si on regarde l'héritage on finira par trouver un TDataSet ou TCustomDataSet parmi les parents ). Pour faire plus simple tout composant que tu peux ajouter à la propriété DataSet de ton DataSource est un DataSet

    Donc ici des TTable ou TQuery sont les "DataSets" dont je parle dans mon explications.
    Je suis un peu perdu voir complètement dans les explications. Ca fait quelques heures que je n'avance plus dans ce programme et je dois bien avouer que ça commence à m'obséder.
    Quelqu'un peut-il jeter un œil à mon programme et notamment au code derrière le composant dblookupcombobox2 et me dire ou sont mes erreurs? Car je crois que la solution doit être dans ces eaux-la.

  9. #9
    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
    Bon alors on va la refaire sous forme de question en corrigeant (je l'espère) ton programme :

    Qu'est-ce que je veux afficher à l'utilisateur dans la liste déroulante ?

    La liste des chevaux dont les enregistrements (DataSet) se trouvent dans QueryChevaux (et par extension dans son DataSource dsChevaux).
    Jusque là le paramétrage me semble correct.

    Quel est est le jeu d'enregistrement dans lequel le DBLookupComboBox doit enregistré la valeur ?

    Ben là je suis pas trop sûr parce que je ne suis pas dans ton programme mais je vais intuiter qu'il s'agit du même jeu que celui affiché dans la grille au-dessus du DBLookupComboBox soit la TTable tparticiper (et par extension son DataSource dsParticiper).
    Donc dans le DBLookupComboBox je renseigne dans la propriété DataSource "dsParticiper" et comme nom du champ à modifier je vais dire que c'est la clé étrangère vers le cheval soit "IdCheval".

    A partir de là cela devrait mieux fonctionner.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  10. #10
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Je ne savais pas que le datasource d'une liste servait à ça. Merci ça a été très instructif, j'aurais probablement plusieurs questions concernant le programme par après mais merci beaucoup pour ton aide ainsi qu'aux autres.

  11. #11
    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
    En fait si tu regardes tout les composants de type DB ils ont tout une propriété DataSource et une propriété DataField (ou Field) cela leur permet d'être connecté directement au jeu d'enregistrement et de proposer d'une part de visualiser la valeur du champ définit dans DataField de l'enregistrement en cours et d'autres part de proposer à l'utilisateur de modifier la valeur de l'enregistrement en changeant directement la valeur dans la zone de saisie.

    N'hésites pas si tu as d'autres problèmes à résoudre ou de points à éclaircir. Note également que la section tutoriels de DVP est également abondant dans ce domaine
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  12. #12
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Voici le problème qui me hante depuis hier matin.

    J'ai mis ma table tCourses comme maitre de ma table ttickets pour que quand je crée un ticket de pari il soit lié à une course. Pour ça j'ai mis la table tcourses dans la propriété mastersource de ma table ttickets et j 'ai mis idcourses comme champ maître du champ idtickets. Jusque la je pense que c'est correct.

    Voici le code que j'ai mis derrière le bouton qui sert à créer un nouveau pari.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure Tgestionparis.btpariClick(Sender: TObject);
    begin
    with dm.queryExe do
     begin
       sql.clear;
       sql.add('insert into ttickets (dateticket, idcourse) values (');
       SQL.Add(quotedstr(dbdatecourse.text)+',');
       SQL.Add(quotedstr(dblookupcombobox1.text)+')');
       ExecSQL;
       sql.text:= 'select * from tcourses';
       open;
     end;
    end;
    Ce code doit me permettre de récupérer la date de la course ainsi que le numéro de la course auquel le ticket doit être lié. Cependant quand je lance l'application il m'indique que le champ idcourse n'existe pas (c'est un champ secondaire créé sur idtickets qui lui est un champ auto-incrémenté)

    Quelles sont mes erreurs dans ce code et y-a-t'il une meilleure façon de faire?

    Merci de bien vouloir me répondre.

  13. #13
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Je n'avance plus dans mon programme depuis 3 jours maintenant car ce problème me bouffe la noix de coco. J'ai vraiment besoin de votre aide pour le résoudre, quelqu'un pourrait-il y prêter attention s'il-vous-plait?

  14. #14
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    J'ai essayé de changer le champ secondaire 'idcourse' en champ primaire et mettre le même code derrière le bouton. Et quand je sélectionne une course puis clique par exemple cinq fois sur le bouton nouveau pari, il va m'ajouter un pari sur la première course puis un pari sur la deuxième etc... au lieu d'ajouter cinq paris à la première course.

    Merci de bien vouloir m'aider sur ce problème que je ne parviens absolument pas à résoudre depuis 3-4 jours maintenant.

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Points : 24
    Points
    24
    Par défaut
    bonjour,

    tu avait la bonne demarche concernant la table tticket, il faut que tu garde le champs idticket comme clé primaire.
    Pour la création de nouveau tickets de pari sur une course, il faut mettre id course de tcourse comme champ maitre de idcourse de la table idticket ca permet la filtration des enregistrements lors de l'affichage dans la dbGrid.

    Pour l'ajout d'enregistrement il faut impérativement respecter la casse de nom de champs car meme si delphi lui ne fait pas la différence, Paradox lui la fait. surtout en langage SQL.

    bonne chance....

    A++++

  16. #16
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par gui187 Voir le message

    Pour l'ajout d'enregistrement il faut impérativement respecter la casse de nom de champs car meme si delphi lui ne fait pas la différence, Paradox lui la fait. surtout en langage SQL.

    bonne chance....

    A++++
    Merci de me répondre mais je n'ai pas compris ce que tu voulais dire par "la casse de nom de champ". Pourrais tu être plus spécifique. Pour ce qui est du mastersource, masterfield etc j'ai vérifié tes informations et c'était correctement paramétré. Mais pour le code j'ai vraiment du mal à voir ce qui cloche. Dans ma table ttickets j'ai le champ idticket qui est auto-incrémenté et qui est la clé primaire. Dateticket qui lui est un champ date et enfin idcourse qui est un champ secondaire et une clé étrangère provenant de la table tcourses. Comment dois je faire mon code pour que cela fonctionne?

  17. #17
    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
    La casse d'un texte c'est la notion majuscule/minuscule. Soit deux mots "ToTo" et "toto", une fonction de comparaison (ou Application ou Langage) dite insensible à la casse dira que les mots sont identiques, à l'inverse une fonction de comparaison (ou Application ou Langage) dite sensible à la casse dira que les mots sont différents.

    Paraox est donc sensible à la casse là où Delphi ne l'est pas.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  18. #18
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Salut,

    Bon c'est pas la casse et j'ai aucune solution qui se profile à l'horizon. L'échéance approche et ces 4-5 jours de blocage sur ce même problème commencent sérieusement à m'inquiéter. Si quelqu'un veut bien jeter un œil à mon programme cela me soulagerait beaucoup.

    Merci d'avance.

    ps: J'ai viré l'alias pour plus de facilité.
    Fichiers attachés Fichiers attachés

  19. #19
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    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 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    le monsieur te dit de respecter la casse de tas expression sql
    par exemple ta table tCourses.db

    dans ton sql il te faut mettre tCourses

    de plus j'aurai été toi je me serais créer des objet me permettant de manipuler mais tables

    Genre
    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
     
     
    objTblCourse = Class
      ...
      Procedure Add(adtCourse : TDatetimes;aHourCourse,IdHippo : integer);
      Procedure Delete(IdCourse : integer);
      Function Valide(adtCourse : TDatetimes;aHourCourse,IdHippo : integer);
      ... 
    end;
    ...
    Procedure objTblCourse.Add(adtCourse : TDatetimes;aHourCourse,IdHippo : integer);
    var
      st 
    begin
      if Valide(adtCourse,aHourCourse,IdHippo) Then
      begin
       with dm.queryExe do
     begin
       sql.clear;
       st := format('insert into tCourses (datecourse, heurecourse, idhippodrome)values ("%s",%d,%d)', [formatedatetime('dd/mm/yyyy',adtCourse),aHourCourse,IdHippo]);
        SQL.Add(st);
        ExecSQL;
      end
      else 
       raize ....
    end;
    afin de bien dissocier les donnée de l'affichage

    @+ phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  20. #20
    Membre à l'essai Avatar de Jenojen
    Inscrit en
    Janvier 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 97
    Points : 17
    Points
    17
    Par défaut
    Merci de me répondre, je sais ajouter des courses sans problèmes. C'est ajouter des tickets à une course qui foire complètement et je ne suis pas encore initié à ta façon de faire et je ne la comprends pas très bien. Normalement dans mon cours ça doit se faire comme ma méthode mais je vois pas du tout pourquoi ça ne fonctionne pas. Je suis quasi sur que ça se joue à un détail mais je ne sais absolument pas quoi faire et plus le temps passe plus je déprime devant mon programme. La deadline approche et j'ai vraiment besoin que quelqu'un jette un oeil directement sur mon programme, quelqu'un qui s'y connait ça ne lui prend même pas 5minutes.

    S'il-vous-plait, aidez moi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 6 12345 ... DernièreDernière

Discussions similaires

  1. [Débutant] besoin d'aide sur les web services
    Par Diangelita dans le forum Services Web
    Réponses: 3
    Dernier message: 20/01/2006, 08h41
  2. Besoin d'aide sur les fonction d'interbase
    Par BOUBOU81 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/11/2004, 10h00
  3. besoin d'aide sur les ORB
    Par floorfille dans le forum CORBA
    Réponses: 4
    Dernier message: 24/08/2004, 15h43
  4. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

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