25.05.2017, 15:50 | #1 |
Участник
|
Ошибка запроса типа Union в лукапе
DAX 2012 R3
версия приложения 6.3.5000.133 версия ядра 6.3.5000.138 Ошибка проявилась в стандартном функционале: при создании нового ресурса (Управление и учет по проектам/Обычный/Ресурсы проекта/Ресурсы). Если в форме создания в поле Рабочий ввести предварительный фильтр с использованием символа *, то при срабатывании лукапа возникает ошибка "Несоответствие числа полей в запросе типа UNION. Номер поля HcmWorkerCubeDimension_1 отличается от номера поля HcmWorkerCubeDimension_2". При этом вызов того же лукапа из поля, не содержащего *, проходит штатно. При попытке отфильтровать появившийся список, используя этот же текст с *, ничего предосудительного не происходит. Как выяснилось в ходе экспериментов, чтобы воспроизвести такое поведение, достаточно на пустую форму добавить StringEdit, перекрыть у него lookup примерно таким образом: X++: public void lookup() { Query query = new Query(); QueryBuildDataSource qbds_1; QueryBuildDataSource qbds_2; SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(ProjTable), this); query.queryType(QueryType::Union); qbds_1 = query.addDataSource(tableNum(ProjTable)); qbds_2 = query.addDataSource(tableNum(ProjTable)); qbds_2.unionType(UnionType::Union); sysTableLookup.parmQuery(query); sysTableLookup.addLookupField(fieldNum(ProjTable, ProjId), true); sysTableLookup.addLookupField(fieldNum(ProjTable, Name)); sysTableLookup.performFormLookup(); } В таком примере ошибочное поведение лукапа воспроизводится чуть более, чем полностью. Ещё нюанс, трассировка запросов показывает, что в ошибочной ситуации запрос на SQL не отправляется. Ядро само видимо решает, что что то не так и генерирует ошибку. Хочу спросить у уважаемого сообщества, сталкивался ли кто нибудь с подобным? Есть ли сборки DAX 2012, на которых описанная ситуация не происходит? И есть ли у кого нибудь мысли, что же тут может происходить, и как с этим
__________________
Здесь могла быть Ваша реклама! |
|
26.05.2017, 15:23 | #2 |
Участник
|
Баг в классе SysTableLookupBase, можно поправить например вот так метод formRun
X++: queryBuildDataSource = formDataSource.queryBuildDataSource(); if (queryBuildDataSource) { // Update the Query's select list. this.buildSelectionList(queryBuildDataSource); uniqueId = queryBuildDataSource.uniqueId(); } queryBuildDataSource = formDataSource.queryRunQueryBuildDataSource(); if (queryBuildDataSource) { // Update the QueryRun's select list. this.buildSelectionList(queryBuildDataSource); uniqueId = queryBuildDataSource.uniqueId(); } if(query != null && query.queryType() == QueryType::Union) { for(i = 1; i <= query.dataSourceCount(); i++) { queryBuildDataSource = query.dataSourceNo(i); if(queryBuildDataSource.uniqueId() != uniqueId) { this.buildSelectionList(queryBuildDataSource); //simple fix srf if (formDataSource.queryRun() && formDataSource.queryRun().query().dataSourceUniqueId(queryBuildDataSource.uniqueId())) { queryBuildDataSource = formDataSource.queryRun().query().dataSourceUniqueId(queryBuildDataSource.uniqueId()); if (queryBuildDataSource) { // Update the QueryRun's select list. this.buildSelectionList(queryBuildDataSource); } } //simple fix srf } } } Но логичнее посмотреть метод this.buildSelectionList и поправить его так, чтобы поля которые уже есть в запросе дополнительно в него не добавлялись, тогда метод formRun править не надо будет.
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Oz (2), gl00mie (3), Logger (1). |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|