WinLin
Messages postés86Date d'inscriptiondimanche 13 février 2005StatutMembreDernière intervention 3 septembre 2007
-
29 mars 2005 à 06:36
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDerniè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);
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 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.
WinLin
Messages postés86Date d'inscriptiondimanche 13 février 2005StatutMembreDerniè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
WinLin
Messages postés86Date d'inscriptiondimanche 13 février 2005StatutMembreDerniè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);