BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Запись (документ) редактируется другим пользователем.

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Запись (документ) редактируется другим пользователем., Очень бы хотелось получить номер этой записи.
 
Написав несколько утилит для работы с заказами сейчас выявилась проблема.
Очень не нравится то, что у меня не учтена одновременная работа с однми и тем же документом.
1. Мне нужна проверка на то, что какой-либо документ в данный момент не редактируется.
2. При редактировании документа моей спецфункцией ставилась бы блокировка для остальных.

Расскажите, пожалуйста каким инструментом это можно сделать.

Конкретно речь идет об Rbook.dbf - заказы покупателей:
Сводные, заявки продажи.........
Блокировки стандартные БЕСТ'овские, которые видны в медежере сервера приложений (тамже и номер записи какой-то висит, когда документ блокируется)
Изменено: Саак Шахламджян - 29.09.2008 17:47:14
 
В поставке с БЭСТ-5 идет описание структуры БД.
Если Вы посмотрите на структуру интересующей Вас таблицы то увидите поле-признак корректировки заказа.
Пользоваться этим полем пробовали ?
 
Цитата
nordk пишет:
В поставке с БЭСТ-5 идет описание структуры БД.
Если Вы посмотрите на структуру интересующей Вас таблицы то увидите поле-признак корректировки заказа.
Пользоваться этим полем пробовали ?

Хотелось бы Вам верить, что все так просто, но я не нашёл такого поля.
Есть поле Input, но оно у всех равно "1", редактируется или нет документ в этот момент. В описании этого поля сказано: "Признак корректировки". В общем "внешне" сами записи в таблице принципиально ничем не отличаются:(
(Запись, которую в данный момент редактирую от остальных).
Изменено: Саак Шахламджян - 30.09.2008 10:22:11
 
Я не утверждаю, поскольку на проверку каждого Вопроса детально не хватает пока ресурсов. Поэтому я спрашиваю
что Вы смотрели сами и что успели попробовать...

Еще есть вот такая функция.
Возможно это то, что Вам надо

Код
FUNCTION Semafor(lSet,lNoSay,nRecNo)
LOCAL nRetValue
LOCAL cLockStr:=SUBSTR(dbinfo(10),LEN(B6_DBF_PATH)+1)+STR(IF(EMPTY(nRecNo),RECNO(),nRecNo),10,0)
IF !EMPTY(IsHidden())
   RETURN .T.
ENDIF
SrvSetLock(1,cLockStr,IF(lSet,2,0),@nRetValue,.F.)
nRetValue:=EMPTY(nRetValue)
IF lSet.AND.!nRetValue.AND.EMPTY(lNoSay)
   IF IsDocObj() 
      SayError("Запись (документ)"+" редактируется другим пользователем!") 
   ELSE 
      SayAndWait("Запись (документ)"+" редактируется другим пользователем!")
   ENDIF 
ENDIF
RETURN nRetValue
Изменено: nordk - 30.09.2008 10:59:58
 
Цитата
nordk пишет:
Я не утверждаю, поскольку на проверку каждого Вопроса детально не хватает пока ресурсов. Поэтому я спрашиваю
что Вы смотрели сами и что успели попробовать...

Еще есть вот такая функция.
Возможно это то, что Вам надо


Здорово, спасибо. На первый взгляд, то что надо, все работает, полностью ясно будет при непосредственном применении.
 
Цитата
Саак Шахламджян пишет:

Здорово, спасибо. На первый взгляд, то что надо, все работает, полностью ясно будет при непосредственном применении.


Семафор работает. Пока никто не жаловался. Я их использую сейчас только для таблицы rbook .
Сейчас возник Вопрос:
"А нельзя ли сразу снять все блокировки с одной таблицы?" Вернее даже "групповое" снятие блокировки через массив значений!? Или снятие блокировок относительно одной рабочей области - этот вариант, вообще идеальный...
 
Совершенно не понимаю что нужно.
F_DBUNLOCK() это не то ?
 
Цитата
nordk пишет:
Совершенно не понимаю что нужно.
F_DBUNLOCK() это не то ?

Я не совсем точно выразил то, что мне требуется. Я хочу одним махом убрать сетевые семафоры для одной Таблицы в одной рабочей области. Хотя уже особо не актуально.
Т.е. вместо:
Код
Semafor(.T.,,RecNo1)
Semafor(.T.,,RecNo2)
Semafor(.T.,,RecNo3)

Semafor(.F.,,RecNo1)
Semafor(.F.,,RecNo2)
Semafor(.F.,,RecNo3)

Что-нибудь такое:

Код
Semafor(.T.,,RecNo1)
Semafor(.T.,,RecNo2)
Semafor(.T.,,RecNo3)

Semafor(.F.,,ALL)
Изменено: Саак Шахламджян - 12.11.2008 15:13:03
 
У меня другой очень сильно интересующий меня Вопрос.
Функция Semafor:
Код
FUNCTION Semafor(lSet,lNoSay,nRecNo)
LOCAL nRetValue 
LOCAL cLockStr:=SUBSTR(dbinfo(10),LEN(B6_DBF_PATH)+1)+STR(IF(EMPTY(nRecNo),RECNO(),nRecNo),10,0) 
IF !EMPTY(IsHidden()) 
   RETURN .T. 
ENDIF 
SrvSetLock(1,cLockStr,IF(lSet,2,0),@nRetValue,.F.) 
nRetValue:=EMPTY(nRetValue) 
IF lSet.AND.!nRetValue.AND.EMPTY(lNoSay) 
   IF IsDocObj() 
      SayError("Запись (документ)"+" редактируется другим пользователем!") 
   ELSE 
      SayAndWait("Запись (документ)"+" редактируется другим пользователем!") 
   ENDIF 
ENDIF 
RETURN nRetValue


Функция SrvSetLock(...,cLockStr,...) "создает строку" на сервере приложений.
Вопрос Как узнать наличие итересующей строки???
Проблема в следующем:
Если n раз подряд вызвать Semafor(.T.,,nRecNo) c одним и тем же nRecNo всегда будет возвращено .T.
Смысл в том, что если я заблокировал один раз, то могу и второй раз заблокировать туже запись, но новой строки не появиться в сервере приложений. Меня же интересует каким образом определить существует ли уже строка cLockStr (параметр функции SrvSetLock())!!!!
Очень волнует данный Вопрос.
Изменено: Саак Шахламджян - 13.11.2008 13:41:06
 
Так ить наличие/отсутствие строки определяется при создании переменной:
"LOCAL cLockStr:=SUBSTR(dbinfo(10),LEN(B6_DBF_PATH)+1)+STR(IF(EMPTY(nRecNo),RECNO(),nRecNo),10,0)"
;-)
Изменено: E.J. - 14.11.2008 06:43:22
 
Цитата
E.J. пишет:
Так ить наличие/отсутствие строки определяется при создании переменной:
"LOCAL cLockStr :=SUBSTR(dbinfo(10),LEN(B6_DBF_PATH)+1)+STR( IF(EMPTY(nRecNo),RECNO(),nRecNo) ,10,0)"
;-)

Интересно было бы знать каким же это чудесным образом? И при чем тут инициализация переменной cLockStr!!?
А при инициализации этой переменной в 2х разных рабочих областях!???
И запись STR(IF(EMPTY(nRecNo),RECNO(),nRecNo),10,0) означает всего лишь навсего то, что если на вход Semafor(lSet,lNoSay,nRecNo) не был подан номер записи, то будет взят номер текущей записи!!! Но это никоим образом не определяет существует ли cLockStr в списке блокировок на сервере!!!!
 
А Вы анализировали переменную nRetValue ?
 
Цитата
nordk пишет:
А Вы анализировали переменную nRetValue ?

Подумывал, подумывал над этим. Значит "оно" там...
 
Нет, что-то мне nRetValue совсем не нравиться
3 раза подряд поставил
SrvSetLock(1,cLockStr,IF(lSet,2,0),@nRetValue,.F.)
lSet был все время .T.

в nRetValue всегда одно и тоже значение....
Не подходит.
Может быть, дело кроется в параметрах SrvSetLock()? Вон их скООлько...
Страницы: 1
Читают тему (гостей: 1)