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 :

Problème de BD


Sujet :

Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut Problème de BD
    Salut à toutes et à tous,

    Dans le cadre d'un projet éducatif,nous sommes confrontés à un problème:

    nous avons 2 tables: TNiveau et TClasses.

    la TClasses liée à TNiveau par relation maître/détail par la champ num_Niveau.

    Les Champs de TNiveau: num_Niveau , nombre_niveau , nom_Niveau.

    Les Champs de TClasse: num_Niveau , num_Classe , nom_Classe.

    -Chaque niveau peut avoir plusieurs classes.

    exemple : -Niveau1 => classe1,classe2,classe3,classe4.
    -Niveau2 => classe1,classe2,classe3.
    -Niveau3 => classe1,classe2,classe3,classe5,classe6.



    *Notre problème est le suivant:

    nous voulons quand on indique le nombre de niveau,on ajoute automatiquement
    le nombre de classe avec le nom de la Classe.

    Exemple:
    -Niveau3 = 6 Classes => ajoute dans la TClasse: classe1,classe2,classe3,classe4 ,classe5,classe6.


    Après ça, si on édite le nombre, par exemple :nombre_niveau devient : 4 Classes , je veux qu'on supprime seulement les deux derniers enregistrements(classe5 et classe6) du Niveau3 .

    SGBD: Paradox.

    Merci.

    NABIL74.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par NABIL74 Voir le message
    Dans le cadre d'un projet éducatif,nous sommes confrontés à un problème:
    Le problème ne serait-il pas plutôt que personne ne veut faire le TD à votre place ?

    Il n'y a aucune difficulté particulière sur cet énoncé et ce n'est pas la relation maître/détail qui en apporte plus.

    Si le problème est que vous êtes bloqués dans la réalisation de ce TD, montrez nous ce que vous avez fait, les endroits où vous êtes bloqués. On vous aidera à les comprendre et à les résoudre.

    Et ça vous sera plus profitable que d'attendre une solution pré digérée !
    Philippe.

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Paradox , encore , décidément la Tunisie a du mal a faire le pas vers des SGBD relationelle , j’espère que vous n'êtes pas enseignant en informatique !

    je ne vais pas vous donner de code Delphi mais vous montrer les possibilités d'une SGBDR (Firebird dans mon exemple)
    une SGBDR peut contenir des Tables ,bien sur ,mais aussi des procédures.
    A noter, Que dans le cas d'une SGBDR il n'y aurait nul besoin d'avoir un Champ Nombre_classe dans la table NIVEAU

    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
    CREATE PROCEDURE SET_CLASSES(NIVEAU INTEGER,NOMBRE INTEGER)
    AS
    DECLARE VARIABLE I INTEGER ; -- Pour la boucle
    BEGIN
      SELECT COUNT(*) FROM CLASSE WHERE NUM_NIVEAU=:NIVEAU INTO :I;
      -- Nombre inférieur au nombre existant
      IF (:NOMBRE<I) THEN 
        BEGIN
          -- Effacer les classes en trop  
          DELETE FROM CLASSE WHERE NUM_CLASSE>:NOMBRE;
          I=:NOMBRE;
        END
     ELSE BEGIN
      IF (I=0) THEN I=1; 
      -- Ajouter des Classes
      WHILE (I<=:NOMBRE) DO
         BEGIN
            INSERT INTO CLASSE(NUM_NIVEAU,NUM_CLASSE,NOM_CLASSE) 
            VALUES (:NIVEAU,:I,'CLASSE'||:I);
            I=I+1; 
         END
     END
      -- Mettre a jour NIVEAU 
      UPDATE NIVEAU SET NOMBRE_NIVEAU=:NOMBRE WHERE NUM_NIVEAU=:NIVEAU;
    END
    vous avez l'algorithme pour un code Delphi
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Le problème ne serait-il pas plutôt que personne ne veut faire le TD à votre place ?
    @Ph. B., NABIL74 a mis comme titre "enseignant", je pense, je l'espère qu'il demande notre avis de professionnel sur sa problématique !
    Et ainsi, offrir à ses élèves une correction digne de ce nom !

    Citation Envoyé par SergioMaster Voir le message
    Paradox , encore , décidément la Tunisie a du mal a faire le pas vers des SGBD relationelle , j’espère que vous n'êtes pas enseignant en informatique !
    SergioMaster, Vert et blanc, c'est l'algérie, la tunisie c'est plutôt tout rouge ...
    Mais il est vrai, OUBLIEZ PARADOX !
    Un professeur qui enseigne encore BDE + Paradox en 2012 ne rend pas service à ces élèves, Thierry Laborde, Responsable technique chez Embarcadero, rappel chaque année qu'il faut migrer vers DBExpress et éventuellement sur Interbase pour vendre quelque licence mais qu'il existe dans la version pro le client MySQL !

    Vos élèves apprennent une technologie obselète, une compétence d'une banalité affligeante pour un développeur Delphi, il y aura toujours de développeur sénior qui savent comment maintenir et, avec de la chance, pourront se débarrasser de Paradox pour la pérennité du logiciel !
    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

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    SergioMaster, Vert et blanc, c'est l'algérie, la tunisie c'est plutôt tout rouge ...
    oui , désolé , j'étais encore sur ma maintenance chez un sous-traitant tunisien
    Mais j'ai remarqué , que les posts des Algériens comme des Tunisiens, les questions avaient souvent tendance a tourner autour de Paradox à croire qu'ils ont les mêmes profs ???
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par ShaiLeTroll Voir le message
    @Ph. B., NABIL74 a mis comme titre "enseignant", je pense, je l'espère qu'il demande notre avis de professionnel sur sa problématique !
    Et ainsi, offrir à ses élèves une correction digne de ce nom !
    C'est bien pour cela que j'ai dit ensuite :
    Si le problème est que vous êtes bloqués dans la réalisation de ce TD, montrez nous ce que vous avez fait, les endroits où vous êtes bloqués. On vous aidera à les comprendre et à les résoudre.
    Citation Envoyé par ShaiLeTroll Voir le message
    Mais il est vrai, OUBLIEZ PARADOX !
    Un professeur qui enseigne encore BDE + Paradox en 2012 ne rend pas service à ces élèves, Thierry Laborde, Responsable technique chez Embarcadero, rappel chaque année qu'il faut migrer vers DBExpress et éventuellement sur Interbase pour vendre quelque licence mais qu'il existe dans la version pro le client MySQL !
    Sans oublier d'autres solutions Open source comme UIB, et j'en passe...
    Philippe.

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    Le problème ne serait-il pas plutôt que personne ne veut faire le TD à votre place ?

    Il n'y a aucune difficulté particulière sur cet énoncé et ce n'est pas la relation maître/détail qui en apporte plus.

    Si le problème est que vous êtes bloqués dans la réalisation de ce TD, montrez nous ce que vous avez fait, les endroits où vous êtes bloqués. On vous aidera à les comprendre et à les résoudre.

    Et ça vous sera plus profitable que d'attendre une solution pré digérée !
    Bonjour à toutes et à tous,

    Je n'est pas demandé à quiconque de faire ce travail à ma place , j'ai espéré un avis de professionnel sur cette problématique.
    Une info: j'enseigne pas la programmation mais la langue française cher ami.
    j'essai de donner un coup de main à mes étudiants.

    @ Sergio: merci pour ce code, je le testerai ce soir inchallah.

    @ShaiLeTroll: je prends toujours notes de tes conseils.

    Et pour Paradox, vous avez raison, il est mort depuis plus de 10 ans!!
    Personnellement , je travaille sous Firebird, depuis plusieurs années et ça me convient très bien.

    Comme les étudiants en informatique sont débutants et ils ne savent pas où mettre les pieds, ils commencent à programmer en utilisant paradox commme SGBD car ils pensent que c'est plus facile à magner que d'autres.

    @+
    NABIL74

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    Comme les étudiants en informatique sont débutants et ils ne savent pas où mettre les pieds, ils commencent à programmer en utilisant paradox commme SGBD car ils pensent que c'est plus facile à magner que d'autres.
    Plus facile au début, mais dès qu'il faut pousser, il faut tout coder soit même pour compenser la faiblesse du SQL en plus le TTable donne de tel mauvaise habitude !

    Leur professeur d'info devrais imposer l'interdiction d'utiliser du BDE !
    Tu devrais lui en toucher deux mots !

    Perso, quand j'étais Etudiant Apprenti, on a utilisé PostgreSQL sous Java et Oracle sous VB6, fallait se débrouiller avec uniquement du SQL, les CREATE et les classique SELECT\UPDATE...

    Paradox, je l'ai utilisé en Entreprise sous D4, mon tuteur était justement en train de passer l'appli en Interbase 6 avec les composants DBX de D5, il y a plus de 10 ans effectivement
    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

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par NABIL74 Voir le message
    Je n'est pas demandé à quiconque de faire ce travail à ma place , j'ai espéré un avis de professionnel sur cette problématique.
    Je vais encore me répéter : mais montrez ce que vous ou vos étudiants ont fait et je suis tout à fait disposé à vous conseiller...
    Citation Envoyé par NABIL74 Voir le message
    Une info: j'enseigne pas la programmation mais la langue française cher ami.
    Je n'ai fait aucune allusion à votre titre, car au vu de la question je me doutais que vous n'enseigniez pas la programmation !
    Citation Envoyé par NABIL74 Voir le message
    j'essai de donner un coup de main à mes étudiants.
    Le problème récurrent est que bien souvent des "étudiants" déposent ici un sujet de TD et attendent béatement qu'on leur donne la solution. Ce n'est pas cela qui les fera progresser...
    Citation Envoyé par NABIL74 Voir le message
    Comme les étudiants en informatique sont débutants et ils ne savent pas où mettre les pieds, ils commencent à programmer en utilisant paradox commme SGBD car ils pensent que c'est plus facile à magner que d'autres.
    Commencer par se documenter et réfléchir ?
    Philippe.

  10. #10
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message

    Leur professeur d'info devrais imposer l'interdiction d'utiliser du BDE !
    Tu devrais lui en toucher deux mots !

    Perso, quand j'étais Etudiant Apprenti, on a utilisé PostgreSQL sous Java et Oracle sous VB6, fallait se débrouiller avec uniquement du SQL, les CREATE et les classique SELECT\UPDATE...
    @ ShaiLeTroll: Oui mon ami, je lui ai déjà touché deux mots sur ça
    il m'a dit qu'il passera sous Firebird , Absolute Database et DBExpress.

    @Sergio: En bricollant la procedure sous Firebird, les étudiants n'ont pas réussi à l'adapter :
    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
    procedure TForm1.Button2Click(Sender: TObject);
    var i, NIVEAU ,NOMBRE :INTEGER ;
    begin
     
    NOMBRE:= StrToInt(Edit1.Text) ;
     
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT COUNT(*) ' );
    Query1.SQL.Add('FROM Divs');         // Div => niveau
    Query1.SQL.Add(' WHERE Niv = Niv '); //Niv=> niveau
     
    Query1.Active:=true;
    i:= Query1.FieldValues['COUNT(*)'] ;
     
    // -- Effacer les classes en trop
     
    IF (I < NOMBRE ) THEN
    BEGIN
     
    Query2.Active:=false;
    Query2.SQL.Clear;
    Query2.SQL.Add('DELETE FROM CLASSES ' );
    Query2.SQL.Add('WHERE   i >' + Edit1.Text + ''  ); // Edit1 => nombre de niveau à éditer
     
    I:=NOMBRE;
    Query2.Active:=true;
     
     // Mettre a jour NIVEAU
     
    {Query3.SQL.Clear;
    Query3.SQL.Add(' UPDATE NIVEAU SET Div=Div  WHERE NUM_NIV=NIV' );
    Query3.Active:=true;}
     
    end;
     
    end;
    @ +

    Nabil74

  11. #11
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    @Sergio: En bricollant la procedure sous Firebird, les étudiants n'ont pas réussi à l'adapter :
    Retranscrit en code delphi, voila ce que çà donne :
    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
    61
    62
    63
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i, NIVEAU, NOMBRE, Maxi :INTEGER;
    begin
      // Parcours de la table des niveaux
      Query1.SQL.Clear;
      Query1.SQL.Add('SELECT num_niveau, nombre_niveau' );
      Query1.SQL.Add('FROM NIVEAU');
      // on ouvre
      Query1.Active := True;
      // on parcours
      while not Query1.Eof do
      begin
        NIVEAU := Query1.FieldByName('num_niveau').AsInteger;
        NOMBRE := Query1.FieldByName('nombre_niveau').AsInteger;
     
        // Je cherche la plus grande classe du niveau
        Query2.SQL.Clear;
        Query2.Params.Clear;
        Query2.SQL.Add('SELECT MAX(num_classe) AS max_num_classe FROM CLASSE');
        Query2.SQL.Add('WHERE num_niveau = :niveau');
        //  Paramètres
        Query2.ParamByName('niveau').AsInteger := NIVEAU;
        Query2.Open;
        Maxi := Query2.FieldByName('max_num_classe').AsInteger;
        Query2.Close;
     
        if Maxi > NOMBRE then
        begin
          // Effacer toutes les classes du niveau considéré supérieures au nombre
          Query2.SQL.Clear;
          Query2.Params.Clear;
          Query2.SQL.Add('DELETE FROM CLASSE' );
          Query2.SQL.Add('WHERE num_niveau = :niveau');
          Query2.SQL.Add('AND num_classe > :nombre');
          //  Paramètres
          Query2.ParamByName('niveau').AsInteger := NIVEAU;
          Query2.ParamByName('nombre').AsInteger := NOMBRE;
          Query2.ExecSQL; // car ce n'est pas un curseur
        end
        else if Maxi < NOMBRE then
        begin
          // Insérer le nombre de classes voulues pour le niveau considéré
          Query2.SQL.Clear;
          Query2.Params.Clear;
          Query2.SQL.Add('INSERT INTO CLASSE(num_niveau, num_classe, nom_classe)');
          Query2.SQL.Add('VALUES(:niveau, :num_classe , :nom_classe)');
          //
          for i := Maxi + 1 to NOMBRE do
          begin
            //  Paramètres
            Query2.ParamByName('niveau').AsInteger := NIVEAU;
            Query2.ParamByName('num_classe').AsInteger := i;
            Query2.ParamByName('nom_classe').AsString := 'Classe ' + IntToStr(i) + ' du niveau ' + IntToStr(NIVEAU);
            Query2.ExecSQL;
          end;
        end;
        // On passe au niveau suivant
        Query1.Next;
      end;
      // Parcours terminé
      Query1.Close;
    end;
    Philippe.

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Que d'erreurs de la part de ces élèves !
    - je ne vois pas la boucle de mon algo
    - pour une Query (cas du Delete et du UPDATE) qui ne renvoie rien on utilise ExecSQL et non Open
    - j'ai horreur également des personnes qui pensent qu'un utilisateur saisira un nombre dans un TEdit , une conversion avec controle est nécessaire
    -par pitié , gardez les mêmes nom de champs et de tables , et nommer les zones de saisies Edit1-> NombreClasses , Edit2-> Niveau , c'est quand même plus lisible
    - Mettez des alias aux champs calculés dans les Querys , à ma souvenance
    COUNT(*) devient 'COUNT' ou 'COUNT_1' et non 'COUNT(*)'
    - Enfin faites attention aux variables utilisées vos élèves se mélangent les pinceaux (i devient quelquefois le niveau !)

    Bon, Philippe m'a coupé l'herbe sous le pied en proposant un code
    [edit] @Phillipe , je n'ai pas de FOR SELECT .... donc il n'y a pas de boucle sur la table NIVEAU

    Cependant j'aurais préféré une approche plus 'pédagogique' (reste de mes années "prof Shaïtan") , avec une seule Query (c'est possible) et crée dynamiquement , et passage de paramètres .
    Voilà ce que j'aurais aimé voir
    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
     
    // le bouton 
    procedure TForm1.TesterClick(sender : TObject)
    begin
    NombreDeClasse:= InttostrDef(Edit1.Text,0);
    Niveau := IntToStrDef(Edit2.Text,0);
    AjoutClasse(niveau,nombredeclasse);
    end;
    // la procédure
    procedure TForm1.AjoutClasses(niveau,nombredeClasse : Integer);
    var i : integer ;
         QD : TQuery; // Query dynamique 
    begin 
    QD:=TQuery.Create(nil);
    try
      QD.DataBaseName:=DataBase1;  // bien sur , il faut un TDatabase sur la Fiche
      QD.SQL.Text:='SELECT COUNT(*) AS C FROM NIVEAU WHERE NUM_NIVEAU=:N';
      QD.paramByName('N').AsInteger:=Niveau;
      QD.Active:=true;
      i:= QD.FieldByName('C').asInteger ;
      QD.Active:=False; 
    // -- Effacer les classes en trop
      if (i>nombredeClasse) then
      begin 
        QD.SQL.Clear;
        QD.SQL.Add('DELETE FROM CLASSES WHERE NUM_NIVEAU=:N');
        QD.SQL.Add('AND NUM_CLASSE<:NC');
        QD.ParamByName('N').asinteger:=Niveau;
        QD.ParamByName('NC').asinteger:=NombreDeClasse;
        QD.ExecSQL;
     end // endif
     else begin 
      if (I=0) then i:=1;
      for i:=i to NombredeClasse do
       begin
          ...
           Voyons voir si ces élèves seront capables de mettre le INSERT
           et de placer correctement le texte selon la méthode choisie     
          ...
       end; // for
     end; // else
     // Mettre a jour NIVEAU
     // Autre technique pour faire un SQL 
       QD.SQL.Text:=Format('UPDATE NIVEAU SET NOMBRE_NIVEAU=%d WHERE   NUM_NIVEAU=%d',[NombredeClasse,Niveau]);
        QD.ExecSQl; 
      end;
     finally
       QD.Free;
      end; 
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par SergioMaster Voir le message
    Bon, Philippe m'a coupé l'herbe sous le pied en proposant un code
    [edit] @Phillipe , je n'ai pas de FOR SELECT .... donc il n'y a pas de boucle sur la table NIVEAU
    Désolé...

    Ensuite, je n'ai pas tout à fait suivi pas à pas votre code PSQL. Je suis plutôt reparti de l'énoncé et j'ai fait une mise à jour globale de la table Classe en fonction des données qui sont saisies dans la table Niveau.
    Pour hypothèse, je ne suis pas parti d'un TEdit où aurait été saisi la valeur nombre, mais de 2 grilles (une par table). La table niveau étant éditable pour saisir les niveaux, leur nombre ; la table classe est lié par une relation maitre/détail à la première et n'est la qu'en mode visualisation pour vérifier le résultat...
    Citation Envoyé par SergioMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //...
       begin
          ...
           Voyons voir si ces élèves seront capables de mettre le INSERT
           et de placer correctement le texte selon la méthode choisie     
          ...
       end; //...
    Eh bien, en relisant mon code, ils devraient pouvoir compléter sans aucune difficulté le votre... sinon, c'est à désespérer !
    Philippe.

  14. #14
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Salut;

    Citation Envoyé par SergioMaster Voir le message
    Que d'erreurs de la part de ces élèves !
    - je ne vois pas la boucle de mon algo
    - pour une Query (cas du Delete et du UPDATE) qui ne renvoie rien on utilise ExecSQL et non Open
    - j'ai horreur également des personnes qui pensent qu'un utilisateur saisira un nombre dans un TEdit , une conversion avec controle est nécessaire
    -par pitié , gardez les mêmes nom de champs et de tables , et nommer les zones de saisies Edit1-> NombreClasses , Edit2-> Niveau , c'est quand même plus lisible
    - Mettez des alias aux champs calculés dans les Querys , à ma souvenance
    COUNT(*) devient 'COUNT' ou 'COUNT_1' et non 'COUNT(*)'
    - Enfin faites attention aux variables utilisées vos élèves se mélangent les pinceaux (i devient quelquefois le niveau !)

    Bon, Philippe m'a coupé l'herbe sous le pied en proposant un code
    [edit] @Phillipe , je n'ai pas de FOR SELECT .... donc il n'y a pas de boucle sur la table NIVEAU

    Cependant j'aurais préféré une approche plus 'pédagogique' (reste de mes années "prof Shaïtan") , avec une seule Query (c'est possible) et crée dynamiquement , et passage de paramètres .
    Voilà ce que j'aurais aimé voir
    @Serge: effectivement, ils ont fait des erreurs sur ta boucle.Franchement, je pense que c'est pardonnable car ils sont que dans leur 3e mois de TP seulement, ils apprennent.
    Le TEdit est pour la saisie du nombre de classes du niveau concerné.
    Je leur ai passé ton message.
    Pour ton nouveau code, on le testera et on vous dira ce que ça donne.

    Mettez des alias aux champs calculés dans les Querys , à ma souvenance
    COUNT(*) devient 'COUNT' ou 'COUNT_1' et non 'COUNT(*)'
    COUNT(*) , ça devrait être COUNT(num_niveau) .

    @Ph. B.: ça marche! c'est ça ce qu'on voulait obtenir.
    une requête selection, une detele si c'est le nombre est en plus, une autre insertion si le nombre est moins. Merci pour ce tuyau .

    Ce code marche sans faire la jointure des deux Tables, on peut s'en passer donc.

    Merci à vous!

    @+
    NABIL74

  15. #15
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Ce code marche sans faire la jointure des deux Tables, on peut s'en passer donc.
    non , c'est plutôt de Nombre_Classe de la table NIVEAU dont il faudrait se passer.

    Je n'avais pas compris qu'il fallait remplir tous les niveaux mais seulement le Niveau saisi avec le nombre de classe de Classe saisi
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  16. #16
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonsoir,

    @Sergio: voilà ce que les étudiants m'ont envoyé par email:

    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
    // insertion
     
     
    if (I=0) then i:=1 ;
     
     if (i < nombredeClasse) then
     
     //for i := i  to NombredeClasse do
    //begin
     
         QD.SQL.Clear;
         QD.Params.Clear;
         QD.SQL.Add('insert into CLASSES( num_niveau, num_classe)');
         QD.SQL.Add('values( :Num_niveau, :num_classe)' );
     
        for i := i   to NombredeClasse do
    begin
          QD.ParamByName('num_niveau').AsInteger := Niveau;
          QD.ParamByName('num_classe').AsInteger := i ;
     
         QD.ExecSQl;
         TClasses.Refresh;
     end;
    une petite remarque: le code que tu m'as filé , met à jour la Table Niveau mais
    le Delete ne fonctionne pas.

    @ NABIL74

  17. #17
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    pas mal ,
    3 remarques toutefois :

    QD.params.Clear est inutile
    TClasses.Refresh; ne devrait pas être dans la boucle
    je m'attendais aussi a un libellé nom_classe , où est il ?
    Les Champs de TClasse: num_Niveau , num_Classe , nom_Classe.
    il manque donc un 3° paramètre , et l'occasion d'utiliser par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QD.ParamByName('nom_classe').AsString:=Format('Classe%d',[i]);
    Il m'étonne que le Delete ne fonctionne pas , sauf que je me suis trompé dans le sens du test , je l'avais bien mis dans la procédure
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM CLASSE WHERE NUM_NIVEAU=:NIVEAU AND NUM_CLASSE>:NOMBRE -- d'ailleurs j'avais oublié le niveau , nul n'est parfait ;-)
    mais mal dans le code fait à main levée , cad hors delphi .(une erreur, non volontaire, mais qui aurait du être vu par des élèves , rien qu'en vérifiant les données après tests)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      QD.SQL.Add('DELETE FROM CLASSES WHERE NUM_NIVEAU=:N');
      QD.SQL.Add('AND NUM_CLASSE>:NC');
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  18. #18
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonsoir,

    On ne pouvait pas espérer mieux!

    Merci à vous tous pour votre précieuse aide.

    Pour moi ce topic est clos.

    Bonne soirée.

    NABIL74

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

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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