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. #41
    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
    Premièrement tu ne dois appeler QuotedStr (donc en gros doubler les ' et entourer la chaîne avec des ') ne doit être fait que pour des valeurs à placer dans des colonnes qui attendent réellement une chaîne.

    Donc ici, vu que le type attendu est un entier, il n'est pas nécessaire d'utiliser QuotedStr. Tu peux donc écrire directement :

    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.dbChevauxDblClick(Sender: TObject);
    begin
    truc:=dm.tParticiper.fieldbyname('idcheval').asinteger;
    with dm.queryExe do
     begin
       sql.clear;
       sql.add('insert into tparier (idcheval) values (');
       sql.add(dm.tParticiper.fieldbyname('idcheval').asString + ')';
       ExecSQL;
       sql.text:= 'select * from tcourses';
       open;
     end;
    end;
    Merci pour ta réponse.

    Lors du lancement du programme j'ai droit à un message d'erreur 'Conversion de type variant incorrecte'. De plus le champ idcheval est un numérique, le .asstring est bon quand même? Et j'ai essayé avec un .asinteger et la c'est le compilateur qui dit que les types ne sont pas compatibles!

  2. #42
    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
    Si le champ contient bien un entier alors la conversion en string via AsString ne lui pose pas de problème par contre s'il existe des lignes avec la valeur NULL alors cela peut expliquer l'erreur qui t'es remontée, vérifies tes données ou bien que le champ idCheval est bien renseigné au moment de ton insertion.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #43
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with dm.queryExe do
      begin
       sql.clear;
       sql.add('insert into tparier (idcheval) values (');
       sql.add(dm.tParticiper.fieldbyname('idcheval').asstring + ')');
       ExecSQL;
       sql.text:= 'select * from tcourses';
       open;
     end;
    Voila le code qui engendre l'erreur.
    J'ai vérifié le champ dans les deux tables et c'est bien un champ numérique. Ensuite niveau données nul, le programme ne se lance même pas et plante aussi tot. Le code se lance de toutes façons sur un double-clique sur une dbgrid.

    http://djvlad.free.fr/vu.JPG

    Voici l'image pour bien visualiser.

  4. #44
    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
    Je pense que les deux problèmes ne sont pas corrélés car comme tu le dis le bout de code en question ne se lance que sur le double-clic sur la grille. En fait ce bout de code ne génère peut-être même pas d'erreur en fait.

    A priori il faut regarder soit au niveau des OnCreate / OnShow / OnActivate des forms ou DataModule. Soit une donnée bizarroïde c'est insérée dans ta table et lors du chargement le programme n'apprécie pas du tout.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #45
    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 fait quelques tests et notamment mis en suspens l'ouverture puis réouverture une à une pour se rendre compte que le programme se lance si la table thippodrome ne s'ouvre pas. Vraiment étrange... une idée?

    De plus quand je double clique sur ma grille la j'ai droit au message violation de clé...

  6. #46
    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
    Ben c'est pas évident... Essayes de faire un select dessus pour regarder s'il n'y a pas de données bizarre. Si c'est pas ça essayes de supprimer le composant qui ouvre la table et de le remettre. En désespoir de cause, détruit la table et recréé là (par contre tu perdras tes données sur cette table penses à essayer de faire un script sql pour les réinsérer).
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #47
    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 supprimé et recréé c'est ok maintenant, merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with dm.queryExe do
      begin
       sql.clear;
       sql.add('insert into tparier (idtickets, idcheval) values (');
       sql.add(dm.tTickets.fieldbyname('idtickets').asstring +',');
       sql.add(dm.tParticiper.fieldbyname('idcheval').asstring + ')');
       ExecSQL;
       sql.text:= 'select * from tcourses';
       open;
     end;
     dm.tParier.refresh;
    Ca c'est le code refait j'avais oublié de mettre le champ principal et maintenant tout va super. Et j'ai aussi trouvé (tout seul )le problème qui me disait violation de clé en allant modifier les paramètres du mastersource.

    Je vais arrêter les frais pour ce soir merci encore à toi Aka Guymelef pour toutes tes aides précieuses et nombreuses.

    A demain pour de nouvelles aventures.

    ps: gui187 si tu lis ce message c'est bon tu peux arrêter de t'inquiéter tout va bien.

  8. #48
    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 tout le monde,

    Quand je double clique sur un cheval pour l'ajouter a ma table parier il faut que cela tienne compte de l'ordre. En gros le premier cheval double-cliqué sur un pari sera celui qui prendra la valeur 1 dans le champ posArrivee.

    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
    begin
    compteur:=compteur+1;
    if compteur<4 then
    begin
    with dm.queryExe do
      begin
       sql.clear;
       sql.add('insert into tparier (idtickets, posarrivee, idcheval) values (');
       sql.add(dm.tTickets.fieldbyname('idtickets').asstring +',');
       sql.add(inttostr(compteur));
     
       sql.add(dm.tParticiper.fieldbyname('idcheval').asstring + ')');
       ExecSQL;
       sql.text:= 'select * from tcourses';
       open;
     end;
     dm.tParier.refresh;
    end
    else showmessage ('Déja 3 chevaux');
    end;
    J'ai donc pensé à un truc de ce style mais je sais que le compteur est une très mauvaise idée.

    Y-a-t'il un moyen de regarder dans la dbgrid liée à la table tparier s'il y déjà trois enregistrements sur un ticket. Et comment faire pour que quand je double-clique une fois ça prenne la valeur 1 puis 2 pour le deuxième double-clique et trois pour le troisième.

    Du style IF dans la dbgrid il y a aucun enregistrement alors posarrivee prend la valeur 1 etc jusqu'à 3 et une fois à trois alors on met un showmessage.

    Merci de me répondre.

  9. #49
    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 peux rempacer ton compteur par une instruction du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbcheval:= tParrier.recordcount
    suivi d'un intruction case en fonction du nombre d'enregistrement renvoyer

    A+++

  10. #50
    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
    bonjour,

    tu peux rempacer ton compteur par une instruction du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbcheval:= tParrier.recordcount
    suivi d'un intruction case en fonction du nombre d'enregistrement renvoyer

    A+++
    Ok merci ca fonctionne nickel pour le compteur mais comment intégrer dans mon sql la variable compteur qui est en integer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sql.add(inttostr(compteur));
    Quelque chose de ce style?

  11. #51
    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
    oui mais il ne faut pas oublier de l'augmenter de 1.

    Sinon tu n'as pas besoin de la convertir en string puisque ton champs est un numerique, si tu veux eviter une 'incompatibilié de type' lors de la mise à jour.

    ca eviter les erreurs
    A+++

  12. #52
    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
    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
    var compteur:integer;
    begin
    compteur:=dm.tParier.recordcount +1;
    //showmessage(inttostr(compteur));
     
    with dm.queryExe do
      begin
       sql.clear;
       sql.add('insert into tparier (idtickets, posarrivee, idcheval) values (');
       sql.add(dm.tTickets.fieldbyname('idtickets').asstring +',');
       sql.add(quotedstr(inttostr(compteur))) ;
       sql.add(dm.tParticiper.fieldbyname('idcheval').asstring + ')');
       ExecSQL;
       sql.text:= 'select * from tcourses';
       open;
     end;
    Si je vire le inttostr ça me met type incompatible et si je le met et que je veux ajouter un cheval j'ai droit à utilisation incorrecte du mot clé. En gros comment inclure une variable numérique dans un insert sql?

    Et autre question comment éviter d'ajouter deux fois un même enregistrement qui provoque des erreurs.Exemple j'ajoute le cheval 3 et je l'ajoute à nouveau juste derrière ça crée une erreur. Comment interdire ça?

    Merci de me répondre.

  13. #53
    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
    Comme je te l'ai déjà dit plus haut, seul les colonnes de type chaîne dans ta base de donnée ont besoin d'être protégées avec QuotedStr. Pour les autres comme les entiers mettre simplement la valeur suffit. Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var compteur:integer;
    begin
    compteur:=dm.tParier.recordcount +1;
    //showmessage(inttostr(compteur));
     
    with dm.queryExe do
      begin
       sql.clear;
       sql.add('insert into tparier (idtickets, posarrivee, idcheval) values (');
       sql.add(dm.tTickets.fieldbyname('idtickets').asstring + ',' + inttostr(compteur) + ',' + dm.tParticiper.fieldbyname('idcheval').asstring + ')' );
       ExecSQL;
       sql.text:= 'select * from tcourses';
       open;
     end;
    Pour ce qui est de vérifier l'erreur ben pas de miracle c'est à toi d'implémenter le contrôle en faisant un select pour vérifier que l'enregistrement que tu essayes d'insérer existe déjà.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  14. #54
    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 pour ta réponse

    J'ai essayé ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    With dm.queryExe do
     begin
      sql.clear;
      sql.text:= ( 'select idcheval from tparier where idcheval = ' +dm.tparticiper.fieldbyname('idcheval').asstring);
    execsql;
    open;
    verif:=sql.text;
    end;
    showmessage (verif);
    Bon j'ai essayé ça mais ça ne fonctionne pas. L'affichage du showmessage me donne 'select idcheval from tparier where idcheval = 2' si ce double clique sur un idcheval étant égal à 2. Comment récupérer la réponse de la requête et non la requète elle même?

  15. #55
    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
    la procédure pour moi serai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    With dm.queryExe do
     begin
      sql.clear;
      sql.text:= ( 'select idcheval from tparier where idcheval = ' +dm.tparticiper.fieldbyname('idcheval').asstring + 'and idticket = '+dm.tTickets.fieldbyName(idticket).assstring);
    execsql;
    open;
    end;
    de facon a verifier que ce ticket existe ou pas.

    pour recuperer la valeur, si la requete renvoie une reponse c'est que l'enregistrement existe deja.
    Donc j'ajouterai un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if dm.queryExe.recordcount>=1 then 
    ShowMessage('Ce cheval est deja joué') else // code de creation de l'enregistrement
    c comme ca que je ferai a toi de voir...

    A+++

  16. #56
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Juste une remarque. Pourquoi ne pas utiliser les requêtes paramétrés pour simplifier les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With dm.queryExe do
     begin
      //sql.clear; pas besoin de clear si tu utilise SQl.text
      sql.text:= 'select idcheval from tparier where idcheval = :ID_CHEVAL and idticket = :ID_TICKET';
      ParamByName('ID_CHEVAL').AsInteger := dm.tparticiper.fieldbyname('idcheval').AsInteger;
      ParamByName('ID_TICKET').AsInteger := dm.tTickets.fieldbyName('idticket').AsInteger;
      //execsql; Open suffira pour une clause select.
      open;
    end;
    Ceci évitera pas mal d'erreur surtout au niveau des champs de type date.
    Et surtout facilitera la lecture du code.

    A+
    On progresse .....

  17. #57
    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 tout le monde.

    Impeccable gui187 comme d'habitude. Merci.

    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
    if (messagedlg('Etes-vous sur de vouloir supprimer ce pari?',mtconfirmation,[mbok,mbcancel],0)=mrok) then
     begin
     with dm.queryexe do
       begin
        sql.clear;
        sql.add('delete from ttickets ');
        SQL.Add('where idTickets='+quotedstr(dbticket.text));
        ExecSQL;
        close;
       end;
      Dm.tTickets.Refresh;
     with dm.queryexe do
       begin
        sql.clear;
        sql.add('delete from tparier ');
        SQL.Add('where idTickets='+quotedstr(dbticket.text));;
        ExecSQL;
        close;
       end;
    J'ai tenté ca derrière le bouton 'supprimer pari' pour supprimer un ticket (fonctionne) et supprimer les informations relatives au ticket dans ma table tparier. Quelle est mon erreur?

    Andry merci pour ton aide mais je suis novice en base de données et j'ai encore très peu de connaissances et d'automatismes sur la sécurisation.
    Mais j'allais justement poser une question à propos de champs type date et heure. J'ai un dbedit relié à un champ Alphanumérique qui doit ensuite renvoyer ses informations dans un champ qui lui est de type date. Comment faire pour que lors de la saisie ou du premier enregistrement les données entrées soient obligatoirement du type date?

    Merci de me répondre.

  18. #58
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Ce n'est pas si compliqué que ça.
    Concernant le dbEdit, je ne te suis pas. Pourquoi affecter un champs alphanumérique à une champs Date.
    A mon avis, c'est l'inverse qui doit être.
    A+
    On progresse .....

  19. #59
    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 suis d'accord avec toi mais le professeur nous a donné un dictionnaire des données à respecter à la lettre. Hors le champ datecourse de la table tcourses ou sera enregistré la date est un alphanumérique. Et le champ dateticket ou sera enregistré la date de la course auquel le ticket est lié est un champ de type date. Donc je ne peux pas faire comme je veux pour les champs sinon crois moi bien que l'alphanumérique arait régné en maître.

    Donc si t'as une explication à me donner, je t'en serais reconaissant.

  20. #60
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Il faut casté via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FieldByName('datecourse').AsString := FieldByName('dateticket').AsString;
    lors de l'affectation;

    A+
    On progresse .....

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

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, 09h41
  2. Besoin d'aide sur les fonction d'interbase
    Par BOUBOU81 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/11/2004, 11h00
  3. besoin d'aide sur les ORB
    Par floorfille dans le forum CORBA
    Réponses: 4
    Dernier message: 24/08/2004, 16h43
  4. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 11h16
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 13h19

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