|
![]() |
#1 |
Участник
|
Проверка предельного количества Range в Query
X++: static void Job_QueryRangeLimit(Args _args) { Query query; QueryRun queryRun; QueryBuildDataSource qbds; QueryBuildRange qbr; int nextI; ; query = new Query(); qbds = query.addDataSource(tablenum(InventTable)); for (nextI = 1; nextI <= 476 ; nextI++) { qbr = qbds.addRange(fieldNum(InventTable, ItemId)); qbr.value(queryValue('1')); } queryRun = new QueryRun(query); queryRun.next(); } 476 условий - берет, а 477 - ошибка "Некоторая часть инструкции SQL имеет слишком глубокую вложенность. Перепишите запрос или разбейте его на запросы меньшего размера." Так что, все зависит от количества ограничивающих значений. Если в пределах нескольких десятков, то можно и через Range. А вот если больше, то может быть имеет смысл сделать обратное - найти значения которые надо не исключать, а наоборот, которые допустимы. Использование временной таблице в запросе по любому физически означает вложенный цикл. Просто, при включении таблицы в запрос этот цикл выполняется не явно. |
|
![]() |
#2 |
Участник
|
в одном месте обошлась циклами, а вот другом уже не получается, как сделать такое:
открывается форма и если при открытии отмечена галка, то должны открываться только те записи, ключи которых есть в заданном контейнере вида [[Значение1Поля1, Значение1Поля2], [Значение2Поля1, Значение2Поля2], ....]. те это пары составных ключей. Галку эту можно снимать и ставить после открытия формы, поэтому все это добро должно лежать в ExecuteQuery. Если делать expression in query ranges и собирать значение типа ((Field11 and Field12) or (Field21 and Field22) ...), то как выше писала, можно , вроде, наткнуться на ограничение длины такого сборного range. А если инициализировать временную таблицу, то возвращаемся к баранам join-а с ними. Как быть? Делать очищаемую постоянную таблицу, совать туда эти пары значений и потом с нею уже join-ить в ExQuery? |
|