Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

Функции в IB. Их действительно так мало?   Найти похожие ветки 

 
sniknik   (2003-08-29 17:50) [0]

Пошол четвертый день моего изучения IB... полет нормальный... ;о))( http://delphimaster.net/view/3-1061978123/)
и вторая неприятность с которой сталкиваюсь.
нехватает функций! в обшем пытаюсь перевести простую вьюшку, на Access-е выглядит так (на MSSQL немного посложнее)

CREATE VIEW VCASHSAIL AS
SELECT KKMNUM AS CASHNUMBER, CHECKNUM AS CHECKNUMBE,ARTICUL AS CARDARTICU,
CDate(Int(DTEVENT)) AS SDATE, Hour(DTEVENT)*100+Minute (DTEVENT) AS STIME,
IIF(QUANTITY>=0,1,0) AS REPLACE, ABS(K.QUANTITY) AS QUANTITY,
ABS(CHECKSUM) AS TOTALRUB FROM KKMCHECKCONTENS K


не нашол аналогов Hour(), Minute(), IIF(), ABS(), да и вообще в хелпе никакого намека на список внутренних функций ... все указывает на то что нужно писать свои в UDF. Неужели правда?
не, написать не проблема, я уже попробовал, сделал функцию на сравнение дат, работает, с остальными тоже думаю проблем не возникнет, но не кажется ли это вам странным? ну тем кто долго с IB работал.
или я всетаки не нашол, тогда где искать? (почемуто кажется что "родные" должны быстрее работать)


 
Romkin   (2003-08-29 18:24) [1]

1. Вместо таких навороченных View пиши ХП, быстрее и читабельнее получится. Насчет функций - да, у IB напряги.
IB6? Тогда есть и ХП для работы со временем, на www.ibase.ru, без UDF

Насчет этой вьюхи у тебя получается что-то вроде


create procedure VCASHSAIL (param1 ..., param2 ...)
returns (CASHNUMBER integer, CHECKNUMBE integer, CARDARTICU varchar(20), SDATE date, STIME TIME, REPLACE integer, QUANTITY numeric(15,4), TOTALRUB numeric(18,2))
as
begin
for select KKMNUM, CHECKNUM, ARTICUL, DTEVENT, QUANTITY, CHECKSUM
from KKMCHECKCONTENS
where Field1 = :param1 and Field2 = :param2
into :CASHNUMBER, :CHECKNUMBE, :CARDARTICU, :DTEVENT, :QUANTITY, :TOTALRUB
do begin
REPLACE = 1;
if (QUANTITY < 0) then
begin
REPLACE = 0;
QUANTITY = -QUANTITY;
end
if (TOTALRUB < 0) then
TOTALRUB = -TOTALRUB;
/* ну а тут ставь распределение по дате и времени... ЗАвисит от диалекта, как и наличие TIME */
suspend;
end
end


 
Romkin   (2003-08-29 18:28) [2]

Впрочем, я зря входные параметры сделал :))) Если точно как View, то заголовок
create procedure VCASHSAIL
returns (CASHNUMBER integer, CHECKNUMBE integer, CARDARTICU varchar(20), SDATE date, STIME TIME, REPLACE integer, QUANTITY numeric(15,4), TOTALRUB numeric(18,2))

и WHERE нафиг убрать... тогда select ничем от selecta VIEW или таблицы не отличается :)


 
GRAND   (2003-08-29 18:49) [3]

Господа, почему напряг с функциями?
Есть EXTRACT (YEAR FROM DATE_FIELD), также есть EXTRACT (HOUR FROM TIME_FIELD)
Пользуйтесь на здоровье!
Лишь бы не говорили, что SQL лучше IB! :)))


 
Romkin   (2003-08-29 18:51) [4]

Это в IB6 есть? Я просто не помню :)
Ты имеешь в виду MSSQL? дык Firebird однозначно лучше :)))


 
sniknik   (2003-08-29 19:07) [5]

Romkin © (29.08.03 18:24) [1]
и процедуры какието нерусские. ;о)) не, не настолько как в Access, там этим словом совсем не процедуры называются, но всеже.

> /* ну а тут ставь распределение по дате и времени... ЗАвисит от диалекта, как и наличие TIME */
а распределение естественно через функции в UDF. понятно, но неприятно. ;о))
к слову диалект у меня 3-й, это оговорено. и даже захочу поменять не смогу. как кстати и вьюху на процедуру, я ее только создаю, пользуюсь не я, офис (смысл в том чтобы он не заметил разницы, и обращался как раньше хотя структура базы уже поменялась (а раньше это была таблица)), я только как посредник между ним и кассами.
ну да ладно это мои трудности.

спасибо. больше искать не буду. буду писать. (просто для меня после Pervasive, MSSQL, да даже Access(тут поменьше) это полное отсутствие функций немного(не то слово :о)) странно)

да еще, фраза
> тогда select ничем от selecta VIEW или таблицы не отличается :)
и по вызову тоже? т.е. можно будет писать не VCASHSAIL или EXEC VCASHSAIL а так SELECT * FROM VCASHSAIL WHERE ...?
mssql не позволяет, IB наверняка тоже, тогда это мне не пойдет.

GRAND © (29.08.03 18:49) [3]
точно работает, проверил
SELECT EXTRACT(YEAR FROM CAST("now" AS TIMESTAMP)) FROM SIZES
надо же, а мне и в голову не пришло, а ведь в Local SQL пользовался.
(часы минуты тоже работает)

еще раз спасибо.


 
sniknik   (2003-08-29 19:13) [6]

ха, да если бы даже пришло, нет EXTRACT-а в хелпе! смотрю в установленом с IB 6.5 SQL Reference Help и InterBase Help.

тем более, большое тебе программврайтерское спасибо. :о))


 
MsGuns   (2003-08-29 19:18) [7]

Есть в дельфишном Local SQL


 
GRAND   (2003-08-29 19:21) [8]

sniknik © (29.08.03 19:07) [5]:
Пожалуйста, рад, что пригодилось! :)

Romkin © (29.08.03 18:51) [4]:
Конечно, в IB6 это есть. Запусти и проверь, сработает.
Да, я имел в виду именно MS SQL. Согласен с тобой насчет FB. Но есть еще Yaffil, он еще покруче рулит.


 
Romkin   (2003-08-29 19:27) [9]

Это... Ставь FB1.0.3 - разницы точно никто не заметит, зато лицензий не нать... IB6.5 - только коммерческий есть. Насчет замены view на ХП - если входных параметров нет, никто никогда не заметит отличий :)
Как было в T...Query "select * from VCASHSAIL WHERE ..." так и останется :)) По правилам VCASHSAIL либо таблица, либо view, либо ХП без входных параметров
Ну разве что быстрее станет работать...

У меня view ни в одной базе нет, везде SP. ТУпая замена view на for select ... suspend катит в любом случае, и по крайней мере не замедляет. Плюс - по возможности входные параметры, чтобы where не писать, надо пихнуть внутрь ХП. Тогда вызов, ессно select * from VCASHSAIL(:param1, param2, ...). view, равно как и результат процедуры, не индексируется, а передав вызов в процедуру, подцепишь индексы в for select.

Правило для ХП простое, есть suspend внутри - можешь вызывать select * from ... То, что в returns - поля курсора будут, как во view. Нет - только через TStoredProc или execute procedure ...

А так - смотри стандартную библиотеку UDF, функций у IB действительно меньше, чем хотелось бы


 
Romkin   (2003-08-29 19:34) [10]

2GRAND У меня в наличии только IB5.6 & FB1.5 :)))
2sniknik РАспределение - если Extract идет, то сам сообразишь, как присвоение сделать :)))
SDATE = EXTRACT(DATE from DTEVENT); (я точно не помню, просто никогда не пользовался)


 
GRAND   (2003-08-29 19:42) [11]

Romkin © (29.08.03 19:34) [10]:
Будет желание Yaffil 835 понюхать - обращайся! :)
Лично мне все в нем нравится. Главное, весит-то всего 1,6М!


 
sniknik   (2003-08-29 21:10) [12]

MsGuns © (29.08.03 19:18) [7]
> Есть в дельфишном Local SQL
ну так. когда пользуешся Local SQL лезеш в справку по нему когда MSSQL то в BOL, ...., IB SQL Reference Help.
если делать по другому, и за справкой по Local SQL идти в BOL можно нарватся на неприятности и покрупнее. :о)) почти ничего работать не будет.

Romkin © (29.08.03 19:27) [9]
ну если вызов селектом из процедуры в IB возможен то тогда она даже предпочтительней, IIF(), ABS() таки нет а в процедуре "if" есть ,обходится, так можно совсем без UDF обойтись.

займусь в понедельник, а пока ыходные! ;о)) (пересаживаюсь на Linux)


 
Zacho   (2003-08-30 09:25) [13]


> sniknik © (29.08.03 21:10) [12]

Кстати, IIF есть в Yaffil, а в FB 1.5 есть CASE, COALESCE, NULLIF


 
Anatoly Podgoretsky   (2003-08-30 09:41) [14]

sniknik © (29.08.03 19:13) [6]
Это ошибка хелпа, может в 7 исправят.


 
VID   (2003-08-30 12:06) [15]

to sniknik : если ты всерьёз решил заниматься IB(and clones) то книга "МИР INTERBASE" как раз самое то. Must have как говорится. Заказать можешь на Books.ru
При прочтении отпадёт масса вопросов, вроде того, с какого началась эта ветка.


 
Romkin   (2003-08-30 13:06) [16]

Да, хорошая книга. Лучшей назвать не могу, потому что не с чем сравнивать %)
А купить ее лучше будет 6-7 сентября на книжной ярмарке.


 
sniknik   (2003-09-01 14:14) [17]

возвращаясь к напечатанному :о)

Zacho © (30.08.03 09:25) [13]
так то в Yaffil, и FB 1.5 а у меня IB 6.5 и менять ну никак нельзя, должен подстроится под то что есть. см. sniknik © (29.08.03 19:07) [5] если интересно почему.
а в нем(6,5) тестовый запрос
SELECT CASE ID WHEN 0 THEN "A" WHEN 1 THEN "B" WHEN 2 THEN "C" END FROM TABLE1
дает ошибку
EOleException : [Gemini InterBase ODBC Driver][INTERBASE]Dynamic SQL Error. SQL error code = -104. Token unknown - line 1, char 15. WHEN
почемуто на WHEN а не CASE может тоже синтаксис не тот а на самом деле есть, но в хелпе тоже его нет, есть "case, converting" (UPPER), все.

Anatoly Podgoretsky © (30.08.03 09:41) [14]
семерку уже скачал, поставлю завтра только ради хелпа (148мег), если не удастся так без установки развернуть(условие задачи под 6,5) и его выташить. надеюсь уже исправленый.

VID © (30.08.03 12:06) [15]
Romkin © (30.08.03 13:06) [16]
издеваетесь? ;о) мне к понедельнику уже сдавать (может не все но основные функции должны работать). а так конечно была бы книга/хелп нормальный и вопросов бы не было.

Romkin ©
кстати, с процедурой (+ EXTRACT от GRAND) все получилось, и UDF писать/распространять не придется.


 
Zacho   (2003-09-01 14:20) [18]


> sniknik © (01.09.03 14:14) [17]

Нету в 6.5 CASE.
Если без UDF все получилось - хорошо, но советую посмотреть на стандартную библиотеку UDF ib_udf.dll, в ней есть множество полезных функций, описание есть в Language Reference.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.011 c
1-71737
bon
2003-09-10 14:07
2003.09.22
вопрос


3-71505
Zheks
2003-09-01 11:12
2003.09.22
Поля соответствия


1-71637
Max_
2003-09-09 10:31
2003.09.22
Глобальная переменная и её уничтожение!


6-71792
laider
2003-07-22 17:08
2003.09.22
net send + delphi 4 + win 98 ???!!!


14-71825
jack128
2003-09-02 10:38
2003.09.22
Именинники 2 сентября





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский