|
09.03.2021, 14:39 | #1 |
Участник
|
element.args().caller() - хорошая мысль. но очень грубо
element.args().lookup*() - прекрасно. спасибо. но я пошел уже другим путем и отрефакторил. принцип по которому я пошел:
получился вот такой код: X++: protected static MdmViewMode get(FormDataSource fdsMain, TableId shadowTableId) { MdmViewMode ret; EnumId enumId = enumnum(MdmType); QueryRun qr = fdsMain ? fdsMain.queryRun() : null; QueryBuildDataSource qbds = qr ? qr.query().dataSourceTable(shadowTableId, 1) : null; SysDictField field = qbds ? SysDictTable::fieldWithEnum(qbds.table(), enumId) : null; QueryBuildRange qbr = field ? qbds.findRange(field.id()) : null; str rangeValue = qbr ? qbr.value() : ''; ; if( !qbds || !qbds.enabled() ) { ret = MdmViewMode::All; } else if( qbds && qbds.joinMode() == JoinMode::NoExistsJoin && rangeValue == SysQuery::value(MdmEnumViewMode::completed()) ) { ret = MdmViewMode::InProcess; } else if( qbds && qbds.joinMode() == JoinMode::NoExistsJoin && rangeValue == SysQuery::value(MdmType::StopProcessing) ) { ret = MdmViewMode::Active; } else if( qbds && qbds.joinMode() == JoinMode::ExistsJoin && rangeValue == SysQuery::value(MdmType::StopProcessing) ) { ret = MdmViewMode::Stopped; } else if( qbds && qbds.joinMode() == JoinMode::ExistsJoin && rangeValue == SysQuery::value(MdmType::Error) ) { ret = MdmViewMode::Error; } else { ret = MdmViewMode::UserDefined; } return ret; } X++: // предполагаем, что в запросе только один range по полю mdmType protected static boolean set( FormDataSource fdsMain, TableId shadowTableId, MdmViewMode viewMode) { EnumId enumId = enumnum(MdmType); QueryRun qr = fdsMain ? fdsMain.queryRun() : null; QueryBuildDataSource qbds = qr ? SysQuery::findOrCreateDataSource(qr.query(), shadowTableId, fdsMain.table()) : null; SysDictField field = qbds ? SysDictTable::fieldWithEnum(qbds.table(), enumId) : null; str rangeValue; ; if( qbds && field ) { startLengthyOperation(); switch( viewMode ) { case MdmViewMode::UserDefined: qbds.enabled(true); qbds.relations(true); qbds.joinMode(JoinMode::InnerJoin); rangeValue = SysQuery::valueUnlimited(); break; case MdmViewMode::All: qbds.enabled(false); qbds.relations(true); qbds.joinMode(JoinMode::ExistsJoin); rangeValue = SysQuery::valueUnlimited(); break; case MdmViewMode::InProcess: qbds.enabled(true); qbds.relations(true); qbds.joinMode(JoinMode::NoExistsJoin); rangeValue = SysQuery::value(MdmEnumViewMode::completed()); break; case MdmViewMode::Active: qbds.enabled(true); qbds.relations(true); qbds.joinMode(JoinMode::NoExistsJoin); rangeValue = SysQuery::value(MdmType::StopProcessing); break; case MdmViewMode::Stopped: qbds.enabled(true); qbds.relations(true); qbds.joinMode(JoinMode::ExistsJoin); rangeValue = SysQuery::value(MdmType::StopProcessing); break; case MdmViewMode::Error: qbds.enabled(true); qbds.relations(true); qbds.joinMode(JoinMode::ExistsJoin); rangeValue = SysQuery::value(MdmType::Error); break; default: throw error(Error::unsupportedEnum(funcname(), viewMode)); } qbds.fetchMode(QueryFetchMode::One2One); qbds.firstOnly(true); SysQuery::findOrCreateRange(qbds, field.id()).value(rangeValue); fdsMain.research(); endLengthyOperation(); return true; } return false; } до жамка: после жамка: спасибо за советы и помощь. |
|
|
За это сообщение автора поблагодарили: sukhanchik (2), Raven Melancholic (2). |
10.03.2021, 11:11 | #2 |
Мрачный тип
|
Цитата:
К томе же реализация фильтров через queryRun().query() - не самый лучший вариант. Кто мешает пользователю в такой форме поиграться с запросом и вызвать стандартными средствами executeQuery(), похоронив все созданное непосильным трудом в queryRun().query() ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... Последний раз редактировалось TasmanianDevil; 10.03.2021 в 11:15. |
|
10.03.2021, 11:22 | #3 |
Участник
|
Цитата:
Цитата:
если пользователь "сломает" мои фильтры, то метод get вернет MdmViewMode::UserDefined для моего кода это вполне штатная ситуация. Именно с queryRun! Это самый лучший вариант. Последний раз редактировалось mazzy; 10.03.2021 в 11:25. |
|