Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.08 c
3-74026
stoper
2003-10-03 13:17
2003.10.23
Фильтр Query


1-74121
BillyJeans
2003-10-11 12:22
2003.10.23
Фоновый рисунок для ListBox и ListView


14-74424
ИМХО
2003-10-05 10:02
2003.10.23
Кто помнит песню и исполнителя?


14-74472
Ренат
2003-10-06 16:03
2003.10.23
Подскажите как ограничить пользователю доступ в интернет


7-74498
Zilog
2003-08-08 16:42
2003.10.23
Пытаюсь записать в COM порт.... Нихрена не выходит.....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский