Форум: "Базы";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизInsert в редактируемом TIBQuery Найти похожие ветки
← →
MsGuns (2003-10-02 12:06) [0]Есть задача выборки из БД данных для последующего из редактирования без сохранения в самой БД (сложный отчет, для подготовки которого надо часть записей модифицировать программно, а кое-какие столбцы давать заполнять узеру)
Положил в проект TIBQuery+TIBUpdateSQL. Просписал все нужные свойства как надо, выоложил датасет в грид и все O`k. Т.е. можно редактить записи и удалять. А вот при вставке... Новая запись после того, как "постится", улетает совершенно не туда, где была вставлена. Пробовал из запроса выкинуть ORDER BY, результат тот же. В чем проблема ? Я уже решил перепахать на клиентский датасет, а потом подумал, что может кто знает, где ручки пошалили
Заранее благодарен за помощь и советы.
← →
Deniz (2003-10-02 12:42) [1]Я предлагал использовать TClientDataSet но ...
Вроде как не получается с IBQuery :(
← →
Johnmen (2003-10-02 12:55) [2]Серега, попробуй тогда использовать TIBDataSet.
← →
Sergey_Masloff (2003-10-02 12:59) [3]Johnmen © (02.10.03 12:55) [2]
>Серега, попробуй тогда использовать TIBDataSet.
А чем поможет IBDataSet? Все равно же записи отсортированы если нет ORDER BY то по PRIMARY KEY. И никуда от этого не уйти. Вроде бы?
← →
MsGuns (2003-10-02 13:08) [4]>Johnmen © (02.10.03 12:55) [2]
>Серега, попробуй тогда использовать TIBDataSet.
Что-то мне шепчет, что один хрен..
>Sergey_Masloff (02.10.03 12:59) [3]
>Все равно же записи отсортированы если нет ORDER BY то по PRIMARY KEY. И никуда от этого не уйти. Вроде бы?
Какой же к лешему PRIMARY у "салатного" НД (в смысле собранного из 7 таблиц). Но даже если он (TIBQuery), сволочь такая неявно под ключ рядит самое первое в перечне запроса поля, то ведь ни фига ж не упорядочивает по этому полю-то ! Я сразу допетрил было, что соль в этом поле и во вставляемой записи в него пишу че надо (в смысле чтоб запись осталась там, где я ее вставил), а она (запись) улетает хрен знает куда, в область совершенно других значений этого поля. Причем закономерности никакой ! Может "прыгнуть" через 10 записей, а может через 20. Но есть одна примета: каждая последующая добавленная запись находится ниже предыдущей добавленной.
--------------------------------------------------------------------------------
← →
Sergey_Masloff (2003-10-02 13:15) [5]>Может "прыгнуть" через 10 записей, а может через 20
А прыгает в "середину" датасета? Ну то есть не последней вставляется? А прыгает всегда "вперед"?
← →
MsGuns (2003-10-02 13:19) [6]>Sergey_Masloff (02.10.03 13:15) [5]
>А прыгает в "середину" датасета? Ну то есть не последней вставляется? А прыгает всегда "вперед"?
Да. Да. Да.
← →
Sergey_Masloff (2003-10-02 14:06) [7]Так. А не прыгает ли он в место перед записью которая была на экране (в гриде) последней на момент вставки?
← →
Deniz (2003-10-02 14:40) [8]Мож все таки TClientDataSet? А если интересно с IBQuery и т.д., так потом разберешься и расскажешь, только вот есть у меня смутное подозрение ...
← →
MsGuns (2003-10-02 16:11) [9]>Sergey_Masloff (02.10.03 14:06) [7]
Значицца так:
Исходные данные: НД больше 100 записей. Ключ назовем условно ID
В гриде отображается за раз 11 (по моему, это серобурофиолетово)
Последовательно делаю 3 вставки. Все время жму инсерт на 2-й записи (т.е. вставка как вторая строка грида и вторая запись НД)
Результат.
1-я вставленная запись "становится" 12-й
2-я вставленная запись "становится" 17-й
3-я вставленная запись "становится" 28-й
4-я вставленная запись "становится" 39-й (???!!! - интересно)
Щас поменяю размер грида...
>Deniz © (02.10.03 14:40) [8]
>Мож все таки TClientDataSet? А если интересно с IBQuery и т.д., так потом разберешься и расскажешь, только вот есть у меня смутное подозрение ...
Да я уже начал с клиентским ;(( А что за подозрения, расскажи, если не в лом ;))
← →
MsGuns (2003-10-02 16:24) [10]Удлиннил грид до 26 строк. Закономерность та же:
1 -> 26
2 -> 53
3 -> 80
4 -> 105
И т.д., когда записи НД заканчиваются, она просто делает аппенд в конец. При этом абсолютно фиолетово в каком месте страницы (видимой части грида) я делаю инсерт. Всегда она выносит новую запись за границы экрана ! Что это ? Фича грида ? датасорса ? интербэйзных компонент доступа ? Но как TIBQuery узнает, какой по порядку строкой грид отображает его запись ?
← →
Sergey_Masloff (2003-10-02 17:01) [11]MsGuns © (02.10.03 16:24) [10]
При соединении с гридом датасет фетчит только сколько записей видно на экране! То есть в буфере 11 записей он в конец буфера вставляет. Такая моя ИМХА. Нет, то что фетчится только сколько видно на экране это я знаю, остальное - предполагаю. Буду думать дальше.
← →
Vemer (2003-10-02 18:25) [12]Мой вариант решения.
Создать временную таблицу с индексом, отвечающим за сортировку, вставлять и по необходимости менять положение строки. При вставке строки можно считывать номер следующей и увеличивать сортироавочный индекс всех последующих на 1, тогда строка встанет после вставки куда надо.
← →
MsGuns (2003-10-02 19:03) [13]>Vemer © (02.10.03 18:25) [12]
Я так и делал до определенного момента. Но когда кол-во сложных отчетов перевалило за десяток, понял, что хватит. К тому же я не знаю, как в IB создать временную (именно временную, а не внешнюю)таблицу.
← →
Deniz (2003-10-03 06:48) [14]Пробовал я с IBQuery, так на тестовом примере, ни ... чего не получилось. Хранятся все изменения в локальном буфере, причем похоже его просто так не перестроишь. В книге "Мир Interbase", написано, что только в FIBPlus реальзован метод Insert! IBX.Insert работает как Append (если я только не ошибся).
А вот с CDS получилось за пару минут :)
← →
Sergey_Masloff (2003-10-03 15:23) [15]Вобщем, все как я сказал. При записи данных они пишутся в кэш. Это делается так:
1) IBX знает размер буфера под 1 запись
2) IBX знает указатель на кэш
3) IBX знает сколько записей в кеше
4) IBX умножает число записей (не всего а сколько уже закешировано - то есть например сколько виднов DBGrid) умножает на размер буфера 1 записи. Получает размер занятого кэша.
5) Берет указатель на кэш и смещается от него на размер кэша (в конец).
6) Пишет туда буфер новой записи (вставленой)
то есть ВСЕГДА в конец. см. TIBCustomDataSet.WriteCache и так далее.
Вывод: Сергей, тебя спасет FIBPlus или ClientDataSet. Я думаю овчинка переписывания механизма кэширования IBX не стоит выделки. Это мое мнение независимого эксперта ;-)
← →
MsGuns (2003-10-03 15:58) [16]>Sergey_Masloff (03.10.03 15:23) [15]
Спасибо, Серега, за такое глубокое исследование ;))
Я и так уже осваиваю TCliantDataSet, но вчера вечеруом все же попробовал фокус с гридом в одну запись. Т.е. идея такова:
есть обычный грид (у меня в 11 строк). Для программной модификации НД (а вставки делаются прогой, что-то типа итоговых записей по группам) я высоту грида уменьшаю до вмещающей только одну строку, а потом делаю всю эту кухню. Ну и в конце восстанавливаю грид. Первые 2 группы - все нормалек, а потом то нормально, то через-пень-колода. Короче, кинул я это безнадежное дело на фигушки ;))))
Но за участие огромное спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c