Підкажіть як в dbgrid1 відображати тільки частина записів, а при

Підкажіть як в DBGrid1 відображати тільки частина записів, а при

Шановні Майстри Delphi! Підкажіть як в DBGrid1 відображати тільки частина записів таблиці сервера, а при черговому натисканні користувачем на кнопку - відображені записи в DBGrid1 залишалися і додавалися такі n записів цієї таблиці.

Ну так все нормальні компоненти доступу до БД тягнуть з сервера тільки, то що в даний момент видно на екрані.

Як я можу отримати таку компоненту, щоб було видно на екрані в даний момент усі 743 записи, що повернув сервер

Так, але мені необхідно, щоб після того з сервера на клієнт отриманий набір записів і відображений в DBGrid, він залишався, а значення наступного запиту додавалися в DBGrid.
Тобто є таблиця з 100000 записів, після натискання кнопки в DBGrid відображається 50 інтересуемого користувача записів, следуюжій запит до сервера - ще 50, але в DBGrid відображається вже 100 записів і так з кожним наступним натисканням. При цьому з сервера на клієнта надходить по 50.

diokant (18.06.03 16:19)
не використовувати DBGrid

або юзати тимчасову табло, куди зливати дані з сервера (якщо записів по 50 штук :)))


> Як я можу отримати таку компоненту, щоб було видно на екрані в
> Даний момент всі 743 записи, що повернув сервер

Я писав не про це.
На екрані поміщається 20 записів - з сервера перекачуються тільки ці 20 записів.
Технологією стиснення зображення не володію. )))

> Або юзати тимчасову табло, куди зливати дані з сервера
думаю мені не підійде, так як потрібно редагувати дані в DBGrid1.

> Не використовувати DBGrid
Якщо не важко - підкажіть докладніше

diokant (18.06.03 17:55)
Так хоча б стандартний StringGrid, дані зберігаєш в структурі TList + record. Коли необхідно додаєш дані в структуру і таблицю, відловлювати зміни даних в таблі - update "бач запис на сервері.

> top
Якщо не важко - підкажіть докладніше

А чи можна в одному DBGrid відобразити дані не з одного, а з декількох DataSource. Якщо так (і можна б було редагувати) - то думаю це підійшло б.

Шановні Майстри Delphi!
Мені потрібно, витягувати на клієнта записи порціями з однієї таблиці сервера, але так, щоб в DBGrid відображалися записи всіх порцій і будь-яку із записів можна б було редагувати прямо в DBGrid.

Будь ласка, підкажіть, найбільш "красивий" варіант реалізації.


> Diokant (19.06.03 09:46)

Не зовсім зрозуміло все-таки, чому не влаштовує стандартна поведінка TDataSet. Дані в нього і так завантажуються не всі відразу, а саме порціями. Тобто приблизно так:
Є DataSet і підключений до нього DBGrid. Відкриваємо DataSet. Він закачує з сервера стільки записів, скільки видно в гріді. Коли користувач починає переміщатися по записах в гріді, то якщо потрібно показати ще не закачані записи, з сервера закачується нова порція і додається в буфер DataSet "а.

Справа в тому, що клієнт зв'язується з сервером по модемного зв'язку.
Якщо я зроблю запит SELECT * FROM T1 - то запит буде виконуватися довго.
Тому я хочу:
- повідомити кількість записів в таблиці (скажімо 50000)
- користувач формував умова,
- після чого я визначаю кількість записів, які відповідають умові і повідомляю це користувачеві
- якщо користувач хоче побачити ці записи, а число цих записів менше скажімо 100 (100-бо це по часу десь секунд 10), то я відображаю їх в DBGrid (якщо вони не поміщаються на екрані - є вертикальна прокрутка)
- користувач формує нову умову,
- після чого я визначаю кількість записів, які відповідають умові (серед них визначаю кількість вже наявних на клієнті (в DBGrid) і кількість, яка необхідна ще отримати з сервера на клієнта)
- якщо число таких записів менше скажімо 100 (100-бо це по часу десь секунд 10), то я відображаю їх в DBGrid, тобто в DBGrid будуть старі записи + нові підкачані.

Таким чином на клієнті буде безліч записів (всі вони доступні в DBGrid, а якщо вони не поміщаються на екрані - є вертикальна прокрутка), подмножествами якого є безлічі записів, що задовольняє всім умовам, які формував користувач. При цьому користувач має можливість редагувати будь-яку з відображених в DBGrid записів


> Diokant (19.06.03 11:00)

Як я зрозумів, насправді тобі треба, щоб споживач міг бачити (і редагувати в гріді) результат декількох послідовних запитів.
Один з варіантів вирішення: використовувати будь-яку MemoryTable, в яку і зливати результати запитів.

Ще додам: при чому тут вертикальна прокрутка в гріді. Тобі вже неодноразово намагалися сказати (і я спробую ще раз :)), що велика кількість записів в гріді - просто не потрібно. Ну не в змозі нормальна людина працювати відразу з декількома тисячами записів. В ідеалі запит повинен повертати стільки записів, скільки поміщається в видиму частину гріда.

> Як я зрозумів, насправді тобі треба, щоб споживач міг> бачити (і редагувати в гріді) результат декількох> послідовних запитів.
Так.

> Один з варіантів вирішення: використовувати будь-яку MemoryTable,> в яку і зливати результати запитів.
А можна трохи докладніше?


> Diokant (19.06.03 11:57)

Є компоненти, спадкоємці TDataSet, які працюють з даними не в будь-якої БД, а в пам'яті. Я свого часу використовував TRxMemoryTable (можу і помилятися в назві, давно це було), запитай - тобі тут порадять яким краще користуватися і де взяти.
А алгоритм роботи приблизно такий:
Виконується запит. Отриманий в результати цього запиту набір даних записується в MemoryTable. Виконується наступний запит - отриманий набір даних додається до набору в MemoryTable. І т.д.
Для того, щоб відредаговані дані можна було відправити на сервер у цій MemoryTable пишеться обробник, наприклад, OnBeforePost, в якому і виконується запит UPDATE.