Bonjour,
Dans un programme en Delphi 10 qui permet de créer des "bons de retours" et donc de créer des sorties de stock sur des articles :
J'ai cette fonction ci-dessous qui me permet de vérifier dans une grille de type TAdvStringGrid si j'ai un doublon avec le paramètre 'reference' et de vérifier la quantité que l'on peut "sortir" du stock. Elle fonctionne correctement sur les références qui ne contiennent que des chiffres.
Après 3 ans, je viens de tomber sur un cas où la référence de l'article à sortir contient un 'C' en plus des chiffres, et pour laquelle il n'y a qu'1 pièce en stock. La fonction rentre une fois de plus dans la boucle et me compte donc une quantité de trop.
En faisant du pas à pas je vois que loc.X = 7 au 2ème passage, je ne comprends pas pourquoi ! alors que d'habitude avec les références sans lettre on passe de loc.X = 1 à loc.X = -1 et c'est terminé.
Du coup, cela crée un problème car cumulQte = 2 au lieu de cumulQte =1, et on est bloqué s'il ne reste qu'1 pièce en stock.
Voici la fonction :
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
45 function TFormDocument.VerifierQteDoublon(reference : string; quantiteStock : double):boolean; var cumulQte, quantiteASortir, qteStock : double; celCodeLigne : integer; Loc : Tpoint; Fp : TFindParams; Begin result := true; cumulQte := 0; quantiteASortir := 0; Loc := Point(-1, -1); //Fp := [fnMatchRegular]; //Fp := [fnMatchFull]; Fp := [fnMatchCase]; qteStock := quantiteStock; repeat Loc := GrilleLignes.Find(loc, reference, fp); if not ((loc.X = -1) or (loc.Y = -1)) then begin // pour chaque ligne visitée : la qté à tester doit etre la qté saisie, ou la diff de qté saisie si on est en etat = 'M' // il faut donc comparer la qté stockée dans la table des lignes et la qté présente dans la cell pour savoir si elle a changé pour chaque ligne en Modif if Etat = 'M' then begin celCodeLigne := GrilleLignes.Ints[GH('CodeLigne'), loc.Y]; if celCodeLigne > 0 then quantiteASortir := abs(TestDocument.GetQuantiteLigne(celCodeLigne, document) - GrilleLignes.Floats[GH('Qté'), loc.Y]) else begin quantiteASortir := GrilleLignes.Floats[GH('Qté'), loc.Y]; end; end else begin quantiteASortir := GrilleLignes.Floats[GH('Qté'), loc.Y]; end; cumulQte := cumulQte + quantiteASortir; if (cumulQte) > qteStock then begin result := false; end; end; until (loc.X = -1) or (loc.Y = -1); End;
Je vous remercie bien d'avance, si quelqu'un a une idée de ce qui peut bloquer !
Cléo
Partager