01.08.2014, 08:15 | #1 |
Участник
|
Клонировать QueryRun
Добрый день!
Вопрос на 5 копеек: у меня есть объект queryRun1. Как мне создать его копию и поместить скажем в queryRun2? |
|
01.08.2014, 08:21 | #2 |
Участник
|
X++: queryRun2 = new QueryRun(queryRun1.query()); |
|
01.08.2014, 08:52 | #3 |
Участник
|
|
|
01.08.2014, 08:57 | #4 |
Участник
|
Я соврал, в query их как раз и нужно вешать))) тем не менее, выборка в queryRun1 и queryRun2 не совпадают...
|
|
01.08.2014, 09:02 | #5 |
Участник
|
В общем, вот почему не сходится: queryRun1 - это запрос датасорса на форме. Датасорс выводится в грид. На грид вешается фильтр... вот это самое значение фильтра при копировании не учитывается. учитываются только рэйнджи, которые прописаны программно (там executeQuery перекрыт...). Вот. как добавить значения фильтра из грида в queryRun2?
|
|
01.08.2014, 09:05 | #6 |
Участник
|
Ошибаетесь. Структура запроса: джойны, рейнджы, сортировки и т.д. - это все задается на уровне query.
QueryRun же это класс отвечающий за перебор записей соответствующего Query. К стати, на уровне QueryRun ещё задается сопоставление курсоров запроса с конкретными экземплярами временных таблиц, если таковые участвуют в запросе. Вот они видимо не скопируются. Можно ещё попробовать вот так, но не уверен что это поможет. X++: queryRun2 = new QueryRun(queryRun1.pack()); |
|
01.08.2014, 09:07 | #7 |
Участник
|
Цитата:
Сообщение от Vasiliusis
В общем, вот почему не сходится: queryRun1 - это запрос датасорса на форме. Датасорс выводится в грид. На грид вешается фильтр... вот это самое значение фильтра при копировании не учитывается. учитываются только рэйнджи, которые прописаны программно (там executeQuery перекрыт...). Вот. как добавить значения фильтра из грида в queryRun2?
Извиняюсь, наоборот. Как передать в отчет отфильтрованные данные из формы? Последний раз редактировалось S.Kuskov; 01.08.2014 в 09:10. |
|
|
За это сообщение автора поблагодарили: Vasiliusis (1). |
01.08.2014, 09:08 | #8 |
Мрачный тип
|
Поможет, класс SysQuery именно так реализует всякие сервисные подсчеты для передаваемых запросов ...
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
01.08.2014, 09:14 | #9 |
Участник
|
Цитата:
X++: static void QueryRunTest(Args _args) { Query q; QueryRun qr1, qr2; QueryBuildDataSource qbds; InventTable inventTable; ; q = new Query(); qbds = q.addDataSource(tablenum(InventTable)); qbds.addRange(fieldnum(InventTable, ItemId)).value("2320"); qbds.addSelectionField(fieldnum(InventTable, ItemId)); qbds.addSelectionField(fieldnum(InventTable, ItemName)); qr1 = new QueryRun(q); while (qr1.next()) { inventTable = qr1.get(tablenum(InventTable)); info(strfmt("%1 (%2)", inventTable.ItemId, inventTable.ItemName)); } info(""); qr2 = new QueryRun(qr1.query()); while (qr2.next()) { inventTable = qr2.get(tablenum(InventTable)); info(strfmt("%1 (%2)", inventTable.ItemId, inventTable.ItemName)); } }
__________________
// no comments |
|
01.08.2014, 09:14 | #10 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Вам в этом случае нужен не DataSource.QueryRun().Query(), а DataSource.Query().
Извиняюсь, наоборот. Как передать в отчет отфильтрованные данные из формы? |
|
01.08.2014, 09:15 | #11 |
Участник
|
полезный класс, если нужно, например, пересобрать запрос, объеденить. Но заметьте, работает он все равно с классом Query, а не QueryRun. Поэтому вести речь о клонировании именно QueryRun, со всем его контекстом - вообще говоря нельзя.
|
|
01.08.2014, 13:12 | #12 |
Мрачный тип
|
S.Kuskov, неправда Ваша - всякие count<Всякое>() в нем работают именно с объектом типа QueryRun и именно его клонируют через контейнер, производя вычисления.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
01.08.2014, 13:57 | #13 |
Участник
|
Цитата:
Вот небольшой пример: X++: static void JobTEST_QueryRunPack(Args _args) { Query query; QueryRun queryRun1, queryRun2; TmpABC TmpABC1; ; query = new Query(); query.addDataSource(tableNum(TmpABC)); TmpABC1.clear(); TmpABC1.Amount = 123.45; TmpABC1.doInsert(); queryRun1 = new QueryRun(query); queryRun1.setCursor(TmpABC1); info(strfmt("SysQuery::countTotal(queryRun1): %1", SysQuery::countTotal(queryRun1))); // 0 info(""); queryRun2 = new QueryRun(queryRun1.pack()); // "клонируем" QueryRun info("queryRun2:"); info("{"); while (queryRun2.next()) // {} { TmpABC1 = queryRun2.get(tableNum(TmpABC)); info(strfmt("%1", TmpABC1.Amount)); } info("}"); info(""); info("queryRun1:"); info("{"); while (queryRun1.next()) // {123,45} { TmpABC1 = queryRun1.get(tableNum(TmpABC)); info(strfmt("%1", TmpABC1.Amount)); } info("}"); } |
|
04.08.2014, 06:58 | #14 |
Мрачный тип
|
Угу, про времянки, читая ответ по диагонали, я как-то пролетел мимо
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
|
|