Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2016, 08:09   #1
Atletnah
 
Регистрация: 13.08.2014
Сообщений: 7
По умолчанию Refresh одной записи DataSet

Возможно ли обновить конкретную запись набора данных?
При использовании связки
1. FDQuery (FireDac)->DataSource
2. FDQuery->TDataSetDriverEh->MemTableEh->DataSource

Есть ли способ узнать актуальна ли запись?
Опишу ситуацию: пользователь открывает датасет, после чего другой пользователь редактирует данные и сохраняет. После первый приступает к редактированию данных, видит при этом не актуальные данные.
Хотелось бы проверять актуальность данных или рефрешить перед редактированием. Поскольку данных в таблице много каждый раз перезагружать датасет не вариант.
Надеюсь понятно объяснил

Заранее спасибо за идеи!
Atletnah вне форума Ответить с цитированием
Старый 07.10.2016, 08:36   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В качестве идеи - в событии BeforeEdit другим квериком дергать из базы нужную запись и сравнить значения предполагаемых для редактирования полей. А дальше или разрешение редактирования, или предупреждение и/или обновление всего датасета. Про локальное обновление одной записи не слышал
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.10.2016, 08:42   #3
Atletnah
 
Регистрация: 13.08.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В качестве идеи - в событии BeforeEdit другим квериком дергать из базы нужную запись и сравнить значения предполагаемых для редактирования полей. А дальше или разрешение редактирования, или предупреждение и/или обновление всего датасета. Про локальное обновление одной записи не слышал
Спасибо за ответ!
Как вариант рассматривал, но много данных сравнивать.

Есть идея добавить триггер записывающий время последней правки записи. На клиенте в переменной хранить время последнего обновления датасета. Соответственно в BeforeEdit сравниваем переменную и момент последней правки.

Возможно есть более красивые варианты
Atletnah вне форума Ответить с цитированием
Старый 07.10.2016, 08:49   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего даст переменная с временем обновления датасета? Тогда уж сравнивать время обновления конкретной записи на клиенте. На счет много сравнивать - много это сотни и тысячи полей, десяток или пара десятков это мало
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.10.2016, 09:12   #5
Atletnah
 
Регистрация: 13.08.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А чего даст переменная с временем обновления датасета? Тогда уж сравнивать время обновления конкретной записи на клиенте. На счет много сравнивать - много это сотни и тысячи полей, десяток или пара десятков это мало


Если время переменной (последний рефреш датасета) < отметка о последней правке записи ТОГДА
данная запись не актуальна и следует обновить датасет или выдать предупреждение.

Полей от 5 до 50.

Хотелось сделать универсальную функцию для проверки.
Такая проверка требуется в нескольких местах

Последний раз редактировалось Atletnah; 07.10.2016 в 09:15.
Atletnah вне форума Ответить с цитированием
Старый 07.10.2016, 09:33   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Если время переменной (последний рефреш датасета) < отметка о последней правке записи ТОГДА
данная запись не актуальна и следует обновить датасет или выдать предупреждение.
А конкретная запись как раз может быть актуальной.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.10.2016, 09:59   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Хотелось бы проверять актуальность данных или рефрешить перед редактированием.
так я и не понял, в чём проблема на событии BeforeEdit прочитать отдельным запросом содержимое ОДНОЙ записи и обновить поля в нужном датасете?

И поля, кстати, руками перебирать не обязательно, в Dataset есть коллекция Fields[] - можно действовать через неё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.10.2016, 10:13   #8
Atletnah
 
Регистрация: 13.08.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так я и не понял, в чём проблема на событии BeforeEdit прочитать отдельным запросом содержимое ОДНОЙ записи и обновить поля в нужном датасете?

И поля, кстати, руками перебирать не обязательно, в Dataset есть коллекция Fields[] - можно действовать через неё.
Этот момент я и упустил. Всё гениальное просто)
Уверен был что есть простое и красивое решение, но понесло не в ту степь. Спасибо!
Atletnah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записи: Найти багаж, средний вес одной вещи в котором отличается не более, чем на 0,3 кг от общего среднего веса одной вещи serg737 Паскаль, Turbo Pascal, PascalABC.NET 4 03.05.2015 18:09
Перемещение ОДНОЙ записи из одной таблицы в другую Vongud БД в Delphi 28 10.04.2015 21:47
Сравнение одной записи с несколькими Negaty SQL, базы данных 6 22.11.2012 16:20
Строку из одного DataSet в другой DataSet Abbath1349 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 22.05.2011 19:26
Update одной записи в таблице EugeneIsmatulin SQL, базы данных 3 31.12.2009 19:39