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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.06.2013, 20:28   #1  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Ну, а если очень хочется работать именно из Аксапты со сторонней базой, то можно использовать одну из особенностей работы Аксы со своей базой. На данном форуме уже не раз приводился способ работы из Аксы не со своими таблицами, а с вьхами, которые Акса считает своими таблицами. Поищите на форуме соответствующие темы. Основной принцип:
  • В AOD создается таблица нужно структуры. Она синхронизируется с базой данных.
  • В базе данный средствами MS SQL таблица удаляется, а вместо неё создается view той же структуры, но в запросе вьюхи обращение идет к нужным данным (не исключено, что на другой сервер), если нужно, то вьюха делается индексируемой. Единственное правило, что если из Аксапты будут идти запросы на обновления, вставку, удаление, то вьюха должна поддерживать эти операции (смотри BOL).
  • Такой подход потребует некоторых изменений в базовых классах синхронизации таблиц, но модификация простая и описана в темах этого форума.
  • После таких манипуляций Акса будет работать так, как будто это её родная таблица, но MS SQL обращаться будет не к таблице, а к вьюхе.
PS: естественно, как любой недокументированный подход, такой способ требует осторожности и четкого документирования для всех заинтересованных лиц. Даже если весь текущий состав ИТ отдела фирмы завтра уволится, следы таких хитростей должны остаться.
За это сообщение автора поблагодарили: d_alexe (1), arhat (1).
Старый 16.06.2013, 11:43   #2  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
Спасибо за конструктивную критику, не знал про возможности решения моей проблемы, другими способами, всегда приятно иметь альтернативы. И возможность работать с аксой напрямую с другими базами тоже нужна. Поговорю с админами на счет настройки прав и вынос таблицы в отдельную файловую группу.
Старый 16.06.2013, 11:58   #3  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1853 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
AX 2012 - storing Dynamics AX Document Attachments Within SharePoint
__________________
-ТСЯ или -ТЬСЯ ?
Старый 17.06.2013, 10:23   #4  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
Обертка для работы со сторонней бд (с поддержкой контенеров)
SharedProject_IAU_SQL (1).xpo - проект
IAU.rar - dll

Можно без dll, тогда не перехватить сообщения от sql. чтобы все работало зайти в места поменять одноименные методы, класса

метод nmExecuteNonQuery - sqlCommandForEx.ExecuteNonQuery(); на sqlCommand.ExecuteNonQuery();

Описание краткое
n - net
p - property
s - set
g - get
m - method

nps - net property Set
npg - net property Get
nm - net method

Вопрос еще такой, как лучше делать обертках, наследовать классы или без наследования.
Если наследовать тогда можно избежать методов которые работают с net классами, но тогда нужно следить за инициализацией всех объектов. Если не наследовать то есть методы которые принимают и возвращают net классы.

Последний раз редактировалось Kainix; 17.06.2013 в 10:28.
За это сообщение автора поблагодарили: raz (5).
Старый 17.06.2013, 10:36   #5  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
пример использования. Выбор и запись в таблицу, состоящую из 2х полей RefRecId int64(bigint) и BinData container(image).
Для доступа к конкретным полям нужна обертка для System.Data.DataSet

X++:
static void IAU_Connection(Args _args)
{
    SysSqlConnection                    sysSqlConnection;
    SysSqlCommand                       SysSqlCommand;
    SysSqlConnectionStringBuilder       sysSqlStringBuilder;
    SysSqlConnectionTable               sysSqlConnectionTable;
    SysDataRowCollection                sysDataRowCollection;
    SysDataRow                          sysDataRow;
    SysSqlDataReader                    sysSqlExecuteReader;
    
    System.Exception                    e;
    ;
    try
    {
        sysSqlStringBuilder = new SysSqlConnectionStringBuilder();

        sysSqlStringBuilder.npsServer('');
        sysSqlStringBuilder.npsDataBase('');
        sysSqlStringBuilder.npsUserName('');
        sysSqlStringBuilder.npsUserPassword('');

        sysSqlConnection = new SysSqlConnection(sysSqlStringBuilder.npgConnectionString());
        SysSqlCommand = sysSqlConnection.sysSqlCommand();

        SysSqlCommand.npsCommandText("SELECT * from Table where RefrecId = @RefRecId");
        SysSqlCommand.sysSqlParameterCollection().addSysSqlParameter("@RefRecId", 5637374403);
        sysSqlExecuteReader = SysSqlCommand.sysSqlExecuteReader();
        sysSqlExecuteReader.nmRead();

        if(sysSqlExecuteReader.npgHasRows())
        {
            sysSqlExecuteReader.nmClose();
            SysSqlCommand = sysSqlConnection.sysSqlCommand();
            SysSqlCommand.npsCommandText("Update Table set binData = @BinData where RefrecId = @RefRecId");
            SysSqlCommand.sysSqlParameterCollection().addSysSqlParameter("@RefRecId", 5637374403);
            SysSqlCommand.sysSqlParameterCollection().addSysSqlParameter("@BinData",  connull());
            SysSqlCommand.nmExecuteNonQuery();

        }
    }
    catch(Exception::CLRError)
    {
        e = CLRInterop::getLastException();
        if(e)
        {
           while(e)
            {
                info(e.get_Message());
                e = e.get_InnerException();
            }
        }
        e = SysSqlCommand.clrSqlExeption();
        if(e)
        {
           while(e)
            {
                info(e.get_Message());
                e = e.get_InnerException();
            }
        }
        else
        {
            e = SysSqlCommand.clrExeption();
            if(e)
            {
               while(e)
                {
                    info(e.get_Message());
                    e = e.get_InnerException();
                }
            }
        }
    }
}

Последний раз редактировалось Kainix; 17.06.2013 в 10:40.
Теги
ado, внешняя база

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Взаимодействие с Excel через .NET (семейство классов SysExcel) gl00mie DAX: Программирование 102 11.08.2022 17:09
Ошибка с подключением через ODBC + глюк с работой через connection Corel DAX: Программирование 8 17.05.2012 11:58
Работа с Excel через COM нестабильна на x64 Максимка DAX: Программирование 6 27.01.2012 12:52
работа 1С из Аксапты через COM _scorp_ DAX: Программирование 7 22.08.2008 15:45
Работа с обычными отчетами через Enterprise Portal OliaM DAX: Программирование 0 17.01.2005 16:53

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

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

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