Страница 1 из 1
insert в IbDataSet
Добавлено: 03 апр 2006, 19:42
slisebo
Ситуация такая:
в dbgrid происходит редактирование содержимого IbDataSet.
Проблема заключается в том, что после сохранения(post) новой записи(insert),
эта новая запись оказывается не в том месте, куда была вставлена-что есть очень неудобно.
Проблема оказалась зашита в самом компоненте.
Может, кто-нибудь в курсе, как такое лечится?
Данная проблема не набюдается в FibPlus, но както влом из-за такого пустяка его покупать.
Добавлено: 03 апр 2006, 20:12
kdv
запись отправляется на сервер, и "втыкается" в клиентский буфер. IBDataSet понятия не имеет, отсортированные по какому критерию он вычитывает записи. Поэтому и не может знать, что в твоем представлении "правильное место".
FIBPlus я не помню как это делает, но наверняка парсингом запроса selectSQL, что не всегда возможно. Или, там есть спец. свойства, которые позволяют указать в каком порядке надо сортировать буфер.
Во всех остальных случаях чтобы запись попала в "нужное место", надо перевыполнить selectSQL, то есть закрыть и открыть IBDataSet. Но это - увеличивает трафик, и может быть медленно (в зависимости от запроса). Кроме того, придется запоминать bookmark записи, опять же, если это возможно (запрос выбирает первичный ключ, и не является группировкой и т.п.).
Вот такие пироги. "Проблема" эта старая, и если вести речь не о запросах select * from table, по-моему нерешаемая (без переоткрытия датасета).
Можно использовать TClientDataSet, который сам сортирует, и соответственно правильно управляет буфером. но это, опять же, если insert идентичен выбираемым столбцам, а это не всегда так. Еще якобы как-то можно в буфер ClientDataSet втыкать записи самому. Глянь на ibase.ru, Документация, там я собрал ряд статей на английском по clientdataset.
Добавлено: 04 апр 2006, 13:12
slisebo
Я говорю про сортировку после вставки записи во внутреннем буфере в самом компоненте IBDataSet.
Механизм его примерно следующий:
во время вставки номер новой записи := количеству записей во внутреннме буфере
после Post, соответственно, новая запись оказывается забрасывается в соответствующее место в этом буфере, т е совсем не в том месте, куда она вставлялась.
т е, например, мы имеем на клиенте отсортированный (или нет) набор записей.
пользователь хочет вставить несколько новых записей.
Вставляет первую между Rec#1 и Rec#2 -во время редактирования он видит, что она вставляется МЕЖДУ ними. Затем нажимает, например, "сохранить". Программно: поисходит расчет соотв. первичного ключа, всякие доп проверки(например, на дублирование значений), выполнение запроса InsertSQL(с введенными параметрами)- все корректно. но перечитывание ВСЕХ записей не происходит(встроенно происходит обновление только текущей записи).
Теперь сама суть проблемы: курсор остается на НОВОЙ записи но ПОСЛЕ записи REC#2, а не перед ней, как она вводилась.
Добавлено: 04 апр 2006, 13:23
kdv
так ibx работает... новые записи в конец буфера добавляет.
Добавлено: 04 апр 2006, 13:25
slisebo
вот я и интересуюсь: есть ещё возможность это побороть, кроме того, как перечитывать ВСЕ записи заново?
Добавлено: 04 апр 2006, 13:33
Merlin
Переписать часть кода IBX. Это же такой пустяк, и код открытый.