Шли годы и я нашел как можно сделать Requery без потери позиции и без создания дурацих циклов. Собственно в Delphi даже 7 все уже давно есть.
Код очень простой:
position2:=GetScrollPos(Form1.DBGridEh1.Handle, SB_VERT); //поза таблицы
position:=Form1.ADODataSet1.GetBookmark; //поза указателя
Form1.ADODataSet1.Requery(); //запрос
Form1.ADODataSet1.GotoBookmark(position); //вернем позу указателя
SetScrollPos(Form1.DBGridEh1.Handle, WM_VSCROLL, position2, True); // вернем позу таблицы
Тут есть важный момент, положение таблицы и указателя – это разные вещщи. С каждой работать в отдельности. Вообще этот код очень некрасив нет что не проверяет разного рода исключений, а надо бы, тем более если мы меняем сортировки, удаляем или фильтруем БД. А если просто апдейтим то можно и так.