Последняя версия DataExpress 3 beta от 18 июля 2020 года.
Изображение Скачать | Изображение Что нового?
См. также: Энциклопедия DX | Форум на develop-soft | Расширения
ИзображениеИзображениеИзображение

Периодическое обновление данных таблицы

Обсуждаются вопросы удаленного доступа к базе данных.
Аватара пользователя
Develop-Soft
Сообщения: 1638
Зарегистрирован: Вт мар 05, 2019 6:09 pm
Благодарил (а): 122 раза
Поблагодарили: 444 раза
Контактная информация:

Периодическое обновление данных таблицы

Сообщение Develop-Soft » Вс ноя 17, 2019 12:13 pm

AndreyM писал(а):Добрый день!

1. Так то что совет с таймером вреден это понятно, а как по другому можно видеть изменения не используя кнопку "Обновить"?

2. И второй вопрос - думаю, что переход с текущей строки в таблице на первую после нажатия кнопки "Обновить" является ошибкой. Т.к. представьте, например в таблице 1000 записей, пользователь работает с 520 записью и решает воспользоваться кнопкой "Обновить".... и попадает после обновления на первую запись.

Как думаете имеет смысл попросить разработчика исправить данную ситуацию?

--
Develop-Soft писал(а):1. Метод называется GotoRecord.
2. GotoRecord привет к фиаско если текущая запись была Delete
3. Обновлять таблицу по таймеру - вредный совет.


1. По-хорошему - никак. Даже 1С-ка работает в аналогичном режиме. Максимум что можно сделать с минимальной нагрузкой - уведомление о необходимости обновить таблицу (без принудительного обновления). Но для этого нужно писать код.

2. А теперь представьте например - в базе 1000 записей, во время вашего простоя 10 других пользователей базы добавили 200 и удалили 300 записей (в том числе и ту, на которой вы находились). Куда предложите вас "подкинуть"?

Аватара пользователя
Develop-Soft
Сообщения: 1638
Зарегистрирован: Вт мар 05, 2019 6:09 pm
Благодарил (а): 122 раза
Поблагодарили: 444 раза
Контактная информация:

Периодическое обновление данных таблицы

Сообщение Develop-Soft » Вс ноя 17, 2019 12:20 pm

AndreyM писал(а):Вчера уже пробовал так делать как посоветовал jurist23rus, но только с методом GotoRecord.
Но после того как запускаю для проверки приложение второго пользователя программа вылетает даже не закончив авторизацию пользователя. Если отключаю строчку с методом GotoRecord - все работает... Но текущее положение в таблице не сохраняется.
Как исправить ситуацию не понимаю.

Мы тоже не понимаем. Те, кто понимал - покинули этот форум и ушли на ТНТ (на битву какую-то...) А тем кто остался желательно бы увидеть код глазами. А лучше - базу целиком на предмет конфликтующего кода или выражений в других местах.

AndreyM
Новичок
Сообщения: 38
Зарегистрирован: Ср ноя 06, 2019 12:44 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Периодическое обновление данных таблицы

Сообщение AndreyM » Вс ноя 17, 2019 5:46 pm

А "подкинуть" нужно в зависимости от того удалена текущая запись или нет.
Если нет - то "подкинуть" на прежнее место, если удалена - то на 1 строку таблицы.
Думаю так правильно будет. Ведь перед "подкидыванием" можно же проверить существует ли такая запись...

--
2. А теперь представьте например - в базе 1000 записей, во время вашего простоя 10 других пользователей базы добавили 200 и удалили 300 записей (в том числе и ту, на которой вы находились). Куда предложите вас "подкинуть"?

AndreyM
Новичок
Сообщения: 38
Зарегистрирован: Ср ноя 06, 2019 12:44 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Периодическое обновление данных таблицы

Сообщение AndreyM » Пн ноя 18, 2019 1:13 am

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

Во вложении в архиве две совершенно одинаковые по своей сути базы. Но формы по умолчанию открываемые при запуске каждой базы различные. Для того чтобы любая база вызвала критическое исключение необходимо перевести ее в режим дизайнера и выбрать Форму 1 после чего выйти из режима дизайнера - спустя 5 секунд возникнет исключение.

Просьба посоветовать каким образом необходимо доработать код скрипта, чтобы подобное исключение не возникало.

Спасибо.

--
Develop-Soft писал(а):
AndreyM писал(а):Вчера уже пробовал так делать как посоветовал jurist23rus, но только с методом GotoRecord.
Но после того как запускаю для проверки приложение второго пользователя программа вылетает даже не закончив авторизацию пользователя. Если отключаю строчку с методом GotoRecord - все работает... Но текущее положение в таблице не сохраняется.
Как исправить ситуацию не понимаю.

Мы тоже не понимаем. Те, кто понимал - покинули этот форум и ушли на ТНТ (на битву какую-то...) А тем кто остался желательно бы увидеть код глазами. А лучше - базу целиком на предмет конфликтующего кода или выражений в других местах.
Вложения
Test.rar
(84.01 КБ) 31 скачивание

jurist23rus
Эксперт
Сообщения: 2706
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 26 раз

Периодическое обновление данных таблицы

Сообщение jurist23rus » Пн ноя 18, 2019 9:40 am

Таймер уничтожать надо своевременно и не будет исключений и вылетов. Этот скрипт всего лишь пример, а не готовое решение.
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
Develop-Soft
Сообщения: 1638
Зарегистрирован: Вт мар 05, 2019 6:09 pm
Благодарил (а): 122 раза
Поблагодарили: 444 раза
Контактная информация:

Периодическое обновление данных таблицы

Сообщение Develop-Soft » Пн ноя 18, 2019 9:43 am

AndreyM писал(а):Просьба посоветовать каким образом необходимо доработать код скрипта, чтобы подобное исключение не возникало.

В процедуре AR проверяйте TdxForm.Opened и выходите из нее если это свойство False.

jurist23rus
Эксперт
Сообщения: 2706
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 26 раз

Периодическое обновление данных таблицы

Сообщение jurist23rus » Пн ноя 18, 2019 9:59 am

AndreyM писал(а):А "подкинуть" нужно в зависимости от того удалена текущая запись или нет.
Если нет - то "подкинуть" на прежнее место, если удалена - то на 1 строку таблицы.
Думаю так правильно будет. Ведь перед "подкидыванием" можно же проверить существует ли такая запись...


Есть определённая логика работы с базами данных, которая сложилась не вчера. Всё что вы считаете правильным вы можете реализовать в скрипте и пользоваться на здоровье. Делайте необходимые вам проверки и "подкидывайте" куда хотите.

Любая манипуляция с базой данных неизбежно будет создавать нагрузку на сетевую базу. Кто-то этого не заметит, а для кого-то это критично, поэтому каждый разработчик баз сам решает усложнять свою базу доп. плюшками или нет.
Destiny is a very convenient word for those who never take decisions.

AndreyM
Новичок
Сообщения: 38
Зарегистрирован: Ср ноя 06, 2019 12:44 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Периодическое обновление данных таблицы

Сообщение AndreyM » Пн ноя 18, 2019 11:28 am

Спасибо, но не пойму как именно проверять состояние.
Не могли бы Вы порекомендовать где можно более подробно почитать про TdxForm.Opened или написать какой код нужно добавить в мой пример.

Develop-Soft писал(а):
AndreyM писал(а):Просьба посоветовать каким образом необходимо доработать код скрипта, чтобы подобное исключение не возникало.

В процедуре AR проверяйте TdxForm.Opened и выходите из нее если это свойство False.

AndreyM
Новичок
Сообщения: 38
Зарегистрирован: Ср ноя 06, 2019 12:44 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Периодическое обновление данных таблицы

Сообщение AndreyM » Пн ноя 18, 2019 11:31 am

Думаю Вы правы, но еще бы знать как именно уничтожать этот самый таймер... :)

jurist23rus писал(а):Таймер уничтожать надо своевременно и не будет исключений и вылетов. Этот скрипт всего лишь пример, а не готовое решение.

Аватара пользователя
Develop-Soft
Сообщения: 1638
Зарегистрирован: Вт мар 05, 2019 6:09 pm
Благодарил (а): 122 раза
Поблагодарили: 444 раза
Контактная информация:

Периодическое обновление данных таблицы

Сообщение Develop-Soft » Пн ноя 18, 2019 1:54 pm

Я думал изначально скинуть пример кода, но вопрос звучал иначе...

Код: Выделить всё

//...
begin
if not Self.Opened then exit;
if (Self.State <> dsEdit) and
   (Self.State <> dsInsert)  then   
//...

А уничтожение таймера не требуется. Это происходит автоматически т.к. Owner=Self.