|
Вопрос # 335/ вопрос решён / |
|
Здравствуйте!
IBTable.RecordCount существующей таблицы с множеством записей выдаёт 0!
Я пытаюсь навигацией пройтись по всей таблице и выбрать названия в Combobox, а в итоге в Combobox'е оказывается только первая запись из таблицы?
Наверняка вы сталкивались с этим! Спасибо!
Привожу отрывок кода
Приложение: Переключить в обычный режим- IBTable1.Open;
- IBTable1.First;
-
- for i:=0 to IBTable1.RecordCount -1 Do
-
- Combobox2.Items.Add(IBTable1.FieldByName('NAME').AsString);
- IBTable1.Next;
- End;
- IBTable1.Close;
 |
Вопрос задал: 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|