Boucle imbriquée prob

Résolu
WinLin Messages postés 86 Date d'inscription dimanche 13 février 2005 Statut Membre Dernière intervention 3 septembre 2007 - 29 mars 2005 à 06:36
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 29 mars 2005 à 09:27
bonjour a tous voila il y a un petit truc que je comprend pas pourtant je pense etre logique je vous explique

j'ai un tableau une stringgrid ou une dbgrid ok
et je doit mettre les lignes dans un fichier texte
donc logiquement il me faut une

1) boucle pour aller de la ligne 1 a X avec un compteur qui va de 1 a X qui permet de prendre les cellule comme variable en ce deplacant dans le tableau
tant que je ne suis pas arrive au maximum de ligne je boucle

2) il me faut une boucle imbriquée dans la premiére qui me permettra de parcourire pour chaque ligne tout le fichier
en veriffiant si tel valeur de la cellure est egale a un champ de record si oui il modifie la quantite
le probleme sa fonctionne une fois puis il ne rentre plus dans ma boucle .

code---------code

recpos : integer; // variable pour connaitre la position d'un record
strcptgrid2 : integer; // variable pour ce deplacer dans la grid2 pour modifier le stock
buffercal : integer; // variable temporaire pour effecturer des calcul








showmessage('entrée dans la mise a jour du stock');
// retirer les articles qui sont vendu


if FileExists('L:\Gestion-stock\data-fic\StockLL.dat') then
begin



assignFile(Fichier,'L:\Gestion-stock\data-fic\StockLL.dat');
reset(fichier);
// strcpt variable qui va parcourrir le tableau permettant
// de changer les variables


for strcptgrid2:=1 to (stringgrid2.RowCount) do
begin


// le while va parcourir tout le fichier de a a z en effectuant le test
while (not eof(fichier)) do
begin
// strcpt variable qui va parcourrir le tableau permettant
// de changer les variables
read(fichier,dencode);
if dencode.serie=stringgrid2.Cells[1,strcptgrid2] {and (dencode.emplacement=stringgrid2.Cells[4,strcptgrid2]) } then
begin
showmessage('passage dans la boucle while valeur '+inttostr(strcptgrid2));
recpos:=filepos(fichier); // si teste ok alors prendre la position du pointeur
seek(fichier,recpos-1); // placement du pointeur sur le record a modifier
buffercal:=strtoint(dencode.qt)-strtoint(stringgrid2.Cells[5,strcptgrid2]);
// Remplissage du buffer
//dencode.qt:=inttostr(buffercal);
dencode.serie:=stringgrid2.Cells[1,strcptgrid2]; // nous allons tester cet valeur avec
dencode.description:=stringgrid2.Cells[2,strcptgrid2];
dencode.taille:=stringgrid2.Cells[3,strcptgrid2];
dencode.emplacement:=stringgrid2.Cells[4,strcptgrid2]; // l'emplacement comme cela si il y a plusieur emplacement avec le meme code
dencode.prix:=stringgrid2.Cells[6,strcptgrid2];
dencode.date:=dencode.date;
write(fichier,dencode);
end;


end;


end;
showmessage('numeraux de serie article non trouver');
end;
closefile(fichier);

Winlin

4 réponses

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
29 mars 2005 à 08:41
Hello,



C'est normal ta boucle while ne s'effectue qu'une seule fois car while
(not eof(fichier)) s'arrete à la fin du fichier. Donc tu dois
repositionner le curseur au debut du fichier avant de rentre dans la
boucle while afin de pouvoir le relire. Pour cela utilise la propriété
seek dont voici l'extrait de l'aide delphi :




Déplace la position en cours dans un fichier vers le composant spécifié.



Unité



System



Catégorie



routines d'entrées/sorties



procedure Seek(var F; N: Longint);



Description



Utilisez Seek pour déplacer le curseur à une position spécifiée dans
des fichiers ouverts typés ou non typés. F se déplace vers le numéro de
composant N, dans lequel le premier composant d'un fichier porte le
numéro 0.



Dans la syntaxe ci-dessus, F est une variable fichier typée ou non
typée Le fichier spécifié par F doit être ouvert. N est une expression
de type Longint.



Pour agrandir un fichier, vous pouvez rechercher le composant qui suit
immédiatement celui du dernier composant ; autrement dit,
l'instruction Seek(F, FileSize(F)) déplace la position du curseur en
fin de fichier.



Remarque : {$I+} vous permet de gérer les
erreurs d'exécution à l'aide des exceptions. Si vous utilisez {$I-},
vous devez faire appel à IOResult afin de détecter les erreurs d'E/S.

Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
3
WinLin Messages postés 86 Date d'inscription dimanche 13 février 2005 Statut Membre Dernière intervention 3 septembre 2007
29 mars 2005 à 09:13
Ok franchement j'aurais encore pu chercher longtemps lol j'avais vraiment pas vu cela merci c'est sympas

je suis un cretin ;) franchement merci jmp77
c'est vraiment gentil de ta part merci encore

prochaine fois je ferai la meme chose mais avec interbase
et plus de fichier texte
mais bon on me la demander comme cela je fait ce que l'on me dit
car ce que je fait va devoir tourner sous linux et j'espere pouvoir le faire tourner avec kylix

bref sa fonctionne j'ai encore une petite erreur mais mon stock ce decompte bien c'est parfait merci encore
0
WinLin Messages postés 86 Date d'inscription dimanche 13 février 2005 Statut Membre Dernière intervention 3 septembre 2007
29 mars 2005 à 09:14
for strcptgrid2:=1 to (stringgrid2.RowCount) do
begin


// le while va parcourir tout le fichier de a a z en effectuant le test
while (not eof(fichier)) do
begin
// strcpt variable qui va parcourrir le tableau permettant
// de changer les variables
read(fichier,dencode);
if dencode.serie=stringgrid2.Cells[1,strcptgrid2] {and (dencode.emplacement=stringgrid2.Cells[4,strcptgrid2]) } then
begin
showmessage('passage dans la boucle while valeur '+inttostr(strcptgrid2));
recpos:=filepos(fichier); // si teste ok alors prendre la position du pointeur
seek(fichier,recpos-1); // placement du pointeur sur le record a modifier
buffercal:=strtoint(dencode.qt)-strtoint(stringgrid2.Cells[5,strcptgrid2]);
// Remplissage du buffer
dencode.qt:=inttostr(buffercal);
dencode.serie:=stringgrid2.Cells[1,strcptgrid2]; // nous allons tester cet valeur avec
dencode.description:=stringgrid2.Cells[2,strcptgrid2];
dencode.taille:=stringgrid2.Cells[3,strcptgrid2];
dencode.emplacement:=stringgrid2.Cells[4,strcptgrid2]; // l'emplacement comme cela si il y a plusieur emplacement avec le meme code
dencode.prix:=stringgrid2.Cells[6,strcptgrid2];
dencode.date:=dencode.date;
write(fichier,dencode);
end;


end;
seek(fichier,0);
end;
showmessage('numeraux de serie article non trouver');
end;
closefile(fichier);


Nickel ;)
0
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
29 mars 2005 à 09:27
Heureux d'avoir pu te depanner.



Bonne continuation.


JMP77.
0
Rejoignez-nous