procedure TBSelectIDByBase(ADataSet:TADODataSet;AID:string;Base:integer;var RID:integer);
var
i,j,k:integer;
StSort:string;
begin
k:=1;
ADataSet.DisableControls;
StSort:=ADataSet.Sort;
ADataSet.Sort:=AID+' ASC';
try
i:=ADataSet.RecordCount;
if i=0 then
begin
RID:=base+1;
exit;
end;
ADataSet.Last;
if i=ADataSet.FieldByName(AID).AsInteger-base then RID:=i+base+1
else
if i=0 then RID:=base+1
else
begin
j:=i div 2;
ADataSet.First;
while (j>1)or(j<-1) do
begin
ADataSet.MoveBy(j);
if k+j>i then k:=i
else if k+j<1 then k:=1
else k:=k+j;
if k=ADataSet.FieldByName(AID).AsInteger-base then
j:=abs((j div 2)+(j mod 2))
else j:=-abs((j div 2)+(j mod 2));
end; // while (j>1)or(j<-1)
case j of
-1:begin
while (k<>ADataSet.FieldByName(AID).AsInteger-base)and(k<>1) do
begin
ADataSet.Prior;
dec(k);
end;
if k=ADataSet.FieldByName(AID).AsInteger-base then RID:=k+1+base
else RID:=base+1;
end;{end -1}
1:begin
while (k=ADataSet.FieldByName(AID).AsInteger-base)and(k<>i) do
begin
ADataSet.Next;
inc(k);
end;
if k<>ADataSet.FieldByName(AID).AsInteger-base then RID:=k+base
else RID:=i+1+base;
end;{end 1}
0:if ADataSet.FieldByName(AID).AsInteger=1+base then RID:=2+base
else RID:=1+base;
end;{end case}
end;
finally
ADataSet.Sort:=StSort;
ADataSet.EnableControls;
end;
end;
procedure TBSelectID(ADataSet:TADODataSet; AID:string;var RID:integer);
var
i,j,k:integer;
StSort:string;
begin
k:=1;
ADataSet.DisableControls;
StSort:=ADataSet.Sort;
ADataSet.Sort:=AID+' ASC';
try
i:=ADataSet.RecordCount;
if i=0 then
begin
RID:=0;
exit;
end;
ADataSet.Last;
if i=ADataSet.FieldByName(AID).AsInteger then RID:=i+1
else
if i=0 then RID:=1
else
begin
j:=i div 2;
ADataSet.First;
while (j>1)or(j<-1) do
begin
ADataSet.MoveBy(j);
if k+j>i then k:=i
else if k+j<1 then k:=1
else k:=k+j;
if k=ADataSet.FieldByName(AID).AsInteger then
j:=abs((j div 2)+(j mod 2))
else j:=-abs((j div 2)+(j mod 2));
end;
case j of
-1:begin
while (k<>ADataSet.FieldByName(AID).AsInteger)and(k<>1) do
begin
ADataSet.Prior;
dec(k);
end;
if k=ADataSet.FieldByName(AID).AsInteger then RID:=k+1
else RID:=1;
end;{end -1}
1:begin
while (k=ADataSet.FieldByName(AID).AsInteger)and(k<>i) do
begin
ADataSet.Next;
inc(k);
end;
if k<>ADataSet.FieldByName(AID).AsInteger then RID:=k
else RID:=i+1;
end;{end 1}
0:if ADataSet.FieldByName(AID).AsInteger=1 then RID:=2
else RID:=1;
end;{end case}
end;
finally
ADataSet.Sort:=StSort;
ADataSet.EnableControls;
end;
end;