| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		Плешивцев Евгений
 
 
  Joined: 03 Apr 2007 Posts: 95 Location: Плешивцев Евгений
  Interests: Волгоград
  | 
		
			
				 Posted: 14 Sep 2007 09:48    Post subject: как правильно закрывать базы | 
				     | 
			 
			
				
  | 
			 
			
				1. Добрый день, регулярно сталкиваюсь с проблемой закрытия баз. Пример: Б-4, 12.01 пак.39 функция запускается из номенклатурного справочника товаров:
 
 	  | Code: | 	 		  // проверка закрытия баз
 
// разработано для Б-4 12.01 Harbour
 
// запускать из номенклатурного справочника товаров
 
 
Function user_proba()
 
 
Local cDataBase:=''
 
Local aStru:={}
 
 
Altd()
 
 
dbPush()
 
 
  aAdd(aStru,{"Sclad","C",6,0})
 
  aAdd(aStru,{"Kol"  ,"N",9,3})
 
 
  cDataBase:=TEMPFILE(GlobalTmpPath,"dbf")
 
  DBCreate(cDataBase,aStru)
 
  Use &cDataBase Alias UsDataBase EXCLUSIVE 
 
 
    SayandWait('закроем базу')
 
  UsDataBase->(dbClosearea())
 
 
dbPop()
 
return nil | 	  
 
 
функция выдает такую ошибку:
 
 
 
 
как правильно? | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Behemoth
 
  
  Joined: 15 Mar 2002 Posts: 155 Location: Новиков Алексей Юрьевич Occupation: ПБОЮЛ Interests: Пермь
  | 
		
			
				 Posted: 14 Sep 2007 10:30    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Добрый день.
 
Всё дело в том, как Вы открываете временную базу. Вы её открываете в рабочей области, в которой находитесь. Эта рабочая область MLABEL. Соответственно MLABEL закрывается и на его месте открывается UsDataBase. То есть, алиаса MLABEL больше нет.
 
Следовательно, когда управление возвращается в initlist номенклатурного справочника отсутствие MLABEL не прохродит незамеченым.   _________________ С уважением, Новиков Алексей. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Behemoth
 
  
  Joined: 15 Mar 2002 Posts: 155 Location: Новиков Алексей Юрьевич Occupation: ПБОЮЛ Interests: Пермь
  | 
		
			
				 Posted: 14 Sep 2007 10:35    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Воспользуйтесь функцией 
 
DBCREATE( <cDatabase>, <aStruct>, [<cDriver>], [<lOpen>], [<cAlias>] ) --> NIL
 
 
Если указать lOpen=.T. и cAlias, то Вы получите тот результат, которого добиваете _________________ С уважением, Новиков Алексей. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		nordk
 
 
  Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
  | 
		
			
				 Posted: 14 Sep 2007 10:38    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Алексей я с Вами не согласен   !!!
 
Mlabel есть - ведь Евгений закрывает не все алиасы а конкретный.
 
Я тоже так закрываю и у меня нет таких проблем.
 
 
Дело в другом.
 
Вы при создании временного файла сделали его алиас активным.
 
А когда вернулись не вернули активную рабочую область
 
на место.
 
Один из первых уроков тут начинался с того, что надо стараться
 
пользоваться функциями
 
SaveSet в начале программы и RestSet в конце.
 
Также полезы функции SaveSetKey и RestSetKey
 
А вот dbpush() и dbpop() я лично в таких программах не применяю.
 
Нет смысла (не вижу смысла). Если убрать программа будет работать
 
также.
 
Тока в конце RestSet() примените и в | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Behemoth
 
  
  Joined: 15 Mar 2002 Posts: 155 Location: Новиков Алексей Юрьевич Occupation: ПБОЮЛ Interests: Пермь
  | 
		
			
				 Posted: 14 Sep 2007 11:19    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Добрый день.
 
 	  | nordk wrote: | 	 		  Алексей я с Вами не согласен   !!!
 
Mlabel есть - ведь Евгений закрывает не все алиасы а конкретный.
 
Я тоже так закрываю и у меня нет таких проблем. | 	  
 
Костя, Вы часто советуете юзерам прогнать программу в отладчике. Попробуйте сами воспользоваться своим советом. Вы увидите, что MLABEL прекращает своё существование в момент совершения команды
 
Use &cDataBase Alias UsDataBase EXCLUSIVE
 
И далее уже не имеет значения, как и что конкретно мы закрываем и пишем ли мы скобки dbpush() - dbpop(). Алиаса MLABEL больше нет. И DBPOP() его не восстанавливает (он не умеет открывать закрытую баз _________________ С уважением, Новиков Алексей. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Плешивцев Евгений
 
 
  Joined: 03 Apr 2007 Posts: 95 Location: Плешивцев Евгений
  Interests: Волгоград
  | 
		
			
				 Posted: 14 Sep 2007 11:38    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Алексей Юрьевич прав, и его рассуждения привели к такой конструкции, которая работает:
 
 	  | Code: | 	 		  // проверка закрытия баз
 
// разработано для Б-4 12.01 Harbour
 
// вер. 1.1
 
// запускать из номенклатурного справочника товаров
 
 
 
Function user_proba()
 
 
Local cDataBase:=''
 
Local aStru:={}
 
Local aSet, aSetKey
 
 
Altd()
 
aSet:=SAVESET()
 
 
  aAdd(aStru,{"Sclad","C",6,0})
 
  aAdd(aStru,{"Kol"  ,"N",9,3})
 
 
  cDataBase:=TEMPFILE(GlobalTmpPath,"dbf")
 
  DBCreate(cDataBase,aStru)
 
  Use &cDataBase Alias UsDataBase NEW EXCLUSIVE 
 
 
  SayandWait('закроем базу')
 
  UsDataBase->(dbClosearea())
 
 
RESTSET(aSet)
 
return nil | 	  
 
 
Изменена конструкция команды Use, теперь так:
 
Use &cDataBase Alias UsDataBase NEW EXCLUSIVE 
 
 
Кстати без указанных Костей конструкций: SAVESET - RESTSET, так же выдается ошибка. Оставляем их. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		nordk
 
 
  Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
  | 
		
			
				 Posted: 14 Sep 2007 11:49    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Женя а теперь попробуй убери NEW - перестанет работать ?
 
P.S.
 
Если честно я использую NetUse() NetUseExc() и для терминального
 
режима не помню еше одна.
 
А еще есть очень удобная DbOpenBases() | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Плешивцев Евгений
 
 
  Joined: 03 Apr 2007 Posts: 95 Location: Плешивцев Евгений
  Interests: Волгоград
  | 
		
			
				 Posted: 14 Sep 2007 12:13    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				| да, Use без New в данном контексте приводит к вышеуказанной ошибке. У функции NetUse такой проблемы нет, но всю программу нужно окружать скобками dbPush - dbPop | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		nordk
 
 
  Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
  | 
		
			
				 Posted: 14 Sep 2007 12:19    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				А зачем ?     | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		 |