![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление [D6, D7, IB6.x]
Lexa © (2004-11-28 20:58:00)Я делаю commit, starttransaction и у меня курсор в гриде улетает на первую запись. Поделитесь пожалуйста, как Вы это красиво преодолеваете? Спасибо.
Style (2004-12-01 08:10:00) [1]
> в смысле сложно? Сложно разобраться в TDataSet? Ну уж какой
> есть, все притензии к борланду ;-)
Нет, сложно потому, что DataSet'a уже два и приходится копировать данные из одного в другой.
jack128 (2004-12-01 02:26:00) [2]Style © (30.11.04 22:57) [24]
Так получается достаточно быстро, но очень сложно!
Может есть другие варианты?
в смысле сложно? Сложно разобраться в TDataSet? Ну уж какой есть, все притензии к борланду ;-)
Val (from Donetsk) (2004-11-30 23:55:00) [3]Уходим в сторону. Спасибо что рассказали мне про отбражение данных, но нас интересует совсем не это(вся таблица из трех строчек в память попала или нет). Я говорю о том, что в тех же IBX, для рефреша, обычно используют тот же запрос, что у вас в отдельном квери, то есть рефрешится не весь НД, а определяемые условием записи. Разница лишь в том, что там это свойство компонента и все.
По поводу нужности ID - вы спросили - я ответил на вопрос.Он был общим, не стоит ответ связывать с вашим конкретным случаем.
Style (2004-11-30 23:35:00) [4]
> а при выборке из таблицы - где?
Вы имеете ввиду select from table....?? :) Или что?
В основном информация начитывается постранично. На примере DBGrid - клиент постепенно начитывает только ту информацию, которую мы видим...
> насколько я понимаю, вы используете IBX? то есть, прописав
> в RefreshSQL(или как он там) условие id = :id
Нет MSSQL... условие id = :id
> что вас смущает? скажите, на кой он мне, если я хочу _показать_
> пользователю 3 поля из хз скольки связанных в запросе таблиц?
Так в том то и дело, что какую-либо строку возникнет необходимость изменить. А откуда же взять тогда тот самый :id???
Val (from Donetsk) (2004-11-30 23:18:00) [5]>Style © (30.11.04 23:07) [26]
Вся информация находится в памяти, на клиенте.
а при выборке из таблицы - где?
насколько я понимаю, вы используете IBX? то есть, прописав в RefreshSQL(или как он там) условие id = :id - получите обновление одной записи?
А как вообще можно работать без ID???
что вас смущает? скажите, на кой он мне, если я хочу _показать_ пользователю 3 поля из хз скольки связанных в запросе таблиц?
Style (2004-11-30 23:07:00) [6]
> Так если у вас процедура возвращает также ID записей, то
> какое отличие от работы с таблицами?
Вся информация находится в памяти, на клиенте.
А как вообще можно работать без ID???
Val (from Donetsk) (2004-11-30 23:02:00) [7]Так если у вас процедура возвращает также ID записей, то какое отличие от работы с таблицами?
Style (2004-11-30 22:57:00) [8]
> Val (from Donetsk) (30.11.04 22:23) [23]
> Никак.Придется.
Вся суть в том, что клиент очень часто работает с сортировками в гриде - и для него пришлось сделать все сортировки локально, написав своего наследника DataSet и грид который использует данные возможности.
Но к примеру в одной форме запрос выполнялся и полностью копировался на клиент около 6 секунд. Естественно при обновлении одной строки в гриде, не очень то приятно ждать cтолько времени.
Временно решил проблему так. Сделал еще одну Query'ину (qryRefresh), что бы она возвращала не весь курсор, а одну строку по ID взятого из текущей записи грида. И далее все значения полей этой строки ( Field[n].Value ) я копирую непосредственно в DataSet грида.
Так получается достаточно быстро, но очень сложно!
Может есть другие варианты?
Val (from Donetsk) (2004-11-30 22:23:00) [9]>Style © (30.11.04 22:13) [22]
Никак.Придется.
Style (2004-11-30 22:13:00) [10]
> DrPass © (30.11.04 21:17) [20]
> Как и во всех остальных случаях. См. выше
А у меня такая ситуация. После выполнения запроса, все без исключения данные копируются с сервера на клиент - т.е. мой DataSet не использует постраничное обращение к серверу.
Таким образом если мне необходимо обновить одну строку, мне придется выполнять запрос заново. Как тут быть?
jack128 (2004-11-30 21:24:00) [11]by © (28.11.04 21:15) [2]
Запоминаю bookmark, а после открытия dataset перехожу на запомненый bookmark.
TBookmark.
AFAIK букмарки недействительны после закрытия датасета.
msguns © (30.11.04 18:44) [17]
а что, должен?
Но вообще нафиг эти XXXRetaining'и. Они нужны только если нормально с транзакциями не умешь работать, ИМХО
DrPass (2004-11-30 21:17:00) [12]
> Люди??? А если это MSSQL и в гриде отображаются данные,
> возвращенные хранимой процедурой? Как в таком случае делаете
> "Обновление"?
Как и во всех остальных случаях. См. выше
Style (2004-11-30 20:22:00) [13]Люди??? А если это MSSQL и в гриде отображаются данные, возвращенные хранимой процедурой? Как в таком случае делаете "Обновление"?
DSKalugin (2004-11-30 19:21:00) [14]CommitRetaining
msguns (2004-11-30 18:44:00) [15]>изм (30.11.04 16:38) [16]
>В IBX можно CommitRetain (если не ошибаюсь в синтаксисе) и тогда курсор не улетает
Точно ?
изм (2004-11-30 16:38:00) [16]В IBX можно CommitRetain (если не ошибаюсь в синтаксисе) и тогда курсор не улетает
msguns (2004-11-30 10:50:00) [17]Поспешил, правя. Извиняюсь. Вот исправленный код:
function TDMAlpha.ReOpen_DataSet(DataSet: TDataSet): boolean;
begin
result := true;
Screen.Cursor := crHourGlass;
with DataSet do
begin
DisableControls;
try
if Active then Close;
Open;
if Tag>0 then Locate(Fields[0].FieldName,Tag,[]);
except
result := false;
end;
EnableControls;
end;
Screen.Cursor := crDefault;
end;
msguns (2004-11-30 10:44:00) [18]>Lexa (29.11.04 22:56) [11]
>А если я его не создаю :) и у меня нет индексов :)
>Ну вот нет и все - одна глупая таблица (2 поля), получается надо вводить номер записи - использовать генератор -> лишнии потери в производительности при inserte. Мне нужна быстрая вставка записи.
Если глупая таблица, то и вся прога, видимо, глупая - нечего тогда изгаляться - иди на коньках покатайся с ИМХО
Все таблицы БД должны иметь ID (Исключения есть, но это явно не твой случай) - автоинкремент. Это поле совершенно не "нагружает" ни сервер, ни процессор, а вот работу с датасетами, полученными из этой таблицы, существенно улучшают и ускоряют.
Пример кода, позиционирующего на заданный ID любой НД при переоткрытии (перед вызовом приложение заносит в тэг датасета
идентификатор текущей записи для перепозиционирования. Если позиционировать не надо, то в тэге должен быть 0):
function TDMAlpha.ReOpen_DataSet(DataSet: TADOQuery): boolean;
begin
result := true;
Screen.Cursor := crHourGlass;
with DataSet do
try
if Active then Close;
Open;
if Tag>0 then Locate(Fields[0].FieldName,Tag,[]);
end;
except
result := false;
end;
end;
DrPass (2004-11-29 23:37:00) [19]
> А если я его не создаю :) и у меня нет индексов :)
Создай. Кто тебе мешает?
> получается надо вводить номер записи - использовать генератор
> -> лишнии потери в производительности при inserte. Мне нужна
> быстрая вставка записи.
Как говорят стоматологи - ты ничего не почувствуешь
> >DrPass
> Ключевое поле + Locate - Поясни плиз
Имел в виду то же самое, что и Anatoly Podgoretsky © (29.11.04 11:22) [7]
Перед commit запоминаешь значение первичного ключа, после commit снова открываешь таблицу и с помощью метода Locate перемещаешься на ту запись, которую ты запомнил. Это надежнее bookmark'ов
Lexa (2004-11-29 22:57:00) [20]>DrPass
Ключевое поле + Locate - Поясни плиз