Цитата:
Сообщение от
plumbum
Нет, в общем-то я хотел констатировать факт, что если суммировать по тому же полю, по которому группировать, то желаемого результата не будет.
Задача была выбрать количество разных поставщиков, для которых созданы закупки...
Аксапта-SQL это лишь жалкое подобие(подмножество) SQL, поэтому сложно требовать от него функций расширяющих SQL, как вы хотите.
Вы пытались сделать вот такой запрос, вот выполните его и посмотрите, что выдаёт нормальный SQL, который вы хотели построить:
X++:
Select orderaccount, count(orderaccount), count(*)
From Purchtable
Group By orderaccount
Но из-за особенностие работы Аксапты с табличными переменными, вы не получите даже этого.
Вам же нужен один из следующих запросов:
X++:
Select Count ( Distinct Orderaccount )
From Purchtable
/
Select Count ( * )
From ( Select Orderaccount
From Purchtable
Group By Orderaccount )
Ни того ни другого Аксапта не поддерживает, к сожалению.
Как вариант - воспользуйтесь
direct sql.
Примерный код для 3-ки (тестировал на Оракле):
X++:
static void Job22(Args _args)
{
dictTable dictTable = new DictTable(tableNum(PurchTable));
Connection con = new Connection();
ResultSet rs;
Statement stmt;
str sql;
str dataareaid;
int cnt;
;
if (dictTable.dataPrCompany())
{
DataAreaId = curext();
if ( SqlSystem::databaseBackendId() == DatabaseId::Oracle )
dataareaid = strFmt(new SqlSystem().monocaseFmt(),dataareaid);
}
sql = strFmt("Select Count ( Distinct %1 ) From %2 where %3 = \'%4\'",
dictTable.fieldName(fieldnum(PurchTable, OrderAccount), DBBackend::SQL),
dictTable.name(DbBackend::SQL),
dictTable.fieldName(fieldnum(PurchTable, DataAreaId), DBBackend::SQL),
DataAreaId);
info(sql);
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next())
{
cnt = rs.getInt(1);
}
info(int2str(cnt));
}
На более поздних версия надо будет ещё включать разрешения через SqlStatementExecutePermission...