| Марина 
 
 
 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 (Сообщение Нет), то есть все будет работать как над
 |  |