FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9176
Вход
Генерация PRG-файла с функциями и процедурами проверки базы данных на основе шаблона контейнера базы

Суть проги заключается в том, что на основании имеющегося шаблона контейнера базы данных она формирует PRG-файл, который преобразует все рабочие базы данных: 1. Добавляет/удаляет/модифицирует поля таблиц, входящих в рабочиие базы; 2. Восстанавливает индексы таблиц рабочих баз данных при некорректном выходе из приложения; 3. Добавляет новые (в соответствии с шаблоном) таблицы; 4. Добавляет/модифицирует представления и связи; 5. Модифицирует индексы и т.д.


 
Прислал: Абразовский Михаил   Категория: Инструменты разработчика


Суть проги заключается в том, что на основании имеющегося шаблона контейнера базы данных она формирует PRG-файл, который преобразует все рабочие базы данных:
1. Добавляет/удаляет/модифицирует поля таблиц, входящих в рабочиие базы;
2. Восстанавливает индексы таблиц рабочих баз данных при некорректном выходе из приложения;
3. Добавляет новые (в соответствии с шаблоном) таблицы;
4. Добавляет/модифицирует представления и связи;
5. Модифицирует индексы
и т.д.

Я делаю следующим образом:
- создаю новую базу данных для любого своего приложения
- запускаю эту программу
- включаю полученный PRG-файл в проект
- включаю 3 файла контейнера базы данных в дистрибутив приложения
- у клиента создаются уже рабочие базы данных со всеми необходимыми таблицами, представлениями, индексными файлами.

В случае, если что-либо изменяется в программе, и это влечет за собой изменение структур таблиц, вношу изменения у себя в шаблонную базу данных и заново формирую этот PRG-файл. На машину клиента устанавливается обновление приложения. При первом запуске его рабочие базы данных клиента модифицируются автоматически.
Чтобы не таскать EXE-файл, я эту прогу включаю в APP-файл.

Необходимо:

1. В главном модуле приложения определить символьные переменные
cpCapMain (название приложения) и cVersion (версия);
2. В тексте проги найти следующий код
\ Add Object Image1 As Image With ;
\ Height = 126,;
\ Left = 22,;
\ Name = 'Image1',;
\ Picture = 'c:\work\all\asp_bmp\soft.bmp',;
\ Top = 24,;
\ Width = 126
и переопределить картинку

Основной вызов - функция fOk_Pr_Base (). В сгенерированном PRG-файле в самом начале приводится описание возвращаемых ею значений
 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (2.5) Вложение [15.84]kb
Дополнения пользователей
Генерация PRG-файла с функциями и процедурами проверки базы данных на основе шаблона контейнера базы
[+][?]
devilr
06.09.06 22:03:13

Все хорошо, но непонятно, как трактовать файл *.ERR.
И слова в ERR-файле, такие как "Descinding" вводят в заблуждение - начал искать в базе данных, не
нашел. Оказывается, это просто ошибка написания Descending в mygendbc.prg
        OtherWise
          \  Index On <> Tag <>
          If !Empty (Sys (2021, i1))
            \\ For <>
          EndIf
          \\ <>
      EndCase
 
devilr
07.09.06 00:13:01

Кстати, автору можно посоветовать прогнать свою прогу на базе данных Паруса - самого крупного
российского проекта на FoxPro. Могу сразу сказать - с наскоку не получится. Переменные, типа
cpTablesString3 будут _очень_ длинными, порядка 3000-4000 символов. Соответственно, про это будет
запись в ERR-файле и, при попытке, отработать созданный PRG-файл будем получать сообщения, типа
"Command contains unrecognized phrase/keyword."
Программа требует серьезной доработки и теста на крупных базах.

ЗЫ: Программа gendbc.prg из комплекта VFP 9.0 при попытке натравливания оной на базу Паруса
вываливается с криком "не могу создать файл более 2 гигабайт"
ama68
07.09.06 10:39:13

С переменными cpTablesString... есть неувязка.
В данной проге их 3 именно из-за присвоения символьного значения более 255 символов.
Прогонял на базе со 100 таблицами.
Если таблиц больше, количество переменных cpTablesString... можно увеличить.
Главное, чтобы переменная cpTablesString, которая является суммой переменных cpTablesString... ,
не превышала допустимого Фоксом значения.
devilr
07.09.06 20:57:15

Тык, это... только что взял пустую, ненастроенную базу Паруса (т.е. из архива, на основании
которого собирается рабочая база) - 691 dbf-файл. Даже, если предположить, что длина названия = 8
байтов + 1 разделяющий байт (типа ";"), то получается, что суммарная переменная будет иметь длину
691*9=6219 байтов. Возьмет ли это корректно FoxPro еще вопрос.
devilr
07.09.06 21:08:46

Тык, это... только что взял пустую, ненастроенную базу Паруса (т.е. из архива, на основании
которого собирается рабочая база) - 691 dbf-файл. Даже, если предположить, что длина названия = 8
байтов + 1 разделяющий байт (типа ";"), то получается, что суммарная переменная будет иметь длину
691*9=6219 байтов. Возьмет ли это корректно FoxPro еще вопрос.
ama68
08.09.06 11:00:03

Насколько я знаю, ограничения по длине символьной переменной в Фоксе составляет 64 Kb
Переменные cpTablesString... можно преобразовать в массив, предварительно написав программный код
для его формирования, исходя из количества таблиц базы.

Совсем забыл. В коде используется функция fGetStrBetweenSimv:

ama68
08.09.06 11:00:17

*-----------------------------------------------------------
* Функция fGetStrBetweenSimv
* Назначение:
*   возвращает текст, находящийся в строке между 
*   определенными символами
* Параметры:
*   cpStr   - строка с текстом и символами
*   npSlovo - номер текста, которое необходимо извлечь
*   cpSimv  - символ-разделитель
Function fGetStrBetweenSimv
Parameter cpStr, npSlovo, cpSimv
  Local clStr, nKSlov, nBeg, nEnd
  cpStr = AllTrim (cpStr)
  nKSlov = Occurs (cpSimv, cpStr) + 1
  If npSlovo > nkSlov
    Return ''
  EndIf
  If nKSlov = 1
    clStr = AllTrim (cpStr)
  Else
    cpStr = AllTrim (cpStr) + cpSimv
    nBeg = IIf (npSlovo = 1, 1, At (cpSimv, cpStr, npSlovo - 1) + 1)
    nEnd = At (cpSimv, cpStr, npSlovo)
    clStr = AllTrim (SubStr (cpStr, nBeg, nEnd - nBeg))
  Endif
Return clStr

devilr
12.09.06 12:51:36

Мда. Для Паруса количество переменных типа cpTablesString получилось 22 + одна суммирующая
переменная. Каждая из переменных очень близко подходит к предельному значению в 255 символов.
ama68
12.09.06 18:47:16

Я же не говорю, что данный вариант - идеал. Не было прецедента, чтобы менять данный алгоритм.
Попробуй созать курсор с Мемо-полем и делай присвоение:
Replace a1 with a1 + a2,
где a2 единственная переменная  cpTablesString, или прямо выражение, значение которого
присваивается переменной cpTablesString.
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика