Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 13 июн 2007, 13:15
есть UDF, получаю день недели из даты в виде строки
Исходник
Код: Выделить всё
function get_DayOfWeek(dt:PChar): integer; cdecl; export;
var
vdt:string;
old_format:string;
old_separator:Char;
begin
vdt:=string(dt);
old_separator:=DateSeparator;
old_format:=ShortDateFormat;
DateSeparator := '-';
ShortDateFormat := 'yyyy/mm/dd';
result:=DayOfWeek(StrTodate(vdt));
if result=1
then result:=7
else result:=result-1;
DateSeparator :=old_separator;
ShortDateFormat := old_format;
end;
Объявление
Код: Выделить всё
DECLARE EXTERNAL FUNCTION GET_DAYOFWEEK
CSTRING(12)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'get_DayOfWeek' MODULE_NAME 'All_my_udf'
И есть сильное подозрение, что валит она у меня FB SS 2.0.1.12810
функция используется в ХП и FB не всегда падает, но это угнетает
Может кто ткнет носом, где я накосячил, только не очень больно.
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 13 июн 2007, 14:07
На глаз сразу не вижу.
Отладчиком из дельфей не пробовал?
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 13 июн 2007, 14:15
WildSery писал(а):На глаз сразу не вижу.
Отладчиком из дельфей не пробовал?
пробовал, сначала в приложении гонял вроде все в норме, затем загнал в DLL
В Дельфях опция компиллера huge strings выставлена, так что преобразование
vdt:=string(dt); должно корректно отрабатывать
если память мне не изменяет, FB 1.5 не валился, затем базу на FB 2 перегнал и началось, может я какого ньюанса при переводе базы не учел?
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 13 июн 2007, 15:04
Скомпилил такую функцию у себя.
select get_dayofweek('2007-06-13') from rdb$database выполняет на ура.
Кстати, почему у тебя 12810, а не 12855?
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 13 июн 2007, 15:08
WildSery писал(а):
Скомпилил такую функцию у себя.
select get_dayofweek('2007-06-13') from rdb$database выполняет на ура.
а у меня вот сервак иногда падает
WildSery писал(а):
Кстати, почему у тебя 12810, а не 12855?
в отпуске был, ток седне закачал 12855
может плюнуть на свою UDF и попробовать в ХП родное?
Код: Выделить всё
...........
nday=extract (weekday from :vdate_call);
if (:nday=0) then nday=7;
.....
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 13 июн 2007, 16:16
Встроенная функция будет быстрее - нет накладных расходов на вызов UDF.
ХП я бы не писал. Там где нужно, такие вычисления и делал на месте. ХП тоже не бесплатно вызывается.
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 14 июн 2007, 07:04
WildSery писал(а):Встроенная функция будет быстрее - нет накладных расходов на вызов UDF.
ХП я бы не писал. Там где нужно, такие вычисления и делал на месте. ХП тоже не бесплатно вызывается.
без ХП никак, ибо определение дня недели - всего лишь малая часть процедуры
попробую пока выкинуть свою UDF, посмотрю, что получится
-
Dimitry Sibiryakov
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Сообщение
Dimitry Sibiryakov » 14 июн 2007, 07:55
Я бы все-таки убрал преобразование string(dt). Мало ли как оно работает внутри... У дельфийской строки есть данные по отрицательным смещениям и если эта конструкция просто присваивает указатель...
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 14 июн 2007, 09:16
Dimitry Sibiryakov писал(а):Я бы все-таки убрал преобразование string(dt). Мало ли как оно работает внутри... У дельфийской строки есть данные по отрицательным смещениям и если эта конструкция просто присваивает указатель...
ну в отладчике все в норме было, к тому же считал, что параметр компиллера huge strings указывает, что воспринимать string, как PChar или я не прав?
так, обнаружил еще, что на клиенте версия была 2.0.0.12748
без учета корявости UDF это может повалить FB?
Поменял клиентскую dll на родную, погонял, пока ничего не сыпется - посмотрим дальше
-
_so_
- Сообщения: 144
- Зарегистрирован: 04 ноя 2004, 22:17
Сообщение
_so_ » 15 июн 2007, 10:59
По идее может валить сервер строка:
result:=DayOfWeek(StrTodate(vdt));
Если в vdt сидит что-то хреновое и следовательно возникает Exception.
Я бы лучше использовал функцию TryStrToDate или StrToDateTimeDef.
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 15 июн 2007, 11:37
_so_ писал(а):По идее может валить сервер строка:
result:=DayOfWeek(StrTodate(vdt));
Если в vdt сидит что-то хреновое и следовательно возникает Exception.
Я бы лучше использовал функцию TryStrToDate или StrToDateTimeDef.
да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 15 июн 2007, 11:42
stix-s писал(а):да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
UDF пишется как раз для любых случаев, а не под конкретные данные. Ы?
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 15 июн 2007, 11:48
WildSery писал(а):stix-s писал(а):да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
UDF пишется как раз для любых случаев, а не под конкретные данные. Ы?
так-то оно так
но когда пишу под конкретную задачу, бывает, про это забываю
-
_so_
- Сообщения: 144
- Зарегистрирован: 04 ноя 2004, 22:17
Сообщение
_so_ » 15 июн 2007, 15:48
да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
Поправь и посмотри будут ли повторяться падения. Или для теста обложи все try except end и кидай в какой-нибудь лог текст Еxception
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
stix-s » 18 июн 2007, 08:40
_so_ писал(а):
да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
Поправь и посмотри будут ли повторяться падения. Или для теста обложи все try except end и кидай в какой-нибудь лог текст Еxception
после смены версии клиента падений пока не наблюдается, так что пока грешу на несовместимость клиента 2.0.0.12748 и сервера FB SS 2.0.1.12855(ибо уже обновил версию сервера, во время жизни топа)
Выжидаю - повалится, вновь за UDF возьмусь