Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не работает такой запрос? [D6]


Страницы:   1 2

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]

в общем мне нужно найти сумму по столбцу одной таблицы и записать ее в ячейку в другой таблицы...

Подскажите как это можно сделать?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо