AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.07.2008, 17:45   #1  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Коллеги, а кто-нибудь загонялся сим интересным вопросом?

Я вот недавно загнался и результаты меня, честно говоря, обрадовали .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
Старый 04.07.2008, 09:30   #2  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Что? Никто даже не пробовал?

Ну тогда расскажу о своих изысканиях.

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  
Dadakhan is offline
Dadakhan
Участник
 
26 / 10 (1) +
Регистрация: 30.05.2007
Какое нибудь практическое применение этому нашлось?
Старый 04.07.2008, 09:54   #4  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Цитата:
Сообщение от Dadakhan Посмотреть сообщение
Какое нибудь практическое применение этому нашлось?

Да, конечно. На одном из проектов работает автоматическая система обновления.

Ее задачи следующие:

1. Обновление объектов;
2. Обновление данных;
3. Загрузка данных.

В силу того, что с этой системой работают админы компании и им хотелось бы автоматизировать этот процесс - вот был придуман такой алгоритм, который позволяет обновить систему по нажатию одной кнопки. Учитывая, что баз около 60 (много регионов) - это существенно облегчает жизнь .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
Старый 04.07.2008, 10:01   #5  
apanko is offline
apanko
MCTS
MCBMSS
Лучший по профессии 2009
 
1,164 / 139 (7) +++++
Регистрация: 24.02.2005
Про фоб не помню, но выгрузку/загрузку блоб полей практиковали тут: Создание записи в таблице Object

Там же есть ссылка на Changing Objects on the Fly (COOF)
Старый 04.07.2008, 10:07   #6  
Corleone is offline
Corleone
Участник
 
355 / 10 (1) +
Регистрация: 27.05.2004
Адрес: London
По моему объект в блобе упакован. Поэтому ты заливаешь не фоб а данные из таблицы объект.
Старый 04.07.2008, 10:19   #7  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Цитата:
Сообщение от apanko Посмотреть сообщение
Про фоб не помню, но выгрузку/загрузку блоб полей практиковали тут: Создание записи в таблице Object

Там же есть ссылка на Changing Objects on the Fly (COOF)

Там речь идет о вставке новой таблицы и ее создании средствами NAV. Тут же речь принципиально о том, чтобы внести существующую таблицу из разработческой БД на рабочую БД. И сделать это можно так, как я описал. По крайней мере - этот метод реально работает .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
Старый 04.07.2008, 10:23   #8  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Цитата:
Сообщение от Gmc Посмотреть сообщение
По моему объект в блобе упакован. Поэтому ты заливаешь не фоб а данные из таблицы объект.
Да, он упакован. И да, я, де-факто, заливаю данные. Это лишь модель заливки фоба .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
Старый 04.07.2008, 10:52   #9  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от FoxSoft2005 Посмотреть сообщение
Там речь идет о вставке новой таблицы и ее создании средствами NAV. Тут же речь принципиально о том, чтобы внести существующую таблицу из разработческой БД на рабочую БД. И сделать это можно так, как я описал. По крайней мере - этот метод реально работает .
Неужели получилось кодом залить BLOB таблицы из одной базы в другую и при этом создается таблица (или добавляются поля)?
Интересно посмотреть на реализацию
Старый 04.07.2008, 11:49   #10  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Цитата:
Сообщение от rmv Посмотреть сообщение
Неужели получилось кодом залить BLOB таблицы из одной базы в другую и при этом создается таблица (или добавляются поля)?
Интересно посмотреть на реализацию
Получилось. Таблица создается (если ее не было) и поля добавляются, если она была, но какого-то поля не было.

А реализация простая.. Что уж таить то .

Предположим, что в таблице А на разработческой БД добавилось поле, которого нет в таблице А на рабочей БД.

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   #11  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от FoxSoft2005 Посмотреть сообщение
Получилось. Таблица создается (если ее не было) и поля добавляются, если она была, но какого-то поля не было.

А реализация простая.. Что уж таить то .

Предположим, что в таблице А на разработческой БД добавилось поле, которого нет в таблице А на рабочей БД.

1. Выгружаем BLOB из одной БД. Сохраняем его в файл.
2. В другой БД загружаем этот файл используя сначала CLEAR(BLOB), а потом BLOLB.IMPORT.
3. Делаем на таблице Object MODIFY(TRUE).
4. Смотрим в таблицу в рабочей БД.
5. Видим поле .
6. Вуаля .

Аналогично со вставкой.

Главная изюминка в том, что нельзя делать INSERT для таблицы с пустым BLOB полем, так как таблица (в отличие, например, от отчета) не может существовать пустой. Хотя бы одно поле должно быть.

А вторая изюминка, нужно триггеры INSERT, MODIFY. DELETE нужно запускать с TRUE для таблицы Object, так как на этих триггерах висят разные интересные вещи .
Нет, запускать код в 2 базах неинтересно .
Как бы так сделать, чтобы из одной базы автоматом заливать изменения в другую .
Старый 07.07.2008, 17:04   #12  
romtex_imported is offline
romtex_imported
Участник
 
66 / 10 (1) +
Регистрация: 06.12.2005
Цитата:
Сообщение от rmv Посмотреть сообщение
Нет, запускать код в 2 базах неинтересно .
Как бы так сделать, чтобы из одной базы автоматом заливать изменения в другую .
Сам не пользовался, но, вроде как в репликации Ландштайнера можно настроить репликацию объектов
Старый 08.07.2008, 11:13   #13  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Для 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  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Проблема с параметрами решена:

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  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Цитата:
Сообщение от 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, 12:22   #16  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от FoxSoft2005 Посмотреть сообщение
...
А реализация простая.. Что уж таить то .
....
Аналогично со вставкой.
А теперь немного усложним задачу - залить фоб, содержащий таблицу, в БД, где уже содержится данная таблица. При этом в таблице изменено поле с Boolean на Option и таблица имеет данные ;-)
Старый 16.07.2008, 14:32   #17  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
Цитата:
Сообщение от RedFox Посмотреть сообщение
А теперь немного усложним задачу - залить фоб, содержащий таблицу, в БД, где уже содержится данная таблица. При этом в таблице изменено поле с Boolean на Option и таблица имеет данные ;-)
И еще входит в первичный ключ
__________________
Want to believe...
Старый 16.07.2008, 14:41   #18  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от DA_NEAL Посмотреть сообщение
И еще входит в первичный ключ
Ну это уже 3 уровень сложности ;-)
Старый 07.08.2008, 15:54   #19  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Цитата:
Сообщение от RedFox Посмотреть сообщение
А теперь немного усложним задачу - залить фоб, содержащий таблицу, в БД, где уже содержится данная таблица. При этом в таблице изменено поле с Boolean на Option и таблица имеет данные ;-)
А что, стандартный механизм заливки фоба такое умеет?

Цитата:
Сообщение от DA_NEAL Посмотреть сообщение
И еще входит в первичный ключ
И такое умеет?
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
Старый 16.03.2009, 20:46   #20  
nav_developers is offline
nav_developers
Участник
 
3 / 10 (1) +
Регистрация: 25.11.2008
Я понимаю, что это очень стыдно
но у меня не получается сделать 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); - глюк выскакивает здесь.

Подскажите плиз, в чем может быть дело ?
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:29.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.