07.10.2004, 15:00 | #1 |
Участник
|
Разные запросы в 2-х и 3-х уровневой конфигурациях. Что делать?!
Многоуважаемая публика. Столкнулась со странной ситуацией: при формировании отчета в 2-х и в 3-х уровневых конфигурациях Axapta отправляет на SQL-сервер разные (!) запросы.
В 2-х уровневой версии запрос уходит на сервер вот в таком виде: SELECT A.VOUCHER,A.TRANSDATE,A.BGR_INVENTTRANSID,SUM(B.AMOUNTMST),SUM(B.AMOUNTCUR),B.ACCOUNTNUM,B.CREDITING,B.VOUCHER,B.TRANSDATE,B.BGR_INVENTTRANSID FROM LEDGERTRANS A,LEDGERTRANS B WHERE ((A.DATAAREAID='bgr') AND ((((((((A.TRANSDATE>={ts '2004-06-01 00:00:00.000'}) AND (A.TRANSDATE<={ts '2004-06-30 00:00:00.000'})) AND NOT ((A.BONDBATCH_RU=' '))) AND NOT ((A.BONDBATCHTRANS_RU=0))) AND ((A.PERIODCODE>=1) AND (A.PERIODCODE<=2))) AND NOT ((A.POSTING=19))) AND (A.VOUCHER=' ВП-00000060')) AND ((((((((((A.TRANSTYPE=0) OR (A.TRANSTYPE=3)) OR (A.TRANSTYPE=14)) OR (A.TRANSTYPE=16)) OR (A.TRANSTYPE=19)) OR (A.TRANSTYPE=20)) OR (A.TRANSTYPE=82)) OR (A.TRANSTYPE=80)) OR (A.TRANSTYPE=9)) OR (A.TRANSTYPE=99)))) AND ((B.DATAAREAID='bgr') AND (((B.RECID<>A.RECID) AND (A.BONDBATCH_RU=B.BONDBATCH_RU)) AND (A.BONDBATCHTRANS_RU=B.BONDBATCHTRANS_RU))) GROUP BY A.VOUCHER,A.TRANSDATE,A.BGR_INVENTTRANSID,B.ACCOUNTNUM,B.CREDITING,B.VOUCHER,B.TRANSDATE,B.BGR_INVENTTRANSID ORDER BY A.VOUCHER,A.TRANSDATE,A.BGR_INVENTTRANSID,B.ACCOUNTNUM,B.CREDITING,B.VOUCHER,B.TRANSDATE,B.BGR_INVENTTRANSID OPTION(FAST 19) А в 3-уровневой, вот в таком: SELECT A.VOUCHER,A.TRANSDATE,A.BGR_INVENTTRANSID,SUM(B.AMOUNTMST),SUM(B.AMOUNTCUR),B.ACCOUNTNUM,B.CREDITING,B.VOUCHER,B.TRANSDATE,B.BGR_INVENTTRANSID FROM LEDGERTRANS A,LEDGERTRANS B WHERE ((A.DATAAREAID='bgr') AND ((((((((A.TRANSDATE>={ts '2004-06-01 00:00:00.000'}) AND (A.TRANSDATE<={ts '2004-06-30 00:00:00.000'})) AND NOT ((A.BONDBATCH_RU=' '))) AND NOT ((A.BONDBATCHTRANS_RU=0))) AND ((A.PERIODCODE>=1) AND (A.PERIODCODE<=2))) AND NOT ((A.POSTING=19))) AND (A.VOUCHER=' ВП-00000060')) AND (((((((((A.TRANSTYPE=3) OR (A.TRANSTYPE=14)) OR (A.TRANSTYPE=16)) OR (A.TRANSTYPE=19)) OR (A.TRANSTYPE=20)) OR (A.TRANSTYPE=82)) OR (A.TRANSTYPE=80)) OR (A.TRANSTYPE=9)) OR (A.TRANSTYPE=99)))) AND ((B.DATAAREAID='bgr') AND (((B.RECID<>A.RECID) AND (A.BONDBATCH_RU=B.BONDBATCH_RU)) AND (A.BONDBATCHTRANS_RU=B.BONDBATCHTRANS_RU))) GROUP BY A.VOUCHER,A.TRANSDATE,A.BGR_INVENTTRANSID,B.ACCOUNTNUM,B.CREDITING,B.VOUCHER,B.TRANSDATE,B.BGR_INVENTTRANSID ORDER BY A.VOUCHER,A.TRANSDATE,A.BGR_INVENTTRANSID,B.ACCOUNTNUM,B.CREDITING,B.VOUCHER,B.TRANSDATE,B.BGR_INVENTTRANSID OPTION(FAST 19) Разница отмечена жиным шрифтом: в 2-х уровневой конфигурации добавляется лишний фильтр, который совсем даже не лишний..... Причем, если идти по циклу в дебагере, то фильтр добавляется в обеих конфигурациях. А на SQL-сервер в итоге уходят разные запросы! УЖАС! Кто-нибудь сталкивался с таким? Знает как бороться?!
__________________
Улыбаемся и машем, парни! Улыбаемся и машем... |
|
07.10.2004, 15:59 | #2 |
Участник
|
Попробуйте почистить кэш в 3-звенке.
|
|
07.10.2004, 16:08 | #3 |
Участник
|
сталкивался с подобной проблемой, правда безотносительно отчетов.
Строился Query добавлялись в него фильтры, а затем при вызове QueryRun.next() отправлялись разные фильтры взависимости от конфигурации(в двухуровневой фильтр целиком, в трехуровневой с недостающим условием). Моя проблема вылечилась, когда я стал определять объекты Query и QueryRun на одной стороне (либо оба на сервере, либо оба на клиенте). Когда проблему обнаружил, query у меня определялся с одной стороны, а вызов new QueryRun(query) на другой стороне. Может это как-то сможет Вам помочь. |
|
|
За это сообщение автора поблагодарили: Logger (2), jasper (1). |
07.10.2004, 16:09 | #4 |
Участник
|
Да какой там кэш Я ее тут только-только запустила, первый раз за месяц, наверное, - специально, чтобы разобраться, почему отчет не работает. А тут -такое!
Спасибо за версию - но дело не в этом.
__________________
Улыбаемся и машем, парни! Улыбаемся и машем... |
|
07.10.2004, 16:34 | #5 |
Участник
|
Цитата:
Изначально опубликовано levsha
Моя проблема вылечилась, когда я стал определять объекты Query и QueryRun на одной стороне (либо оба на сервере, либо оба на клиенте). Когда проблему обнаружил, query у меня определялся с одной стороны, а вызов new QueryRun(query) на другой стороне. Может это как-то сможет Вам помочь. Query действительно определялся на стороне клиента, а QueryRun - в серверном классе, формирующем данные для отчета. Сейчас проблема успешно излечена, спасибо огромное! Добавлю еще, что попытка вылечиться "простым" способом, сделав в серверном классе при инициализации параметров: query = new Query(_query); к успеху НЕ привела. Действенных решений 2: 1. Объявить класс, в котором делается самое первое query = new Query() серверным. 2. Перенести ту часть формирования query, в которой добавляются Range'и по "сбоящему" полю (в моем случае - по TRANSTYPE) в серверный класс, в котором делается QueryRun.
__________________
Улыбаемся и машем, парни! Улыбаемся и машем... |
|
07.10.2004, 16:47 | #6 |
Модератор
|
Либо не использовать смешанные конфигурации (Очень рекомендую)
P.S. Anais, levsha! Спасибо за описание интересного бага и способа лечения. С Уважением, Георгий. |
|
22.10.2004, 15:22 | #7 |
Участник
|
Цитата:
Изначально опубликовано Anais
Перенести ту часть формирования query, в которой добавляются Range'и по "сбоящему" полю (в моем случае - по TRANSTYPE) в серверный класс, в котором делается QueryRun. Плюс к этому в продолжении темы: плохо в случае переноса QueryRun с клиента на сервер становится не только фильтрам... Сейчас наблюдал такую картину: объекты Query и QueryRun формировались оба на клиенте, а вот вызов QueryRun.next() происходил уже на сервере. Фильтры и на толстом и на тонком клиентах формировались одинаковые (трассировка запросов давала идентичные результаты), но при этом на толстом клиенте процесс отрабатывал успешно, на тонком клиенте происходило зацикливание именно в выполнении процедур на аосе (никаких запросов дополнительно к серверу БД не формировалось, но между объектами на сервере происходила передача ссылки на этот объект QueryRun). Пришлось все параметры, необходимые для формирования query, дублировать на сервере... |
|
22.10.2004, 15:31 | #8 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
Либо не использовать смешанные конфигурации (Очень рекомендую) Георгий. |
|
22.10.2004, 15:39 | #9 |
Модератор
|
На АОСе надо галку поставить - и все у Вас будет дебажиться и на сервере. Почитайте доку, а лучше - методом научного тыка - там её несложно найти.
С Уважением, Георгий |
|
22.10.2004, 15:46 | #10 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
На АОСе надо галку поставить - и все у Вас будет дебажиться и на сервере. |
|
22.10.2004, 15:50 | #11 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
На АОСе надо галку поставить - и все у Вас будет дебажиться и на сервере. Почитайте доку, а лучше - методом научного тыка - там её несложно найти. С Уважением, Георгий |
|
22.10.2004, 15:54 | #12 |
Модератор
|
Да, точно. в 2,5 её не было
Сорри, если кого ввел в заблуждение. С Уважением, Георгий. |
|
04.11.2004, 12:47 | #13 |
Участник
|
Цитата:
Изначально опубликовано Anais
Многоуважаемая публика. Столкнулась со странной ситуацией: при формировании отчета в 2-х и в 3-х уровневых конфигурациях Axapta отправляет на SQL-сервер разные (!) запросы. |
|