Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лечим прокрутку для ADODataSet с clUseServer 
:(
    Опции темы
Чучмек
Дата 10.3.2013, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 1
Всего: 41



Если использовать серверный курсор, прокрутка имеет всего три позиции - начало,конец, и посредине( сдвиг на страницу).
Пришлось разобраться с серверным курсором.
Это замена, для постраничной, выборки от мелкософта. 
Отсутствие LIMIT, было для меня большим разочарованием в MS SQL
Разбираясь с прокруткой нашел следующие
DBGrids
Код

procedure TCustomDBGrid.UpdateScrollBar;
var
  SIOld, SINew: TScrollInfo;
begin
...
    with FDatalink.DataSet do
    begin
...
      if IsSequenced then
      begin
        SINew.nMin := 1;
        SINew.nPage := Self.VisibleRowCount;
        SINew.nMax := Integer(DWORD(RecordCount) + SINew.nPage - 1);
        if State in [dsInactive, dsBrowse, dsEdit] then
          SINew.nPos := RecNo;  // else keep old pos
      end
      else
      begin
        SINew.nMin := 0;
        SINew.nPage := 0;
        SINew.nMax := 4;
        if FDataLink.BOF then SINew.nPos := 0
        else if FDataLink.EOF then SINew.nPos := 4
        else SINew.nPos := 2;
      end;
...
end;

и
ADODB
Код

function TCustomADODataSet.IsSequenced: Boolean;
begin
  Result := Assigned(RecordSet) and Recordset.Supports(adApproxPosition) and
    (CursorLocation <> clUseServer) and not Filtered;
end;

Переопределяем IsSequenced
Код

function TMyAdoTable.IsSequenced: Boolean;
begin
if (CursorLocation=clUseServer) and (CursorType=ctKeyset)then result:=true else
 result:= inherited IsSequenced;
end;

Запускаем. Тревожное ожидание. Подозрительная задержка. Но вот появляется...
О чудо!!! Нормальная прокрутка!!!  
Смотрим сколько данных было получено...
Восторг пропадает. Грузилось так, как если бы вся таблица целиком.   
Ищем причину. smile  smile  smile  smile smile  
Причина кроется в вызове метода Get_RecordCount интерфейса Recordset15. smile smile  smile 
Легко проверить посмотрев сколько времени выполняется вызов  GetRecordCount ( и сколько при этом подгружается данных).
Возможно в другой версии Microsoft ActiveX Data Objects Library эта проблема устранена.
Поскольку определить число строк в курсоре, при работе с курсором  средствами TSQL, очень просто (переменная @@CURSOR_ROWS после открытия курсора).
Я пойду на хитрость. Переопределю GetRecordCount.
Код

function TMyAdoTable.GetRecordCount: Integer;
var
 n:olevariant;
begin
if (CursorLocation=clUseServer) and (CursorType=ctKeyset)then
 begin
 n:=Recordset.AbsolutePosition;
 Recordset.MoveLast;
 result:=Recordset.AbsolutePosition;
 Recordset.AbsolutePosition:=n ;
 end
 else result:=inherited GetRecordCount;
end;



Код

TMyAdoTable=class(TADOTable)
 protected
  function IsSequenced: Boolean; override;
  function GetRecordCount: Integer; override;
 end;


 smile  smile  smile  smile  smile  smile  smile  smile  smile 



Это сообщение отредактировал(а) Чучмек - 10.3.2013, 14:53


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Illusion Dolphin
Дата 10.3.2013, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 2
Всего: 63



Цитата

Отсутствие LIMIT, было для меня большим разочарованием в MS SQL

В MS SQL есть TOP, ROW_NUMBER ( ) и другие примочки


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Чучмек
Дата 10.3.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 1
Всего: 41



TOP это TOP - первые n записей.
Все остальное, кроме курсора - костыли.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.