|
|
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
Есть запрос в mdb базе (формат Access2000): Код: plaintext 1. 2. 3. Когда этот запрос вызывается в Access (Open) все столбцы содержат ожидаемые данные, в частности столбец START_PRICE содержит данные из либо из LIST_PRICE либо из PRZ_VEN1. Все ОК. Когда запрос вызывается из ADO (COM, Jet4.0 OLEDB Provider) как сохраненная процедура (Cmd.CommandType = 4, Cmd.CommandText = "<имя запроса>"), то возвращается только первая строка данных. Если =Switch() обрамить например =CCur(Switch()), то возвращаются все строки, но в столбце START_PRICE отсутсвуют данные для варианта когда pl.ACTIVE IS NULL. Когда запрос вызыватеся из ADOX (.NET, Jet4.0 OLEDB Provider) как сохраненная процедура, то в столбце START_PRICE отсутсвуют данные для варианта когда pl.ACTIVE IS NULL (как для варианта с обрамлением в ADO). Если =Switch() обрамить например =CCur(Switch()), то вообще происходит ошибка в провайдере. У кого есть какие мысли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 11:57:03 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
Если вызывать не как сохраненную процедуру, а как запрос, то проблеммы теже самые. В ADO (COM) выводит только первую строчку потому, что уже вторая содержит столбец START_PRICE без данных и при переборе рекордсета происходит ошибка Type mismatch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 12:09:27 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
Замена Switch(...) на Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 12:34:53 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
А если pl.ACTIVE=False тогда что должно возвращаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 12:39:23 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
ааа, веточки из разных таблиц :) Предпочитаю левые JOIN упрятывать в подзапрос, а iif'ы писать во внешнем запросе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 12:44:52 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
возможно из другой оперы, но помню джет лажал (при группировках), если в булевом поле был (мог быть) Null. (из-за LEFT/RIGHT JOIN перед группировкой). (Думаю, внутри себя, под промежуточные результаты он продолжает выделять по биту на буль, и нуль туда (в бит) попросту не влезает). Лечилось неявным "приведением" к небулеву формату "результирующего" поля. (например попробуйте в сравнениях заменить pl.ACTIVE - > {pl.ACTIVE+0}). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 12:58:15 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
2 Roma R pl.ACTIVE=False не бывает (тяжкое наследие, запрос мой, база не моя :) ) 2 фыыф Помоги плз глупому, что именно в Switch нужно написать, а так глубоко синтаксиса не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 13:08:43 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
пробуй в духе: авторSELECT pp.*, pl.ACTIVE, pl.LIST_PRICE, pl.DISCOUNT, pl.SALE_PRICE, Switch(pl.ACTIVE,pl.LIST_PRICE,(pl.ACTIVE+0) IS NULL,p.PRZ_VEN1) AS START_PRICE FROM [SELECT c.CLIENT_CODE, p.PROD_CODE, p.PROD_DESC, p.PRZ_VEN1 FROM CLIENTS c, PRODUCTS p]. AS pp LEFT JOIN PRICE_LISTS AS pl ON (pp.CLIENT_CODE = pl.CLIENT_CODE) AND (pp.PROD_CODE = pl.PROD_CODE) ORDER BY pp.CLIENT_CODE, pp.PROD_CODE; Но только если аксесс>= Access97(95?) (в аксессе 2.0 было, кажется, Null+0=0 в запросах) ес-сна никаких гарантий. одна из догадок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 13:23:41 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
pl.ACTIVE=False не бывает - странно. Тогда поробуй так IIF(NZ(pl.ACTIVE,False),pl.LIST_PRICE,p.PRZ_VEN1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 13:32:36 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
Порпобовал оба совета. В Access работают оба, пример от фыыф в .NET дает такой же результат как и раньше (т.е.) с пустыми значениями. Пример от Roma R дает результат с пустыми значениями в COM и ошибку (как и раньше с CCur) в .NET. Нда, наступил так наступил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:03:09 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
а ларчик открывался просто Код: plaintext Логично в принципе, что нужно СНАЧАЛА на NULL проверять. Но вот объяснить почему в ACCESS работает так, в COM по-другому, а в .NET провайдере по третьему я не могу ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:23:03 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
Ну и последний штрих, ларчик не совсем прост ;) Код: plaintext 1. 2. По поводу того, что ACTIVE не может быть FLASE: ACTIVE - это пережиток прошлого, по идее, если есть запись в PRICE_LIST, то это и означает, что данная комбинация CLIENT-PRODUCT активна. Т.о ACTIVE или TRUE или NULL и лишь показывает наличие комбинации. Основная цель была в том, что цену в список нужно брать или из прайс-листа, если такая комбинация CLIENT-PRODUCT активна, или из PRODUCTS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:37:19 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
p1366=Switch( А что это за знак равенства? Истессно, с ним работать не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 14:47:59 |
|
||
|
Проблеммы со Switch()
|
|||
|---|---|---|---|
|
#18+
Владимир СанычА что это за знак равенства? Истессно, с ним работать не будет. Наличие/отсутствие этого равно никак не сказывается что на ошибочном, что на текущем, рабочем варианте. Текущий, кста, выглядит так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2004, 16:34:32 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32677314&tid=1672014]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 356ms |

| 0 / 0 |
