Показать сообщение отдельно
Старый 14.10.2016, 00:31   #30  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Чтобы окончательно добить тему, поделюсь небольшой идей.

Как я уже писал, в AX2009 нет computed columns, но это, разумеется, не преграда пытливому уму и неугомонным рукам

В качестве дисклеймера:
  1. Если вам кажется, что ваша задача требует применения этого решения, остановитесь и подумайте. Возможно, задачу можно переформулировать так, что computed columns будут не нужны.
  2. Если вы всё ещё считаете, что вам необходимы computed columns в AX2009, подумайте ещё раз.
  3. Если ваша настойчивость не знает границ, то так и быть, делайте, но учтите, что нижеприведённый код - это proof-of-concept, и его надо дорабатывать перед переносом в рабочую среду.

Итак, задача: сделать в AX2009 view на основе таблицы LedgerTrans, в котором дебетовые и кредитовые суммы будут в разных полях, чтобы потом можно было группировками собирать дебетовые и кредитовые обороты.
  1. Создаём View, как показано на рисунке. Поля AmountMST, AmountMSTDebit и AmountMSTCredit привязаны к одному и тому же полю LedgerTrans.AmountMST. Статический метод synchronize() пока сделаем пустым.
  2. Ищем в AOT класс Application и его метод dbSynchronize(). В конец этого метода добавляем следующую строчку:
    X++:
    LedgerTransDebCredView::synchronize();
  3. Возвращаемся в метод synchornize() на нашем view и пишем в него следующий код:
    X++:
    public static void synchronize()
    {
        UserConnection  userConnection;
        str             sqlStatement;
        Statement       statement;
        ;
    
        sqlStatement =
            'ALTER VIEW [dbo].[LEDGERTRANSDEBCREDVIEW] AS ' +
            'SELECT ' +
            '   A.ACCOUNTNUM AS ACCOUNTNUM, ' +
            '   A.TRANSDATE AS TRANSDATE, ' +
            '   A.VOUCHER AS VOUCHER, ' +
            '   A.TXT AS TXT, ' +
            '   A.AMOUNTMST AS AMOUNTMST, ' +
            '   CASE WHEN A.AMOUNTMST >= 0 THEN A.AMOUNTMST ELSE NULL END AS AMOUNTMSTDEBIT, ' +
            '   CASE WHEN A.AMOUNTMST <= 0 THEN A.AMOUNTMST ELSE NULL END AS AMOUNTMSTCREDIT, ' +
            '   A.DATAAREAID AS DATAAREAID, ' +
            '   A.RECID AS RECID ' +
            'FROM LEDGERTRANS A';
        new SqlStatementExecutePermission(sqlStatement).assert();
    
        userConnection = new UserConnection();
        statement = userConnection.createStatement();
        statement.executeUpdate(sqlStatement);
    
        CodeAccessPermission::revertAssert();
    }
  4. Синхронизируем view LedgerTransDebCredView и открываем его Table browser'ом.

Ура, в поле AmountMSTDebit остались только дебетовые балансы, а в поле AmountMSTCredit - кредитовые.
Миниатюры
Нажмите на изображение для увеличения
Название: Table browser.png
Просмотров: 757
Размер:	36.3 Кб
ID:	10990  
Изображения
 
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: mazzy (10), AlGol (2).