Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление [D6, D7, IB6.x]


Страницы:   1 2

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 - Поясни плиз


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо