mazzy-ax / SysResultSet

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SysResultSet

SysResultSet – класс-обертка на языке X++ для стандартного класса ResultSet в Microsoft Dynamics AX 2009, Microsoft Dynamics AX 2012, Axapta 4.0 и Axapta 3.0:

  • позволяет удобно работать с ResultSet, читать значения по именам колонок, а не только по индексу колонки
  • реализует один метод get для чтения значений разных типов (см. метод ::getColumn())
  • позволяет использовать статические методы в старом коде, который использует стандартный ResultSet

а также обходит "особенности" стандартного ResultSet:

  • каждое поле в стандартном resultSet можно читать только один раз. При попытке повторного чтения возникает ошибка.
  • поля в стандартном resultSEt можно читать только в порядке возрастания номеров. Если сначала считать поле с номером 2, а затем попытаться считать поле с номером 1, то возникает ошибка.

Пример использования для ax2009 - запрос для сверки остатков и сумм в открытых проводках:

SysResultSet resultSet = SysResultSet::executeQuery(strfmt(@"

with trans as (
    select o.AMOUNTMST, o.ACCOUNTNUM, o.TRANSDATE, o.REFRECID as RecId, o.DATAAREAID
    from VENDTRANSOPEN as o
    where o.DATAAREAID = %1
    union
    select -(t.AMOUNTMST - t.SETTLEAMOUNTMST) as AMOUNTMST, t.ACCOUNTNUM, t.TRANSDATE, t.RECID, t.DATAAREAID
    from VENDTRANS as t
    where t.DATAAREAID = %2
    )
select sum(AmountMST) as AmountMST, ACCOUNTNUM, TRANSDATE, RecId, DATAAREAID from trans
    group by DATAAREAID, ACCOUNTNUM, TRANSDATE, RecId -- индекс t.AccountDateIdx, o.AccountDateIdx
    having sum(AmountMST) <> 0
    order by DATAAREAID, ACCOUNTNUM, TRANSDATE, RecId

", sql.sqlLiteral(open.dataAreaId), sql.sqlLiteral(trans.dataAreaId)));

while( resultSet.next() )
{
    info(strFmt("%1, %2, %3, %4",
            resultSet.value("AmountMST"),
            resultSet.value("AccountNum"),
            resultSet.value("TransDate", Types::Date),
            resultSet.value("RecId")
        ), "", SysInfoAction_TableField::newBuffer(VendTrans::find(resultSet.value("RecId")))
    );

    progress.incCount();
}

Автор первого варианта обертки - Роман Долгополов (rdol, db): в первом варианте был реализован один универсальный метод get при помощи resultSetMetaData.

Полный рефакторинг класса-обертки - mazzy: Struct values, binds, nameByField, copyTo, getNull, getPrev, статические методы для выполнения запроса, для получения единственного значения, статические методы для работы со стандартным resultSet в унаследованном коде.

Внимание! В Ax4 и старше для работы базового класса ResultSet требуется разрешение SqlStatementExecutePermission это разрешение выдается только на сервере.

Внимание! Для импорта проекта ax3 сконвертируйте xpo-файл в кодировку Wind-1251. Github хранит и распаковывает файлы в кодировке UTF-8.

Следите за тем, чтобы объекты этого класса создавались на сервере, чтобы не генерировать лишнего трафика между клиентом и сервером.

mazzy, v1.03, 27.04.2016

About


Languages

Language:Java 99.8%Language:PowerShell 0.2%