Bonjour,
Je ne sais pas si je dois poster ici ou sur Interbase, mais je pense plus à un problème spécifique Delphi.
L'algo suivant est censé sur un dataset comportant un champ 'numero_ligne', décaler les numéros de ligne selon la position où l'on veut insérer.

dans
1,2,3,4,5
si je prévois d'insérer après 3, je dois obtenir :
1,2,3,5,6

Si on fait cet exemple ça marche.

En revanche si je tente d'insérer avant 1, ça boucle indéfiniment.
Le test sur bof est inopérant.

Le pire, c'est que je pense qu'il a dû fonctionner à une époque.

Y a-t-il quelque chose qui pourrait expliquer ça ?
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
 
procedure TDB_piece_client.decaler_lignes(P_Table_Ligne  :  TDataset;
                                          P_nb_lignes    : integer);
Var
 
 L_Numero_Ligne_Initiale:Integer;
 L_Numero_Ligne:Integer;
 
begin
P_table_ligne.DisableControls;
// Récupération du numéro de la ligne d'insertion
L_Numero_Ligne_Initiale:=P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger;
 
// On se place à la fin du recordset
P_Table_Ligne.Last;
// Tant qu'on n'est pas sur la ligne d'insertion
repeat
  if (P_table_ligne.State <> dsEdit) and   (P_table_ligne.State <> dsInsert)
  then
    P_table_ligne.edit;
  L_Numero_Ligne:=P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger;
  // On décale le numéro de ligne du nombre d'insertion désiré
  P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger:=L_Numero_Ligne+P_nb_lignes;
  // on remonte d'une ligne dans la grille
  //P_table_Ligne.MoveBy(-1);
  P_table_Ligne.Prior;
until  (P_Table_Ligne.FieldByName('NUMERO_LIGNE').asinteger < L_Numero_Ligne_Initiale) or
    P_table_ligne.bof;
If Not P_table_ligne.bof
Then
  P_table_Ligne.MoveBy(+1);
P_table_ligne.EnableControls;
end;