18.07.2006, 15:23 | #1 |
Участник
|
Как блокировать одновременный доступ к Заказу?
Товарищи по Axapta, подскажите, пожалуйста, никто не сталкивался с такой задачей:
Необходимо не допускать одновременной работы 2х и более пользователей в одной шапке(строках) Заказа/Закупки. Работаем на 2х звенке, Axapta 3.0. |
|
18.07.2006, 15:37 | #2 |
Гость
|
Цитата:
Сообщение от блондинка
Товарищи по Axapta, подскажите, пожалуйста, никто не сталкивался с такой задачей:
Необходимо не допускать одновременной работы 2х и более пользователей в одной шапке(строках) Заказа/Закупки. Работаем на 2х звенке, Axapta 3.0. |
|
18.07.2006, 16:00 | #3 |
Member
|
lagr221374, на ник посмотрите.
А вообще речь идет о поиске стандартной функциональности или о том, как выполнить доработку? Первого нет, а второе можно почерпнуть в журналах ГК и складских журналах.
__________________
С уважением, glibs® |
|
18.07.2006, 16:04 | #4 |
Гость
|
Цитата:
Сообщение от glibs
lagr221374, на ник посмотрите.
А вообще речь идет о поиске стандартной функциональности или о том, как выполнить доработку? Первого нет, а второе можно почерпнуть в журналах ГК и складских журналах. Другой вопрос что для работы это не удобно...но такова жизнь Последний раз редактировалось lagr221374; 18.07.2006 в 16:06. |
|
18.07.2006, 16:33 | #5 |
Участник
|
Цитата:
Сообщение от lagr221374
Можно создать одного user-а и только ему дать права для работы с заказами.
Вообще говоря, лучше настроить RLS на поле Ответственный продавец. При создании это поле заполнять в обязательном порядке. |
|
18.07.2006, 17:39 | #6 |
Участник
|
Большое спасибо за активное участие!
Жизненная ситуация такая: Выделить отдельного "ответственного" за Заказ административно невозможно, да и не требуется. Желание только не мешать друг другу одновременной работой. Програмно, по аналогии с журналами, ставим и снимаем блокировки. Но, очень уж тяжело получилось - слишком много ситуаций пришлось предусмотреть, когда этот блок ставим, а когда снимаем, и все равно надо постоянно обновлять форму, чтобы снимались блокировки. |
|
18.07.2006, 17:53 | #7 |
Гость
|
Цитата:
Сообщение от блондинка
Большое спасибо за активное участие!
Жизненная ситуация такая: Выделить отдельного "ответственного" за Заказ административно невозможно, да и не требуется. Желание только не мешать друг другу одновременной работой. Програмно, по аналогии с журналами, ставим и снимаем блокировки. Но, очень уж тяжело получилось - слишком много ситуаций пришлось предусмотреть, когда этот блок ставим, а когда снимаем, и все равно надо постоянно обновлять форму, чтобы снимались блокировки. Снял галку все вздохнули свободно. |
|
18.07.2006, 17:57 | #8 |
Участник
|
Согласна. Но у нас очень требовательный пользователь. Он не хочет помнить сам о необходимости ставить, и главное, снимать эту галку. А главное, руководитель не хочет слышать, что кто-то забыл снять галку...
|
|
18.07.2006, 18:03 | #9 |
Участник
|
Я тоже считаю, что оптимальным было бы разделить ответственность за Заказы между пользователями. Буду стараться убедить в этом руководство. Главная трудность состоит в том, что в 1С это ТАК РАБОТАЛО.
|
|
18.07.2006, 18:42 | #10 |
Участник
|
Цитата:
Сообщение от блондинка
Главная трудность состоит в том, что в 1С это ТАК РАБОТАЛО.
В 1С пока пользователь не нажмет на кнопку Записать или Провести данных в базе просто нет. После создания, несколько пользователей и в 1С вполне могут работать с одним документом - изменения запишет только первый. Второй получит сообщение о том, что заказ изменен и все его изменения будут потеряны. Проэмулируйте эту кнопку - Записать. При создании заказ блокируйте, при нажатии на кнопку разблокируйте. Редактируйте заказ только в том случае если пользователь нажал на кнопку Открыть. Обратите внимание на совет glibs Как блокировать одновременный доступ к Заказу? Его совет содержит только суть. На самом деле в Аксапте есть аналог безо всякого программирования.Если вы хотите избавиться от коллизий при редактировании разными пользователями одного и того же заказа - вам нужно проэмулировать кнопку Открыть и разрешать редактирование только открытых заказов. Только зачем повторять функционал другой программы - не очень понимаю. Если идти до конца по Аксаптовской логике, то разрешайте редактирование только тех заказов, которые имеют статус Журнал. В этом случае, пользователи чтобы отредактировать, должны сменить статус (в этот момент снимутся резервы), отредактировать и вернуть статус (в этот момент произойдет перерезервирование) |
|
18.07.2006, 18:45 | #11 |
Участник
|
Цитата:
Сообщение от блондинка
Согласна. Но у нас очень требовательный пользователь. Он не хочет помнить сам о необходимости ставить, и главное, снимать эту галку.
Просто Вы разговариваете с пользователем на разных языках. Пользователь не замечает, что он наживает на галку и снимает ее, поскольку это происходит автоматически. А вы не знаете о том, что пользователь нажимает на кнопку Записать (или Провести) |
|
19.07.2006, 11:12 | #12 |
Участник
|
Можно попробовать реализовать с.о.
1. Создаете табличку (salesTableLock), в которой поля: SalesId, UnitId (1, 2:Заказы\Закупки), createdBy, createdDate, createdTime 2. На примере Заказов: Перегружаете в форме salesTable метод active, в котором: 2.1 Делаете проверку на наличие в SalesTableLock записи с salesId == SalesId из текущего курсора, и, если находите, то на форме д.б. метод editsales (я в 2.5 работаю). Вызываете его с параметром false. Посмотрите методы datasource формы AlowEdit, AllowCreate, AllowDelete... Можете выдавать сообщение пользователю. 2.2 Удаляете все записи из табличке salesTableLock, у которых createdBy == curUserId() и, сот-но, модуль == 1:заказы 2.2 Вставляете запись в salesTableLock, salesId из текущего курсора, UnitId = 1 Это навскидку, изврат конечно. Наверняка есть подводные камни. Например пользователь может перезагрузить комп, и тогда запись зависнет в таблице. Тогда нужно определять пакет, который будет чистить "подвисшие" записи, а идентифицировать их, ну, скажем по времени захвата. Сколько времени Заказ может быть захвачен? Решать вам. Да, и лочить запись нужно так же в момент создания. 3. В форме SalesCreateOrder в конце метода initvalue. В противном случае, пока пользователь создает новую запись, другой вошедший в форму "Заказы" может ее заблокировать. |
|
19.07.2006, 14:21 | #13 |
Member
|
Если речь идет об автоматическом снятии "зависшей" блокировки, то лучше посмотреть соответствующий механизм, который реализован в непрерывных номерных сериях (там используется идентификатор сессии и еще что-то (не помню уже)).
Это теоретически. Реально я бы ничего из вышеперечисленного делать не рекомендовал (слишком много кодирования из-за ерунды какой-то).
__________________
С уважением, glibs® |
|
19.07.2006, 16:25 | #14 |
Иван Захаров
|
Цитата:
Сообщение от glibs
Если речь идет об автоматическом снятии "зависшей" блокировки, то лучше посмотреть соответствующий механизм, который реализован в непрерывных номерных сериях (там используется идентификатор сессии и еще что-то (не помню уже)).
... блондинка, Журналы то это одно - там отдельная форма строк, открытие которой можно заблокировать. А вот форма заказов совсем другая. Представьте себе что имеем 10 заказов. Один пользователь на 1м. Второй на 10м. И начинают они "бежать" (с помощью стрелочек на клавиатуре) по гриду - первый - вниз, второй - вверх. Что происходит в районе примерно 5го по счету заказа если они одновременно на нем "остановились"? Вы вообще думали о той бизнес-логике которая должна при этом отрабатывать? Для каждого пользователя: 1. Перечитать запись из БД. 2. Проверить флаг а. Блокирован - блокируем заказ от изменения текущим пользователем (строки + все кнопки) б. Не блокирован - обновляем в транзакции флаг в заказе. Перечитываем запись в датасорс. Можем осуществлять работу с заказом. 3. Ушли с этого заказа - обновить запись в БД., разбликировать строки и кнопки ... и далее на п.1 Короче, бред.... А кроме обычной формы заказов есть форма "Строки открытых заказов" (или как она там называется... Аксапты под рукой нет). Там такую же хрень реализовывать? |
|
Теги |
ax3.0 |
|
|