![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не работает такой запрос? [D6]
lexander © (2006-08-08 23:46:00)Подскажите! Использую ADO под Access
UPDATE t_stud
SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
GROUP BY t_plat.id_stud HAVING ((t_plat.id_stud)=28))
WHERE t_stud.id_stud = 28;
Дает ошибку "В операции должен использоваться обновляемый запрос"
Lexander (2006-08-13 15:04:00) [1]Спасибо, понял!
А что по поводу [20]и и[21]
sniknik (2006-08-13 13:39:00) [2]> в случае если нет полей он суммирует и возвращает не ноль (как ожидалось) а NULL.
null как раз более правильно ожидать... ноль это когда чтото есть и у него в подсчитиваемом поле значение/я = 0, а если поля/значения вообще нет то null. это логично, а вот 0 и когда сумма = 0 и значений нет тоже = 0 нелогично.
лучше смени ожидания..., ну или два раза выполняй подсчет в функции. хотя может там есть и другой способ, я тоже далеко не все там знаю (слишком много всего, и если это чтото мне не нужно, то специально учить не собираюсь).
lexander (2006-08-13 04:50:00) [3]Простите за назойливость: еще один вопрос к sniknik ©
Скажите а в запросах типа DSum('suma', 't_plat', 'id_stud='+CStr(id_stud))
можно использовать присвоения переменным ну что-то типа
IIf(a=DSum('suma', 't_plat', 'id_stud='+CStr(id_stud));a;0)
Получается что в случае если нет полей он суммирует и возвращает не ноль (как ожидалось) а NULL. Программно из Delphi я это конечно смогу обработать, а вот чтоб дальше в запросе - не получается. Можно конечно извратиться и поставить выражение DSum и на условие и на результат, т.е. если сумма есть то она же и возвращается если нет то ноль. Просто я подумал может там все проще - я ведь не знаю еще всех возможностей функций Access
За ранее Вам благодарен!!!
lexander (2006-08-13 03:37:00) [4]И сразу, пока вспомнил...
Если мне надо во время работы программы скопировать базу данных (сделать копию) - есть необходимость отключать ADOConnection
Это при том, что я не использую методы компонент для работы с БД, а все делаю через запросы (просто я так понял через методы БД не сразу обновляется)
lexander (2006-08-13 02:03:00) [5]sniknik ©
Подскажите еще... после апдейта через ADOCommand, как обновить DataSet, работающий с тойже таблицей что обновлялась. Я это делаю открывая и закрывая DataSet - при этом сбивается маркер - идет в начало. Почемуто refresh - результата не дает ни какого.
Может можно както правильнее обновлять?
(в данном случае информация отображается на Гриде)
А за функции, большое спасибо все пока работает на ура...!!!
sniknik (2006-08-13 01:22:00) [6]Anatoly Podgoretsky © (12.08.06 14:14) [18]
выслать? ;) у меня их в избытке, большая часть в общемто. но меня это как то не напрягает... на работе вроде бы, даже другие части по руски, но даже не думал принести обьеденить, чтобы больше руских хелпов было. что есть то и есть, и ладно. :-)
Anatoly Podgoretsky (2006-08-12 14:14:00) [7]sniknik © (11.08.06 20:52) [17]
Не обнаружил ни одного куска на английском языке.
sniknik (2006-08-11 20:52:00) [8]> А то хелп в Ассess на английском
поставь рускую/с другого диска версию мс оффиса, есть русский хелп, видел (может не все переведено но есть...) либо на мелкософте поищи, там тоже могут быть отдельно доки, и там они делятся по языкам при скачке.
lexander (2006-08-11 20:10:00) [9]Еще раз большое Вам спасибо!!!
Последнее, может у вас есть ссылка на какой-нибудь ресурс с описанием всех этих функций на русском! А то хелп в Ассess на английском, а он у меня на троечку...
sniknik (2006-08-11 01:40:00) [10]конечно к аксесс (вернее к jet, ядро, + бейсик который это ядро поддерживает... не весь правда), вообще сам по себе SQL довольно бедный язык (выучить за пару прочтений можно... была брошурка "чистый sql" в 12 -15 страниц все вложилось...), т.что любые более менее интересные "фишки" это признаки конкретного SQL сервера/движка, можно даже не сомневаться.
lexander (2006-08-10 23:21:00) [11]СПАСИБО!!! Вот этого мне и не хватало...
Я не знал про существование этих функций.
А их оказалось очень много :)
(А то меня тут заклевали совсем...)
Вопрос - эти функции используються в запросах только к Access или это стандартные функции SQL. Т.е. где искать информацию о них в литературе об Access или в литературе про SQL
sniknik (2006-08-10 20:56:00) [12]> Закрываю тему! ВСЕМ СПАСИБО ЗА УЧАСТИЕ!
зря... не все ее еще видели ;о).
для access действительно с подзапросов в апдейте не пройдет, и дело скорее всего не в реальном количестве возвращаемях записей, а в том что при апдейде строится обьеденение, а при обьеденении с подзапрсом результат получается необновляемый рекордсет... о чем и ошибка.
зато можно так
вместо ошибочного
> UPDATE t_stud
> SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
> GROUP BY t_plat.id_stud HAVING ((t_plat.id_stud)=28))
> WHERE t_stud.id_stud = 28;
для всего одной всего обновляемой записи
UPDATE t_stud
SET suma = DSum('suma', 't_plat', 'id_stud='+CStr(id_stud))
это для всех записей в таблице t_stud (при условии что и там есть поле id_stud, должно быть по идее но не показано...)
проверь, если не ошибся в деталях должно работать. переделать для одной... ну думаю не проблема.
lexander (2006-08-10 13:56:00) [13]> Большая. Если не видишь ее, то тебе в желтую прессу писульки писать, а не программы.
Я спорить не буду я в БД новичок... но то что результат они дают один и тот же это точно. И не надо так критично, я не очень пока знаю все возможности запросов, но с логикой у меня все в порядке. (мне в прессе сказали :) )
> Финансовые документы так не ведут. История платежей хранится пожизненно.
Поверь там такая ситуация, что хранить их в БД пожизненно с тем учетом что они будут налету пересчитываться - невозможно (по крайней мере не рационально)
____________________________________________________________
В общем ладно... объяснить Вам всю ситуацию - это отдельная тема - долго
(я чувствую еще немного - и мне придется идти в прессу - самоутверждаться)
Закрываю тему! ВСЕМ СПАСИБО ЗА УЧАСТИЕ!
evvcom (2006-08-10 13:09:00) [14]> [9] lexander (10.08.06 12:42)
> Результат подзапроса один и тот же... и ошибка таже
Чую, не там копаешь. А ты уверен, что приведенный тобою запрос вообще пытается выполняться? Запиши заведомо ошибочный (синтаксически) запрос вместо апдейта и посмотри, изменится ли код/текст ошибки?
Desdechado (2006-08-10 12:47:00) [15]> А какая разница между этим запрсом и тем что я приводил.
Большая. Если не видишь ее, то тебе в желтую прессу писульки писать, а не программы.
> Правда, не совсем понятно, зачем это нужно - проще на лету посчитать
Не только проще, но и правильней.
> далее данная сумма ипользуется в расчетах, которые тоже должны быть записаны в таблицу t_stud
И что?
> т.к. информация с таблицы t_plat будет удалена
Финансовые документы так не ведут. История платежей хранится пожизненно.
lexander (2006-08-10 12:42:00) [16]> А id_stud ты собираешься каждый раз ручками подставлять ?
Да как не крути, хоть ручками, хоть так как у Вас - ошибка одна и таже... (я так написал для простоты восприятия запроса)
> Правда, не совсем понятно, зачем это нужно - проще на лету посчитать
Просто далее данная сумма ипользуется в расчетах, которые тоже должны быть записаны в таблицу t_stud, т.к. информация с таблицы t_plat будет удалена
> Ну а [2] ты попробовал? Где результаты?
Конечно пробывал. А какая разница между этим запрсом и тем что я приводил. Результат подзапроса один и тот же... и ошибка таже
ANB (2006-08-10 10:15:00) [17]
> lexander (09.08.06 20:44) [5]
А id_stud ты собираешься каждый раз ручками подставлять ?
UPDATE t_stud
SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
where t_plat.id_stud=t_stud.id_stud)
Правда, не совсем понятно, зачем это нужно - проще на лету посчитать и показать.
evvcom (2006-08-10 08:48:00) [18]> [4] lexander (09.08.06 20:03)
> ну а что мне делать?
Ну а [2] ты попробовал? Где результаты?
Чукча не читатель, чукча писатель (с) не помню
Mike Kouzmine (2006-08-09 22:14:00) [19]Anatoly Podgoretsky © (09.08.06 19:30) [3] Select sum() вряд ли
вернет больше одной записи. Мне кажется.
lexander (2006-08-09 20:44:00) [20]в общем мне нужно найти сумму по столбцу одной таблицы и записать ее в ячейку в другой таблицы...
Подскажите как это можно сделать?