salut
il faut lui y attacher un composant Tupdatesql ou gere soit meme la mise a jour
@+ Phil
salut
il faut lui y attacher un composant Tupdatesql ou gere soit meme la mise a jour
@+ Phil
nous avons une boucle(liée à un boutton) qui post les enregistrements des classements des étudiants suivant leur moyenne(du plus grand au plus petit).comment lui y attacher un composant Tupdatesql qui gère soit même la mise a jour ?parceque j'ai essayé est je n'est pas trouvé de solution avec Tupdatesql .
salut
la query doit etre attache au tupdatsql par la propriete updateobjet
je suppose que le champs classement fait parti d'une table ou est ce un champs calculer ?
@+ Phil
resalut;
oui le champs "classement" fait parti de la table "Edudiants".
Re Nabil;
voilà ma suggestion, crée un autre champ type numérique et essai le code source avec, histoire de voir la réaction de ton appli si tout marche bien alors tu as un problème avec le champ classement.
Revenons à l'objectif principal :
Quel est-il ?
- Modifier le contenu de la requête pour créer un rapport sans modifier la table, et une fois le rapport créé, on détruit la requête sans mettre à jour les tables ?
- Modifier le contenu de la requête pour mettre à jour les tables ?
La démarche sera différente suivant ce que tu désires.
Dans le premier cas, la query étant en READ ONLY, tu pourrais la dupliquer dans un TDataset et ensuite travailler sur le TDataset avec le bout de code que je t'ai indiqué précédemment, dans l'autre, il faudra boucler sur une requête SQL "UPDATE".
bonjour Just-Soft,
j'ai créer un autre champ de type numérique mais j'ai toujours le même message: "Query_classement:impossible de modifier un ensemble de données en lecture seule".
j'ai essayé la boucle sur une table(sans prendre compte du tri du classement de chaque étudiant) et ça marche nickel!
Y at-il un moyen de modifier le résultat d'une requête liée à cette boucle?
merci encore
salut Le Lézard ;
l'objectif principal est:
1-tri de la moyenne des étudiants(du plus grand au plus petit suivant sa moyenne).
2-modifier les résultats obtenus et mettre à jour la table(poster le classement de chaque étudiant dans la table "Etudiants".
ex:
1---Albert Loront--- 6°---15.23---classement:"5"
2---Tony Faudin--- 6°---16.15---classement:"2"
3---Charles Samon---6°---17.25---classement:"1"
.
.
Voici un bout de code (non testé) qui répond à ton besoin...
Le principe est simple : Tu fais une requête (QRY_S) qui te retourne pour chaque classe les étudiants ordonnés du meilleur au moin bon.
Tu parcours ensuite le résultat de cette requête et tu ajoutes 1 au classement à chaque éléve d'une même classe avant d'envoyer une requête (QRY_U) qui met à jour le champ CLASSEMENT pour l'étudiant en question (grace à son ID). Dès que tu changes de classe, tu remets le classement à 1 et rebelotte...
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 procedure MaJ_Classement; Var Qry_S : TQuery; // Requête "SELECT" Qry_U : TQuery; // Requête "UPDATE" Cur_Rang : Integer; Cur_Classe : String; Cur_Id : Integer; begin Qry_S := TQuery.Create(nil); //------------------------------------------------------------------- // Insérer ici les paramètres de connexion du TQUERY au SGBD //------------------------------------------------------------------- Qry_S.SQL.Clear; Qry_S.SQL.Add('SELECT etu_id as id, etu_classe as classe, etu_moyenne as moyenne '); Qry_S.SQL.Add('FROM etudiants '); Qry_S.SQL.Add('ORDER BY etu_classe, etu_moyenne DESC'); Qry_S.Active := true; If Qry_S.RecordCount > 0 then Begin Qry_U := TQuery.Create(nil); //------------------------------------------------------------------- // Insérer ici les paramètres de connexion du TQUERY au SGBD //------------------------------------------------------------------- Qry_S.First; // Boucle sur les classes While not Qry_S.Eof do Begin Cur_Classe :=Qry_S.FieldByName('classe').AsString; Cur_Rang := 1; // Boucle sur les étudiants While (Qry_S.FieldByName('classe').AsString = Cur_Classe) and (not Qry_S.Eof) do begin Cur_Id := Qry_S.FieldByName('id').AsInteger; Qry_U.SQL.Clear; Qry_U.SQL.Add('UPDATE etudiants SET classement = '+IntToStr(Cur_Rang)+' '); Qry_U.SQL.Add('WHERE etu_id = '+IntToStr(Cur_Id)); Qry_U.ExecSQL; Qry_S.Next; Inc(Cur_Rang); end; // Fin de boucle étudiants end; // Fin de boucle classes Qry_U.Close; Qry_U.Free; end; //If Qry_S.RecordCount > 0 Qry_S.Close; Qry_S.Free end;
ça marche nickel!
je connaisais pas cette procédure avant.
un grand merci à vous tous d'être penché sur mon cas et d'avoir eu le temps de me répondre.D'ailleurs c'est le point fort de ce grand Forum.Encore merci!
Partager