Чтобы окончательно добить тему, поделюсь небольшой идей.
Как я уже писал, в AX2009 нет computed columns, но это, разумеется, не преграда пытливому уму и неугомонным рукам
В качестве дисклеймера:
- Если вам кажется, что ваша задача требует применения этого решения, остановитесь и подумайте. Возможно, задачу можно переформулировать так, что computed columns будут не нужны.
- Если вы всё ещё считаете, что вам необходимы computed columns в AX2009, подумайте ещё раз.
- Если ваша настойчивость не знает границ, то так и быть, делайте, но учтите, что нижеприведённый код - это proof-of-concept, и его надо дорабатывать перед переносом в рабочую среду.
Итак, задача: сделать в AX2009 view на основе таблицы LedgerTrans, в котором дебетовые и кредитовые суммы будут в разных полях, чтобы потом можно было группировками собирать дебетовые и кредитовые обороты.
- Создаём View, как показано на рисунке. Поля AmountMST, AmountMSTDebit и AmountMSTCredit привязаны к одному и тому же полю LedgerTrans.AmountMST. Статический метод synchronize() пока сделаем пустым.
- Ищем в AOT класс Application и его метод dbSynchronize(). В конец этого метода добавляем следующую строчку:
X++:
LedgerTransDebCredView::synchronize();
- Возвращаемся в метод 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();
}
- Синхронизируем view LedgerTransDebCredView и открываем его Table browser'ом.
Ура, в поле AmountMSTDebit остались только дебетовые балансы, а в поле AmountMSTCredit - кредитовые.