Конференция "Базы" » Bookmark после обновления данных. [D7]
 
  • Andrey_Pl (11.11.13 18:00) [0]
    Подскажите должен ли работать и всегда ли механизм Bookmark?
    После обновления данных не получается вернуться на исходную запись.

       _bMark := cdsData.GetBookmark;
       try
         RefreshData;
         try cdsData.GotoBookmark(_bMark); except end;
       finally
         cdsData.FreeBookmark(_bMark);
       end;

  • Inovet © (11.11.13 18:24) [1]
    > [0] Andrey_Pl   (11.11.13 18:00)
    > всегда ли

    Эту запись удалили
  • sniknik © (11.11.13 18:31) [2]
    букмарки, это указатели, а указатели после пересоздания структуры будут указывать на то же самое в новой разве, что случайно... (например сформировали в той же области памяти и все данные неизменны).
  • Andrey_Pl (11.11.13 18:42) [3]
    > Inovet ©   (11.11.13 18:24) [1]
    нет не обязательно. Сохраняются изменения в базу. Но не обязательно именно эта запись будет редактируемой.
  • Andrey_Pl (11.11.13 18:44) [4]
    > sniknik ©   (11.11.13 18:31) [2]
    как вообще букмарки работают. какой механизм их действия? (и пытался найти инфу по этому но что то не нашел)?
  • [ВладОшин] © (12.11.13 08:31) [5]
    как вообще букмарки работают. какой механизм их действия?

    unit DB;
     TBookmark = Pointer;

    т.е .Как работает указатель?
    Не работает он.
    В нем хранится адрес в памяти, по которому расположены данные. В нашем случае запись.

    Механизм такой: Взять адрес памяти, по которому расположены данные, записать в переменную

    есть же метод
    .GetBookmark
    ctrl+click на него, попадаешь в реализацию, смотришь что делается

    еще метод
    .BookmarkValid()
    ctrl+click на него, попадаешь в реализацию, смотришь что делается
  • [ВладОшин] © (12.11.13 11:55) [6]
    Кстати, вместо всего этого
      _bMark := cdsData.GetBookmark;
      try
        RefreshData;
        try cdsData.GotoBookmark(_bMark); except end;

    Писал как то свой CDS (TClientDataSet)
    Где GetBookmark; в приватную переменную запоминал значение из поля, которое Index для данного CDS
    А GotoBookmark соответственно делал  Locate туда (или на первую подходящую, если таковых несколько)
    А если не было записи (удалена), то на предыдущую по индексу
  • Anatoly Podgoretsky © (12.11.13 13:30) [7]
    А что первичного ключа нет?
  • [ВладОшин] © (12.11.13 13:38) [8]

    > А что первичного ключа нет?

    Обычно это Index
    Но бывает, что нет
  • Andrey_Pl (12.11.13 17:55) [9]
    заметил что при обновлении данных обновленная запись иногда меняет свою позицию в пришедшем наборе данных. Как я понял с этим и связана причина того что  Bookmark  не помогает (из [ВладОшин] ©   (12.11.13 08:31) [5]).

     Наверно как вариант буду использовать  Locate для возврата на исходную запись.
  • Inovet © (12.11.13 19:56) [10]
    > [9] Andrey_Pl   (12.11.13 17:55)
    > запись иногда меняет свою позицию в пришедшем наборе данных

    Позиция определяется только order by, но ты ничего не сказал о БД.
  • Ega23 © (13.11.13 08:07) [11]

    > заметил что при обновлении данных обновленная запись иногда
    > меняет свою позицию в пришедшем наборе данных.


    Ты пойми, тебе никто не гарантирует того, что твой набор данных не изменится.
    Если образно, то представь, что ты выписываешь газету "Вечерний гость". Вот ты вытащил её из почтового ящика. Есть ненулевая вероятность того, что там окажется точно такая же газета, как и вчера? Ну есть. В типографии могли ошибиться, почтальон был пьян и т.д. Но, скорее всего, она уже будет другая.
    А ты вчера не дочитал статью про птеродактиля, но помнишь, что она была на восьмой странице (это и есть наш Bookmark). Открываем на восьмой, а там - а вот чёрт его знает, что там. Прогноз погоды. ТВ-программа. List index out of bounds (сегодня "Вечерний гость" всего на 4-х страницах вышел).
    Но может и повезти и статья таки окажется про птеродактиля.
 
Конференция "Базы" » Bookmark после обновления данных. [D7]
Есть новые Нет новых   [134428   +39][b:0][p:0.001]