Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / О пользе функции Nz в запросах / 8 сообщений из 8, страница 1 из 1
22.09.2004, 19:24:51
    #32707480
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
Есть запрос
Код: plaintext
1.
SELECT DealList.Comment, Len(Brackets([DealList].[Comment])) AS Expr1
FROM DealList;
в котором поле Comment - текстовое, а функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function Brackets(Comment As String) As String
Dim ib As Integer, ie As Integer, str As String
Brackets = ""
str = Nz(Comment, "")
ib = InStr( 1 , str, "<")
ie = InStr( 1 , str, ">")
If ib >  0  And ie > ib Then
Brackets = Left(str, ie -  1 )
Brackets = Right(Brackets, Len(Brackets) - ib)
End If
End Function
извлекает из этого поля текст, заключенный в угловые скобки <...>, если таковой есть. Вроде бы в самой функции стоит обработка возможности полю Comment быть IsNull.
Но запуск запроса дает мне =Error в тех строках, в которых поле действительно пустое, причем простановка BrakePoint дает, что на этих строках запрос ВООБЩЕ функцию Brackets не спрашивает!
Если же Nz заранее вставить
Код: plaintext
1.
SELECT DealList.Comment, Len(Brackets(Nz([DealList].[Comment],""))) AS Expr1
FROM DealList;
, то все работает как надо.

Почему так???
Если уважаемые монстры ответят на этот вопрос, тогда может и другой задавать не потребуется.
...
Рейтинг: 0 / 0
22.09.2004, 19:38:22
    #32707499
vasiliy04
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
возможно нужно поставить в функции optional,
аргумент пустой поэтому ошибка
...
Рейтинг: 0 / 0
22.09.2004, 19:38:55
    #32707500
IgorM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
Потому что тип String не может принимать Null, если критично обрабатывать Null внутри функции, поменяй тип аргумента на Variant.
...
Рейтинг: 0 / 0
22.09.2004, 19:39:36
    #32707505
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
ошибка в объявлении типа входного параметра.

Код: plaintext
Public Function Brackets(Comment As String) As String
Миф не может преобразовать Null в String

напиши так
Public Function Brackets(Comment As Variant) As String

или так

Public Function Brackets(Comment As Variant) As String





(с выражением лица)
...
Рейтинг: 0 / 0
22.09.2004, 19:40:50
    #32707507
мфышдшн04
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
Public Function Brackets(Optional Comment As String) As String
...
Рейтинг: 0 / 0
22.09.2004, 19:56:14
    #32707525
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
Блин! Зараза! Скотина! Сволочь!...
медленно остываю
Дело в том, что в более длинном запросе ОНО работает!:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT DealList.PartStatus, DealTypeTerms.DealStageName,
 Status.StatusText, Status.StatusComment, DealTypeTerms.Item,
 DealList.PartStatus, Status.StatusID, DealList.Amount, Status.StatusText,
 DealList.Comment, DealList.DealID, DealList.PartTypeID, ([Item]> 1  Or 
(DealList.MaxOfStatus)= 7 ) AS Expr1, Status.StatusID, Deals.DealName, Brackets
([DealList.Comment]) AS BracketsComment, Companies.FullCompanyNameRus, Len
(Brackets([DealList.Comment])) AS LB

FROM (Companies RIGHT JOIN Filials ON Companies.CompanyID = Filials.CompanyID)
 RIGHT JOIN (Deals RIGHT JOIN (DealTypeTerms RIGHT JOIN (DealList LEFT JOIN
 Status ON DealList.MaxOfStatus = Status.StatusID) ON DealTypeTerms.DTTID = 
DealList.DTTID) ON Deals.DealID = DealList.DealID) ON Filials.FilialID = 
DealList.FilialID

WHERE (((DealList.DealID)=get_DealID()) AND ((DealList.PartTypeID)
=get_PartTypeID()) AND ((([Item]> 1  Or ([DealList].[MaxOfStatus])= 7 ))=True) AND
 ((([Item]> 1  Or Len([DealList].[Comment])> 0 ))=True) AND ((IsNull
([DealList.Amount]))=False))

ORDER BY DealTypeTerms.Item DESC , DealList.PartStatus, Status.StatusID DESC ,
 DealList.Amount DESC , Companies.FullCompanyNameRus;
Там где надо нули поле LB дает нули. НО!!! Полученный набор НЕ ФИЛЬТРУЕТСЯ ПО ЭТОМУ ПОЛЮ! Т.е. если я в отчете хочу фильтр LB>0 поставить, то он футболит меня пешком в эротический поход. Полдня бьюсь с отчетом, забросил излюбленный Shell, а тут такая засада!

Это все из серии "Иногда Аксесс умеет преобразовывать типы"???
PS А как в коде подкрасить текст?
...
Рейтинг: 0 / 0
22.09.2004, 20:16:05
    #32707548
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
Variant решил проблему, Optional чего-то сразу не сработал

Спасибки!
...
Рейтинг: 0 / 0
22.09.2004, 20:38:29
    #32707568
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
О пользе функции Nz в запросах
Пардон, что с опозданием. Optional - это не для того. Это чтобы аргумент вообще не указывать, а не чтобы передавать значение Null.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / О пользе функции Nz в запросах / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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