![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FibDataSet быстрая работа
DelphiLexx © (2006-12-06 10:54:00)Проблема следующая. Есть форма с гридом и MainFIBDataSet'ом.Transation = MainFIBTransaction, у которого 4 колонки. Данные в этот грид вносятся не напрямую, а через модальную форму с четырьмя Edit'ами. Все эти четыри Edot'a напрямую с колонками грида не связаны, это сделано за тем, чтобы вводимые пользователем данные в Edit'ы не отображались сразу же в колонках. После нажатия кнопки OK модальной формы выполняется запрос(update или insert) в отдельном TFIBDataSet'e, у которого в качестве транзакции используется такая же транзакия, что и у MainFIBDataSet'ом, а MainTransaction.
После закрытия модального окна внесенные данные сразу в строке грида не отображаются и приходится делать:
MainFIBDataSet.Close;
MainFIBDataSet.Open;
{Становится на предыдущую запись - в KeyValue хранится значения ID пред. запсиси. Я не люблю пользоваться MoveBy или Bookmark'ами}
MainFIBDataSet.Locate(KeyName, KeyValue, [])
Если записей в гриде много ~>10000 MainFIBDataSet.Locate - приводит к торможению.
Поэтому возникает вопрос - как сделать так чтобы данные внесенные в мод. форму сразу после нажатия "OK" отображались в гриде. Все это позволит избежать использования MainFIBDataSet.Close; MainFIBDataSet.Open; MainFIBDataSet.Locate(KeyName, KeyValue, []). Желательно без CacheUpdate так как мои FIBs их не поддерживают должным образом.
iva (2006-12-07 07:13:00) [1]
> > Нет. Должен быть запрос на обновление одной строки.
>
> И как он должен выглядеть.
select * from RAW_DICT WHERE ( ID = :OLD_ID )
где ID - идентификатор строки, ключевое поле, уникальный номер строки ...
DelphiLexx (2006-12-06 18:49:00) [2]
> А что у тебя в DeleteSQL или UpdateSQL?
Ты мне скажи в RefreshSQL каким образом офомляется запрос для обновления одной записи через Update или Select.
Sergey13 (2006-12-06 15:11:00) [3]> [14] DelphiLexx © (06.12.06 14:23)
> [15] DelphiLexx © (06.12.06 14:24)
А что у тебя в DeleteSQL или UpdateSQL?
select * from RAW_DICT - Это запрос на ВСЕзаписи. Модифицируй его для получения 1 конкретнойзаписи.
DelphiLexx (2006-12-06 14:24:00) [4]
> И что в Update
Извеняюсь и что мы пишем в RefreshSql
DelphiLexx (2006-12-06 14:23:00) [5]
> Где наконец твой запрос?
Делам в том, что select у меня выглядит след. образом:
select * from RAW_DICT
И что в Update
Sergey13 (2006-12-06 14:18:00) [6]> [12] DelphiLexx © (06.12.06 14:13)
> И как он должен выглядеть.
Черная строка символов на белом фоне, если настройки делфы не менять.
В ФИБ-ах что, нет генератора этих запросов? Нет справки по ним? Нет примеров?
Нет учебника по SQL, в конце концов?
Где наконец твой запрос?
DelphiLexx (2006-12-06 14:13:00) [7]
> Нет. Должен быть запрос на обновление одной строки.
И как он должен выглядеть.
Sergey13 (2006-12-06 14:07:00) [8]> [10] DelphiLexx © (06.12.06 14:06)
> Получается, что в RefreshSQL я должен запихнуть то же, что
> и в SelectSQL.
Нет. Должен быть запрос на обновление одной строки.
> В итоге получится аналог DataSet.Close, DataSet.Open.
Нет.
DelphiLexx (2006-12-06 14:06:00) [9]
> А не рефрешит -видимо, не задан текст RefreshSQL
Получается, что в RefreshSQL я должен запихнуть то же, что и в SelectSQL.
В итоге получится аналог DataSet.Close, DataSet.Open.
Sergey13 (2006-12-06 13:26:00) [10]> [6] DelphiLexx © (06.12.06 13:15)
А я делал, все нормально. Почему?
Виталий Панасенко (2006-12-06 13:25:00) [11]
> DelphiLexx © (06.12.06 13:15) [6]
>
>
> > Если ты распечатал что-то с экрана, а потом изменил экран,
>
> > распечатка поменяется?
>
> Ну сделал я как ты сказал результат тот же.
>
Значит, не так что-то делаешь. А не рефрешит -видимо, не задан текст RefreshSQL
Виталий Панасенко (2006-12-06 13:24:00) [12]
> DelphiLexx © (06.12.06 11:05) [2]
>
>
> > Зачем. У показываемого датасета есть свои методы Insert,
>
> > Edit и Delete.
>
> А какая разница какой я использую DataSet, главное, что
> это выполняется в одной транзакции.
А при чем тут "одна транзакция" ? Ты ведь в MainFIBDataSet в св-ве SQL-SELECT указал что-то типа SELECT * FROM TABLE_NAME WHERE .... данные считались в кэш MainFIBDataSet и ПОКА ТЫ ВСЕ НЕ ПЕРЕЧИТАЕШЬ, ТО ЭТОТ САМЫЙ MainFIBDataSet ничего не узнает о том, что ты в этой же транзакции добавил(изменил/удалил) данные другим FIBDataSetом. Это одно и тоже(практически) как изменение данных несколькими пользователями...И суть второго DataSetа ?
DelphiLexx (2006-12-06 13:15:00) [13]
> Если ты распечатал что-то с экрана, а потом изменил экран,
> распечатка поменяется?
Ну сделал я как ты сказал результат тот же.
DelphiLexx (2006-12-06 13:15:00) [14]
> MainFIBDataSet.Refresh
Выдает exception, что типа не может сделать Refresh.
Sergey13 (2006-12-06 11:19:00) [15]> [2] DelphiLexx © (06.12.06 11:05)
Если ты распечатал что-то с экрана, а потом изменил экран, распечатка поменяется?
iva (2006-12-06 11:18:00) [16]MainFIBDataSet.Refresh
DelphiLexx (2006-12-06 11:05:00) [17]
> Зачем. У показываемого датасета есть свои методы Insert,
> Edit и Delete.
А какая разница какой я использую DataSet, главное, что это выполняется в одной транзакции.
Sergey13 (2006-12-06 10:58:00) [18]> После нажатия кнопки OK модальной формы выполняется запрос(update
> или insert) в отдельном TFIBDataSet'e
Зачем. У показываемого датасета есть свои методы Insert, Edit и Delete.