25.03.2012, 17:43 | #1 |
MCTS
|
Выделенные строки на гриде -> QueryRun
Как бы это покороче написать?
|
|
25.03.2012, 17:51 | #2 |
Участник
|
Не очень понятен вопрос.
Если хотите сделать что-то вроде того, что из датасорса вытащить запрос, в котором кроме всех фильтров будет еще какой-то признак выделения строк и подсунуть такую конструкцию в queryRun, то, вроде бы такого нет. Если нужно просто обработать строки, которые выделены, то нужно смотреть в сторону методов getFirst и getNext датасорса. Например, в классе, в который передается курсор, независимо от того, выделено несколько строк или только одна, можно пользоваться чем-то вроде: Цитата:
protected void initFromCaller(common _callerTable)
{ ShipmentsJournal_OVK locShipmentsJournal; FormDataSource shipmentJournalDS; shipmentJournalDS = _callerTable.dataSource(); for (locShipmentsJournal = (shipmentJournalDS && shipmentJournalDS.getFirst(1)) ? shipmentJournalDS.getFirst(1) : _callerTable; locShipmentsJournal; locShipmentsJournal = shipmentJournalDS ? shipmentJournalDS.getNext() : null) { // Тут обрабатываем переменную таблицы locShipmentsJournal Последний раз редактировалось Raven Melancholic; 25.03.2012 в 17:55. |
|
25.03.2012, 18:52 | #3 |
MCTS
|
Цитата:
Сообщение от Raven Melancholic
Не очень понятен вопрос.
Если хотите сделать что-то вроде того, что из датасорса вытащить запрос, в котором кроме всех фильтров будет еще какой-то признак выделения строк и подсунуть такую конструкцию в queryRun, то, вроде бы такого нет. Если нужно просто обработать строки, которые выделены, то нужно смотреть в сторону методов getFirst и getNext датасорса. Например, в классе, в который передается курсор, независимо от того, выделено несколько строк или только одна, можно пользоваться чем-то вроде: Последний раз редактировалось Eldar9x; 25.03.2012 в 18:55. |
|
25.03.2012, 21:22 | #4 |
Роман Долгополов (RDOL)
|
Похоже я продолжаю упорно рекламировать одну и ту же фичу
Выборка произвольных записей одним запросом Набираем RecId в Set любым способом (пример пробега по выделенным записям во втором сообщении) ну или вот готовый код: X++: public static Set dsGetMarked(FormDataSource _ds) { Set markedRecords = new Set(Types::Int64); Common markedRecord; if (! _ds.anyMarked() && _ds.cursor()) { markedRecords.add(_ds.cursor().RecId); } else { markedRecord = _ds.getFirst(true); while (markedRecord) { markedRecords.add(markedRecord.RecId); markedRecord = _ds.getNext(); } } return markedRecords; } Чуть измененный пример из исходной темы: X++: static void refList_TutorialSet(Args _args) { RecordReferenceList_RU refList = RecordReferenceList_RU::construct(); RecordReference_RU ref; InventTable inventTable; int i; Set markedRecords = new Set(Types::Int64); Query query; QueryBuildDataSource qbds; QueryRun queryRun; ; setprefix("RecordReferenceList_RU"); while select inventTable { markedRecords.add(inventTable.RecId); i++; if (i > 10) { break; } } refList.setRecords(markedRecords); refList.flush(); info("Query"); query = new Query(); qbds = query.addDataSource(tablenum(InventTable)); refList.join(qbds); queryRun = new QueryRun(query); while (queryRun.next()) { info(queryRun.get(tablenum(InventTable)).caption()); } info("Select"); while select inventTable join ref where ref.RefRecId == inventTable.RecId && ref.ParmId == refList.getParmId() { info(inventTable.caption()); } refList.cleanup(); } |
|
|
За это сообщение автора поблагодарили: Eldar9x (1). |
26.03.2012, 00:48 | #5 |
Участник
|
|
|
26.03.2012, 07:11 | #6 |
MCTS
|
|
|
26.03.2012, 11:38 | #7 |
Участник
|
В любом случае, в QueryRun и в Query нет данных о выделенных строках, эти данные есть только в датасорсе. Так что пробежать по датасорсу все равно нужно, а вот что делать с этими данными, полученными при пробеге по датасорсу уже другой вопрос.
Один из вариантов это то, что предлагает db - воспользоваться классом RecordReferenceList_RU (если DAX2009, иначе сделать что-то подобное самому - там ничего особенно сложного нет). |
|