Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 335

/ вопрос решён /

Здравствуйте!
IBTable.RecordCount существующей таблицы с множеством записей выдаёт 0!

Я пытаюсь навигацией пройтись по всей таблице и выбрать названия в Combobox, а в итоге в Combobox'е оказывается только первая запись из таблицы?
Наверняка вы сталкивались с этим! Спасибо!
Привожу отрывок кода

Приложение:
  1. IBTable1.Open;
  2. IBTable1.First;
  3.  
  4. for i:=0 to IBTable1.RecordCount -1 Do
  5.  
  6. Combobox2.Items.Add(IBTable1.FieldByName('NAME').AsString);
  7. IBTable1.Next;
  8. End;
  9. IBTable1.Close;


RedMask Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: RedMask (статус: Посетитель)
Вопрос отправлен: 22 февраля 2007, 09:14
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович

Здравствуйте, RedMask!
Сделайте
while not(IBTable1.EOF) do
или
IBTable1.Last;
rc:=IBTable1.RecordCount;
IBTable1.First;
for i:=0 to rc do

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Время отправки: 22 февраля 2007, 09:52
Оценка за ответ: 5

Комментарий к оценке: Спасибо! Теперь сделаю!
Но всё таки, интересно, почему так?

Ответ #2. Отвечает эксперт: ANBsoft

Можно еще дать команду FetchAll после открытия датасета. Это особенность работы компонентов - чтобы не перегружать себя ненужными данными (особенно при больших таблицах и работе по сети), компонент выбирает данные по мере надобности (по команде Next или аналогичной), а FetchAll или Last заставляет загрузить все данные из таблицы или запроса.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 22 февраля 2007, 11:00
Оценка за ответ: 5

Комментарий к оценке: После вашего ответа прочитал про комманду FetchAll! Много нового и интересного, очень благодарен

Ответ #3. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, RedMask!
Если брать Ваш код то правильнее сделать так.
Компонент IBTable хранит данные набора в кэше и
обновление набора данных в кэше опрежделяется выполнением транзакции.
if IBTransaction1.Active then IBTransaction1.Commit;
IBTransaction1.StartTransaction;
IBTable1.Active:=true;
ShowMessage(inttostr(IBTable1.RecordCount));
if not IBTable1.IsEmpty then
begin
IBTable1.First;
while not IBTable1.eof do
begin
ComboBox2.Items.Add(IBTable1.FieldByName('NAME').AsString);
IBTable1.Next;
end;
IBTable1.Active:=false;
Смею предположить что кроме извлечения данных вы пытались ещё что-то занести в таблицу. По рекомендации Borland компонент IBTable рекомендуется использовать только для неизменяемых наборов данных, все изменяемые наборы данных используют компонент TIBQuery
Удачи!

Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 22 февраля 2007, 11:05
Оценка за ответ: 5

Комментарий к оценке: Спасибо, про транзакцию не знал) Про изменения набора данных тоже в первый раз слышу! :-)

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 22 февраля 2007, 10:44; участников в обсуждении: 1.
Помфюк Владимир Степанович

Помфюк Владимир Степанович (статус: Абитуриент), 22 февраля 2007, 10:44 [#1]:

Потому что по-умолчанию записи не кешируются и Вам IBTable честно отвечает "вижу 1 запись". Если таблицу связать с Grid'ом - будет немного больше. Память берегут.

31 января 2011, 19:22: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.02 сек.