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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.07.2015, 12:03   #21  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Dolores Посмотреть сообщение
Еще раз на примере: есть 2 базы Work и Test.
1) В приложении Test (в Axapta) создаем таблицу TestFile. При синхронизации эта таблица появляется в базе Test
2) В базе Work в SQL создаем таблицу TestFile с такой же структурой
3) В базе Test в SQL удаляем таблицу TestFile
4) В базе Test в SQL создаем представление TestFile, связанное с базой Work.

Таким образом, при работе в приложении Test c таблицей TestFile данные записываются в базу Work через представление.
Но при синхронизации таблиц в приложении Test возникнет ошибка, потому что мы удалили таблицу в базе Test в SQL.
В версии Ax2.5 я сделал следующее

Исходная таблица TestFile в базе Test не удаляется, а переименовывается.

ДО штатной синхронизации выполняется:
  • Удаление существующего View с указанным именем
  • Переименование таблицы со специфическим именем в имя, только что удаленного View
Затем запускается штатный режим синхронизации по реально существующей таблице

ПОСЛЕ штатной синхронизации выполняется:
  • Переименование таблицы в специфическое уникальное имя
  • Создание нового View
Специфическое имя таблицы формируется как Имя_Таблицы_GUID.
Т.е. в конец имени таблицы через символ подчеркивания дописывается GUID сформированный через функцию NewId() на MS SQL сервере

Все параметры, необходимые как для переименования, так и для создания View хранятся в специально для этого созданной настроечной таблице

В "псевдокоде" это выглядит так

X++:
\\ \Classes\Application\dbSynchronize

boolean dbSynchronize(tableId tableId = 0, ...)
{
    MyClass_SqlView myClass_SqlView;

(...)

// Переименование таблиц ДО синхронизации
myClass_SqlView = new MyClass_SqlView();
myClass_SqlView.restoreOrigConfig(tableId);

// Собственно синхронизация
ok = super(tableId, syncAsNeeded, continueOnError, showProgress, checkSyncTables);

// Переименование таблиц ПОСЛЕ синхронизации
myClass_SqlView.replaceTableOnView(tableId);

(...)
}

Для MS SQL переименование - это хранимая процедура sp_rename. Использовать можно так

Код:
-- Скрипт MS SQL
if ObjectProperty(Object_Id('Старое_Имя'), 'IsUserTable') = 1
    exec sp_rename 'Старое_Имя','Новое_имя'

Если в качестве параметра TableId передан 0, то переименовываются все View, имена которых хранятся в настроечной таблице

Соответственно, в рабочей базе просто надо удалить записи в этой настроечной таблице, чтобы использовалась сама таблица, а не создавалось View на ее основе.

View именно удаляются/создаются по той причине, что в исходную таблицу TestFile могут быть добавлены/удалены поля. Т.е. без пересоздания View может произойти рассинхронизация структуры View и таблицы-образца.

Тут есть некоторая проблема, связанная с тем, что в случае модификации структуры собственно настроечной таблицы, где хранятся имена для переименования, может возникнуть конфликт при выполнении myClass_SqlView.restoreOrigConfig(). Но вероятность такого конфликта не высока, а если он все-таки возник, то лучше "вручную" синхронизировать сначала эту настроечную таблицу, и только после этого выполнять синхронизацию View.

PS: У нас подобные View использовались для объединения данных из нескольких баз. Т.е. View - это Select * from Base1.dbo.Table1 UNION ALL Base2.dbo.Table1
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 08.07.2015, 12:32   #22  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Dolores Посмотреть сообщение
Еще раз на примере
Ок. Для вашего примера.
1) В приложении Test (в Axapta) создаем таблицу TestFile_dummy. При синхронизации эта таблица появляется в базе Test.
2) В базе Work в SQL создаем таблицу TestFile с такой же структурой
3) В приложении Test создаём представление с именем TestFile связанное с таблицей TestFile_dummy
4) В базе Test подменяем текст представления TestFile так чтобы оно смотрело на таблицу TestFile базы Work.
Старый 08.07.2015, 13:53   #23  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ок. Для вашего примера.
1) В приложении Test (в Axapta) создаем таблицу TestFile_dummy. При синхронизации эта таблица появляется в базе Test.
2) В базе Work в SQL создаем таблицу TestFile с такой же структурой
3) В приложении Test создаём представление с именем TestFile связанное с таблицей TestFile_dummy
4) В базе Test подменяем текст представления TestFile так чтобы оно смотрело на таблицу TestFile базы Work.
А как теперь записать данные в таблицу TestFile базы Work?
Старый 08.07.2015, 15:51   #24  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Dolores Посмотреть сообщение
А как теперь записать данные в таблицу TestFile базы Work?
Из приложения Test?
Вы обновляемое представление делаете? Тогда, видимо, вам нужно подменять запрос не у представления, а у таблицы. Нужно пробовать.
Старый 09.07.2015, 07:07   #25  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ок. Для вашего примера.
1) В приложении Test (в Axapta) создаем таблицу TestFile_dummy. При синхронизации эта таблица появляется в базе Test.
2) В базе Work в SQL создаем таблицу TestFile с такой же структурой
3) В приложении Test создаём представление с именем TestFile связанное с таблицей TestFile_dummy
4) В базе Test подменяем текст представления TestFile так чтобы оно смотрело на таблицу TestFile базы Work.
Никак не получается... Нам нужно, находясь в приложении Test, записывать данные в таблицу TestFile базы Work.
Старый 09.07.2015, 09:32   #26  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Dolores Посмотреть сообщение
Никак не получается... Нам нужно, находясь в приложении Test, записывать данные в таблицу TestFile базы Work.
Для этого вам придётся реализовать (через тригеры?) трансляцию всех изменений из одной базы в другую и решить задачу по синхронизации процесса выделения RecId в двух приложениях.

А вам точно нужно on-line интеграция. Не устроит ли вас синхронизация изменений в асинхронном режиме?
Старый 09.07.2015, 11:12   #27  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Dolores Посмотреть сообщение
Никак не получается... Нам нужно, находясь в приложении Test, записывать данные в таблицу TestFile базы Work.
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Для этого вам придётся реализовать (через тригеры?) трансляцию всех изменений из одной базы в другую
Не обязательно. Через View это тоже работает. В смысле, запись во View при определенных настройках автоматически означает запись в таблицу-источник View. А с триггерами будет та же проблема синхронизации, когда при очередной синхронизации слетят все ранее настроенные триггера.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
и решить задачу по синхронизации процесса выделения RecId в двух приложениях.
Ну, это вообще не проблема. Достаточно в SYSTEMSEQUENCES для нужной таблицы организовать сдвиг в поле NextVal. При общем диапазоне значений в 20 значащих цифр выделить диапазон для разных баз - не проблема. Ну, например, для базы Test поставить значение от 0, а для базы Work поставить значение от 10 в 10 степени.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А вам точно нужно on-line интеграция. Не устроит ли вас синхронизация изменений в асинхронном режиме?
А вот к этому вопросу присоединяюсь. Можно же "тупо" написать Job на MS SQL, который периодически будет сравнивать таблицы, например, раз в 10 минут, и объединять изменения (команда MERGE в T-SQL)

Да, настройка репликации MS SQL не подойдет, поскольку она основана на триггерах. А триггера могут слететь при синхронизации таблиц в Axapta.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX Content: Using Power View with Dynamics AX Blog bot DAX Blogs 0 17.09.2013 01:12
DAX: Enabling Power View on Multidimensional Models for Microsoft Dynamics AX 2012 R2 Blog bot DAX Blogs 0 27.06.2013 06:16
dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View Blog bot DAX Blogs 0 12.12.2012 13:11
Как реализовать Query или View на примере такого T-SQL запроса для OLAP? sao DAX: Программирование 9 07.10.2005 18:57
Подмена запроса формы запросом из АОТа Dubinski Serguei DAX: Программирование 2 03.06.2004 14:44

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:22.