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

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

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




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 14.03.2020 14:23 
Не в сети

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
Доброе время суток.
Учет клиентов крайний(лицензия),SQL,45 юзверей типа "Пользователь" работают по RDP
Работаю все в одной таблице с горизонтальной фильтрацией.Фильтрация обеспечивает условное деление таблицы на 10 "отдельных" зон видимости.От 2 до 8 пользователей видят только свою "отдельную зону".
Возникла проблема с одновременным редактированием записи в "Форме" двумя и более пользователями,что влечет за собой сохранение не всех данных,так как естественно сохраняются данные того что последний сохранил.
Собственно просьба: Помогите пожалуйста с реализацией защиты от одновременного редактирования записи.


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

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Приветствую.
Как вариант дополнительное поле в таблице, которое проверяется на наличие значения при открытии формы и в которое по триггеру "при открытии формы" заносится ID пользователя, который начал редактирование. По триггеру "при закрытии формы" поле очищается.

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


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

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
Триггер "при открытие формы" более менее работает,задача решается
Код:
IF <UserBlockId> = 0 THEN
  IF MsgBox("Можно редактировать", vbYesNo+vbInformation+vbDefaultButton1, "Тест1")=vbYes THEN
 
  SetControlValue "ИД Блокировки", <CurrentUserID>
  PressButton 'Применить'
  END IF
ELSE
  MsgBox "Запись уже открыта ", vbOK+vbWarning, "Стоп!!!"
PressButton 'Отмена'
END IF


Нажатие PressButton 'Применить' пришлось вставить - иначе значение присвоенное <CurrentUserID> не обрабатывается......

Второй триггер при закрытие присваивает UserBlockId значение 0

Вот только пока не обновишь таблицу запись не откроешь........а самое плохое что пока не обновишь таблицу запись можно второму пользователю открыть,хоть бери и добавляй каждый раз при закрытие обновление таблицы .....хотя это не спасет.........
Так что работает ,но похоже реализовал я криво....
Может как то можно более изящно решить данный вопрос в целом?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14.03.2020 20:40 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
Можно записывать инфу не в спец поле, а в глобальную константу. Посредством
SetGlobalConstant и GetGlobalConstant

_________________
2B OR NOT 2B = TRUE


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

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
Ivan писал(а):
Можно записывать инфу не в спец поле, а в глобальную константу. Посредством
SetGlobalConstant и GetGlobalConstant

А как практически это использовать?Как её обрабатывать?


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

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Ivan писал(а):
Можно записывать инфу не в спец поле, а в глобальную константу. Посредством
SetGlobalConstant и GetGlobalConstant
для каждой записи своя константа??? Смысл? Ведь в одной таблице могут одновременно несколько записей редактироваться пользователями.
merefa37 писал(а):
Триггер "при открытие формы" более менее работает,задача решается
а почему не напрямую запросом меняете значение спецполя? Зачем на форме выставляете его???

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


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

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
Я пробовал и так и так...
Код:
IF <UserBlockId> = 0 THEN
  IF MsgBox("Можно редактировать", vbYesNo+vbInformation+vbDefaultButton1, "Тест1")=vbYes THEN
 
  ExecuteSQL("UPDATE qdfLgotKontakt SET [UserBlockId] = <CurrentUserID> WHERE ID = <ID>")
  PressButton 'Применить'
  END IF
ELSE
  MsgBox "Запись уже открыта ", vbOK+vbWarning, "Стоп!!!"
PressButton 'Отмена'
END IF

Разницы в поведение триггера нет.
В обеих вариантах нужно перед открытием формы обновлять таблицу......
Или Вы что то имели другое в виду?


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

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Зачем обновлять таблицу??? Получайте значение спецполя прямым запросом через ExecuteSQL! Ссылкой на текущую запись пользуйтесь только для получения ID записи.

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


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

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
Спасибо так работает,сегодня протестирую о результатах отпишусь...
Код:
Dim CID, sql1
  sql1 = "SELECT UserBlockId FROM qdfLgotKontakt WHERE ID = <ID>"
  CID = ExecuteSQL (sql1)
  MsgBox CID
  IF CID = 0 THEN
    IF MsgBox("Можно редактировать", vbYesNo+vbInformation+vbDefaultButton1, "Тест1")=vbYes THEN
    ExecuteSQL("UPDATE qdfLgotKontakt SET [UserBlockId] = <CurrentUserID> WHERE ID = <ID>")
  END IF
ELSE
  MsgBox "Запись уже открыта ", vbOK+vbWarning, "Стоп!!!"
PressButton 'Отмена'
END IF


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

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
Теперь возникла проблема в том что если пользователь закроет форму по кнопке "Отмена" или через "крестик" :D то триггер на закрытие формы не отработает,а запрет на записи останется...
Как Это можно обыграть?


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

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
merefa37 писал(а):
Теперь возникла проблема в том что если пользователь закроет форму по кнопке "Отмена" или через "крестик" :D то триггер на закрытие формы не отработает...
Какая версия программы? У меня триггер все эти события корректно отрабатывает.

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


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

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
OMEN писал(а):
Какая версия программы?
2.1093
у меня триггер при закрытие с условием
Код:
(SELECT UserBlockId FROM qdfLgotKontakt WHERE ID = <ID>) = <CurrentUserID>

сам триггер
Код:
ExecuteSQL("UPDATE qdfLgotKontakt SET [UserBlockId] = 0 WHERE ID = <ID>")

работает,но если только не закрыть форму через отмену или закрытием окна.Если так сделать то UserBlockId остается с значением UserID.


Добавил сообщение триггера и увидел что он не всегда срабатывает,как сделать правильно,а то что то запутался


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

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
merefa37 писал(а):
у меня триггер при закрытие с условием
Код:
(SELECT UserBlockId FROM qdfLgotKontakt WHERE ID = <ID>) = <CurrentUserID>

Можно проще: проверяйте на ненулевое значение и все. Если так, то обнуляйте.
merefa37 писал(а):
Добавил сообщение триггера и увидел что он не всегда срабатывает
у меня всегда


Вложения:
При закрытии формы.gif
При закрытии формы.gif [ 1.85 МБ | Просмотров: 34867 ]

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15.03.2020 18:30 
Не в сети

Зарегистрирован: 31.05.2019 11:58
Сообщения: 19
Триггер без условия проверил срабатывает всегда,как и у Вас.
А вот с условием беда,ведь надо проверить значение в форме присвоенное CurrentUserID,если совпало то обнулить.
Иначе любой другой юзер откроет форму,она скажет,занято и закроет по "Отмена",то триггер обнулит,тем самым снова даст полномочия для редактирования формы
А это условие как то коряво работает......
Как правильно прописать условие на закрытие в виду выше изложенного?

Ps. Как говорится сам ду.....невнимательный короче,триггер на закрытие формы с выше приведенным условием отрабатывает нормально,путаница возникла из-за того что перепутал окна с программой под разными пользователями.
Просто под собой можно форму записи открывать несколько раз,и тут триггер в этом виде не справляется(соответственно).
Запрет на открытие одной и той же записи это наверное следующий вопрос.
Спасибо за помощь!


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

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
merefa37 писал(а):
ведь надо проверить значение в форме присвоенное CurrentUserID,если совпало то...
закрыть форму, значит уже данный пользователь редактирует эту запись в другом сеансе.

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

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


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

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


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

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