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; |