![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
null+integer [D5, IB5.x]
Daiz13 © (2002-07-22 11:10:00)К одной из колонок выборки добавляеться результат другого SELECT. Проблема в том что если эта "другая" выборка возвращает null то в итоге получаем null, хотя TOTALENERGY и больше нуля.
SELECT M.DAYTIME, M.TOTALENERGY, CAST((SELECT sum(COUNTERA) FROM TCOR WHERE daytime<=M.DAYTIME ) AS INTEGER)+M.TOTALENERGY as cor
FROM measures M
Как к null прибавить integer и получить integer?
Val (2002-07-24 16:49:00) [1]не о том. просто на PL можно написать процедурки перегружаемые, т.е. имя у них одно и то же, а тип параметров разный, вызывай себе для любого типа, для которого реализовал. Но если в IB так не получится, придется давать разные имена, но это не проблема, я думаю, приделать префикс удобный и все.
IlyaA (2002-07-24 14:23:00) [2]Тогда в хранимых проц-х надо проверять не на >0 а на Null
Val (2002-07-24 10:42:00) [3]а если тип строка, к примеру?
IlyaA (2002-07-24 08:17:00) [4]У меня вчера возникла та-же проблема. Я создал процедуры, которые возвр. нужное значение, а если такой записи нет то 0; и вид с использованием ентих процедур.
Вот что у меня получилось:
CREATE PROCEDURE GET_SELL_CNT (
ITOVAR INTEGER
) RETURNS (
T_CNT INTEGER
) AS
BEGIN
Select cnt From Sell_Tovar Where Tovar_No = :iTovar into :T_Cnt;
if ( :T_Cnt > 0 ) then
Suspend;
else
begin
T_Cnt = 0;
Suspend;
end
END
CREATE PROCEDURE GET_SELL_WES (
ITOVAR INTEGER
) RETURNS (
T_WES FLOAT
) AS
BEGIN
Select Wes From Sell_Tovar Where Tovar_No = :iTovar into :T_Wes;
if ( :T_Wes > 0 ) then
Suspend;
else
begin
T_Wes = 0;
Suspend;
end
END
Это процедуры. Их вид почти одинаков.
CREATE VIEW OSTATKI (
ID,
PO,
PF,
ARTIKUL,
NAME,
PROBA,
TOV_SIZE,
TOVAR_GROUP,
IZGOTOV_NAME,
OST_WES,
OST_CNT,
EI_ID,
EI
) AS
Select Fakt_Tovar.ID as ID, Fakt_Tovar.Price_Otpusk as PO, Fakt_Tovar.Price_Free as PF,
A.Artikul as Artikul, A.Name as Name,
A.Proba as Proba, A.Tov_Size as Tov_Size,
TG.Name as Tovar_Group, I.Name as Izgotov_Name,
( Fakt_Tovar.Wes - (Select Sum(T_Wes) from Get_Sell_Wes( Fakt_Tovar.ID )) ) as Ost_Wes,
( Fakt_Tovar.Tovar_Count - (Select Sum(T_Cnt) from Get_Sell_Cnt( Fakt_Tovar.ID )) ) as Ost_Cnt,
EdI.ID as EI_ID, EdI.Name as EI
From Fakt_Tovar FT, Artikuls A, Tovar_Group TG, Izgotov I, Ed_Izmer EdI
Where ( FT.ARTIKUL_NO = A.ID ) and ( A.Group_No = TG.ID ) and ( A.Izgotov = I.ID ) and
( A.Ed_Izm = EdI.ID )
А это Вид, в котором используются данные процедуры. Вроде всё работает как надо.
Может что-то здесь лучше можно сделать? Заранее спасибо.
Ciklon (2002-07-23 22:20:00) [5]Можно воспользоваться библиотекой UDF rFunc.dll
В ней приличное количество полезных функций, в том числе имеется функция Z- для проверки входного параметра на NULL и выводе в этом случае значения "0", если входной параметр отличен от NULL, то он передается на выход без изменения.
Val (2002-07-22 14:28:00) [6]неплохо было бы, по-моему, написать функцию типа оракловской nvl, в которую передают два параметра, имя поля и значение. Она проверяет данное поле на null и в случае положительного результата, возвращает второй, переданный ей аргумент, т.е. заменяет null им.
Тогда все выглядело бы так:
SELECT M.DAYTIME, M.TOTALENERGY, CAST((SELECT sum(nvl(COUNTERA,0)) FROM TCOR WHERE daytime<=M.DAYTIME ) AS INTEGER)+M.TOTALENERGY as cor
FROM measures M
Lord Warlock (2002-07-22 14:16:00) [7]Операция преобразования в LocalSQL - CAST
kaif (2002-07-22 14:14:00) [8]Боюсь, придется хранимую процедуру писать с FOR SELECT... И перед каждым SUSPEND делать проверку
IF (SUM_COUNTERA IS NULL) и возвращать в этом случае TOTALENERGY.
По скорости не потеряешь.
oss (2002-07-22 13:13:00) [9]попробуй CONCAT
Val (2002-07-22 11:36:00) [10]операция с null дает null и это правильно. Для оперирования с числами нужно этот null преобразовывать в 0.