Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.501 c
4-1104059945
pomashok
2004-12-26 14:19
2005.02.13
управление громкостью


1-1106988265
Hadroran
2005-01-29 11:44
2005.02.13
SYSDBA --> masterkey


3-1105515172
AlexTregubov
2005-01-12 10:32
2005.02.13
Как сделать запрос


9-1082472667
smb
2004-04-20 18:51
2005.02.13
скачайте, посмотрите.


1-1106743509
Eyfel
2005-01-26 15:45
2005.02.13
ECO + Delphi 2005