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

Вниз

Как получить данные из DataSet не меняя его активную запись.   Найти похожие ветки 

 
Бездомный   (2011-12-05 12:35) [0]

Желательно с поиском по ключевому полю.

Пока сделал так, но, чувствую, можно сделать как-то быстрее, элегантнее, что ли:

  IDField := List.DataController.KeyField;
  IDValue := Node.KeyValue;

   DL := TDataLink.Create;
   try
     DL.DataSource := List.DataController.DataSource;
     DL.ReadOnly := True;

     Row := DL.ActiveRecord;
     try
       for I := 0 to Pred(DL.RecordCount) do
       begin
         DL.ActiveRecord := I;
         if DL.DataSet.FieldByName(IDField).Value = IDValue then
         begin
           Result := DL.DataSet.FieldByName(FieldName).Value;
           Break;
         end;
       end;
     finally
       DL.ActiveRecord := Row;
     end;
   finally
     DL.Free;
   end;


 
Медвежонок Пятачок ©   (2011-12-05 12:53) [1]

если б было можно получить данные не меняя активную строку, то, я думаю, возможно было бы получить данные вообще не открывая датасета.


 
Димка На   (2011-12-05 12:54) [2]


> Медвежонок Пятачок ©   (05.12.11 12:53) [1]

Ну а как это TDBGrid делает?


 
Jeer ©   (2011-12-05 12:56) [3]

Ему открыть второй датасет религия не позволяет.


 
Медвежонок Пятачок ©   (2011-12-05 12:56) [4]

Ну а как это TDBGrid делает?

А он это делает?


 
Jeer ©   (2011-12-05 12:57) [5]


> Ну а как это TDBGrid делает?


Он вообще ничего не делает, кроме отображения из датасета.


 
Димка На   (2011-12-05 12:57) [6]


> А он это делает?

А разве нет? Активная строка одна, а он при прорисовке показывает все.


 
Димка На   (2011-12-05 12:58) [7]


> Ему открыть второй датасет религия не позволяет.

Предлагаете открывать такой-же датасет и работать с ним?


 
Медвежонок Пятачок ©   (2011-12-05 13:01) [8]

А разве нет? Активная строка одна, а он при прорисовке показывает все.

Конечно нет.


 
OW ©   (2011-12-05 13:03) [9]

в ADO есть Clone, если это ADO


 
Anatoly Podgoretsky ©   (2011-12-05 13:03) [10]


> А разве нет? Активная строка одна, а он при прорисовке показывает
> все.

Не может быть!


 
Димка На   (2011-12-05 13:04) [11]


> Конечно нет.

А как тогда?


> OW ©   (05.12.11 13:03) [9]
> в ADO есть Clone, если это ADO

ADO, ADO, при этом все данные в памяти будут скопированы?


 
Медвежонок Пятачок ©   (2011-12-05 13:06) [12]

А как тогда?

Любая видимая в гриде строка как минимум один раз была текущей в датасете после его открытия.

Или тебе удобнее думать, что грид обладает магией и телепатией?


 
Плохиш ©   (2011-12-05 13:06) [13]


> Димка На   (05.12.11 13:04) [11]
>
> > Конечно нет.
>
> А как тогда?
>

Создай событие OnDataChange, поставь в нëм точку останова и удивись.


 
Ega23 ©   (2011-12-05 13:08) [14]


var
 bm: TBookmark;

with DataSet do
begin
 if IsEmpty then Exit;
 DisableControls;
 try
   bm := GetBookmark;
   try
     First;
     while not Eof do
     begin
       // Вот тута проверяем, чо за запись и подходит она нам или нет.
       Next;
     end;
     GotoBookmark(bm);
   finally
     FreeBookmark(bm);
   end;
 finally
   EnableControls;
 end;
end;


 
OW ©   (2011-12-05 13:08) [15]


> ADO, ADO, при этом все данные в памяти будут скопированы?

да


 
Димка На   (2011-12-05 13:12) [16]


> Или тебе удобнее думать, что грид обладает магией и телепатией?

Хотелось бы.


> Создай событие OnDataChange, поставь в нëм точку останова
> и удивись.

Интересно получается.
Например, взять не грид, а TcxDBTreeList, который в данном случае - то же самое. Ставлю на OnDataChange его DataSource точку останова, запускаю. Останов 2 раза, а строк, которые отображает контрол несколько сотен. Какой отсюда вывод?


 
Димка На   (2011-12-05 13:13) [17]


> Ega23 ©   (05.12.11 13:08) [14]

Спасибо. Я так понимаю это "православный"  вариант?


 
Медвежонок Пятачок ©   (2011-12-05 13:13) [18]

Какой отсюда вывод?

вывод простой: ты наивный и неискушенный человек.


 
OW ©   (2011-12-05 13:16) [19]

давно бы написал
ADODS2.Clone(ADODS1); да посмотрел.
не знаю как реализовано, но внешне как ты описал

дергается вот это
Recordset20 = interface(Recordset15)
function Clone(LockType: LockTypeEnum): _Recordset; safecall;


 
Димка На   (2011-12-05 13:20) [20]


> OW ©   (05.12.11 13:16) [19]
> давно бы написал
> ADODS2.Clone(ADODS1); да посмотрел.
> не знаю как реализовано, но внешне как ты описал
>

Я уже попробовал - работает, но совесть мучает факт копирования данных. Хотя, может они и не копируются, а просто ссылка на них добавляется. Почитаю еще.


 
Ega23 ©   (2011-12-05 13:21) [21]


> Спасибо. Я так понимаю это "православный"  вариант?


Я антихристианин, посему мне обидны ваши слова.


 
Димка На   (2011-12-05 13:25) [22]


> Я уже попробовал - работает, но совесть мучает факт копирования
> данных. Хотя, может они и не копируются, а просто ссылка
> на них добавляется. Почитаю еще.

Нашел по первым трем ссылкам с гугла:
You do not actually make another physical copy which would require memory, but rather, you create a second (or third, etc.) pointer to the same Recordset.
То что нужно.


> Ega23 ©   (05.12.11 13:21) [21]

Ну это слово я с иронией употребил, потому и в кавычках. Извини в любом случае и спасибо за помощь!


 
OW ©   (2011-12-05 13:28) [23]


> Хотя, может они и не копируются, а просто ссылка на них
> добавляется.

По моему, ссылка. Но!
Можно пустить 2 курсора, независимо. Один из - закрыть, открыть и т.п.
Я так делаю, когда доп.поток пускаю на выбранные данные(отчет формировать, печатать). А юзер новые может выбирать в это время.


 
Плохиш ©   (2011-12-05 14:24) [24]


> Димка На   (05.12.11 13:12) [16]

Теперь тоже самое для OnBeforeScroll


 
Ega23 ©   (2011-12-05 14:46) [25]


> Например, взять не грид, а TcxDBTreeList, который в данном
> случае - то же самое. Ставлю на OnDataChange его DataSource
> точку останова, запускаю. Останов 2 раза, а строк, которые
> отображает контрол несколько сотен. Какой отсюда вывод?


Отсюда вывод такой, что TDataSource.OnDataChange дёргается при:
1. Изменении содержимого набора данных.
2. TDataSet.EnableControls



Страницы: 1 вся ветка

Текущий архив: 2012.03.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
15-1322384341
RDen
2011-11-27 12:59
2012.03.18
конец света отменяется


2-1323102981
Prok186
2011-12-05 20:36
2012.03.18
Компонент TMediaPlayer: как при открытии AVI ...


2-1323244056
Дмитрий_
2011-12-07 11:47
2012.03.18
восстановить курсор если найдена запись


15-1321986296
dreamse
2011-11-22 22:24
2012.03.18
Настройка размера шрифта в редакторе кода


15-1322401925
Vyacheslav
2011-11-27 17:52
2012.03.18
Delphi XE2 не работают Break Point