Bonjour. J'ai un petit soucis.
J'ai une boucle qui parcours + de 300000 tuples d'une table.
Dans cette table, les propriétés sont:
- ref (identifiant auto-incrémenté)
- lib (chaine initiale)
- trait (chaine traitée)
Pour l'instant, seules les colonnes ref et lib sont remplies.
Le but de ma boucle est donc de récupérer, pour chaque tuple, la valeur de la chaine lib, de la traiter (à l'aide d'une fonction...), et une fois traitée, de faire un update sur ma table pour ajouter la chaine traitée trait sur la ligne du lib correspondant.
Mon code, sous Delphi 7, est le suivant:
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 procedure TForm1.Button1Click(Sender: TObject); var i:integer; //Compteur de boucle sIn:string; //Chaine à traiter nbreint:integer; //Nombre de tuples de la table nbrestr:string; //nbreint convertir en string begin nbreint:=Query_nbreCOUNT.Value; nbrestr:=IntToStr(nbreint); for i:=1 to nbreint do begin with query_mot do begin //Active:=false; Params[0].Value:=i; ExecSQL; Active:=True; Open; end; mot:=query_motmot_lib.Text; query_mot.Active:=False; result:=convert(mot); query_trait.Params[0].Value:=result; query_trait.Params[1].Value:=i; query_trait.ExecSQL; end; end;
La requete de mon query_nbre est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT COUNT(*) FROM mots
La requete de mon query_mot est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT mot_lib FROM mots WHERE mot_num=:p
La requete de mon query_trait est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3UPDATE mots SET mot_trait=:p WHERE mot_num=:q
Lorsque j'exécute, il me retourne le message d'erreur suivant:
Le projet importbdd.exe a provoqué une classe d'exception EDBEngineError avec le message 'Opération non applicable.
Trop de tables ouvertes.
Table: C:\...\mots.db'. Processus stoppé. Utilisez Pas-àpas ou Exécuter pour continuer.
Cepedant, lorsque je donne à i une valeur fixe, donc sans faire de boucle, ça fonctionne parfaitement.
Y'aurait-il un probleme face à un nombre très important de lignes, où est-ce moi qui ait fait une bourde qui fait que ma boucle plante ?
J'ai bien sûr sur ma form le composant Ttable activé sur ma base mot.db et le composant Tdatasource lié à mon Ttable.
A savoir aussi que je bosse avec une base Paradox.
Merci de m'éclairer. Je pete un plomb depuis hier soir.
Merci d'avance pour vos réponses.
Partager