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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.10.2014, 16:04   #1  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Подмена запроса для View
Добрый день.

Имеется созданное в AOT View определенной структуры. Задача - подменить содержимое View на уровне базы данных.
В Axapta 3 (+Oracle) данная задача решалась написанием скрипта (CREATE OR REPLACE VIEW...) в SysSQLInitDbTriggers.

Как решается данная задача в DAX2009?

Пересмотрел на форуме множество тем, в которых говорится, что необходима доработка при синхронизации или что нужно смотреть в сторону Application::dbSynchronize() (в том числе смотрел тему Запрет синхронизации объекта АОТ).

В итоге однозначного решения не нашел.
Если кто-нибудь знает решение для DAX2009 или есть пример решения, просьба рассказать о нем.
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 20.10.2014 в 17:39.
Старый 22.10.2014, 10:50   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от samolalex Посмотреть сообщение
В Axapta 3 (+Oracle) данная задача решалась написанием скрипта (CREATE OR REPLACE VIEW...) в SysSQLInitDbTriggers.

Как решается данная задача в DAX2009?
Да все также ...
для MS SQL вместо CREATE OR REPLACE VIEW... будет
Код:
IF OBJECT_ID ('[myViewName]',\'V\') IS NOT NULL DROP VIEW [myViewName]
CREATE VIEW [myViewName] ...
За это сообщение автора поблагодарили: Logger (3), samolalex (2).
Старый 22.10.2014, 11:47   #3  
AraraT® is offline
AraraT®
Участник
1C
 
158 / 106 (4) +++++
Регистрация: 13.01.2006
Адрес: Республика Татарстан, г. Казань
Можно через класс Application, метод dbSynchronize с подменой запроса для конкретного View.
__________________
Айрат Вильданов.
skype: vildanov.a
Старый 22.10.2014, 11:55   #4  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Сообщение от AraraT® Посмотреть сообщение
Можно через класс Application, метод dbSynchronize с подменой запроса для конкретного View.
А что подразумевается под подменой запроса в данном случае - вызов скрипта "CREATE VIEW..."? И как именно можно подменить запрос для конкретного VIEW?
__________________
С уважением, Александр.
Старый 22.10.2014, 12:10   #5  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Да все также ...
для MS SQL вместо CREATE OR REPLACE VIEW... будет
Код:
IF OBJECT_ID ('[myViewName]',\'V\') IS NOT NULL DROP VIEW [myViewName]
CREATE VIEW [myViewName] ...
Вопрос вызывает место (класс/метод), из которого необходимо вызывать скрипт, т.к. в DAX2009 SysSQLInitDbTriggers отсутствует.
__________________
С уважением, Александр.
Старый 22.10.2014, 12:25   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от samolalex Посмотреть сообщение
место (класс/метод), из которого необходимо вызывать скрипт
X++:
Application::dbSynchronize()
Старый 22.10.2014, 12:36   #7  
AraraT® is offline
AraraT®
Участник
1C
 
158 / 106 (4) +++++
Регистрация: 13.01.2006
Адрес: Республика Татарстан, г. Казань
Цитата:
Сообщение от samolalex Посмотреть сообщение
А что подразумевается под подменой запроса в данном случае - вызов скрипта "CREATE VIEW..."? И как именно можно подменить запрос для конкретного VIEW?
вот после этого места можно вызвать скрипт:
X++:
ok = super(tableId, syncAsNeeded, continueOnError, showProgress, checkSyncTables);
в стиле (примерно, делаю вырезки из кода, только для понимания):

X++:
private void CreateView(str _sql)
{
    Connection          connection;
    Statement           statement;
    ;

    connection  = new Connection();
    statement   = connection.createStatement();

    SqlStatementExecutePermission   = new SqlStatementExecutePermission ( _sql );
    SqlStatementExecutePermission.assert();

    statement.executeUpdate(_sql);

    CodeAccessPermission::revertAssert();
}
У нас на Вьюшке создавался метод, в котором возвращалась строка как скрипт создания необходимой вьюшки на чистом SQL, потом проверялось его наличие через Dict*-классы и вызывался, как раз после указанного супера.

Перед созданием вьюшки - ее надо грохнуть.
__________________
Айрат Вильданов.
skype: vildanov.a
За это сообщение автора поблагодарили: samolalex (2).
Старый 22.10.2014, 15:46   #8  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Спасибо за ответы.

Правильно я понимаю (с учетом информации в ранее опубликованной теме Синхронизация View DAX40), что при синхронизации определенного VIEW в метод Application::dbSynchronize() параметр tableId всегда передается равным 0. т.е. получается, что определить синхронизация какого объекта происходит в указанном методе невозможно?
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 22.10.2014 в 16:07.
Старый 22.10.2014, 16:13   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от samolalex Посмотреть сообщение
Спасибо за ответы.

Правильно я понимаю (с учетом информации в ранее опубликованной теме Синхронизация View DAX40), что при синхронизации определенного VIEW в метод Application::dbSynchronize() параметр tableId всегда передается равным 0. т.е. получается, что определить синхронизация какого объекта происходит в указанном методе невозможно?
Да, у меня на AX2009 так же
Старый 08.07.2015, 09:20   #10  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
Никому не удалось исключить таблицу из синхронизации в AX2009 ? Очень нужно!
Старый 08.07.2015, 09:46   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Никогда не было такой задачи.
Вот индексы успешно прятали от аксапты. Возможно для табличек сработает такой же подход.
А вам это зачем ?
Старый 08.07.2015, 09:54   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вот тема была для индексов
Не удалять индексы при синхронизации
Старый 08.07.2015, 09:54   #13  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
Всё та же задача - подменить содержимое View на уровне базы данных. Создано представление в рабочей базе, которое связано с таблицей в другой базе. В рабочей базе в SQL данная таблица удалена и при синхронизации в программе выдается ошибка по этой таблице. Поэтому нужно исключить её из синхронизации.
Старый 08.07.2015, 10:01   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Подложите во View копию этой таблицы, просто что бы ошибки не было. А после все равно подмените текст View на свой.
Старый 08.07.2015, 10:16   #15  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
А как в SQL подложить во View копию этой таблицы?
Старый 08.07.2015, 10:28   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Зачем через SQL? Напрямую в приложении аксапты всё сделайте.
Или я не понимаю проблемы?

Допустим вам нужно в итоге получить View с определённым набором столбцов (откуда будут тянуться данные для этой View не важно). Я бы создал в этом же приложении таблицу с произвольным именем по структуре совпадающую с результирующим View (с таким же набором столбцов и соответствующими типами данных). Сделал бы на основе этой вспомогательной таблицы View с нужным именем.
Старый 08.07.2015, 10:35   #17  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
Если нет необходимости в подмене view сразу после синхронизации, можно все сделать средствами самого sql - сделать периодическую операцию, которая делает drop view XXX / create view XXX раз в день. И Kuskov правильно сказал про копию таблицы - обязательно сделайте, просто чтобы не было сообщений об ошибке

Последний раз редактировалось AlexeyS; 08.07.2015 в 10:37.
Старый 08.07.2015, 10:46   #18  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
Еще раз на примере: есть 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.
Старый 08.07.2015, 10:57   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Dolores Посмотреть сообщение
Но при синхронизации таблиц в приложении Test возникнет ошибка, потому что мы удалили таблицу в базе Test в SQL.
А для чего мы её удалили?
Старый 08.07.2015, 10:59   #20  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Потому что вьюха в сиквеле для Аксапты подменяет реальную таблицу
Т.е. в АОТ вью нет, есть таблица

Меня не спрашивайте, почему так сделано)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: S.Kuskov (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 07:19.