|
03.07.2008, 17:45 | #1 |
Участник
|
Коллеги, а кто-нибудь загонялся сим интересным вопросом?
Я вот недавно загнался и результаты меня, честно говоря, обрадовали .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
04.07.2008, 09:30 | #2 |
Участник
|
Что? Никто даже не пробовал?
Ну тогда расскажу о своих изысканиях. fob программно загрузить можно. Нужно лишь идентифицировать из фоба участок данных, относящийся к конкретному объекту. Задача нетривиальная, так как мне пока не понятен его внутренний формат. Понятное дело, там присутствует как описание объекта (видимо, это запись в таблице Object только в бинарном виде), так и сам объект (это значение BLOB поля в таблице Object). А далее нужно просто заливать бинарную часть, касающуюся данных самого объекта в соотв. BLOB-поле с MODIFY(TRUE) на таблице Object. Кроме того, есть вариант, как смоделировать заливку фоба. Берем таблицу Object. Ищем нужный объект и выгружаем значение BLOB поля в файл (например, в файл с расширением dat). Здесь же формируем некий настроечный файл, в котором на каждый выгруженный объект будет присутствовать соответствующая строка с данными полей таблицы Object. Потом же, пользуясь dat-файлом и настроечным файлом - заливаем объекты в систему. Тут возникает вопрос - а что делать с таблицами, ведь они есть физический объект БД. Как их заливать фобом? Ответ - а очень просто. Если внимательно посмотреть на фоб для единственной таблицы - можно увидеть, что структура таблицы хранится и в нем тоже. Посему в момент изменения бинарных данных в BLOB поле таблицы Object происходит изменение таблицы в БД. То же самое со вставкой. Т.е. мы стандартными средствами C/AL создаем запись в таблице Object, далее загружается dat файл и в момент выполнения INSERT(TRUE) таблица физически создается в БД. P.S. Кстати, методом валидейта, например, поля Скомпиллирован в таблице Object можно компилить объекты в момент вставки. Так-то! .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
04.07.2008, 09:44 | #3 |
Участник
|
Какое нибудь практическое применение этому нашлось?
|
|
04.07.2008, 09:54 | #4 |
Участник
|
Да, конечно. На одном из проектов работает автоматическая система обновления. Ее задачи следующие: 1. Обновление объектов; 2. Обновление данных; 3. Загрузка данных. В силу того, что с этой системой работают админы компании и им хотелось бы автоматизировать этот процесс - вот был придуман такой алгоритм, который позволяет обновить систему по нажатию одной кнопки. Учитывая, что баз около 60 (много регионов) - это существенно облегчает жизнь .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
04.07.2008, 10:01 | #5 |
MCTS
|
Про фоб не помню, но выгрузку/загрузку блоб полей практиковали тут: Создание записи в таблице Object
Там же есть ссылка на Changing Objects on the Fly (COOF) |
|
04.07.2008, 10:19 | #6 |
Участник
|
Цитата:
Сообщение от apanko
Про фоб не помню, но выгрузку/загрузку блоб полей практиковали тут: Создание записи в таблице Object
Там же есть ссылка на Changing Objects on the Fly (COOF) Там речь идет о вставке новой таблицы и ее создании средствами NAV. Тут же речь принципиально о том, чтобы внести существующую таблицу из разработческой БД на рабочую БД. И сделать это можно так, как я описал. По крайней мере - этот метод реально работает .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
04.07.2008, 10:52 | #7 |
Участник
|
Цитата:
Интересно посмотреть на реализацию |
|
04.07.2008, 11:49 | #8 |
Участник
|
Цитата:
А реализация простая.. Что уж таить то . Предположим, что в таблице А на разработческой БД добавилось поле, которого нет в таблице А на рабочей БД. 1. Выгружаем BLOB из одной БД. Сохраняем его в файл. 2. В другой БД загружаем этот файл используя сначала CLEAR(BLOB), а потом BLOLB.IMPORT. 3. Делаем на таблице Object MODIFY(TRUE). 4. Смотрим в таблицу в рабочей БД. 5. Видим поле . 6. Вуаля . Аналогично со вставкой. Главная изюминка в том, что нельзя делать INSERT для таблицы с пустым BLOB полем, так как таблица (в отличие, например, от отчета) не может существовать пустой. Хотя бы одно поле должно быть. А вторая изюминка, нужно триггеры INSERT, MODIFY. DELETE нужно запускать с TRUE для таблицы Object, так как на этих триггерах висят разные интересные вещи .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
04.07.2008, 14:36 | #9 |
Участник
|
Цитата:
Сообщение от FoxSoft2005
Получилось. Таблица создается (если ее не было) и поля добавляются, если она была, но какого-то поля не было.
А реализация простая.. Что уж таить то . Предположим, что в таблице А на разработческой БД добавилось поле, которого нет в таблице А на рабочей БД. 1. Выгружаем BLOB из одной БД. Сохраняем его в файл. 2. В другой БД загружаем этот файл используя сначала CLEAR(BLOB), а потом BLOLB.IMPORT. 3. Делаем на таблице Object MODIFY(TRUE). 4. Смотрим в таблицу в рабочей БД. 5. Видим поле . 6. Вуаля . Аналогично со вставкой. Главная изюминка в том, что нельзя делать INSERT для таблицы с пустым BLOB полем, так как таблица (в отличие, например, от отчета) не может существовать пустой. Хотя бы одно поле должно быть. А вторая изюминка, нужно триггеры INSERT, MODIFY. DELETE нужно запускать с TRUE для таблицы Object, так как на этих триггерах висят разные интересные вещи . Как бы так сделать, чтобы из одной базы автоматом заливать изменения в другую . |
|
16.07.2008, 12:22 | #10 |
Участник
|
|
|
04.07.2008, 10:07 | #11 |
Участник
|
По моему объект в блобе упакован. Поэтому ты заливаешь не фоб а данные из таблицы объект.
|
|
04.07.2008, 10:23 | #12 |
Участник
|
Да, он упакован. И да, я, де-факто, заливаю данные. Это лишь модель заливки фоба .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
08.07.2008, 11:13 | #13 |
Участник
|
Для 5.0 в Cfront добавлены новые функции:
http://blogs.msdn.com/nav_developer/archiv...ng-c-front.aspx Переменные: CF - OCX- Cfront vFile -Variant vFilter Variant [codebox]----RUN------ vFile:='C:\ExportFob.fob'; vFilter:='WHERE(Type=CONST(Table),ID=FILTER(1..10))'; CF.ExportFob(vFile,vFilter);[/codebox] Проблема, как в NAV преобразовать параметры в строковые типы Variant'ов VT_LPWSTR? " You can only export objects as binary .fob files. It is not possible to export objects as text. In SP1 for NAV version 5, C/Front will no longer check for license permissions when importing files. So the import-functionality works just like importing objects manually, which means that the license file is not checked. In previous versions it was not possible to import new objects or tables with new fields unless the NAV license would allow the user to create those objects or fields manually. "
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
08.07.2008, 14:17 | #14 |
Участник
|
Проблема с параметрами решена:
Name DataType Subtype Length CF OCX CFRONT Control var1 Variant var2 Variant sc Automation 'Microsoft Script Control 1.0'.ScriptControl [codebox]---RUN--- OpenDatabase; CREATE(sc); sc.Language:='vbScript'; var1:=sc.evаl('"'+'C:\test.fob'+'"'); var2:=sc.evаl('"'+'WHERE(Type=CONST(Table),ID=FILTER(15))'+'"'); CF.ExportFOB(var1,var2); CLEAR(sc); [/codebox]
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
14.07.2008, 09:40 | #15 |
Участник
|
Цитата:
Сообщение от captain
Проблема с параметрами решена:
Name DataType Subtype Length CF OCX CFRONT Control var1 Variant var2 Variant sc Automation 'Microsoft Script Control 1.0'.ScriptControl [codebox]---RUN--- OpenDatabase; CREATE(sc); sc.Language:='vbScript'; var1:=sc.evаl('"'+'C:\test.fob'+'"'); var2:=sc.evаl('"'+'WHERE(Type=CONST(Table),ID=FILTER(15))'+'"'); CF.ExportFOB(var1,var2); CLEAR(sc); [/codebox] Ну так то в пятерке (я читал про эту возможность). Речь шла о более ранних версиях NAV. К тому же, требо залить фоб (на самом деле не ИМЕННО фоб, а ОБЪЕКТ) используя C/AL.
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
16.07.2008, 14:32 | #16 |
Участник
|
И еще входит в первичный ключ
__________________
Want to believe... |
|
16.07.2008, 14:41 | #17 |
Участник
|
|
|
16.03.2009, 20:46 | #18 |
Участник
|
Я понимаю, что это очень стыдно
но у меня не получается сделать OpenDatabase. пытаюсь, находясь в одном fdb экспортнуть че нить из другого.... Версия Nav - 5.0. Пишет, что " вызов opendatabase неудачен. c front fatal error: Cfront.dll or CfrontSQL.dll is not loaded. use connectserverandopendatabase first...." код такой CF.SetNavisionPath('C:\Program Files\Microsoft Dynamics NAV\CSIDE Client'); CF.OpenDatabase('C:\Copydatabase.fdb',10000, TRUE); - глюк выскакивает здесь. Подскажите плиз, в чем может быть дело ? |
|