Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизОбновление Найти похожие ветки
← →
Lexa (2004-11-28 20:58) [0]Я делаю commit, starttransaction и у меня курсор в гриде улетает на первую запись. Поделитесь пожалуйста, как Вы это красиво преодолеваете? Спасибо.
← →
Anatoly Podgoretsky © (2004-11-28 21:07) [1]Перейди после этого на ту, на которую хочешь.
← →
by © (2004-11-28 21:15) [2]Запоминаю bookmark, а после открытия dataset перехожу на запомненый bookmark.
TBookmark.
← →
Lexa (2004-11-28 21:17) [3]>by
а если пояляются записи - все ок?
← →
Lexa (2004-11-28 21:29) [4]если не трудно - бросьте кусок кода
← →
Ярослав (2004-11-28 21:33) [5]Это не всегда помогает, если другой пользователь в этот момент удалит несколько записей включая ту на которой стоял курсор, т.е. был запомнен bookmark, то после такого обновления перед глазами пользователя может оказаться совершенно другая часть grid-а
← →
Lexa (2004-11-28 21:36) [6];) я об этом догадывался.
← →
Anatoly Podgoretsky © (2004-11-29 11:22) [7]by © (28.11.04 21:15) [2]
Забудь об bookmark как об дурном дне, для этого предназначены ключи.
← →
Lexa (2004-11-29 22:18) [8]>Anatoly Podgoretsky [7]
можно по подробней, что за ключи?
← →
Anatoly Podgoretsky © (2004-11-29 22:49) [9]Первичный ключ таблицы
← →
DrPass © (2004-11-29 22:53) [10]Ключевое поле + Locate
← →
Lexa (2004-11-29 22:56) [11]Primary key?
А если я его не создаю :) и у меня нет индексов :)
Ну вот нет и все - одна глупая таблица (2 поля), получается надо вводить номер записи - использовать генератор -> лишнии потери в производительности при inserte. Мне нужна быстрая вставка записи.
← →
Lexa (2004-11-29 22:57) [12]>DrPass
Ключевое поле + Locate - Поясни плиз
← →
DrPass © (2004-11-29 23:37) [13]
> А если я его не создаю :) и у меня нет индексов :)
Создай. Кто тебе мешает?
> получается надо вводить номер записи - использовать генератор
> -> лишнии потери в производительности при inserte. Мне нужна
> быстрая вставка записи.
Как говорят стоматологи - ты ничего не почувствуешь
> >DrPass
> Ключевое поле + Locate - Поясни плиз
Имел в виду то же самое, что и Anatoly Podgoretsky © (29.11.04 11:22) [7]
Перед commit запоминаешь значение первичного ключа, после commit снова открываешь таблицу и с помощью метода Locate перемещаешься на ту запись, которую ты запомнил. Это надежнее bookmark"ов
← →
msguns © (2004-11-30 10:44) [14]>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;
← →
msguns © (2004-11-30 10:50) [15]Поспешил, правя. Извиняюсь. Вот исправленный код:
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;
← →
изм (2004-11-30 16:38) [16]В IBX можно CommitRetain (если не ошибаюсь в синтаксисе) и тогда курсор не улетает
← →
msguns © (2004-11-30 18:44) [17]>изм (30.11.04 16:38) [16]
>В IBX можно CommitRetain (если не ошибаюсь в синтаксисе) и тогда курсор не улетает
Точно ?
← →
DSKalugin © (2004-11-30 19:21) [18]CommitRetaining
← →
Style © (2004-11-30 20:22) [19]Люди??? А если это MSSQL и в гриде отображаются данные, возвращенные хранимой процедурой? Как в таком случае делаете "Обновление"?
← →
DrPass © (2004-11-30 21:17) [20]
> Люди??? А если это MSSQL и в гриде отображаются данные,
> возвращенные хранимой процедурой? Как в таком случае делаете
> "Обновление"?
Как и во всех остальных случаях. См. выше
← →
jack128 © (2004-11-30 21:24) [21]by © (28.11.04 21:15) [2]
Запоминаю bookmark, а после открытия dataset перехожу на запомненый bookmark.
TBookmark.
AFAIK букмарки недействительны после закрытия датасета.
msguns © (30.11.04 18:44) [17]
а что, должен?
Но вообще нафиг эти XXXRetaining"и. Они нужны только если нормально с транзакциями не умешь работать, ИМХО
← →
Style © (2004-11-30 22:13) [22]
> DrPass © (30.11.04 21:17) [20]
> Как и во всех остальных случаях. См. выше
А у меня такая ситуация. После выполнения запроса, все без исключения данные копируются с сервера на клиент - т.е. мой DataSet не использует постраничное обращение к серверу.
Таким образом если мне необходимо обновить одну строку, мне придется выполнять запрос заново. Как тут быть?
← →
Val (from Donetsk) (2004-11-30 22:23) [23]>Style © (30.11.04 22:13) [22]
Никак.Придется.
← →
Style © (2004-11-30 22:57) [24]
> 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 23:02) [25]Так если у вас процедура возвращает также ID записей, то какое отличие от работы с таблицами?
← →
Style © (2004-11-30 23:07) [26]
> Так если у вас процедура возвращает также ID записей, то
> какое отличие от работы с таблицами?
Вся информация находится в памяти, на клиенте.
А как вообще можно работать без ID???
← →
Val (from Donetsk) (2004-11-30 23:18) [27]>Style © (30.11.04 23:07) [26]
Вся информация находится в памяти, на клиенте.
а при выборке из таблицы - где?
насколько я понимаю, вы используете IBX? то есть, прописав в RefreshSQL(или как он там) условие id = :id - получите обновление одной записи?
А как вообще можно работать без ID???
что вас смущает? скажите, на кой он мне, если я хочу _показать_ пользователю 3 поля из хз скольки связанных в запросе таблиц?
← →
Style © (2004-11-30 23:35) [28]
> а при выборке из таблицы - где?
Вы имеете ввиду select from table....?? :) Или что?
В основном информация начитывается постранично. На примере DBGrid - клиент постепенно начитывает только ту информацию, которую мы видим...
> насколько я понимаю, вы используете IBX? то есть, прописав
> в RefreshSQL(или как он там) условие id = :id
Нет MSSQL... условие id = :id
> что вас смущает? скажите, на кой он мне, если я хочу _показать_
> пользователю 3 поля из хз скольки связанных в запросе таблиц?
Так в том то и дело, что какую-либо строку возникнет необходимость изменить. А откуда же взять тогда тот самый :id???
← →
Val (from Donetsk) (2004-11-30 23:55) [29]Уходим в сторону. Спасибо что рассказали мне про отбражение данных, но нас интересует совсем не это(вся таблица из трех строчек в память попала или нет). Я говорю о том, что в тех же IBX, для рефреша, обычно используют тот же запрос, что у вас в отдельном квери, то есть рефрешится не весь НД, а определяемые условием записи. Разница лишь в том, что там это свойство компонента и все.
По поводу нужности ID - вы спросили - я ответил на вопрос.Он был общим, не стоит ответ связывать с вашим конкретным случаем.
← →
jack128 © (2004-12-01 02:26) [30]Style © (30.11.04 22:57) [24]
Так получается достаточно быстро, но очень сложно!
Может есть другие варианты?
в смысле сложно? Сложно разобраться в TDataSet? Ну уж какой есть, все притензии к борланду ;-)
← →
Style © (2004-12-01 08:10) [31]
> в смысле сложно? Сложно разобраться в TDataSet? Ну уж какой
> есть, все притензии к борланду ;-)
Нет, сложно потому, что DataSet"a уже два и приходится копировать данные из одного в другой.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.033 c