Программы "Простой софт" www.prostoysoft.ru

ВНИМАНИЕ! РЕКЛАМНЫЕ СООБЩЕНИЯ И ГИПЕРССЫЛКИ В ФОРУМЕ ЗАПРЕЩЕНЫ (посты удаляются автоматически часто с пользователем)
Текущее время: 22.07.2019 12:57

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: 03.03.2016 00:15 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
База SQL на cервере. У клиента Windows XP.
Пишу много, кратко не получается.
Что есть?

1. Таблица "Услуги"
2. Вкладка с представлением "Оказанные услуги врачи МРТ", основанная на "Услуги" с отбором только услуг МРТ и по JOIN еще чего то прилеплено.
3. К представлению "Оказанные услуги врачи МРТ" имеется подчиненная таблица "Услуги". Один ко многим по полю "Номер пациента"
4. На вкладке "Оказанные услуги врачи МРТ" есть кнопка VBScript "Заключение", формирующая по шаблону заключение для последующего редактирования или открывающая заключение если оно уже есть. При этом используются данные из текущей записи в таблице "Услуги" (<tblSurveys>.<ID> и т.п.)

Все работает хорошо. Врач в "Оказанные услуги врачи МРТ" находит пациента, выбирает нужное обследование пациента в таблице "Услуги" и жмет кнопку "Заключение"

Однако как правило врач описывает сегодняшних пациентов. Поэтому в дереве выбирает сегодняшнее число. Там выбирает пациента/обследование. И ему неудобно тыкать мышкой еще и в нижнюю (подчиненную) таблицу "Услуги".
Бывает у одного пациента 2 обследования в день и он хочет выбирать обследование в главной ("Оказанные услуги врачи МРТ") таблице.

Был написан триггер в таблице "Оказанные услуги врачи МРТ" срабатывающий при перемещении по записям
GoToRecordInSubTable "tblSurveys", <ID>
позиционирующий курсор в подчиненной таблице на запись соответствующую активной записи в главной.

Все прекрасно. Однако со временем проявилась серьезная проблема требующая Вашей помощи в её решении.

Между моментом когда врач тыкнет мышкой в главной таблице и моментом когда курсор в подчиненной спозиционируется после отработки триггера проходит какое то время (0,5 - 2 секунды, а в принципе может и более наверное).
За это время врач иногда успевает нажать кнопку "Заключение" и код в кнопке будет работать по старым (до перепозиционирования) данным из подчиненной таблицы.

В результате получаем/открываем неверное заключение, могущее попасть к пациенту. Это ЧП.

Вставка в начало кода в кнопке строки
WScript.Sleep 2000
(задержка 2 с)
решает проблему плохо.
1. Нет гарантии что не будет ситуации когда задержка нужна в 2,5 или 5 с
2. Задержка будет всегда даже когда она в принципе не нужна (ткнули в запись в подчиненной). А пользователь не должен ждать когда ждать не надо.

Вставка цикла
Ждать пока "Номер услуги" в подчиненной не сравняется с "Номер услуги" в главной.
Совсем не выход.
Поскольку врач может в подчиненной таблице выбрать услугу и курсор в главной не должен перепозиционироваться.
Собственно это 50% данного функционала - "Удобный просмотр старых обследований пациента". Вторая половина - отсутствие ошибок при формировании заключений.

Какие есть мысли у кого?
Может как то блокировать работу программы пока триггер не отработает? Как?
Или как то можно в VBScript-е узнать что есть не завершенные запросы к БД? Но тут не только БД но и сама программа участвует.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 00:56 
Не в сети

Зарегистрирован: 13.09.2015 23:15
Сообщения: 115
Откуда: Санкт-Петербург
Uspenskiy, а если попробовать сделать кнопку недоступной с помощью внутренней команды DisableToolbarButtons, если ID главной не соответствует ID подчинённой? Или наоборот разблокировать её с помощью противоположной команды EnableToolbarButtons при соблюдении этого условия.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 01:18 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
seovet Ваш совет не приемлем по той же причине что и
Uspenskiy писал(а):
Вставка цикла
Ждать пока "Номер услуги" в подчиненной не сравняется с "Номер услуги" в главной.
Совсем не выход.
Поскольку врач может в подчиненной таблице выбрать услугу и курсор в главной не должен перепозиционироваться.


Выбрав запись с услугой в главной таблице врач видит в подчиненной таблице ВСЕ услуги оказанные пациенту.
За прошлые годы или другими врачами УЗИ, невролог и т.п. В этом случае перепозиционировать курсор в главной нельзя.
И соответственно не будет соответствия главной и подчиненной.

Иными словами
если тыкаем в главной, то ждем пока спозиционируется в подчиненной и потом запуск кнопки
если тыкаем в подчиненной, то НЕ ждем, не позиционируем просто запускаем кнопку (никакого соответствия тут не будет)

Я ошибся чуть в первом посте п.3 правильно так
3. К представлению "Оказанные услуги врачи МРТ" имеется подчиненная таблица "Услуги". Один ко многим по полю "Номер пациента"


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 01:26 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
И ещё
seovet писал(а):
Uspenskiy, а если попробовать сделать кнопку недоступной ...

Будет лучше если она будет доступной. Врач нажмет её и чуть подождет пока процессы пройдут.

А при не доступной (серенькой) он не заметит и ткнет и будет десять минут ждать открытия Worda или EFilma (на него такая же кнопка почти). Потом ко мне пойдет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 01:36 
Не в сети

Зарегистрирован: 13.09.2015 23:15
Сообщения: 115
Откуда: Санкт-Петербург
Тогда может в тот же триггер, который позиционирует курсор, вставить скрипт на печать с предварительным предложение "хотите распечатать заключение?" и объяснить, что надо дождаться этого сообщения при перемещении, а не нажимать кнопку? А кнопка уже на случай изменений в текущей записи.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 01:53 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
seovet писал(а):
Тогда может в тот же триггер, который позиционирует курсор, вставить скрипт на печать с предварительным предложение "хотите распечатать заключение?" и объяснить, что надо дождаться этого сообщения при перемещении, а не нажимать кнопку? А кнопка уже на случай изменений в текущей записи.

Увы то же не то.

На момент работы триггера никто не знает что делать дальше.

После позиционирования врач может писать заключение.
Документ формируется по шаблону (вставляется фамилия, номер и название обследования и т.п.) и потом врач в нем пишет описание снимка. Потом печатается и сохраняется.
А если заключение есть (старое), то эта же кнопка просто показывает старое заключение что бы правильно написать новое.

А может просмотреть снимок. Есть другая кнопка по которой открываются снимки по номеру обследования (новые или старые). Он может не заметить что не тот снимок открылся. А это вообще беда по чужому снимку писать заключение.

А может и ничего не делать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 03:44 
Не в сети

Зарегистрирован: 13.09.2015 23:15
Сообщения: 115
Откуда: Санкт-Петербург
Тогда может совместить оба предложенных способа и в начале работы триггера запускать команду блокировки кнопки, а в конце кнопку разблокировать? Визуально видно, когда кнопка недоступна для нажатия, не думаю, что будут проблемы с тем, что врач не поймёт этого. Тем более кнопка после позиционирования станет цветной, как бы намекая, что уже можно нажимать. Если только, команда разблокировки не сработает раньше, чем команда перехода к записи будет выполнена...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 13:42 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
seovet писал(а):
... в начале работы триггера запускать команду блокировки кнопки, а в конце кнопку разблокировать


Да. Это должно работать. И возможно это единственный выход. Но должен быть еще какой то путь.
Не нравится мне блокировать кнопку. Тупые они врачи (как и мы инженеры) не заметят. Не удобно...
Я хотел еще горячие клавиши назначить.

Была идея в кнопке узнавать активную таблицу.
Если активна (тыкнули мышкой) главная, то ждать пока ID не сравняются как вы писали,
а если подчиненная, то не ждать.
но <CurrentTable> всегда дает имя главной таблицы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03.03.2016 18:15 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
seovet спасибо. Ваш совет навел на мысли.

В триггере сделал так
SetGlobalConstant("Var_MoveTrigerRun", '1')
GoToRecordInSubTable "tblSurveys", <ID>
SetGlobalConstant("Var_MoveTrigerRun", '0')

В кнопке
Dim Stop
Stop = <Var_MoveTrigerRun>
Do While Stop = 1
Stop = GetGlobalConstant("Var_MoveTrigerRun")
WScript.Sleep 300
Loop
' далее код кнопки

Все прекрасно. И кнопка доступна и лишнего не ждем.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB