Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.032 c
6-1097351939
BigvD.
2004-10-09 23:58
2004.12.26
Proxy & Delphi


14-1101731699
ИМХО
2004-11-29 15:34
2004.12.26
Кто рулит на Земле?


3-1101373424
Инког
2004-11-25 12:03
2004.12.26
table


14-1102104298
SergP
2004-12-03 23:04
2004.12.26
Интерестная штука в Паскале.


3-1101736060
Fedor
2004-11-29 16:47
2004.12.26
MasterSourse в IBDATASET





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский