powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Восстановление базы
15 сообщений из 15, страница 1 из 1
Восстановление базы
    #32622988
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется такой код, написан не мной, а собран из разных источников...помогите разобраться
Пример № 1:
*****
Имеется FOX БАЗА ДАННЫХ в которую входит к примеру две таблицы связанные между собой Relationship
Вопрос. Как восстановить программно Relationship?
Ответ
Допусим, нужно связать wr1 и wr2 по ключу id_z из БД work2

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE wr1 ADD PRIMARY KEY id_z TAG id_z
ALTER TABLE wr2 ADD FOREIGN KEY id_z TAG id_z REFERENCES wr1
CLOSE DATABASE      && закрыть БД
USE work2.dbc IN  0   && открыть эту БД, как таблицу
LOCATE FOR ObjectType="Table" AND ObjectName="wr2"
nObjID=ObjectID && ??? что за переменные и чему равен ObjectID и откуда берется ???
LOCATE FOR ObjectType="Relation" AND ObjectID=nObjID
REPLACE RiInfo WITH "CCR"

>Просматриваю ее как таблицу BROWSEом. Структура вроде бы ясна. Но в
>строки, где ObjectType="Relation" поля RiInfo пустые.
>В другой базе в одном случае в поле RiInfo стоит "ICI"
>Хотя Relation в обоих случаях на первый взгляд одинаковые.

>Вопрос. Где могут быть описаны все допустимые значения поля RiInfo?

I - Ignore
C - Cascade
R - Restrict

Первый символ относится к Update, второй к Delete, третий к Insert. В
твоём случае c ICI

I - Ignore Update
C - Cascade Delete
I - Ignore Insert


(с) Кирилл
***** источник: A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок. HELP "PRIBAMBASI for VFP on materials of conferences, literature and own development

Пример № 2
*****

**** Удаляем из базы данных все ссылки на индексы ****
************** и постоянные отношения ****************
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
lnFH=Fopen("KONTAKT.DBC", 2 )
If m.lnFH< 0 
  Messagebox("Для выполнения данной операции требуется эксклюзивный доступ к данным."+Chr( 13 )+ ;
    "Закройте все окна, завершите работу программы на других компьютерах и повторите попытку"+Chr( 13 )+Chr( 13 )+ ;
    "p.s. Если ничего не помогло, будите админа", 16 )
  Do RestorySet
  Return .f.
Endif
Fclose(m.lnFH)
USE KONTAKT.DBC EXCLUSIVE
DELETE ALL FOR ALLTRIM(UPPER(ObjectType)) = "INDEX"
DELETE ALL FOR ALLTRIM(UPPER(ObjectType)) = "RELATION"
REPLACE ALL PROPERTY WITH DelPrimaryKey(PROPERTY) ;
  FOR ALLTRIM(UPPER(ObjectType)) = "TABLE"
PACK
USE
FLUSH

дальше идет переиндексация и востановление отношений

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
***** Реиндексация таблицы ZEX *****
 IF FILE("ZEX.CDX")
   ERASE (FULLPATH("ZEX.CDX"))
 ENDIF
 USE ZEX EXCLUSIVE
 SET COLLATE TO ""
 PACK
 ALTER TABLE ZEX ADD PRIMARY KEY ZEX TAG ZEX_ZEX
***** Реиндексация таблицы S_ZEX *****
 IF FILE("S_ZEX.CDX")
   ERASE (FULLPATH("S_ZEX.CDX"))
 ENDIF
 USE S_ZEX EXCLUSIVE
 SET COLLATE TO ""
 PACK
 INDEX ON AZEX TAG S_ZEX_ZEX COMPACT ASCENDING

ALTER TABLE S_ZEX 	  ADD FOREIGN KEY TAG S_ZEX_ZEX  REFERENCES ZEX 	 TAG ZEX_ZEX

табл много *дум* 2 хватит
......

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 CLOSE DATABASES ALL && закрытие 
 USE KONTAKT.DBC EXCLUSIVE && открытие базы как таблицы
 LOCATE FOR ALLTRIM(UPPER(ObjectType)) = "TABLE" .AND. ALLTRIM(UPPER(ObjectName)) = "S_ZEX" && ? UPPER('abcd') && Displays ABCD
* ищем таблицу с именем S_ZEX
 IF FOUND() && если нашли
   lnObjectID = ObjectID && ХренЗнает
   LOCATE FOR ALLTRIM(UPPER(ObjectType)) = "RELATION" .AND. ; && ищем отношения
     ATC("S_ZEX_ZEX",PROPERTY) >  0  .AND. ; && тэг таблицы (s_zex) в property ищется s_zex_zex слева на право
     ATC("ZEX",PROPERTY) >  0  .AND. ; && тут или таблица или поле опять ХЗ
     ATC("ZEX_ZEX",PROPERTY) >  0  .AND. ; && это тэг таблицы zex.dbf
     PARENTID = m.lnObjectID && тут мучает вопрос что такое символ "эм" с точкой m.* что означает??? скажи пожалуйста 
   IF FOUND()
     REPLACE RiInfo WITH "RRR   " && что есть RiInfo и с чем его едят и где оно храниться ???
   ELSE
     MESSAGEBOX("База дынных испорчена, и все тут...суши весла",  48 )
   ENDIF
 ENDIF
 USE

(с) Жихарев Дмитрий
*****источник: foxclub.ru

People сделайте мне help!!! плизз...

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32623122
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grumax_userPeople сделайте мне help!!! плизз...

Help чего? Каждую строчку комментировать? Уточни, что именно надо прояснить?
...
Рейтинг: 0 / 0
Восстановление базы
    #32623248
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ВладимирМ
Добрый день!
Каждую строчку не надо ;-)) надо каждую строчку где -> && с вопросом "???" :-))

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32623402
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Grumax_user
А вы батенька нахал...
>nObjID=ObjectID && ??? что за переменные и чему равен ObjectID и откуда берется ???
Это поле таблицы в текущей рабочей области. В этом примере в work2.dbc

>PARENTID = m.lnObjectID && тут мучает вопрос что такое символ "эм" с точкой m.* что означает??? скажи пожалуйста
Пожалуйста:) Это означает что мы используем не поле таблицы а одноименую переменую памяти

>REPLACE RiInfo WITH "RRR " && что есть RiInfo и с чем его едят и где оно храниться ???
Это поле таблицы в текущей рабочей области. В этом примере в KONTAKT.DBC
...
Рейтинг: 0 / 0
Восстановление базы
    #32623437
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, начну с того, что восстанавливать постоянные связи (persistent relationship) вообще нет необходимости. Это чисто дезайнерская примочка и никак, никоим образом не влияет на собственно работу программы и заполнение базы данных. Для чего это вообще используется можно почитать здесь

http://www.foxclub.ru/kb/index.php?sid=35321&aktion=artikel&rubrik=004&id=103&lang=ru
Раздел "Связи и отношения межде таблицами"

Теперь собственно по коду:

Код: plaintext
1.
2.
USE work2.dbc IN  0   && открыть эту БД, как таблицу
LOCATE FOR ObjectType="Table" AND ObjectName="wr2"
nObjID=ObjectID && ??? что за переменные и чему равен ObjectID и откуда берется ???

В даннм случае видимо предполагалось, что ObjectID - это имя поля таблицы work2.dbc

Однако сам код некорректен. Проблема в том, что в таком синтаксисе FoxPro предполагает, что ObjectID - это имя поля таблицы, открытой в текущей рабочей области. Но, поскольку используется синтаксис USE ... IN 0, то нет никакой гарантии, что таблица work2.dbc будет открыта именно в текущей рабочей области. Т.е. нужен дополнительный переход в нужную рабочую область непосредственно перед командой LOCATE. Я бы сделал так:

Код: plaintext
1.
2.
3.
USE work2.dbc IN  0   && открыть эту БД, как таблицу
SELECT work2
LOCATE FOR work2.ObjectType="Table" AND work2.ObjectName="wr2"
nObjID=work2.ObjectID

Впрочем, тут надо еще навесить много каких проверок, но это отвлечет от сути.

Код: plaintext
PARENTID = m.lnObjectID && тут мучает вопрос что такое символ "эм" с точкой m.* что означает??? скажи пожалуйста 

Префикс "m." означает, что речь идет именно о переменной памяти, а не о поле таблицы. Когда FoxPro встречает выражение вроде

nObjID=ObjectID

то сначала он предполагает, что "ObjectID" - это имя поля таблицы, открытой в текущей рабочей области. Если же такого поля в текущей рабочей области не существует, то после этого предпринимается поиск переменной памяти с таким именем.

Так вот, префик "m." говорит FoxPro о том, что надо сразу искать переменную памяти и не тратить время на поиск поля с таким именем.

Код: plaintext
REPLACE RiInfo WITH "RRR   " && что есть RiInfo и с чем его едят и где оно храниться ???

Странно, ты вроде бы смотрел файл базы данных как таблицу в BROWSE-окне(work2.dbc). Хочешь сказать, что не заметил там поля с именем "RiInfo"?

В команде REPLACE в этом месте может стоять только и исключительно имя поля таблицы. Поскольку нет опции IN, то речь идет о таблице открытой в текущей рабочей области. Поднимаемся чуть выше по коду и видим, что речь идет о таблице открытой командой

USE KONTAKT.DBC EXCLUSIVE

PS:
Вместо с FoxPro поставляется такая программ Home()+Tools\GenDBC\GenDBC.prg. Если натравить эту программу на твою базу данных, то она сгенерит файл PRG, который будет содержать код программной генерации файла базы данных

DO (Home()+Tools\GenDBC\GenDBC.prg) WITH "MakeBase.prg"

MakeBase.prg - это файл, который будет сформирован как результат работы программы GenDBC.prg

При запуске программа попросит указать базу данных (файл DBC) по которому надо создать программу генерации

Далее открываешь полученный файл MakeBase.prg на редактирование и смотришь как именно там создают постоянные связи.
...
Рейтинг: 0 / 0
Восстановление базы
    #32623462
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Burn и Вас тем же местом ;-)))
Почему нахал?
Я просто самоучка (пару месяцев назад я вообще не знал что такое VFP, за плечами школьный курс по Basic и диплом по окончании детского сада № 3).
Обучаюсь методом научного тыка, столкнулся с проблеммой (создаю базу, архивацию сделал, но надо еще программу по восстановлению, с ней собственно и мучаюсь) начал лопатить литературу искать, изучать нашел пару интересных статей и что не удивительно для ньюба не разобрался в коде...попросил помощи у гуру, а Вы сразу нахал 8-((( *обидно да*
З.Ы. из Вашего объяснения ничего не понял ;-)) (слишком круто завернули, придется опять соло доходить *вздых*)

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32623521
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>из Вашего объяснения ничего не понял
Ничего, Владимир все по полочкам разложил. А у меня нет педагогического таланта...
Почитай здесь - http://www.foxclub.ru/kb/ как раз для начинающих
...
Рейтинг: 0 / 0
Восстановление базы
    #32623540
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир
"Ну, с "постоянной связью" все относительно просто. Ее следует использовать, если Вы собираетесь построить Referential Integrity." (С) Владимир Максимов
Ну, начну с того, что восстанавливать постоянные связи (persistent relationship) вообще нет необходимости...
Я как раз и использую Referential Integrity для создания триггеров на обновление, удаление и вставку, но при разрушении базы мне придется восстановить отношения с триггерами, для этого, как я понимаю и используется
Код: plaintext
REPLACE RiInfo WITH "RRR   "
или мне лучше использовать следующую команду после создания связей
Код: plaintext
alter tables NK_OTZSPEC add FOREIGN  key RN_NKOTZ TAG NKOTZSP_NK REFERENCES NK_OTZ TAG NK_OTZ_NKO
*****
Код: plaintext
1.
2.
  CREATE TRIGGER ON <имя таблици> FOR DELETE AS <имя триггера>
  CREATE TRIGGER ON <имя таблици> FOR INSERT AS <имя триггера>
  CREATE TRIGGER ON <имя таблици> FOR UPDATE AS <имя триггера>

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32623576
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Burn
Спасибо...
Просто пока отвечал Вам пришло сообщение от Владимира

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32623623
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grumax_user2Владимир
"Ну, с "постоянной связью" все относительно просто. Ее следует использовать, если Вы собираетесь построить Referential Integrity." (С) Владимир Максимов

Ну, начну с того, что восстанавливать постоянные связи (persistent relationship) вообще нет необходимости...


Здесь нет противоречия. Вы просто не прочитали статью

http://www.foxclub.ru/kb/index.php?sid=35321&aktion=artikel&rubrik=004&id=104&lang=ru
Раздел "Триггер", "Referential Integrity"

Там есть такой абзац
В принципе, по окончании создания триггеров "Referential Integrity" постоянную связь, послужившую основой для создания данной ссылочной целостности можно удалить. Это уже никак не скажется на факте существования созданных триггеров. Однако я не советовал бы этого делать по той причине, что в случае внесения изменений в "Referential Integrity" (пусть даже по отношению к другим таблицам) генератор "затрет" ранее созданные триггера.

Прежде чем что-то делать надо обязательно определить "граничные условия". Т.е. при каких условиях будет происходить то или иное действие. В данном случае, когда Вам понадбиться восстанавливать контейнер базы данных?

Очевидно, что речь идет о ситуации, когда Вы установили программу конечному пользователю и у него произошел сбой, в результате которого был поврежден файл контейнер базы данных.

Так вот, "постоянная связь" нужна для создания новых объектов. Но если объект уже создан, то факт наличия (отсутствия) постоянной связи на него никак, никоим образом уже не влияет.

Вы планируете предоставить возможность конечному пользователю модифицировать триггера из "Referential Integrity"? Если "Да", то тогда действительно надо восстанавливать постоянные связи. Если же "Нет", то это не обязательно.

Еще одно соображение.

В программе обязательно необходимо предусмотреть создание резервной копии базы данных. Это просто уже "штатная" процедура вообще для любой программы.

Так вот, контейнер база данных (DBC, DCT, DCX) - это файл, который как правило вообще не модифицируется в процессе работы. Это значит, что для восстановления файла контейнера базы данных достаточно просто скопировать эти файлы из резервной копии. ВСЕ. Никаких проблем.

Восстановление индексов - это аналогичная операция: Из резервной копии копируются файлы CDX и выполняется команда REINDEX на все таблицы.

Поскольку структура индексных файлов в резервной копии корректна, то такая подмена пройдет безболезненно, а команда REINDEX приведет в соответствие содержимое индексов и реальных данных. Опять же нет необходимости мучится со структурой индексов и ссылочной целостностью.
...
Рейтинг: 0 / 0
Восстановление базы
    #32623802
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир
Спасибо большое.
Теперь бы как объяснить шефу требующему от меня прогу по восстановленю базы, что написаной ранее проги по резервному копированию хватит ;-))) *мдя
Надеюсь я сделал правильный вывод :-)))
Пойду до дому...пока

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32624422
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир
Владимир Странно, ты вроде бы смотрел файл базы данных как таблицу в BROWSE-окне(work2.dbc). Хочешь сказать, что не заметил там поля с именем "RiInfo"?
Я читал Вашу статью "Советы начинающим Часть I.База данных
", но не догадался что файл *.dbc подобный *.dbf можно browse посмотреть...ступил...было бы меньше проблем, подвел VFP добавили бы вместо 'open' кнопочку 'browse' ;-)))

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32624441
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопросик...
Сделал browse файла *.dbc там есть поля типа MEMO, жму просмотр (ctrl+home) а там квадратики, а между ними просветы из читаемого текста...эти мемо поля читаемы или нет? если читаемы то как ;-))

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
Восстановление базы
    #32624471
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квадратиками отображаются всяческие служебные символы для которых нет подходяших букв например символы с кодами от x00 до x20.
...
Рейтинг: 0 / 0
Восстановление базы
    #32624496
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Burn
Burn А у меня нет педагогического таланта...
Вы заблуждаетесь.... :-)) Спасибо Вам и Владимиру, без вас я бы не разобрался, все оказалось просто, надо было сделать browse *.dbc и код бы читался сравнительно легко...

Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Восстановление базы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]