Конференция "Начинающим" » Как получить данные из DataSet не меняя его активную запись.
 
  • Бездомный (05.12.11 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;
  • Медвежонок Пятачок © (05.12.11 12:53) [1]
    если б было можно получить данные не меняя активную строку, то, я думаю, возможно было бы получить данные вообще не открывая датасета.
  • Димка На (05.12.11 12:54) [2]

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

    Ну а как это TDBGrid делает?
  • Jeer © (05.12.11 12:56) [3]
    Ему открыть второй датасет религия не позволяет.
  • Медвежонок Пятачок © (05.12.11 12:56) [4]
    Ну а как это TDBGrid делает?

    А он это делает?
  • Jeer © (05.12.11 12:57) [5]

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


    Он вообще ничего не делает, кроме отображения из датасета.
  • Димка На (05.12.11 12:57) [6]

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

    А разве нет? Активная строка одна, а он при прорисовке показывает все.
  • Димка На (05.12.11 12:58) [7]

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

    Предлагаете открывать такой-же датасет и работать с ним?
  • Медвежонок Пятачок © (05.12.11 13:01) [8]
    А разве нет? Активная строка одна, а он при прорисовке показывает все.

    Конечно нет.
  • OW © (05.12.11 13:03) [9]
    в ADO есть Clone, если это ADO
  • Anatoly Podgoretsky © (05.12.11 13:03) [10]

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

    Не может быть!
  • Димка На (05.12.11 13:04) [11]

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

    А как тогда?


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

    ADO, ADO, при этом все данные в памяти будут скопированы?
  • Медвежонок Пятачок © (05.12.11 13:06) [12]
    А как тогда?

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

    Или тебе удобнее думать, что грид обладает магией и телепатией?
  • Плохиш © (05.12.11 13:06) [13]

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

    Создай событие OnDataChange, поставь в нëм точку останова и удивись.
  • Ega23 © (05.12.11 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 © (05.12.11 13:08) [15]

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

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

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

    Хотелось бы.


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

    Интересно получается.
    Например, взять не грид, а TcxDBTreeList, который в данном случае - то же самое. Ставлю на OnDataChange его DataSource точку останова, запускаю. Останов 2 раза, а строк, которые отображает контрол несколько сотен. Какой отсюда вывод?
  • Димка На (05.12.11 13:13) [17]

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

    Спасибо. Я так понимаю это "православный"  вариант?
  • Медвежонок Пятачок © (05.12.11 13:13) [18]
    Какой отсюда вывод?

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

    дергается вот это
    Recordset20 = interface(Recordset15)
    function Clone(LockType: LockTypeEnum): _Recordset; safecall;
  • Димка На (05.12.11 13:20) [20]

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

    Я уже попробовал - работает, но совесть мучает факт копирования данных. Хотя, может они и не копируются, а просто ссылка на них добавляется. Почитаю еще.
  • Ega23 © (05.12.11 13:21) [21]

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


    Я антихристианин, посему мне обидны ваши слова.
  • Димка На (05.12.11 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 © (05.12.11 13:28) [23]

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

    По моему, ссылка. Но!
    Можно пустить 2 курсора, независимо. Один из - закрыть, открыть и т.п.
    Я так делаю, когда доп.поток пускаю на выбранные данные(отчет формировать, печатать). А юзер новые может выбирать в это время.
  • Плохиш © (05.12.11 14:24) [24]

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

    Теперь тоже самое для OnBeforeScroll
  • Ega23 © (05.12.11 14:46) [25]

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


    Отсюда вывод такой, что TDataSource.OnDataChange дёргается при:
    1. Изменении содержимого набора данных.
    2. TDataSet.EnableControls
 
Конференция "Начинающим" » Как получить данные из DataSet не меняя его активную запись.
Есть новые Нет новых   [134431   +13][b:0][p:0.002]