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 :

comment ajouter des données dans deux tableaux?


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    S.H
    S.H est déconnecté
    Membre très actif
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Par défaut comment ajouter des données dans deux tableaux?
    Bonjour

    J'ai deux tableaux, le premier pour étudiants (nom, prenom, DatNaiss)et l'autre pour cours(Math,informatique ,Algorithme... ) et la relation entre les deux est N,N . troisieme tableau Cours(etudiantID,CoursId)
    Pour ajouter un nouvel étudiant, je vérifie s'il existe déjà ou non avec un procedure Ici
    et vérifie est ce que La leçon appartient-elle à cet élève ou non.

    le code ne marche pas :oops:
    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
     
              if (Dmdata.qryAjou.SQL.Text:='SELECT IIF(p.RESULT,'TRUE','FALSE') FROM aa(EdtNom.text,Edtprenom.text,EdtDatNaiss.text) p' ) = 'false' then
                Begin
                 Dmdata.qryAjou.SQL.Text:='INSERT INTO Etudiants (Nom,prenom,datnaiss)'+
                 'VALUES (:Nom,:prenom,:datnaiss)' ;
                 Dmdata.qryAjou.Params.ParamByName('nom').AsString:= edtNom.Text;
                 Dmdata.qryAjou.Params.ParamByName('prenom').AsString:= edtLprenom.Text;
                 Dmdata.qryAjou.params.ParamByName('datnaiss').AsDate:= StrToDate(edtdatnaiss.Text);
                 etudiantID :=  (SELECT GEN_ID( GEN_etudiantID, 0 ) FROM RDB$DATABASE);
                End  ;
     
            NomCour := ('Select NomCour  from Cours where NomCour = :combox.text');
              if ((NomCour =null )then
                Begin
                 Dmdata.qryAjou.SQL.Text:='Insert into Cours (NomCour) values (:NomCour)';
                 Dmdata.qryAjou.Params.ParamByName('NomCour').AsString:= ComboBox1.Text;
                 CoursId :=  (SELECT GEN_ID( GEN_CoursId, 0 ) FROM RDB$DATABASE);
                end;
     
            Dmdata.qryAjou.SQL.Text:='Insert into EtudCours (etudiantID,CoursId) values (:etudiantID,:CoursId)';
    merci

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    C'est quoi ce code ?
    Affectation et Comparaison dans le If
    Aucun Open ni ExecuteSQL

    Si c'est censé être du Delphi, il manque BEAUCOUP de code, faudrait revoir les bases.
    Ce code ce n'est pas qu'il ne fonctionne pas, c'est qu'en Delphi, il ne compile pas

    Pourquoi ne pas tout écrire en SQL, une procédure qui fait le boulot d'ajouter d'un Cours pour un Etudiant, au besoin si l'étudiant n'existe pas cela appelle la fonction d'ajout d'un Etudiant
    En Delphi, il n'y aura que l'appel à la procédure AjoutEtudiantDansCours
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Quant à comparer 'false' à ' FALSE' et 'TRUE', le résultat est connu à l'avance !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    C'est du grand n'importe quoi du Delphi mâtiné de Firebird avec utilisation d'une procédure (aa) Firebird (demandée ici) qui AMHA ne sert à rien avec peut être un soupçon d'ADOQuery si j'en juge les Dmdata.qryAjou.Params.ParamByName utilisés.


    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
     
    Dmdata.qryAjou.SQL.Text:='SELECT COALESCE(ID,-1) FROM Etudiants from ETUDIANT  where nom=:nom and prenom=:prenom and dnaiss=:dnaiss';
    Dmdata.qryAjou.Params.ParamByName('nom').AsString:= edtNom.Text;
    Dmdata.qryAjou.Params.ParamByName('prenom').AsString:= edtLprenom.Text;
    Dmdata.qryAjou.params.ParamByName('datnaiss').AsDate:= StrToDate(edtdatnaiss.Text);
    Dmdata.qryAjou.Open;
    etudiantID :=DmData.qryAjou.FieldByname('ID').AsInteger;
    Dmdata.qryAjou.Close;
    if etudiantID=-1  then
      begin
         // Ajout 
         Dmdata.qryAjou.SQL.Text:='INSERT INTO Etudiants (Nom,prenom,datnaiss) VALUES (:Nom,:prenom,:datnaiss)' ;
         Dmdata.qryAjou.Params.ParamByName('nom').AsString:= edtNom.Text;
         Dmdata.qryAjou.Params.ParamByName('prenom').AsString:= edtLprenom.Text;
         Dmdata.qryAjou.params.ParamByName('datnaiss').AsDate:= StrToDate(edtdatnaiss.Text);
         Dmdata.qryAjou.ExecSQL;
     
         Dmdata.qryAjou.SQL.Text:='SELECT GEN_ID( GEN_etudiantID, 0) ID FROM RDB$DATABASE';
         Dmdata.qryAjou.Open;
         etudiantID :=DmData.qryAjou.FieldByname('ID').AsInteger;
         Dmdata.qryAjou.Close;
      end;
    Cela écrit, ce n'est pas terrible mais je ne suis pas sûr que la syntaxe INSERT INTO Etudiants (Nom,prenom,datnaiss) VALUES (:Nom,:prenom,:datnaiss) RETURNING IDsoit acceptée par ADO

  5. #5
    S.H
    S.H est déconnecté
    Membre très actif
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est quoi ce code ?

    Pourquoi ne pas tout écrire en SQL, une procédure qui fait le boulot d'ajouter d'un Cours pour un Etudiant, au besoin si l'étudiant n'existe pas cela appelle la fonction d'ajout d'un Etudiant
    En Delphi, il n'y aura que l'appel à la procédure AjoutEtudiantDansCours
    Parce que je ne veux pas ajouter une procedure à la base de données
    Je veux ajouter le code dans Delphi.
    N'est-il pas approprié d'ajouter la procédure lors de l'exécution du programme sur le réseau? Mais mon programme sur un Pc

    c'est mieux car si j'ajoute une procédure, nous aurons de nombreux paramètres dans la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create procedure aa(nom varchar(20),prenom varchar(20),dnaiss date),Tel,Adresse,Email,note,............
    Citation Envoyé par tourlourou Voir le message
    Quant à comparer 'false' à ' FALSE' et 'TRUE', le résultat est connu à l'avance !
    Non si l'enregistrement existe, elle retourne 'TRUE' sinon elle retourne 'False'

    Citation Envoyé par SergioMaster Voir le message
    Bonjour,
    Il y a deux tables, la table des étudiants et la table des leçons, et vous avez été dans les deux tables avec la base de données où plus d'une leçon l'a étudiée, et la leçon est enseignée par plus d'un étudiant, où la relation était de type n, n, donc une troisième table a été ajoutée pour faire la relation 1, n
    Non il y a trois tables parce aue la relation entre les deux tables est N,N(Chaque étudiant a une ou plusieurs leçons, et chaque étudiant a un ou plusieurs étudiants)
    À cela, nous avons ajouté le troisième tableau(EtudLecon)
    Regardez cette vidéo


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dmdata.qryAjou.SQL.Text:='SELECT COALESCE(ID,-1) FROM  ETUDIANT  where nom=:nom and prenom=:prenom and dnaiss=:dnaiss' Dmdata.qryAjou.Params.ParamByName('nom').AsString:= edtNom.Text;
    Dmdata.qryAjou.Params.ParamByName('prenom').AsString:= edtLprenom.Text;
    Dmdata.qryAjou.params.ParamByName('datnaiss').AsDate:= StrToDate(edtdatnaiss.Text);
    Dmdata.qryAjou.Open;
    etudiantID :=DmData.qryAjou.FieldByname('ID').AsInteger;
    Dmdata.qryAjou.Close;
    if etudiantID=-1  then
    SELECT COALESCE(ID,-1) Toujours afficher une erreur
    Je l'ai changé en SELECT COALESCE(ID,-1) as Id
    Mais etudiantID renvoie toujours la valeur 0 pas -1 ce qui signifie que la condition ne sera pas remplie

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par S.H Voir le message
    Parce que je ne veux pas ajouter une procedure à la base de données
    Je veux ajouter le code dans Delphi.
    C'est bien ce que je proposai.

    c'est mieux car si j'ajoute une procédure, nous aurons de nombreux paramètres dans la procédure
    Ne pas mélanger procédure Delphi et procedure Firebird pour commencer.


    Citation Envoyé par SergioMaster
    Bonjour,
    Il y a deux tables, la table des étudiants et la table des leçons, et vous avez été dans les deux tables avec la base de données où plus d'une leçon l'a étudiée, et la leçon est enseignée par plus d'un étudiant, où la relation était de type n, n, donc une troisième table a été ajoutée pour faire la relation 1, n
    Je ne crois pas que cela soit de moi, j'utilise hyper rarement ce genre de description des relations


    Je l'ai changé en SELECT COALESCE(ID,-1) as Id
    mea culpa j'avais oublié de mettre l'alias de champ (au fait on peut se passer du as)


    Mais etudiantID renvoie toujours la valeur 0 pas -1 ce qui signifie que la condition ne sera pas remplie
    Non, c'est -1 qui signifie que ce n'est pas rempli, je suis parti du fait qu'ID était une colonne auto-incrémentée (pour Firebird ceci est une SEQUENCE ou GENERATOR)
    Avec Firebird cela abouti à deux déclarations possibles et en général l'utilisation d'un trigger de ce type

    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
    SET TERM ^ ;
    ALTER TRIGGER ETUDIANT_BI ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp BIGINT;
    BEGIN
      IF (NEW.ID IS NULL) THEN
        NEW.ID = GEN_ID(GEN_BANQUES_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_etudiantID, 0);
        if (tmp < new.ID) then
          tmp = GEN_ID(GEN_etudiantID, new.ID-tmp);
      END
    END^
    SET TERM ; ^
    Firebird 3 offre la possibilité d'une colonne GENERATED BY DEFAULT AS IDENTITY (voir release note) mais du coup la valeur ne peut jamais être null et je ne suis pas sûr que l'on puisse obtenir la valeur du générateur.

    Bien sûr il est possible de faire sans trigger mais pour cela il faut modifier la requête INSERT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dmdata.qryAjou.SQL.Text:='INSERT INTO Etudiants (ID,Nom,prenom,datnaiss) VALUES (GEN_ID(GEN_etudiantID,1),:Nom,:prenom,:datnaiss)' ;
    Toutefois le trigger est recommandé, et avec FB3 c'est même plutôt le type IDENTITY qui l'est.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 11/02/2015, 08h29
  2. Réponses: 7
    Dernier message: 21/06/2011, 11h18
  3. comment ajouter des données dans la base
    Par ghost10 dans le forum Linq
    Réponses: 12
    Dernier message: 25/05/2010, 23h08

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