| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |