AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.11.2007, 21:12   #1  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
Есть ли альтернатива SysQuery::countLoops(_queryRun)
Нужно посчитать количество результирующих строк при обработке запроса к таблице InventSum и другим подобным. При использовании SysQuery::countLoops тратиться много времени на перебор строк результата обычным циклом. Хотелось бы что нибудь побыстрее. Может как-то напрямую к БД (Oracle)?
Старый 04.11.2007, 21:25   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А что конкретно ты хочешь посчитать?
В смысле, напиши словами, какой запрос ты хочешь получить?

Не могу придумать, что такого можно считать (кол-во строк) по InventSum
Старый 04.11.2007, 21:42   #3  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от Beast-L
...
При использовании SysQuery::countLoops тратиться много времени на перебор строк результата обычным циклом.
...
Откудова у вас такая информация?

Походите дебагером по вот такому джобу. Вложенные циклы в каком месте вас смущают?

static void glibs()
{
Query query;
Counter counter;
;

query = new Query();
query.addDataSource(tablenum(InventSum));

counter = SysQuery::countTotal(new QueryRun(query));

info (strfmt("%1", counter));

}
__________________
С уважением,
glibs®
Старый 04.11.2007, 22:34   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Beast-L Посмотреть сообщение
Нужно посчитать количество результирующих строк при обработке запроса к таблице InventSum и другим подобным. При использовании SysQuery::countLoops тратиться много времени на перебор строк результата обычным циклом. Хотелось бы что нибудь побыстрее. Может как-то напрямую к БД (Oracle)?
countLoops возвращает не "количество результирующих строк", а количество выполнений цикла по группировкам.
"количество результирующих строк" возвращает countTotal.

Сначала выполняется группировка, внутри групп выполняется count(recid) (для countTotal), а уже по группам идет цикл (чтобы подсчитать число выполнений цикла).

См. также FAQ: http://forum.mazzy.ru/index.php?showtopic=300
__________________
полезное на axForum, github, vk, coub.
Старый 05.11.2007, 10:23   #5  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
X++:
public client server static Integer countLoops(QueryRun _queryRun)
{
    container c = sysQuery::countPrim(_queryRun.pack(false));

    return conPeek(c,2);
}

private server static container countPrim(container _queryPack)
{
    ....

    while(countQueryRun.next())
    {
        common  = countQueryRun.get(countQuery.dataSourceNo(1).table());
        counter += common.recId;
        loops++;
    }

    return [counter,
            loops];
}
Как раз таки loops меня устраивает а не counter. Дело в том что мне нужно количество строк которые будут отображаться в гриде на форме. Я уже попробовал countTotal, 100% не то что мне нужно.

Последний раз редактировалось Beast-L; 05.11.2007 в 10:28.
Старый 05.11.2007, 10:42   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Beast-L Посмотреть сообщение
Я уже попробовал countTotal, 100% не то что мне нужно.
Скорее всего вы ошибаетесь.
Но как пожелаете.
__________________
полезное на axForum, github, vk, coub.
Старый 05.11.2007, 10:56   #7  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
Во всяком случае напрямую rows = SysQuery::countTotal(_queryRun); мне не подходит.
Старый 05.11.2007, 12:17   #8  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А что конкретно ты хочешь посчитать?
В смысле, напиши словами, какой запрос ты хочешь получить?

Не могу придумать, что такого можно считать (кол-во строк) по InventSum
Ну например заказчик хочет в форме остатков (своей) видеть всё по серийным номерам с наложенными фильтрами например по цвету если строк в гриде будет 10 это и так наглядно видно а вот когда например 510 уже посчитать глазами не так то и просто. Или ДК в проданных хочет иметь возможность видеть количество строк в гриде что бы оценивать объёмы продаж

Последний раз редактировалось Beast-L; 05.11.2007 в 12:32.
Старый 05.11.2007, 13:37   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Show me the QUERY from the grid
Старый 05.11.2007, 13:51   #10  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
SELECT * FROM InventSum WHERE ((((AvailPhysical > 0)))) JOIN * FROM InventTable WHERE InventSum.ItemId = InventTable.ItemId JOIN * FROM InventDim WHERE InventSum.InventDimId = InventDim.inventDimId JOIN * FROM InventLocation WHERE InventDim.InventLocationId = InventLocation.InventLocationId AND ((InventLocationType_UAI = Автомобили))
Старый 05.11.2007, 14:11   #11  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от Beast-L
...
видеть количество строк в гриде что бы оценивать объёмы продаж
...
Это даже не женская логика...

Один уважаемый на данном форуме мой коллега анекдот рассказывал. Не могу найти в сети, но примерно так звучит.

Сынуля: Папа, я сегодня с девушкой на дискотеку иду. Мне деньги нужны.
Папа: А сколько тебе нужно?
— (Показывает большим и указательным пальцем руки размер пачки денег толщиной примерно с сантиметр) Вот столько.
— Ну, возьми в тумбочке.
— А в какой?
— Да в любой.

У вас примерно вот так же с объемом продаж получается .
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: e@gle (1).
Старый 05.11.2007, 15:22   #12  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
Понимаю как это со стороны выглядит, но лично я объёмы продаж оценивать не собираюсь. Заказчик просит я делаю, а как он уже этим пользоваться будет это меня мало беспокоит. Кроме того не вижу проблем в оценке объёмов если все проданные единицы попадают в одну таблицу из которой данные берутся на форму на которой столько фильтров сколько хочет заказчик, а оценивать как раз таки ему. Заказчику по моему видней что ему нужно для оценки объёмов продаж.

Последний раз редактировалось Beast-L; 05.11.2007 в 15:31.
Старый 05.11.2007, 21:58   #13  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Не знаю, поможет ли, но попробуй вот этот метод использовать (его добавить надо в класс SysQuery)
X++:
public client server static Integer dev_countTotal(Query _query)
{
    int                     k;
    Query                   countQuery = _query.newObject(_query.pack(FALSE));
    QueryRun                countQueryRun;
    QueryBuildDataSource    dataSource = countQuery.dataSourceNo(1);
    QueryBuildFieldList     theFieldList = dataSource.fields();
    Common                  record;
    int                     ret = 0;

    // Add contribution from dynalinks...
    countQuery = SysQuery::copyDynalinks(countQuery, _query);
    theFieldList.addField(fieldnum(Common, RecId), SelectionField::COUNT);

    for (k = 2; k <= countQuery.dataSourceCount();k++)
    {
        dataSource = countQuery.dataSourceNo(k);
        theFieldList = dataSource.fields();
        theFieldList.dynamic(false);
        theFieldList.clearFieldList();
        theFieldList.addField(fieldNum(Common,TableId));
    }

    countQueryRun = new QueryRun(countQuery);
    while (countQueryRun.next()) {
        record = countQueryRun.getNo(1);
        ret += record.RecId;
    }

    return ret;
}
За это сообщение автора поблагодарили: belugin (3).
Старый 06.11.2007, 12:20   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
См. job из FAQ'а
Лучше внести правку в сам код, нежели создавать отдельный метод.
Там была ошибка, ее нужно поправить.

Цитата:
Сообщение от kashperuk Посмотреть сообщение
X++:
        theFieldList.addField(fieldNum(Common,TableId));
А вот с этим будьте предельно осторожны.
TableID - псевдополе, которое отсутствует на SQL.
Запрос может выродится как в "select * from", в "select from" или в "" в разных версиях.
В общем, если хочется сократить количество возвращаемых полей, то для получаения гарантированного результата в любых версиях и сервис-паках, в списке полей должно быть хотя бы одно ХРАНИМОЕ на SQL поле.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: belugin (5).
Старый 06.11.2007, 12:29   #15  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от mazzy Посмотреть сообщение
См. job из FAQ'а
TableID - псевдополе, которое отсутствует на SQL.
Запрос может выродится как в "select * from", так и в "select from" в разных версиях.
Код работает везде начиная с AX 3.0 SP3
На более ранних версиях не проверял.

Сергей, а есть где-то задокументированные примеры такого поведения?
Потому что ты уже пару раз выдаешь такое предупреждение, но на яву я его ни разу не видел.
За это сообщение автора поблагодарили: Beast-L (1).
Старый 06.11.2007, 12:49   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Сергей, а есть где-то задокументированные примеры такого поведения?
Нет. Задокументированных не видел.

Но мне задают кучу вопросов. Несколько раз источником багов в запросах было наличие псевдполей и отсутствие хранимых полей. В том числе TableID. Особенно в join'ах.

Может быть, я дую на воду.
Но каждый раз, если есть возможность, предупреждаю о возможных проблемах с псевдополями.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Beast-L (1).
Старый 06.11.2007, 12:56   #17  
Beast-L is offline
Beast-L
Участник
Аватар для Beast-L
 
104 / 21 (1) +++
Регистрация: 20.10.2006
Адрес: Киев
Спасибо, то что доктор прописал

Последний раз редактировалось Beast-L; 06.11.2007 в 13:11.
Теги
как правильно, подсчет строк

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ALEG: Software-as-a-service есть ли у них будущее в России Blog bot DAX Blogs 0 28.10.2006 16:10
Fullscope - Процессное производство для Axapta есть. mazzy DAX: Функционал 33 28.08.2006 13:22
Enterprise Portal - Альтернатива есть? kashperuk DAX: Программирование 5 02.06.2006 10:49
Есть ли возможность вызывать код с вышележащих слоев ? FishLog DAX: Программирование 5 07.09.2004 17:24
Есть ли возможность вызывать код с вышележащих слоев ? FishLog DAX: Программирование 0 07.09.2004 13:39

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:19.