Форум » Clipper » Clipper 5.2e + DBFNTX сохранение состояния БД » Ответить

Clipper 5.2e + DBFNTX сохранение состояния БД

Sergy: Вот какой вопрос у меня возник: в некоторых участках программы требуется сохранение состояния всех открытых таблиц (индексов, алиасов, relation, фильтров, RECNO() и тп) потом их полное восстановление. Реально ли это сделать или не заморачиваться ? Пока вижу такую реализацию: 1) просматриваем от 1 до 255 все рабочие области. 2) если область используется, сохраняем: AADD(aWorks, {ALIAS(), RECNO(), INDEXKEY(INDEXORD(1..NN)), DBFILTER(), DBRELATION(1...NN),....} ) после чего все закрываем (обычно именно это нужно), работаем с другими таблицами, закрываем их и по массиву aWorks восстанавливаем состояние. Начинаю уже подходить к реализации - довольно сложный в отладке процесс. Может кто сталкивался с граблями и поможет не наступить мне на них. Заранее спасибо уважаемым участникам конференции.

Ответов - 6

Григорьев Владимир: Я вижу недостаток, относящийся к самому Clipper, а не к вашей идеи, состоящий в том, что Clipper не делает доступным спецификацию файла базы данных после ее открытия. Правда смещение в структуре, соответствующей объекту выбранной рабочей области, по которому хранится спецификация файла известен. Оттуда можно эту спецификацию выуживать, чтобы затем по ней заново открывать нужную базу данных.

Sergy: именно этот недостаток Clipper и привел к созданию данной ветки ;-) Подскажи пожалуйста, как выудить эту спецификацию, и что с ней после "рыбалки" делать. ;-D Спасибо.

ort: Я сохраняю состояние баз в стеке, но при этом не закрываю их. Думаю, что этот код можно подправить под вашу задачу. Добавить еще индекс, фильтр и relation. // Длина стека базы данных #define LEN_DBF_STACK 11 // Стек базы данных STATIC cDbStack := "" /*** * dbSave() - сохраняет текущие установки базы данных: * рабочая область, * номер записи, * управляющий индекс, * значение SET SOFTSEEK * значение SET DELETED */ Function dbSave() cDbStack = Chr(Select())+; Str(RecNo(),7)+; Chr(IF(Used(),IndexOrd(),0))+; If(Set(_SET_SOFTSEEK),"T","F")+; If(Set(_SET_DELETED), "T","F")+; cDbStack RETURN NIL /*** * dbRest() - восстанавливает текущие установки базы данных: * рабочая область, * номер записи, * управляющий индекс, * значение SET SOFTSEEK * значение SET DELETED */ Function dbRest() Set(_SET_SOFTSEEK,IF(SubStr(cDbStack,10,1)=="T",.T.,.F.)) Set(_SET_DELETED, IF(SubStr(cDbStack,11,1)=="T",.T.,.F.)) Select(Asc(SubStr(cDbStack,1,1))) IF Used() dbGoto(Val(SubStr(cDbStack,2,7))) dbSetOrder(Asc(SubStr(cDbStack,9,1))) ENDIF // Коррекция стека cDbStack = SubStr(cDbStack, LEN_DBF_STACK+1) RETURN NIL


mike: Я вот столкнулся с такой трудностью при реализации алгоритма, если есть несколько БД с set relation, то при восстановлении исходного состояния БД по очереди в цикле, происходит смещение записей, относительно сохраненных значений, некоторых зависимых БД, т.к. в Clipper установка set relation действует только в активной БД, а в пассивных она не работает..., плюнул на это дело... если кто реализовал полностью алгоритм поделитесь!

Sergy: именно Relation я и опасаюсь... а они у меня используются...

suv2: Sergy пишет: Вот какой вопрос у меня возник: в некоторых участках программы требуется сохранение состояния всех открытых таблиц (индексов, алиасов, relation, фильтров, RECNO() и тп) потом их полное восстановление. Реально ли это сделать или не заморачиваться ? очень сложно, а в некоторых случаях (SIx) - АБСОЛЮТНО точное восстановление вообще невозможно. забей. отталкивайся от другого концепта - держи всегда файлы открытыми.



полная версия страницы