Марина
Joined: 27 Aug 2002 Posts: 501 Location: Кондрина Марина Александровна Occupation: ОАО БКО программист Interests: Боровичи Новгородской обл
|
Posted: 22 Mar 2007 14:08 Post subject: Проблемы с блокированием записи |
|
|
Маленькая программка, которую надо подключить по Ctrl+F5 в Прайс-листе Управления продажами
Code: |
#include 'inkey.ch'
function main()
aSet:=saveset()
altd()
*Сперва создаем и открываем монопольно новую таблицу для редактирования
indnomer:=0
do while file(LoadPath()+"\real\magmm"+ltrim(str(indnomer))+".dbf");
.or.file(LoadPath()+"\real\magmm"+ltrim(str(indnomer))+".cdx")
indnomer++
enddo
dbcreate(LoadPath()+"\real\magmm"+ltrim(str(indnomer))+".dbf",;
{{"code","C",3,0},;
{"name","C",20,0},;
{"sumoutr","N",12,2},;
{"u_neotgr","L",1,0},;
{"l_avt","L",1,0}})
NETUSE("mag_ce",LoadPath()+"\real\magmm"+ltrim(str(indnomer))+".dbf",,.F.)
index on name tag tag_name to (Loadpath()+"\real\magmm"+ltrim(str(indnomer))+".cdx")
* и создаем в ней одну строку для редактирования
dbappend(); field->name:='Строка'
*Это попытка блокировки текущей записи в mlabel и проверка, заблокирована ли запись
if mlabel->(rlock())
sayandwait("1 Да"+str(mlabel->(recno())))
mlabel->marka:='aaaaaa'
else
sayandwait("1 Нет"+str(mlabel->(recno())))
endif
*Пауза
altd()
dbgotop()
DISPBOX(5,2,24,62,( Chr( 201 ) + Chr( 205 ) + Chr( 187 ) + Chr( 186 ) + Chr( 188 ) + Chr( 205 ) + Chr( 200 ) + Chr( 186 )+' ' ) ,"W+/B")
@6,03 say padc("Таблица для редактирования",59)
nTop:=7
nBot:=22
cColHead:={" Магазин Цена Не отгр-ть"}
cCurProc:={||2}
aBlockCols:={{{||field->name},0},{{||str(field->sumoutr,12,2)},21},{{||if(field->u_neotgr,chr(251)," ")},38}}
_aPic:={"XXXXXXXXXXXXXXXXXXXX","999999999.99"}
_aHeads:={{"Магазин :","NAME","1","1","0"},{"Цена :","SUMOUTR","1","1","0"}}
_bScrInit:={||If(nApp=2,0,1)}
mag_ce->( INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,,_aPic,,,;
,,_bScrInit,,,;
,,,,,;
15))
*Это повторная попытка блокировки и проверка, заблокирована ли запись
if mlabel->(rlock())
sayandwait("2 Да"+str(mlabel->(recno())))
mlabel->marka:='bbbbbb'
else
sayandwait("2 Нет"+str(mlabel->(recno())))
endif
restset(aSet)
return 1
|
В этом тесте редактируется запись в файле mag_ce. А перед этим блокируется запись в mlabel. Странно то, что при редактировании записи в mag_ce слетает блокировка записи в mlabel.
Так вот, первый пользователь из прайс-листа запускает эту программу. На экране сообщение Да про блокирование соответствующей записи в mlabel. Далее, на экране появляется таблица со словом Строка. Исправляем в этой строчке цифру 0 на другую. Не выходим из таблицы, пусть пока повисит!
Второй пользователь теперь тоже заходит в прайс-лист, встает на тот же товар. Запускает эту же программу. Сразу же делается попытка блокирования той же записи в mlabel. Получаем сообщение Да, то есть запись была разблокирована. А кто ее разблокировал? Ведь редактирование происходило в другой таблице!
А вот если первый пользователь не будет редактировать строку Строка, то второму пользователю не удастся заблокировать эту запись в mlabel (Сообщение Нет), то есть все будет работать как над |
|