Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Обновление   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.05 c
3-1101458305
ocean
2004-11-26 11:38
2004.12.26
Репликация MS SQL


14-1101995436
TButton
2004-12-02 16:50
2004.12.26
Internal Server Error задолбаллллллллллллл!!!


14-1102280836
noname:)
2004-12-06 00:07
2004.12.26
Зацените прогу


14-1101337186
OneFragLeft
2004-11-25 01:59
2004.12.26
Музыкальные пристрастия программеров.


4-1100510145
Shc
2004-11-15 12:15
2004.12.26
Изменение ресурсов