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