| 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 |  | 
	
		|  | 
	
		|  |