Проблема получения актуальных значений из БД в интерфейсе

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Проблема получения актуальных значений из БД в интерфейсе

Сообщение Max_Ural »

Есть моя таблица, добавленная в словарь

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

#include dictypes.def
create table _synhro "Последний сеанс синхронизации"
  with table_code = 30204
  (
    nrec     : tNrec "Номер записи",
    LastSeans: datetime "Предыдущий запуск синхронизации"
  )
  with index
  (
    _cat01 = nrec (Unique, Surrogate)
  );
Есть мой интерфейс, который отображает дату и время на основе значения поля LastSeans этой таблицы.

Синхронизация может запускаться двумя способами - по расписанию и вручную.
Задача:
если я открыл интерфейс для запуска вручную и при этом отработал запуск по расписанию - чтобы обновилось дата и время в интерфейсе.
Во время тестирования заходил и менял это поле через саппорт - интерфейс никак не видит, что поле изменилось

Пробовал следующие варианты:
1. Сделал таймер, который срабатывает каждые 10 секунд. В событии по таймеру вызывал ReReadRecord, никакого эффекта. С помощью вывода сообщения видно, что таймер срабатывает.
2. Пробовал через событие cmIdle - тоже никакого эффекта.

Подскажите пожалуйста, как можно решить данную задачу.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Сообщение larin »

Похоже данные закэшированы в драйвере БД. Возможности программно сбросить кэш драйвера на VIP-е к сожалению нет. В Атлантисе 5.4 появилась кнопочка в системной панели "Обновить данные из БД". Используйте ее чтобы перечитать данные в интерфейсе.
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

Максим, какая у вас БД?
kroxa
топ-софт
Сообщения: 65
Зарегистрирован: Пт, 07/09/2007 11:57
Имя Фамилия: Александр Крахотко
Откуда: ТопСофт
Контактная информация:

Сообщение kroxa »

была подобная проблема при использовании Галактика через OLE - Федор может дать более подробные рекомендации как сбросить кэш (может сейчас есть другие способы).

тогда заметили что на некоторых БД при групповой работе даже функция GetFirst и все остальные общеиспользуемые (на oracle и mssql - в 2007 году) - не может сбросить кэш, при этом время жизни кэша совпадает с временем жизни экземпляра VIP интерфейса - час, день, неделя ... (пока не закроете)

тогда проблему решили используя внутреннею недокументированную функцию (по совету Федора):
cmOnVipUse : FreeDrvCache;

наверняка она Вам поможет, если еще осталась в Атлантисе 5.Х :)
где-то была документация, которую написал по этой функции, но сейчас найти уже не удалось.
Max_Ural
партнер
Сообщения: 82
Зарегистрирован: Ср, 19/09/2007 08:35
Имя Фамилия: Максим Шагубаков
Откуда: Галактика-Урал
Контактная информация:

Сообщение Max_Ural »

Вадим, данная проблема возникла на платформе MS SQL.
Александр, спасибо за совет, сегодня попробую запустить эту функцию (если она еще существует :-) )
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Максим, если вы хотите сделать мультики - используйте MacroMedia Flash.

Если серьёзно, то есть несколько функций, позволяющих реализовать мультяшное поведение интерфейсов. Использовать их не рекомендуется.

FreeDrvCache - метод ЛТ, сносит кэш данных этой ЛТ.
FreeDrvCachedTable (<tablecode>) - сносит кэш во всех ЛТ, где используется таблица со словарным кодом tablecode
EnableDrvCache (<enable>) - метод ЛТ, включает/выключает кэширование в ЛТ, возвращает состояние включённости до вызова
Ответить