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

Delphi Discussion :

Utilisation d'un DBAdvGrid pour la saisie des données


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut Utilisation d'un DBAdvGrid pour la saisie des données
    salut
    dans ma base de donnes (firebird 2.5) j'ai les quatre tables suivantes :
    Nom : Sans titre1.png
Affichages : 659
Taille : 13,8 Ko
    voila le code de création des table:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    CREATE TABLE ETUDIANTES (
      N_INSCRIPTION  INTEGER NOT NULL,
      NOM            VARCHAR(20),
      PRENOM         VARCHAR(20) CHARACTER SET NONE,
      /* Keys */
      CONSTRAINT ETUDIANTES_INDEX01
        PRIMARY KEY (N_INSCRIPTION)
    );
     
    CREATE TABLE MODULES (
      CODE_MODULE  VARCHAR(20) NOT NULL,
      NOM_MODULE   VARCHAR(20),
      /* Keys */
      CONSTRAINT MODULES_INDEX01
        PRIMARY KEY (CODE_MODULE)
    );
    CREATE TABLE SEMESTRES (
      CODE_SEMESTRE  VARCHAR(2) NOT NULL,
      /* Keys */
      CONSTRAINT SEMESTRES_INDEX01
        PRIMARY KEY (CODE_SEMESTRE)
    );
     
    CREATE TABLE RESULTATS (
      N_INSCRIPTION  INTEGER NOT NULL,
      CODE_MODULE    VARCHAR(20) NOT NULL,
      CODE_SEMESTRE  VARCHAR(2) NOT NULL,
      CONTROLE1      FLOAT,
      CONTROLE2      FLOAT,
      EXAMEN         FLOAT,
      OBSRVATION     VARCHAR(50),
      /* Keys */
      CONSTRAINT RESULTATS_INDEX01
        PRIMARY KEY (N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE),
      /* Foreign keys */
      CONSTRAINT RESULTATS_FOREIGN_KEY01
        FOREIGN KEY (N_INSCRIPTION)
        REFERENCES ETUDIANTES(N_INSCRIPTION)
        ON UPDATE CASCADE, 
      CONSTRAINT RESULTATS_FOREIGN_KEY02
        FOREIGN KEY (CODE_MODULE)
        REFERENCES MODULES(CODE_MODULE)
        ON UPDATE CASCADE, 
      CONSTRAINT RESULTATS_FOREIGN_KEY03
        FOREIGN KEY (CODE_SEMESTRE)
        REFERENCES SEMESTRES(CODE_SEMESTRE)
        ON UPDATE CASCADE
    );
    voila l'interface de la fiche :
    Nom : Sans titre.png
Affichages : 439
Taille : 29,2 Ko


    j'ai utilise le composant DBAdvGrid pour afficher les résultat de requête SQL suivante (le code source du bouton OK):
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with FDQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select etud.*,res.CONTROLE1,res.CONTROLE2,res.EXAMEN,res.OBSRVATION ');
      SQL.Add(' from etudiantes etud');
      SQL.Add(' left join resultats res');
      SQL.Add(' ON etud.N_INSCRIPTION=res.N_INSCRIPTION');
      SQL.Add(' AND res.CODE_MODULE=:CODE_MODULE');
      SQL.Add(' AND res.CODE_SEMESTRE=:CODE_SEMESTRE');
      SQL.Add(' order by etud.N_INSCRIPTION');
      ParamByName('CODE_MODULE').value:=strtoint(ComboBox2.Text);
      ParamByName('CODE_SEMESTRE').value:=ComboBox1.Text;
      Open;
    end;
    TNumericField(FDQuery1.FieldByName('CONTROLE1')).DisplayFormat := '0#.00';
    TNumericField(FDQuery1.FieldByName('CONTROLE2')).DisplayFormat := '0#.00';
    TNumericField(FDQuery1.FieldByName('EXAMEN')).DisplayFormat := '0#.00';
    end;
    -Je voulais saisie les notes (CONTROLE1,CONTROLE2,EXAMEN) a partir du DBAdvGrid1 (Utilisation du DBAdvGrid1 pour la saisie des données )
    l'option: goEditing est défini sur true dans DBAdvGrid1.Options et DBAdvGrid1.PageMode = true

    mon problème est dans DBAdvGrid:
    -Lorsque je modifie dans les colonnes suivantes: (N_INSCRIPTION,NOM,PRENOM) la modification réussit (Je peux les modifier sans aucun problème)
    -mais les colonnes (CONTROLE1,CONTROLE2,EXAMEN,OBSRVATION) ne son pas éditables (Quand j'appuie deux fois avec la souris par exemple sur la cellule du colonne CONTROLE1 Rien n'apparaît Je ne peux rien écrire).

    pour quoi les trois premières colonnes son éditable mais les colonnes (CONTROLE1,CONTROLE2,EXAMEN,OBSRVATION) ne son pas éditables ?

    Comment résoudre le problème de la saisie des Notes?
    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    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 638
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Le fait que le SQL soit une jointure explique les deux observations

    -Lorsque je modifie dans les colonnes suivantes: (N_INSCRIPTION,NOM,PRENOM) la modification réussit (Je peux les modifier sans aucun problème)
    -mais les colonnes (CONTROLE1,CONTROLE2,EXAMEN,OBSRVATION) ne son pas éditables (Quand j'appuie deux fois avec la souris par exemple sur la cellule du colonne CONTROLE1 Rien n'apparaît Je ne peux rien écrire).
    ' from etudiantes etud left join resultats res' vous auriez interverti les tables le problème aurait été inverse.
    Tout FDQuery de ce genre devrait être associé à un FDUpdateSQL qui vous permettrait d'établir les actions (SQL) à effectuer.

    PS. Le composant n'a rien à voir (encore une fois ) avec le problème.

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    -Par vos mots , J'ai compris que la cause de mon problème est: la requête de jointure car la requête étant le résultat d'une jointure entre plusieurs tables, il y a plusieurs champs qui sont en readonly.
    -et Après avoir cherché sur ce forum J'ai trouvé le but à utiliser le FDUpdateSQL ici
    (C'est le principe, Firedac est BDE Like c'est ainsi que fonctionnait déjà TQuery de BDE, FDQuery est readonly c'est en l'associant avec le FDUpdateSQL qu'il devient readwrite.)

    donc la solution de mon pb est d’utilisé le composant FDUpdateSQL et mon FDQuery doit être associée avec un FDUpdateSQL
    -Je n'ai jamais utilisé le FDUpdateSQL
    -Pouvez-vous me dire comment résoudre mon problème avec FDUpdateSQL ?

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    J'ai essayé d'utiliser le composant FDUpdateSQL
    Est-ce que je fais comme dans l'image est correcte ?
    Nom : Sans titre.png
Affichages : 395
Taille : 30,3 Ko
    et j'ai appuyé sur (Generate SQL) puis ok

    J'ai lié le composant FDQuery1 avec FDUpdateSQL1 comme suite:
    Nom : 0101.png
Affichages : 372
Taille : 8,0 Ko


    Mais le problème n'a pas été résolu les colonnes (CONTROLE1,CONTROLE2,EXAMEN,OBSRVATION) ne son pas éditables

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Oui et non. les champs que tu peux modifier sont dépendants de ton modèle relationnel
    Positionner des updates ne changera rien. Cela dépend aussi des capacités de ta base de donnée à gérer l'intégrité référentielle.

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    voila le model relationnel
    Nom : Sans titre1.png
Affichages : 659
Taille : 13,8 Ko
    Je veux entrer les notes a partir du DBAdvGrid
    Que proposez-vous ?

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    La table "Etudiantes" ne change pas
    "Semestre" ne doit avoir sa clé primaire que sur un seul champ : Code_Semestre
    Coupler Modules et Semestres dans une nouvelle table "ModulesSemestres" avec deux champs Code_module et Code_Semestre (clé primaire composée)
    Modifier la clé primaire de "Résultat" comme suite Code_module, Code_Semestre et N_Inscription

  8. #8
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    mais les colonnes (CONTROLE1,CONTROLE2,EXAMEN,OBSRVATION) Toujours ne son pas éditables dans la grille
    Voilà ce que je recherche

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Tu dois avoir une grille par table avec des FdTables et non pas des FdQuery les informations de nom, prénom ... proviennent de CalcFields

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    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 638
    Billets dans le blog
    65
    Par défaut
    Bonsoir,

    Qu'est-ce que vous n'avez pas compris dans la phrase
    vous auriez interverti les tables le problème aurait été inverse.
    [EDIT] en Post Scriptum vous aviez vérifié que les colonnes n'étaient pas en Readonly ?

    Nom : Capture.PNG
Affichages : 394
Taille : 9,3 Ko
    cela dit pour arriver à ce résultat, il y a plusieurs choses à régler.
    tout d'abord le SQL, j'ai utilisé celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select etud.*,res.CODE_MODULE,Res.CODE_SEMESTRE,COALESCE(res.CONTROLE1,0.00) CONTROLE1,COALESCE(res.CONTROLE2,0.00) CONTROLE2
    ,COALESCE(res.EXAMEN,0.00) EXAMEN,res.OBSRVATION
    from resultats res 
    right join etudiantes etud ON etud.N_INSCRIPTION=res.N_INSCRIPTION
    AND res.CODE_MODULE=1   -- à remplacer par un paramètre
    AND res.CODE_SEMESTRE='01'  -- à remplacer par un paramètre
    order by etud.N_INSCRIPTION
    Ensuite vous n'avez pas indiqué s'il fallait que la grille soit pré-remplie à l'avance, ce qui est le cas dans mon exemple par la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm83.FDConnection1AfterConnect(Sender: TObject);
    begin
    try fdConnection1.ExecSQL('INSERT INTO RESULTATS (N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE)'+
                              ' SELECT N_INSCRIPTION,1,''01'' FROM ETUDIANTES');
    except
     
    end;
    end;
    Ensuite les SQL du FDUpdate, vous noterez qu'après les avoir généré par exemple ainsi
    Nom : Capture1.PNG
Affichages : 394
Taille : 16,2 Ko

    je les ai aussi modifié
    Insert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO RESULTATS
    (N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE, CONTROLE1, 
      CONTROLE2, EXAMEN, OBSRVATION)
    VALUES (:NEW_N_INSCRIPTION, 1, '01', :NEW_CONTROLE1, 
      :NEW_CONTROLE2, :NEW_EXAMEN, :NEW_OBSRVATION)
    Update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE RESULTATS
    SET N_INSCRIPTION = :NEW_N_INSCRIPTION, CODE_MODULE = :NEW_CODE_MODULE, 
      CODE_SEMESTRE = :NEW_CODE_SEMESTRE, CONTROLE1 = :NEW_CONTROLE1, 
      CONTROLE2 = :NEW_CONTROLE2, EXAMEN = :NEW_EXAMEN, OBSRVATION = :NEW_OBSRVATION
    WHERE N_INSCRIPTION = :OLD_N_INSCRIPTION AND CODE_MODULE =1 AND 
      CODE_SEMESTRE = '01'
    Delete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE FROM RESULTATS
    WHERE N_INSCRIPTION = :OLD_N_INSCRIPTION AND CODE_MODULE = 1 AND 
      CODE_SEMESTRE = '01'
    fetchRow
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE, CONTROLE1, CONTROLE2, 
      EXAMEN, OBSRVATION
    FROM RESULTATS
    WHERE N_INSCRIPTION = :OLD_N_INSCRIPTION AND CODE_MODULE = 1 AND 
      CODE_SEMESTRE = '01'
    Une note enfin, je trouve vos codes semestre un peu court ! 2 Char, j'en aurai mis 3 minimum (201) ou 5 pour être précis sous la forme aaaas ie. 20201 premier semestre de 2020.
    De même je trouve "limite" que toutes les étudiantes aient pour le même module, qu'il n'y ait pas plusieurs classes, etc. donc une structure extrêmement faible de la base de données

  11. #11
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    meeeeeeeerci SergioMaster Le problème résolu

    comment ajouter des paramètres (CODE_MODULE, CODE_SEMESTRE) dans la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm83.FDConnection1AfterConnect(Sender: TObject);
    begin
    try fdConnection1.ExecSQL('INSERT INTO RESULTATS (N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE)'+
                              ' SELECT N_INSCRIPTION,1,''01'' FROM ETUDIANTES');
    except
     
    end;
    end;
    meme question avec FetchRowSQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE, CONTROLE1, CONTROLE2, 
      EXAMEN, OBSRVATION
    FROM RESULTATS
    WHERE N_INSCRIPTION = :OLD_N_INSCRIPTION AND CODE_MODULE = 1 AND 
      CODE_SEMESTRE = '01'

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    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 638
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Citation Envoyé par delphi2019 Voir le message
    comment ajouter des paramètres (CODE_MODULE, CODE_SEMESTRE) dans la requête suivante:
    Jamais vous ne lisez la documentation ? Ou encore ne regardez les différentes surcharges d'une méthode ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fdConnection1.ExecSQL('INSERT INTO RESULTATS (N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE)'+
                              ' SELECT N_INSCRIPTION,:a,:b FROM ETUDIANTES',[1,'01']);
    même question avec FetchRowSQL:
    et des autres aussi pendant qu'on y est ! Réfléchissez, à quoi sert ce FetchRows ? Vous pouvez même l'améliorer pour obtenir en sus les nom et prénom de l'étudiant
    Je crois que pour le principe, je vais vous laissez chercher seul, du moins jusqu'à ce soir, vous n'apprendrez rien et surtout pas à chercher sinon (surtout maintenant que vous êtes devenu étudiant )

  13. #13
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    meerci SergioMaster !!!!

    Lorsque j'ajuste le paramètre par ComboBox1.text et ComboBox2.text, La requête n'est pas exécutée
    Je peux résoudre le problème en utilisant FDQuery
    Mais je veux par fdConnection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fdConnection1.ExecSQL('INSERT INTO RESULTATS (N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE)'+
                              ' SELECT N_INSCRIPTION,:a,:b FROM ETUDIANTES',[strtoint(ComboBox2.Text),ComboBox1.Text]);
    Pour FetchRows (Après réflexion, j'ai trouvé la solution)
    La requête devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT N_INSCRIPTION, CODE_MODULE, CODE_SEMESTRE, CONTROLE1, CONTROLE2, 
      EXAMEN, OBSRVATION
    FROM RESULTATS
    WHERE N_INSCRIPTION = :OLD_N_INSCRIPTION AND CODE_MODULE =:CODE_MODULE AND 
      CODE_SEMESTRE =:CODE_SEMESTRE
    et les paramètres de FDUpdateSQL1 Ils ont été introduits dans FDQuery1

    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
     
    with FDQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select etud.*,res.CODE_MODULE,Res.CODE_SEMESTRE,COALESCE(res.CONTROLE1,0.00) CONTROLE1,COALESCE(res.CONTROLE2,0.00) CONTROLE2');
      SQL.Add(',COALESCE(res.EXAMEN,0.00) EXAMEN,res.OBSRVATION');
      SQL.Add(' from resultats res ');
      SQL.Add(' right join etudiantes etud');
      SQL.Add(' ON etud.N_INSCRIPTION=res.N_INSCRIPTION');
      SQL.Add(' AND res.CODE_MODULE=:CODE_MODULE');
      SQL.Add(' AND res.CODE_SEMESTRE=:CODE_SEMESTRE');
      SQL.Add(' order by etud.N_INSCRIPTION');
      ParamByName('CODE_MODULE').value:=strtoint(ComboBox2.Text);
      ParamByName('CODE_SEMESTRE').value:=ComboBox1.Text;
      Open;
    end;
    meerci SergioMaster Vous êtes le meilleur !!!!

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Pour reprendre les éléments que j'avais présenté dans mon précédent post, voici un exemple en SQLLite
    information sur la base de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      object FDConnection1: TFDConnection
        Params.Strings = (
          'Database=C:\ProgramData\Data\BDDSCOL.DB'
          'LockingMode=Normal'
          'DriverID=SQLite')
    Nom : Annotation 2020-01-09 084705.png
Affichages : 335
Taille : 12,5 Ko

    Voici le script de création de la base
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    create database bddscol ;
     
    create table etudiantes (
      n_inscription integer not null,
      nom varchar(30) default null,
      prenom varchar(30) default null,
      primary key (n_inscription)
    );
     
    insert into etudiantes
    (n_inscription, nom, prenom) 
    values 
    (101,'Faivres','Denise') ,
    (102,'Menier','Stéphanie') ,
    (103,'Coulon','Pascale') ;
     
     
    create table semestres (
      code_semestre integer not null,
      semestre varchar(20) default null,
      primary key (code_semestre)
    );
     
    insert into semestres
    (code_semestre,semestre) 
    values
    (1901,'1er Semestre 2019/2020') ,
    (1902,'2nd Semestre 2019/2020') ;
     
    create table modules (
      code_module integer not null,
      nom_module varchar(20) default null,
      primary key (code_module)
    );
     
    insert into modules
    (code_module,nom_module) values 
    (101,'module A') ,
    (102,'module B') ;
     
    create table modsem (
      code_module integer not null,
      code_semestre integer not null,
      primary key (code_module,code_semestre)
    );
     
    insert into modsem 
    select code_module, code_semestre  from semestres join modules
     
    create table resultats (
      code_module integer not null,
      code_semestre integer not null,
      n_inscription integer not null,
      controle1 float default null,
      controle2 float default null,
      examen float default null,
      Observation varchar(20) default null,
      primary key (code_module,code_semestre,n_inscription)
    );
    Fichiers attachés Fichiers attachés

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    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 638
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Sans vouloir te vexer Alain, ta proposition est quand même très "old school" (cela me rappelle mes premiers programmes du siècle dernier) et ne répond pas au post de départ, à savoir un FDQuery avec jointure et des colonnes non modifiables. (même si le titre nous cite un composant TMS)

    Même si je trouve la structure de la Base de données de delphi2019 très "légère" la tienne ne l'est guère moins. À ta décharge, le MCD de base est loin d'être un modèle de normalisation !

    P.S. Depuis au moins les deux dernières versions majeures il n'est plus besoin de mettre de composant FDGUIxWaitCursor, sauf à vouloir gérer le dit curseur.

    On notera que delphi2019 s'est engouffré dans l'utilisation du FdConnexion.ExecSQL que je n'avais utilisé que comme une sorte de pré-saisie (empêchant de ce fait le test du Insert), je n'aime pas trop comment je l'ai utilisée pour éviter les clés en double (try except end)

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Ma proposition est très "old school". Elle repart de la structure proposée et applique en partie le modèle de normalisation (Boyce Codd). J'ai essayé de proposer un point de départ pour une alternative. De la bonne structure d'une base dépend sa croissance. En général je réserve les query pour les recherches et la agrégations de données. Ce type de modèle est utilisé sur les grosses applis sur lequelles je travaille actuellement.
    Avec FireDac j'ai développé une surcouche qui gère le Insert, Delete et Update relativement à un enregistrement d'une table obtenu depuis une requête mais je n'aime pas trop cette méthode qui sous entend que la structure de la base n'est pas top avec des temps de recherche souvent asser long.
    Mais chacun ses gouts 😉

  17. #17
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    merci ALWEBER
    J'ai téléchargé votre projet Je le garde, j'en aurai peut-être besoin un jour

  18. #18
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    sera beaucoup plus juste pour FetchRows (Nous avons utilisé la jointure)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT R.N_INSCRIPTION, R.CODE_MODULE, R.CODE_SEMESTRE, R.CONTROLE1, R.CONTROLE2, 
      R.EXAMEN, R.OBSRVATION,R.PRENOM,R.NOM
    FROM RESULTATS R JOIN ETUDIANTES E ON R.N_INSCRIPTION=E.N_INSCRIPTION
    WHERE N_INSCRIPTION = :OLD_N_INSCRIPTION AND CODE_MODULE =:CODE_MODULE AND 
      CODE_SEMESTRE =:CODE_SEMESTRE
    Est-ce jointure seulement pour FetchRows ou Nous l'utilisons également avec DeleteSQL,InserSQL,ModifySQL ?????

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    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 638
    Billets dans le blog
    65
    Par défaut
    Vous êtes sérieux ? À quoi vous servirait une jointure dans un Insert, Update ou Delete ?
    Lire la documentation complète http://docwiki.embarcadero.com/Libra...t.TFDUpdateSQL serait une bonne idée.
    elle vous permettra de comprendre à quoi sert fetchrowSQL

  20. #20
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    merci

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

Discussions similaires

  1. [AC-2007] Macros pour la saisie des données
    Par BARRADE dans le forum VBA Access
    Réponses: 5
    Dernier message: 29/03/2015, 00h02
  2. Réponses: 17
    Dernier message: 05/06/2010, 21h30
  3. Réponses: 3
    Dernier message: 20/06/2009, 15h34
  4. Utilisation d'un DBGrid pour la saisie des données
    Par amtdev dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/02/2008, 09h17
  5. un éqivalent de jcalendar pour la saisie des heures
    Par nutix2003 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 12/02/2007, 22h19

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