Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 109

Запретить открывать форму с данными, если она уже открыта другими

08.12.2017, 12:41. Показов 1768. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть список с данными, нажимая 2 раза, открывается форма с этими детальными данными. Там есть идентификационный код или серия. Нужно запретить, открытие формы по идентификационному коду если она уже открыта.

Возможно ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2017, 12:41
Ответы с готовыми решениями:

Визуализатор XML отображает уже стилизованную форму с данными
Копаюсь с данными из росреестра. Требуется парсить полученные от него xml файлы и далее печатать их. На самом сайте есть возможность...

Запретить открытие формы если она уже открыта
Из главной формы открываю еще одну форму кнопкой. При повторном нажатии вызывается повторно вызывается окно с 2й формой. Как сделать...

Как определить, что открыта панель Персонализации и завершить её, если она открыта?
Я понимаю, что необходимо узнать Hendle окна. Но как узнать хэндл Панель управления\Все элементы панели управления\Персонализация???...

16
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.12.2017, 12:50
Цитата Сообщение от vadca Посмотреть сообщение
Нужно запретить, открытие формы по идентификационному коду если она уже открыта.
Имеется ввиду запрет открытия на другом клиентском месте?
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 109
08.12.2017, 13:13  [ТС]
Да, на другом ПК или на нескольких.

Добавлено через 20 минут
MS SQL Server база данных
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.12.2017, 13:16
Цитата Сообщение от vadca
Да, на другом ПК или на нескольких
Полагаю, что зависит от СУБД.
Например, в Oracle есть конструкция SELECT ... FOR UPDATE. Если я при открытии формы делаю не просто SELECT, а SELECT FOR UPDATE, то СУБД проверяет, не заблокирована ли строка другим. Если заблокирована, то выдается ошибка, которую при обработке можно заменить на что-то вроде "Документ уже открыт другим пользователем".
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
08.12.2017, 13:20
Grossmeister, не, это вы уже жестите. Перед выдачей ошибки база знатно потупит (подождёт, пока снимется блокировка). Лучше завести отдельное поле в этой таблице (или в другой) с признаком блокировки записи. Хотя тут придётся следить за снятием этой записи, ибо клиент может отвалиться не почистив за собой запись.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.12.2017, 13:24
Цитата Сообщение от Usaga Посмотреть сообщение
Перед выдачей ошибки база знатно потупит (подождёт, пока снимется блокировка)
Нет. Точнее если просто SELECT FOR UPDATE, то да, программа перейдет в ожидание снятия блокировки.
А вот если SELECT FOR UPDATE NOWAIT, то будет попытка самому заблокировать строку, а если она уже заблокирована, то немедленно ORA-00054 resource busy
1
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
08.12.2017, 13:30
Grossmeister, но это если речь о обращении к базе в рамках транзакции. ТС просил удерживать блокировку на всё время открытия формы редактирования. А это значит, что придётся держать транзакцию пока не закроется форма редактирования. Мягко говоря, не очень правильное решение.

И не нужно ли прибавить HOLDLOCK, чтобы блокировка не уехала после выполнения запроса?
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 109
08.12.2017, 13:39  [ТС]
Спасибо за идеи. Буду пробовать обе.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
08.12.2017, 13:50
Цитата Сообщение от Usaga
Мягко говоря, не очень правильное решение.
Во-первых, вряд ли кто-то станет специально долго держать открытую форму.
Во-вторых, открытая транзакция ничему не мешает.
В-третьих, если по бизнес-условиям во время редактирования инфы никто другой не имеет права редактировать эту же инфу, то другого способа, кроме как SELECT FOR UPDATE, обеспечить это нет.
А что касаемо самопальной реализации блокировок, то это обязательно будет приводить (хотя бы периодически) к тому, что эти блокировки будут оставаться. Тем более, что для того, чтобы изменение какого-то поля увидела другая сессия, это изменение надо зафиксировать с пом. COMMIT
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
08.12.2017, 13:55
Grossmeister, я согласен, что самопальная блокировка - дело такое, за ней следить нужно. Но можно решить и иначе: мьютексами на стороне сервера\клиента.

Удерживать монопольную блокировку над строкой\таблицей - плохое решение.

Добавлено через 54 секунды
Цитата Сообщение от Grossmeister Посмотреть сообщение
Во-первых, вряд ли кто-то станет специально долго держать открытую форму.
Открыть форму и пойти попить чая или поговорить по телефону с клиентом - чем не распространённая практика?
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 109
08.12.2017, 14:04  [ТС]
Usaga, а как реализовать мьютексами на стороне сервера\клиента. ? Я мютекс реализовал на саму оболочку программы, чтобы не запускали несколько раз. А тут форма таже, но может содережать разные данные, исходя от серии, наврятли можно наложить мютекс
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
08.12.2017, 14:12
vadca, под "мьютексом" я имел в виду общий способ блокирования. Это не обязательно должен быть именно мьютекс или примитив синхронизации. Можно банально завести словарик (Dictionary) в который заталкивать серийный номер (или что у вас там идентифицирует запись) и какой-нибудь ID клиента взявшегося её редактировать.

Поскольку работа с данными идёт через один сервер, централизованно, то он всегда будет в курсе кто и что редактирует. PROFIT. Никаких "долгих" транзакций.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 109
08.12.2017, 14:24  [ТС]
А какой нибудь пример, может можно увидеть где нибудь? С этим еще не сталкивался. или по каким критериям гууглить
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
08.12.2017, 14:28
vadca, вам недостаточно совета про словарь?
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
08.12.2017, 15:05
Как-то нелогично поставлена задача.
Если делать селект с удержанием, то, чисто теоретически, другой клиент даже реестр не увидит - так как должен получить хотя-бы айдишку с таблицы, где строка отбирается. И получит вечный дедлок в ожидании.
Переспросите заказчика, может быть нужно не давать права сохранять, пока открыта сессия на другой машине? Иначе задача довольно нетривиальная получается с множеством костылей в будущем.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 109
08.12.2017, 15:25  [ТС]
hoolygan, ок, как вариант, как запретить сохранять ?
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
08.12.2017, 16:05
vadca, вводите в таблицу поле типа timestamp и читаете её вместе со всеми данными, а в момент сохранения, добавляете её к в условию WHERE (update bla-blah where Id=@Id and Version=@Version). При изменении любого поля записи СУБД автоматически изменит и значение этого поля (оно сродни счётчику), потому последующие попытки обновить запись обломятся: версия-то изменилась и Update такую запись не найдёт.

Это очень популярный подход. Никаких блокировок. Только пользователя нужно будет известить, что сохранение не удалось так как целевая запись была изменена кем-то другим.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2017, 16:05
Помогаю со студенческими работами здесь

Как запретить открывать форму?
ну скажем при определенных условиях? оптимально хотелось бы возможность скрыть ярлык в меню слева. есть такие команды? или же повесить на...

Как запретить работу в одной форме если открыта другая?
Подскажите, пожалуйста, как запретить работу в одной форме если открыта другая?

Не пересоздается директория QDir, если она открыта через файловый менеджер
Нужно удалить существующую директорию, если она есть и создать новую с тем же именем, т.е. очистить и записать в нее файлы. Все хорошо до...

[WPF] Не открывать окно, если уже открыто
Интересует как можно автоматически сделать так, чтобы окно, если он уже открыто, не открывалось дублем, а просто передавался фокус...

Ошибка, что база уже открыта oткрыть Exclusive уже неудaется.
Еслй етoт пример пoстaвить в цикл (типo пoвтoряетсья через 1 мин.), тo через кaкиx тo 25 - 35 рaзoв видoет oшибку, чтo бaзa уже oткрытa и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru