01.04.2002, 19:24 | #1 |
Administrator
|
Как в query создать relation вида...
... неравно.
Например, хочу сделать query вида: <pre> InventTrans T1, T2; select T2 join T1 where T2.InventDimId == T1.InventDimId && T2.InventTransId != T1.InventTransId;</pre> Если у кого-нибудь есть идеи, как это реализовать с помощью query, пожалуйста, поделитесь.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
01.04.2002, 21:05 | #2 |
Участник
|
Не очень понятен смысл этого выражения. Попарно все движения с одинаковой складской аналитикой. А зачем? Это ж офигительная выборка получится. А смысла никакого...
В любом случае - неравенство это тип связи notexist. А почему именно query? Почему не хочешь выбрать все InventDim'ы, а затем проверить внутри на несовпадение? Среди выбранного богатства совпадающие inventTransID составят несколько процентов... Т.е. с запросом провозишься, а выиграешь несколько процентов... Стоит ли? |
|
02.04.2002, 11:24 | #3 |
Administrator
|
Наверное, не очень корректно сформулировал...
В виде SQL-запросов то, что я хочу сделать, выглядит примерно так:
<pre> InventTrans T1, T2; select firstonly T1 where T1.InventTransId == X; while select T2 where T2.InventDimId == T1.InventDimId && T2.InventTransId != T1.InventTransId { // bla, bla, bla... }</pre> Это я хочу сделать с помощью query, чтобы использовать эту выборку в отчете. Проблема в том, что при создании query для отчета единственный доступный тип связи, это "==", причем сравниваются только поля (с фиксированными величинами сравнивать нельзя). Правда, если делать отчет мастером отчетов, то иногда получается сравнить с фиксированной величиной (эти связи добавляются автоматически), а вот в ручную такую связь добавить не удается. Можно поподробнее про связь notexist. Каким образом ее создать?
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
02.04.2002, 19:27 | #4 |
Участник
|
notexist не надо создавать это свойство JoinMode у датасорса.
Насчет мастера и сравнения с константой. Можно подробнее? |
|
04.04.2002, 10:11 | #5 |
Administrator
|
Цитата:
Изначально опубликовано mazzy
Насчет мастера и сравнения с константой. Можно подробнее?
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
04.04.2002, 13:41 | #6 |
Moderator
|
Ладно - поделюсь стратегическим знанием
static void FedTest(Args _args) { Query qry; QueryRun qrun; InventTrans inventTrans1,inventTrans2; QueryBuildDataSource qbds; QueryBuildRange qbr; qry = new Query(); qbds=qry.addDataSource(tablenum(inventTrans),"it1"); qbds=qbds.addDataSource(tablenum(inventTrans),"it2"); qbds.relations(false); qbr=qbds.addRange(fieldnum(inventTrans,voucher)); qbr.value("( (it1.InventDimId != it2.InventDimId ) && (it1.inventTransId == it2.inventTransId) )"); qrun = new QueryRun(qry); qrun.reset(); while (qrun.next()) { inventTrans1 = qrun.getNo(1); inventTrans2 = qrun.getNo(2); print inventTrans1.InventTransId, " ", inventTrans1.InventDimId," ",inventTrans2.InventTransId," ",inventTrans2.inventDimId; pause; } } |
|
04.04.2002, 13:55 | #7 |
Administrator
|
Спасибо, но это фильтрация через Range
В принципе, тоже подойдет, но просто ради спортивного интереса я пытаюсь ее сделать через relation. Кажется, mazzy прав, стоит попробовать JoinMode NotExist. Пока не было времени проверить. Как сделаю, сообщу.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
05.04.2002, 09:25 | #8 |
Moderator
|
Если при использовании данного подхода включить трассировку SQL-запросов, можно увидеть, что Axapta генерирует вполне правильный join двух таблиц, который очень даже быстро отрабатывает.
Собственно - не вижу никаких преимуществ использования relation в данной ситуации. |
|
05.04.2002, 19:04 | #9 |
Участник
|
max, спасибо. Только узнать бы "когда" она это делает.
fed, запрос генерируется нормальный. Это да. Есть только один недостаток: это делается через программирование. А как сделать без программирования? И еще одно замечание: если через программирование, то второе условие в range value лишнее. Лучше прилинковать таблицы явно через addDynalink, а не через range. |
|
05.04.2002, 19:20 | #10 |
Moderator
|
Привет mazzy !
Ну - собственно - если у тебя две одинковых таблицы в запросе отчета, то тебе все равно придеться метод fetch перепрограммировать, иначе тебе до нужного экземпляра таблицы не добраться. Кстати - и за что же ты так программирование не любишь ? Я же не предлагаю систему корреспонденции проводок переделать . |
|
05.04.2002, 21:02 | #11 |
Участник
|
Да. точно. Придется. Я не подумал об этом.
Программирование я люблю. Просто мне кажется, что программисты очень часто забывают о стандартных и штатных фичах программы (и сам такой). В результате строки срываются на ровном месте. Поэтому первый вопрос, который я себе задаю - как это сделать без программирования. Кроме того, Аксапта позиционируется как готовая программа. Она таковой и является. В моей Аксапта-практике - если возникает необходимость глобального программирования, то чаще всего я чего-то не понимаю или не знаю. Например, этот вопрос max'а: сделать query вида. В такой формулировке можно сделать только программированием. НО! Наверняка макс не просто так вопрос задает. Наверняка он решает какую-то важную задачу. Уверен, что существует решение его задачи без программирования. Уверен, что его задачу можно решить в Аксапте быстрее и эффективнее, если решать ее без программирования. Max, скажи, что за проблема то? |
|