Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2015, 18:24   #1
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Счастье ADOQuery1.RecordCount показывает неверное количество записей

Подскажите пожалуйста, почему, после выполнения ниже приведенного кода, ADOQuery1.RecordCount возвращает единицу? Хотя в таблице 15 записей.



Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.Close;
  ADOQuery1.Open;

  label1.Caption:=inttostr(ADOQuery1.RecordCount);

end;

Последний раз редактировалось Stilet; 19.01.2015 в 18:34.
Женя32 вне форума Ответить с цитированием
Старый 19.01.2015, 18:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Потому что ADOQuery далеко не всегда может правильно заставить провайдер вернуть кол-во запрошенного, особенно если работает буфферизация, и подкачкой записей по мере необходимости занимается сам провайдер.
Можно попробовать выполнить метод Last, возможно тогда RecordCount пересчитается как полагается, но без гарантии.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.01.2015, 18:41   #3
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Потому что ADOQuery далеко не всегда может правильно заставить провайдер вернуть кол-во запрошенного, особенно если работает буфферизация, и подкачкой записей по мере необходимости занимается сам провайдер.
Можно попробовать выполнить метод Last, возможно тогда RecordCount пересчитается как полагается, но без гарантии.
А причем здесь провайдер, если проект находится на локальном компьютере?
Женя32 вне форума Ответить с цитированием
Старый 19.01.2015, 19:21   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А при том что слово provider многозначимое.
ADO работает с СУБД не само по себе, а посредством передачи команд через некую DLL, называемую "провайдером СУБД". Собственно в настройках ODBC можно подсмотреть список этих DLL.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.01.2015, 20:31   #5
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
Радость

Я извиняюсь, но, я не правильно изложил проблему.

Дело в том, что идет выбор определенной ячейки таблице, для этого используется вот такая конструкция:


PHP код:
      ADOQuery1.Close;
  
ADOQuery1.SQL.Clear;
  
ADOQuery1.SQL.Add('Select MAX(НДата)  from счет');
  
ADOQuery1.Open
Естественно что после этого кода будет одна запись, как вернуть исходное состояния?
Женя32 вне форума Ответить с цитированием
Старый 19.01.2015, 20:51   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как вернуть исходное состояния?
Никак. Либо заново внести запрос в этот компонент, и переоткрыть, либо создать еще один Query и такие вспомогательные запросы делать в нем.
В принципе есть еще один способ - UNION.
Но наверное я не буду о нем рассказывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.01.2015, 21:01   #7
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 621
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Никак. Либо заново внести запрос в этот компонент, и переоткрыть, либо создать еще один Query и такие вспомогательные запросы делать в нем.
В принципе есть еще один способ - UNION.
Но наверное я не буду о нем рассказывать.
Все, спасибо, работает!
Женя32 вне форума Ответить с цитированием
Старый 19.01.2015, 21:25   #8
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Естественно что после этого кода будет одна запись, как вернуть исходное состояния?
MAX
Код:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
  with ADOQueryAgregat do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT MAX(UnitPrice) FROM Order_Details');
    Open;
    Label1.Caption :=  ADOQueryAgregat.Fields.Fields[0].AsString;
  end;
end;
или COUNT
Код:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
  with ADOQueryAgregat do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT COUNT(UnitPrice) FROM Order_Details');
    Open;
    Label1.Caption := 'Количество: '+ ADOQueryAgregat.Fields.Fields[0].AsString;
  end;
end;
Но скажу что DBGridEh все это умеет делать без запроса
Вложения
Тип файла: rar agregat.part1.rar (500.0 Кб, 7 просмотров)
Тип файла: rar agregat.part2.rar (265.7 Кб, 7 просмотров)
xxbesoxx вне форума Ответить с цитированием
Старый 19.01.2015, 22:22   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Но скажу что DBGridEh все это умеет делать без запроса
Умеет, но просто элементарным перебором всех записей датасета. Поэтому и без запроса
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать массив записей в соответствии с заданной структурой. Количество записей не больше 10. zulja Паскаль, Turbo Pascal, PascalABC.NET 0 21.05.2012 07:50
Количество записей в таблице Meri12 SQL, базы данных 1 03.05.2012 00:58
Количество записей в таблице Марк Охман БД в Delphi 2 27.09.2010 14:07
Количество записей в БД artemavd БД в Delphi 10 15.09.2010 11:36
Количество записей в отчете timesoon Microsoft Office Access 4 09.06.2010 01:58