04.11.2007, 21:12 | #1 |
Участник
|
Есть ли альтернатива SysQuery::countLoops(_queryRun)
Нужно посчитать количество результирующих строк при обработке запроса к таблице InventSum и другим подобным. При использовании SysQuery::countLoops тратиться много времени на перебор строк результата обычным циклом. Хотелось бы что нибудь побыстрее. Может как-то напрямую к БД (Oracle)?
|
|
04.11.2007, 21:25 | #2 |
Участник
|
А что конкретно ты хочешь посчитать?
В смысле, напиши словами, какой запрос ты хочешь получить? Не могу придумать, что такого можно считать (кол-во строк) по InventSum |
|
04.11.2007, 21:42 | #3 |
Member
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от Beast-L
Нужно посчитать количество результирующих строк при обработке запроса к таблице InventSum и другим подобным. При использовании SysQuery::countLoops тратиться много времени на перебор строк результата обычным циклом. Хотелось бы что нибудь побыстрее. Может как-то напрямую к БД (Oracle)?
"количество результирующих строк" возвращает countTotal. Сначала выполняется группировка, внутри групп выполняется count(recid) (для countTotal), а уже по группам идет цикл (чтобы подсчитать число выполнений цикла). См. также FAQ: http://forum.mazzy.ru/index.php?showtopic=300 |
|
05.11.2007, 10:23 | #5 |
Участник
|
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]; } Последний раз редактировалось Beast-L; 05.11.2007 в 10:28. |
|
05.11.2007, 10:42 | #6 |
Участник
|
Скорее всего вы ошибаетесь.
Но как пожелаете. |
|
05.11.2007, 10:56 | #7 |
Участник
|
Во всяком случае напрямую rows = SysQuery::countTotal(_queryRun); мне не подходит.
|
|
05.11.2007, 12:17 | #8 |
Участник
|
Ну например заказчик хочет в форме остатков (своей) видеть всё по серийным номерам с наложенными фильтрами например по цвету если строк в гриде будет 10 это и так наглядно видно а вот когда например 510 уже посчитать глазами не так то и просто. Или ДК в проданных хочет иметь возможность видеть количество строк в гриде что бы оценивать объёмы продаж
Последний раз редактировалось Beast-L; 05.11.2007 в 12:32. |
|
05.11.2007, 13:37 | #9 |
Участник
|
Show me the QUERY from the grid
|
|
05.11.2007, 13:51 | #10 |
Участник
|
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 |
Member
|
Цитата:
Сообщение от Beast-L
...
видеть количество строк в гриде что бы оценивать объёмы продаж ... Один уважаемый на данном форуме мой коллега анекдот рассказывал. Не могу найти в сети, но примерно так звучит. Сынуля: Папа, я сегодня с девушкой на дискотеку иду. Мне деньги нужны. Папа: А сколько тебе нужно? — (Показывает большим и указательным пальцем руки размер пачки денег толщиной примерно с сантиметр) Вот столько. — Ну, возьми в тумбочке. — А в какой? — Да в любой. У вас примерно вот так же с объемом продаж получается .
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: e@gle (1). |
05.11.2007, 15:22 | #12 |
Участник
|
Понимаю как это со стороны выглядит, но лично я объёмы продаж оценивать не собираюсь. Заказчик просит я делаю, а как он уже этим пользоваться будет это меня мало беспокоит. Кроме того не вижу проблем в оценке объёмов если все проданные единицы попадают в одну таблицу из которой данные берутся на форму на которой столько фильтров сколько хочет заказчик, а оценивать как раз таки ему. Заказчику по моему видней что ему нужно для оценки объёмов продаж.
Последний раз редактировалось Beast-L; 05.11.2007 в 15:31. |
|
05.11.2007, 21:58 | #13 |
Участник
|
Не знаю, поможет ли, но попробуй вот этот метод использовать (его добавить надо в класс 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 |
Участник
|
См. job из FAQ'а
Лучше внести правку в сам код, нежели создавать отдельный метод. Там была ошибка, ее нужно поправить. А вот с этим будьте предельно осторожны. TableID - псевдополе, которое отсутствует на SQL. Запрос может выродится как в "select * from", в "select from" или в "" в разных версиях. В общем, если хочется сократить количество возвращаемых полей, то для получаения гарантированного результата в любых версиях и сервис-паках, в списке полей должно быть хотя бы одно ХРАНИМОЕ на SQL поле. |
|
|
За это сообщение автора поблагодарили: belugin (5). |
06.11.2007, 12:29 | #15 |
Участник
|
Цитата:
На более ранних версиях не проверял. Сергей, а есть где-то задокументированные примеры такого поведения? Потому что ты уже пару раз выдаешь такое предупреждение, но на яву я его ни разу не видел. |
|
|
За это сообщение автора поблагодарили: Beast-L (1). |
06.11.2007, 12:49 | #16 |
Участник
|
Нет. Задокументированных не видел.
Но мне задают кучу вопросов. Несколько раз источником багов в запросах было наличие псевдполей и отсутствие хранимых полей. В том числе TableID. Особенно в join'ах. Может быть, я дую на воду. Но каждый раз, если есть возможность, предупреждаю о возможных проблемах с псевдополями. |
|
|
За это сообщение автора поблагодарили: Beast-L (1). |
06.11.2007, 12:56 | #17 |
Участник
|
Спасибо, то что доктор прописал
Последний раз редактировалось Beast-L; 06.11.2007 в 13:11. |
|
Теги |
как правильно, подсчет строк |
|
|