Показать сообщение отдельно
Старый 05.08.2009, 12:50   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от 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...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: plumbum (1).