Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проблеммы со Switch() / 14 сообщений из 14, страница 1 из 1
02.09.2004, 11:57:03
    #32677079
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
Есть запрос в mdb базе (формат Access2000):

Код: plaintext
1.
2.
3.
SELECT pp.*, pl.ACTIVE, pl.LIST_PRICE, pl.DISCOUNT, pl.SALE_PRICE, =Switch(pl.ACTIVE=True,pl.LIST_PRICE,pl.ACTIVE 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;

Когда этот запрос вызывается в 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()), то вообще происходит ошибка в провайдере.

У кого есть какие мысли?
...
Рейтинг: 0 / 0
02.09.2004, 12:09:27
    #32677126
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
Если вызывать не как сохраненную процедуру, а как запрос, то проблеммы теже самые. В ADO (COM) выводит только первую строчку потому, что уже вторая содержит столбец START_PRICE без данных и при переборе рекордсета происходит ошибка Type mismatch.
...
Рейтинг: 0 / 0
02.09.2004, 12:34:53
    #32677223
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
Замена Switch(...) на
Код: plaintext
IIF(pl.ACTIVE IS NULL,p.PRZ_VEN1,pl.LIST_PRICE)
ни к чему не приводит - результат тотже
...
Рейтинг: 0 / 0
02.09.2004, 12:39:23
    #32677241
Roma R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
А если pl.ACTIVE=False тогда что должно возвращаться?
...
Рейтинг: 0 / 0
02.09.2004, 12:44:52
    #32677265
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
ааа, веточки из разных таблиц :)
Предпочитаю левые JOIN упрятывать в подзапрос, а iif'ы писать во внешнем запросе
...
Рейтинг: 0 / 0
02.09.2004, 12:58:15
    #32677314
фыыф
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
возможно из другой оперы, но помню джет лажал (при группировках), если в булевом поле был (мог быть) Null. (из-за LEFT/RIGHT JOIN перед группировкой).

(Думаю, внутри себя, под промежуточные результаты он продолжает выделять по биту на буль, и нуль туда (в бит) попросту не влезает).

Лечилось неявным "приведением" к небулеву формату "результирующего" поля. (например попробуйте в сравнениях заменить pl.ACTIVE - > {pl.ACTIVE+0}).
...
Рейтинг: 0 / 0
02.09.2004, 13:08:43
    #32677345
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
2 Roma R
pl.ACTIVE=False не бывает (тяжкое наследие, запрос мой, база не моя :) )

2 фыыф
Помоги плз глупому, что именно в Switch нужно написать, а так глубоко синтаксиса не знаю.
...
Рейтинг: 0 / 0
02.09.2004, 13:23:41
    #32677391
фыыф
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
пробуй в духе:
автор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 в запросах)
ес-сна никаких гарантий. одна из догадок.
...
Рейтинг: 0 / 0
02.09.2004, 13:32:36
    #32677420
Roma R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
pl.ACTIVE=False не бывает - странно. Тогда поробуй так

IIF(NZ(pl.ACTIVE,False),pl.LIST_PRICE,p.PRZ_VEN1)
...
Рейтинг: 0 / 0
02.09.2004, 14:03:09
    #32677510
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
Порпобовал оба совета. В Access работают оба,
пример от фыыф в .NET дает такой же результат как и раньше (т.е.) с пустыми значениями. Пример от Roma R дает результат с пустыми значениями в COM и ошибку (как и раньше с CCur) в .NET.
Нда, наступил так наступил.
...
Рейтинг: 0 / 0
02.09.2004, 14:23:03
    #32677565
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
а ларчик открывался просто
Код: plaintext
IIF(pl.LIST_PRICE is NULL,pp.PRZ_VEN1,pl.LIST_PRICE)

Логично в принципе, что нужно СНАЧАЛА на NULL проверять. Но вот объяснить почему в ACCESS работает так, в COM по-другому, а в .NET провайдере по третьему я не могу ;)
...
Рейтинг: 0 / 0
02.09.2004, 14:37:19
    #32677618
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
Ну и последний штрих, ларчик не совсем прост ;)
Код: plaintext
1.
2.
IIF(pl.ACTIVE is NULL,pp.PRZ_VEN1,pl.LIST_PRICE)
вместо
IIF(pl.LIST_PRICE is NULL,pp.PRZ_VEN1,pl.LIST_PRICE)
вызывает падение .NET провайдера, несмотря на то, что и pl.ACTIVE, и pl.LIST_PRICE подтягиваются в одном джоине и оба явно указаны в списке полей в селекте и по идее оба должны быть NULL если для данной строки джоин не выполняется.

По поводу того, что ACTIVE не может быть FLASE: ACTIVE - это пережиток прошлого, по идее, если есть запись в PRICE_LIST, то это и означает, что данная комбинация CLIENT-PRODUCT активна. Т.о ACTIVE или TRUE или NULL и лишь показывает наличие комбинации. Основная цель была в том, что цену в список нужно брать или из прайс-листа, если такая комбинация CLIENT-PRODUCT активна, или из PRODUCTS.
...
Рейтинг: 0 / 0
02.09.2004, 14:47:59
    #32677657
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
p1366=Switch(
А что это за знак равенства? Истессно, с ним работать не будет.
...
Рейтинг: 0 / 0
02.09.2004, 16:34:32
    #32677963
p1366
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблеммы со Switch()
Владимир СанычА что это за знак равенства? Истессно, с ним работать не будет.

Наличие/отсутствие этого равно никак не сказывается что на ошибочном, что на текущем, рабочем варианте. Текущий, кста, выглядит так:
Код: plaintext
=CCur(IIF(pl.LIST_PRICE is NULL,pp.PRZ_VEN1,pl.LIST_PRICE)) AS START_PRICE
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проблеммы со Switch() / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]