как правильно закрывать базы
Select messages from
# through # FAQ
[/[Print]\]

-> Программирование в БЭСТ-4

#1: как правильно закрывать базы Author: Плешивцев ЕвгенийLocation: Плешивцев Евгений PostPosted: 14 Sep 2007 09:48
    —
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


функция выдает такую ошибку:


как правильно?

#2:  Author: BehemothLocation: Новиков Алексей Юрьевич PostPosted: 14 Sep 2007 10:30
    —
Добрый день.
Всё дело в том, как Вы открываете временную базу. Вы её открываете в рабочей области, в которой находитесь. Эта рабочая область MLABEL. Соответственно MLABEL закрывается и на его месте открывается UsDataBase. То есть, алиаса MLABEL больше нет.
Следовательно, когда управление возвращается в initlist номенклатурного справочника отсутствие MLABEL не прохродит незамеченым.

#3:  Author: BehemothLocation: Новиков Алексей Юрьевич PostPosted: 14 Sep 2007 10:35
    —
Воспользуйтесь функцией
DBCREATE( <cDatabase>, <aStruct>, [<cDriver>], [<lOpen>], [<cAlias>] ) --> NIL

Если указать lOpen=.T. и cAlias, то Вы получите тот результат, которого добиваете

#4:  Author: nordkLocation: Горбунов Константин PostPosted: 14 Sep 2007 10:38
    —
Алексей я с Вами не согласен !!!
Mlabel есть - ведь Евгений закрывает не все алиасы а конкретный.
Я тоже так закрываю и у меня нет таких проблем.

Дело в другом.
Вы при создании временного файла сделали его алиас активным.
А когда вернулись не вернули активную рабочую область
на место.
Один из первых уроков тут начинался с того, что надо стараться
пользоваться функциями
SaveSet в начале программы и RestSet в конце.
Также полезы функции SaveSetKey и RestSetKey
А вот dbpush() и dbpop() я лично в таких программах не применяю.
Нет смысла (не вижу смысла). Если убрать программа будет работать
также.
Тока в конце RestSet() примените и в

#5:  Author: BehemothLocation: Новиков Алексей Юрьевич PostPosted: 14 Sep 2007 11:19
    —
Добрый день.
nordk wrote:
Алексей я с Вами не согласен !!!
Mlabel есть - ведь Евгений закрывает не все алиасы а конкретный.
Я тоже так закрываю и у меня нет таких проблем.

Костя, Вы часто советуете юзерам прогнать программу в отладчике. Попробуйте сами воспользоваться своим советом. Вы увидите, что MLABEL прекращает своё существование в момент совершения команды
Use &cDataBase Alias UsDataBase EXCLUSIVE
И далее уже не имеет значения, как и что конкретно мы закрываем и пишем ли мы скобки dbpush() - dbpop(). Алиаса MLABEL больше нет. И DBPOP() его не восстанавливает (он не умеет открывать закрытую баз

#6:  Author: Плешивцев ЕвгенийLocation: Плешивцев Евгений PostPosted: 14 Sep 2007 11:38
    —
Алексей Юрьевич прав, и его рассуждения привели к такой конструкции, которая работает:
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, так же выдается ошибка. Оставляем их.

#7:  Author: nordkLocation: Горбунов Константин PostPosted: 14 Sep 2007 11:49
    —
Женя а теперь попробуй убери NEW - перестанет работать ?
P.S.
Если честно я использую NetUse() NetUseExc() и для терминального
режима не помню еше одна.
А еще есть очень удобная DbOpenBases()

#8:  Author: Плешивцев ЕвгенийLocation: Плешивцев Евгений PostPosted: 14 Sep 2007 12:13
    —
да, Use без New в данном контексте приводит к вышеуказанной ошибке. У функции NetUse такой проблемы нет, но всю программу нужно окружать скобками dbPush - dbPop

#9:  Author: nordkLocation: Горбунов Константин PostPosted: 14 Sep 2007 12:19
    —
А зачем ?



-> Программирование в БЭСТ-4


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group