Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Débutant
Débutant Pour bien débuter avec Delphi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 18h45   #1
NABIL74
Membre éprouvé
 
Homme NABIL
Enseignant
Inscription : août 2008
Messages : 482
Détails du profil
Informations personnelles :
Nom : Homme NABIL
Localisation : Algérie

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 482
Points : 431
Points : 431
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.
NABIL74 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 17/12/2012, 23h27   #2
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 058
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 058
Points : 2 802
Points : 2 802
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/12/2012, 09h18   #3
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 272
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 272
Points : 7 533
Points : 7 533
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 :
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
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 10h18   #4
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 256
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 256
Points : 13 360
Points : 13 360
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

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 10h22   #5
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 272
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 272
Points : 7 533
Points : 7 533
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 ???
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 11h13   #6
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 058
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 058
Points : 2 802
Points : 2 802
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
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 :
Citation:
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 11h50   #7
NABIL74
Membre éprouvé
 
Homme NABIL
Enseignant
Inscription : août 2008
Messages : 482
Détails du profil
Informations personnelles :
Nom : Homme NABIL
Localisation : Algérie

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 482
Points : 431
Points : 431
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
NABIL74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 12h33   #8
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 256
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 9 256
Points : 13 360
Points : 13 360
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

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 14h33   #9
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 058
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 058
Points : 2 802
Points : 2 802
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 19h13   #10
NABIL74
Membre éprouvé
 
Homme NABIL
Enseignant
Inscription : août 2008
Messages : 482
Détails du profil
Informations personnelles :
Nom : Homme NABIL
Localisation : Algérie

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 482
Points : 431
Points : 431
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 :
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
NABIL74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 21h43   #11
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 058
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 058
Points : 2 802
Points : 2 802
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
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 :
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 08h33   #12
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 272
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 272
Points : 7 533
Points : 7 533
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 :
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;
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h49   #13
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 058
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 058
Points : 2 802
Points : 2 802
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
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 :
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 17h43   #14
NABIL74
Membre éprouvé
 
Homme NABIL
Enseignant
Inscription : août 2008
Messages : 482
Détails du profil
Informations personnelles :
Nom : Homme NABIL
Localisation : Algérie

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 482
Points : 431
Points : 431
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.

Citation:
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
NABIL74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 18h53   #15
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 272
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 272
Points : 7 533
Points : 7 533
Citation:
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
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 19h37   #16
NABIL74
Membre éprouvé
 
Homme NABIL
Enseignant
Inscription : août 2008
Messages : 482
Détails du profil
Informations personnelles :
Nom : Homme NABIL
Localisation : Algérie

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 482
Points : 431
Points : 431
Bonsoir,

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

Code :
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
NABIL74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 08h16   #17
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 272
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 272
Points : 7 533
Points : 7 533
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 ?
Citation:
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 :
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 :
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 :
1
2
3
 
  QD.SQL.Add('DELETE FROM CLASSES WHERE NUM_NIVEAU=:N');
  QD.SQL.Add('AND NUM_CLASSE>:NC');
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 19h10   #18
NABIL74
Membre éprouvé
 
Homme NABIL
Enseignant
Inscription : août 2008
Messages : 482
Détails du profil
Informations personnelles :
Nom : Homme NABIL
Localisation : Algérie

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 482
Points : 431
Points : 431
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
NABIL74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h21.


 
 
 
 
Partenaires

Hébergement Web