Написав несколько утилит для работы с заказами сейчас выявилась проблема.
Очень не нравится то, что у меня не учтена одновременная работа с однми и тем же документом.
1. Мне нужна проверка на то, что какой-либо документ в данный момент не редактируется.
2. При редактировании документа моей спецфункцией ставилась бы блокировка для остальных.
Расскажите, пожалуйста каким инструментом это можно сделать.
Конкретно речь идет об Rbook.dbf - заказы покупателей:
Сводные, заявки продажи.........
Блокировки стандартные БЕСТ'овские, которые видны в медежере сервера приложений (тамже и номер записи какой-то висит, когда документ блокируется)
В поставке с БЭСТ-5 идет описание структуры БД.
Если Вы посмотрите на структуру интересующей Вас таблицы то увидите поле-признак корректировки заказа.
Пользоваться этим полем пробовали ?
nordk пишет:
В поставке с БЭСТ-5 идет описание структуры БД.
Если Вы посмотрите на структуру интересующей Вас таблицы то увидите поле-признак корректировки заказа.
Пользоваться этим полем пробовали ?
Хотелось бы Вам верить, что все так просто, но я не нашёл такого поля.
Есть поле Input, но оно у всех равно "1", редактируется или нет документ в этот момент. В описании этого поля сказано: "Признак корректировки". В общем "внешне" сами записи в таблице принципиально ничем не отличаются:(
(Запись, которую в данный момент редактирую от остальных).
Я не утверждаю, поскольку на проверку каждого а детально не хватает пока ресурсов. Поэтому я спрашиваю
что Вы смотрели сами и что успели попробовать...
Еще есть вот такая функция.
Возможно это то, что Вам надо
Код
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 пишет:
Я не утверждаю, поскольку на проверку каждого а детально не хватает пока ресурсов. Поэтому я спрашиваю
что Вы смотрели сами и что успели попробовать...
Еще есть вот такая функция.
Возможно это то, что Вам надо
Здорово, спасибо. На первый взгляд, то что надо, все работает, полностью ясно будет при непосредственном применении.
Здорово, спасибо. На первый взгляд, то что надо, все работает, полностью ясно будет при непосредственном применении.
Семафор работает. Пока никто не жаловался. Я их использую сейчас только для таблицы rbook .
Сейчас возник :
"А нельзя ли сразу снять все блокировки с одной таблицы?" Вернее даже "групповое" снятие блокировки через массив значений!? Или снятие блокировок относительно одной рабочей области - этот вариант, вообще идеальный...
nordk пишет:
Совершенно не понимаю что нужно.
F_DBUNLOCK() это не то ?
Я не совсем точно выразил то, что мне требуется. Я хочу одним махом убрать сетевые семафоры для одной Таблицы в одной рабочей области. Хотя уже особо не актуально.
Т.е. вместо:
У меня другой очень сильно интересующий меня .
Функция 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())!!!! Очень волнует данный .
Так ить наличие/отсутствие строки определяется при создании переменной:
"LOCAL cLockStr:=SUBSTR(dbinfo(10),LEN(B6_DBF_PATH)+1)+STR(IF(EMPTY(nRecNo),RECNO(),nRecNo),10,0)"
;-)
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 в списке блокировок на сервере!!!!