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

Вниз

Вернуть результат из вычисляемого поля запроса   Найти похожие ветки 

 
Shizuku ©   (2005-01-17 13:48) [0]

Не удаётся вернуть результат (значение поля sum_result) в переменную DELPHI из следующего запроса:

SELECT
 sum(ANSWER.MARK) AS sum_result
FROM
 RESULT
 INNER JOIN ANSWER ON (RESULT.REPLY_ID = ANSWER.REPLY_ID)
WHERE
 (RESULT.USER_ID = :USER_ID) AND
 (RESULT.CREATED = "NOW")


Запрос тестировался в EMS Interbase Manager - Query Builder, где прекрасно возращал требуемый результат.

Для возврата значения используется код:

if (vartype(dm.IBQuery6.FieldValues["SUM_RESULT"]) and
varTypeMask =varInteger) then
showmessage("Тест пройден. Сумма балов :"+string  <== Error %.%(dm.IBQuery6.FieldValues["sum_result"]))
else
showmessage("Тест пройден. Сумма балов : 0");
end;

Если убрать условие- обработчик, то ошибка:

Project PRIPO.exe raised exception class EVariantTypeCastError
with message "Could not convert variant of type (Null) into type (String)...."

В отладке:

(vartype(dm.IBQuery6.FieldValues["SUM_RESULT"]) and
varTypeMask =varInteger) = inacessible value

dm.IBQuery6.FieldValues["SUM_RESULT"]= null (врёт)

Испытывался и такой код:

showmessage("Тест пройден. Сумма балов :"+
dm.IBQuery6.FieldByName("sum_result").AsString)


Результат - пустая строка


 
Danilka ©   (2005-01-17 14:04) [1]


> dm.IBQuery6.FieldValues["SUM_RESULT"]= null (врёт)

Зачем?
я имею ввиду - зачем ему врать-то? :))


 
Danilka ©   (2005-01-17 14:06) [2]

приведи, плиз, текст процедуры, которая все это хозяйство делает.
заполняет параметры, выполняет запрос, и т.д.


 
Johnmen ©   (2005-01-17 14:20) [3]

if dm.IBQuery6.FieldByName("SUM_RESULT").IsNull then
...
else
showmessage("Тест пройден. Сумма балов :"+
dm.IBQuery6.FieldByName("sum_result").AsString)


 
Danilka ©   (2005-01-17 14:39) [4]

[3] Johnmen ©   (17.01.05 14:20)
Там нет нулла. Сказано-же - врет оно. :)


 
Shizuku ©   (2005-01-17 14:43) [5]

to Johnmen> на else не идёт. Но результат не может быть NULL, даже несмотря на то, что в запросе идёт сравнение с NOW. Записей мало, всё выполняется за время меньше секунды. Впрочем была попытка заменить NOW на обычную дату (прдварительно подсмотреную), результата тоже нет. А сам по себе запрос вернул всю сумму на дату.


 
Danilka ©   (2005-01-17 14:51) [6]

[5] Shizuku ©   (17.01.05 14:43)
Он тебе честно возвращаешь то, что ты просишь, ни больше не меньше. Если "на else не идёт", значит те условия, которые ты ему задал, всегда возвращают NULL. Поэтому я и написал тебе: [2] Danilka ©   (17.01.05 14:06)


 
Shizuku ©   (2005-01-17 14:55) [7]

Плисс добавьте мя в Аську
ICQ: 229798623

Чё то тут не так...


 
Shizuku ©   (2005-01-17 15:07) [8]

Полный текст процедуры
===========================
procedure TFTest.Button1Click(Sender: TObject);
begin
if not addResult then
 Exit;
if dm.IBQuery2.active then
dm.ibquery2.close;
dm.ibquery2.open;
if dm.IBQuery2.FieldByName("QUESTION").AsString ="" then
begin
dm.ibquery6.open;

dm.IBScript1.ExecuteScript;
dm.IBScript1.Script.Clear;

dm.IBQuery6.Params.ParamByName("user_id").AsString:=
dm.ibquery4.FieldValues["user_id"];

//if (vartype(dm.IBQuery6.FieldValues["SUM_RESULT"]) and
//varTypeMask =varInteger) then
//showmessage("Тест пройден. Сумма балов :"+string(dm.IBQuery6.FieldValues["sum_result"]))
if dm.IBQuery6.FieldByName("SUM_RESULT").IsNull then
showmessage("Тест пройден. Сумма балов : NULL. Поля базы не заполнены.")
else
showmessage("Тест пройден. Сумма балов :"+
dm.IBQuery6.FieldByName("sum_result").AsString)
//else
//showmessage("Тест пройден. Сумма балов : 0");
end;
end;


Query4
=====================
select * from student

No comment ^_^


 
Erik1 ©   (2005-01-17 15:07) [9]

А ты уверен, что это "(RESULT.CREATED = "NOW")" то что тебе надо? Ведь "NOW" это строка, да и USER_ID надо задавать.


 
Danilka ©   (2005-01-17 15:07) [10]

[7] Shizuku ©   (17.01.05 14:55)
Зачем аська, когда есть форум?


 
Danilka ©   (2005-01-17 15:16) [11]

1. у тебя сначала:
dm.ibquery6.open;

а затем:
dm.IBQuery6.Params.ParamByName("user_id").AsString:= dm.ibquery4.FieldValues["user_id"];

а надо наоборот.
и на счет NOW, как справедливо заметил [9] Erik1, нет под рукой фиребирда чтобы проверит:
2. он нормально ее понимает, как дату или как строку?
3. эта ф-я возвращает дату и время с точностью до секунд? если да, то не подойдет она тебе, я так думаю..


 
Shizuku ©   (2005-01-17 15:19) [12]

to Danilka> По форуму общение гораздо медленее - на то он и форум. У мя настолько узкий канал, что каждую страницу приходится ждать по пять минут, в лучшем случае.


 
Johnmen ©   (2005-01-17 15:22) [13]

> (RESULT.CREATED = "NOW")

Какого типа CREATED ?
(RESULT.CREATED = CAST("NOW" AS <тип CREATED>))
При этом
Если DATE в 1 диалекте, если TIMESTAMP в 3 диалекте, то такое сравнение всегда даст False.
И обрати внимание на "TODAY".


 
Shizuku ©   (2005-01-17 15:33) [14]

to Johnmen> у меня диалект 1
Где можно подробней про InterBase функции?
to Danilka> Спасибо огромное, работает. Облажалась мя позорно.


 
Johnmen ©   (2005-01-17 15:44) [15]

Shizuku ©   (17.01.05 15:33) [14]

Тогда, если в поле типа DATE только дата без времени (время 00:00:00, то сравнивать надо
(RESULT.CREATED = CAST("TODAY" AS DATE))
А если есть и время, то (только для FB):
EXTRACT(YEAR FROM RESULT.CREATED)=EXTRACT(YEAR FROM CAST("TODAY" AS DATE)) AND
EXTRACT(MONTH FROM RESULT.CREATED)=EXTRACT(MONTH FROM CAST("TODAY" AS DATE)) AND
EXTRACT(DAY FROM RESULT.CREATED)=EXTRACT(DAY FROM CAST("TODAY" AS DATE))

Если же IB, то манипулировать операциями <,>,<=,>=


 
Danilka ©   (2005-01-17 15:49) [16]

[15] Johnmen ©   (17.01.05 15:44)
TODAY - как я понимаю, это сегодня, с вырезаным временем?
тогда, может, проще что-то типа:
RESULT.CREATED BETWEEN CAST("TODAY" AS DATE) AND (CAST("TODAY" AS DATE)+1) ?

И индекс по полю CREATED будет участвовать.


 
Shizuku ©   (2005-01-17 16:03) [17]

Польз. тестируется, потом надо подсчитать и выдать ему результат. Вы видели как мя решила эту проблему: выборка по user_id и created, где Created - дата занесения очередной результирующей записи в базу. Я боюсь, что при достаточно большом объеме теста, на операции сохранения и пр. уйдёт больше 1 секунды, и тогда последующая выборка со сравнением по NOW вернёт неполную сумму. Были испробованы различные варианты с like и betweeen, но стопроцентного решения как-то в голову не приходит.


 
Johnmen ©   (2005-01-17 16:30) [18]

>Danilka ©   (17.01.05 15:49) [16]

Да, всё верно :)


 
msguns ©   (2005-01-17 16:42) [19]

Джонмэн абсолютно прав в [15]. Я сам, пока не начал "кастать" дату по кускам не мог добиться правильно выборки документов за период. Фарьберд


 
Johnmen ©   (2005-01-17 22:02) [20]

>Danilka ©  (17.01.05 15:49) [16]
>Johnmen ©  (17.01.05 16:30) [18]
>Да, всё верно :)

За исключением небольшого нюанса - правая граница не должна входить, т.е. надо

(CAST("TODAY" AS DATE) <= RESULT.CREATED )
AND
(RESULT.CREATED < CAST("TODAY" AS DATE)+1)


>msguns ©  (17.01.05 16:42) [19]

В принципе можно попытаться без "кусков"...:)


 
Danilka ©   (2005-01-18 14:14) [21]

[20] Johnmen ©   (17.01.05 22:02)
Угу, я про правую границу и не подумал.
Тяжело после ороклового TRUNC в других серверах с датами работать, прямо ломки.. :)


 
Danilka ©   (2005-01-18 14:15) [22]

Врочем, ничего кроме лени не мешает там сделать свой аналог TRUNC.. :)



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

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

Наверх





Память: 0.5 MB
Время: 0.036 c
14-1106577959
uny
2005-01-24 17:45
2005.02.13
Сайт о том что можно сделать своими руками


6-1101878414
BT
2004-12-01 08:20
2005.02.13
IdTCPClient


4-1103568134
WandR
2004-12-20 21:42
2005.02.13
Загрузчик ехе


1-1107091280
Baddelay
2005-01-30 16:21
2005.02.13
ListBox изменение выделенного итема


1-1106902447
Jay1982
2005-01-28 11:54
2005.02.13
Icon handle





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский