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