Вниз
Скачать: CL | DM;

Почему не работает такой запрос?   Найти похожие ветки 

← →
lexander   (2006-08-08 23:46) [0]

Подскажите! Использую 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;

Дает ошибку "В операции должен использоваться обновляемый запрос"


← →
Johnmen ©   (2006-08-09 00:43) [1]

К какому селу здесь группировка???


← →
ANB ©   (2006-08-09 09:52) [2]

UPDATE t_stud
SET t_stud.suma = (SELECT Sum(t_plat.suma) FROM t_plat
where t_plat.id_stud=28)
WHERE t_stud.id_stud = 28;

В оракле такая конструкция прокатывает :)


← →
Anatoly Podgoretsky ©   (2006-08-09 19:30) [3]

Johnmen ©   (09.08.06 00:43) [1]
Не только груп но и Having
И что прикажете делать если select вернет больше одной записи? В соседнии записывать?


← →
lexander   (2006-08-09 20:03) [4]

ну а что мне делать?

есть таблица студентов
есть таблица платежей студентов

связь один-ко-многим

нужно в конце года найти сумму всех платежей каждого студента и в таблицу со студентами каждому записать эту сумму минус стоимость за год, т.е. найти переплату или долг

вложенный запрос полюбому должен был возвращать одну запись, там отбор по id студента шел


← →
lexander   (2006-08-09 20:44) [5]

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

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


← →
Mike Kouzmine ©   (2006-08-09 22:14) [6]

Anatoly Podgoretsky ©   (09.08.06 19:30) [3] Select sum() вряд ли
вернет больше одной записи. Мне кажется.


← →
evvcom ©   (2006-08-10 08:48) [7]

> [4] lexander   (09.08.06 20:03)
> ну а что мне делать?

Ну а [2] ты попробовал? Где результаты?
Чукча не читатель, чукча писатель (с) не помню


← →
ANB ©   (2006-08-10 10:15) [8]


> 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)

Правда, не совсем понятно, зачем это нужно - проще на лету посчитать и показать.


← →
lexander   (2006-08-10 12:42) [9]

> А id_stud  ты собираешься каждый раз ручками подставлять ?

Да как не крути, хоть ручками, хоть так как у Вас - ошибка одна и таже... (я так написал для простоты восприятия запроса)

> Правда, не совсем понятно, зачем это нужно - проще на лету посчитать

Просто далее данная сумма ипользуется в расчетах, которые тоже должны быть записаны в таблицу t_stud, т.к. информация с таблицы t_plat будет удалена

> Ну а [2] ты попробовал? Где результаты?
Конечно пробывал. А какая разница между этим запрсом и тем что я приводил. Результат подзапроса один и тот же... и ошибка таже


← →
Desdechado ©   (2006-08-10 12:47) [10]

> А какая разница между этим запрсом и тем что я приводил.
Большая. Если не видишь ее, то тебе в желтую прессу писульки писать, а не программы.

> Правда, не совсем понятно, зачем это нужно - проще на лету посчитать
Не только проще, но и правильней.

> далее данная сумма ипользуется в расчетах, которые тоже должны быть записаны в таблицу t_stud
И что?

> т.к. информация с таблицы t_plat будет удалена
Финансовые документы так не ведут. История платежей хранится пожизненно.


← →
evvcom ©   (2006-08-10 13:09) [11]

> [9] lexander   (10.08.06 12:42)
> Результат подзапроса один и тот же... и ошибка таже

Чую, не там копаешь. А ты уверен, что приведенный тобою запрос вообще пытается выполняться? Запиши заведомо ошибочный (синтаксически) запрос вместо апдейта и посмотри, изменится ли код/текст ошибки?


← →
lexander   (2006-08-10 13:56) [12]

> Большая. Если не видишь ее, то тебе в желтую прессу писульки писать, а не программы.

Я спорить не буду я в БД новичок... но то что результат они дают один и тот же это точно. И не надо так критично, я не очень пока знаю все возможности  запросов, но с логикой у меня все в порядке. (мне в прессе сказали :) )

> Финансовые документы так не ведут. История платежей хранится пожизненно.

Поверь там такая ситуация, что хранить их в БД пожизненно с тем учетом что они будут налету пересчитываться - невозможно (по крайней мере не рационально)

____________________________________________________________
В общем ладно... объяснить Вам всю ситуацию - это отдельная тема - долго
(я чувствую еще немного - и мне придется идти в прессу - самоутверждаться)

Закрываю тему! ВСЕМ СПАСИБО ЗА УЧАСТИЕ!


← →
sniknik ©   (2006-08-10 20:56) [13]

> Закрываю тему! ВСЕМ СПАСИБО ЗА УЧАСТИЕ!
зря... не все ее еще видели ;о).

для 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 23:21) [14]

СПАСИБО!!! Вот этого мне и не хватало...
Я не знал про существование этих функций.
А их оказалось очень много :)

(А то меня тут заклевали совсем...)

Вопрос - эти функции используються в запросах только к Access или это стандартные функции SQL. Т.е. где искать информацию о них в литературе об Access или в литературе про SQL


← →
sniknik ©   (2006-08-11 01:40) [15]

конечно к аксесс (вернее к jet, ядро, + бейсик который это ядро поддерживает... не весь правда), вообще сам по себе SQL довольно бедный язык (выучить за пару прочтений можно... была брошурка "чистый sql" в 12 -15 страниц все вложилось...), т.что любые более менее интересные "фишки" это признаки конкретного SQL сервера/движка, можно даже не сомневаться.


← →
lexander   (2006-08-11 20:10) [16]

Еще раз большое Вам спасибо!!!

Последнее, может у вас есть ссылка на какой-нибудь ресурс с описанием всех этих функций на русском! А то хелп в Ассess на английском, а он у меня на троечку...


← →
sniknik ©   (2006-08-11 20:52) [17]

> А то хелп в Ассess на английском
поставь рускую/с другого диска версию мс оффиса, есть русский хелп, видел (может не все переведено но есть...) либо на мелкософте поищи, там тоже могут быть отдельно доки, и там они делятся по языкам при скачке.


← →
Anatoly Podgoretsky ©   (2006-08-12 14:14) [18]

sniknik ©   (11.08.06 20:52) [17]
Не обнаружил ни одного куска на английском языке.


← →
sniknik ©   (2006-08-13 01:22) [19]

Anatoly Podgoretsky ©   (12.08.06 14:14) [18]
выслать? ;) у меня их в избытке, большая часть в общемто. но меня это как то не напрягает... на работе вроде бы, даже другие части по руски, но даже не думал принести обьеденить, чтобы больше руских хелпов было. что есть то и есть, и ладно.  :-)


← →
lexander   (2006-08-13 02:03) [20]

sniknik ©

Подскажите еще... после апдейта через ADOCommand, как обновить DataSet, работающий с тойже таблицей что обновлялась. Я это делаю открывая и закрывая DataSet - при этом сбивается маркер - идет в начало. Почемуто refresh - результата не дает ни какого.

Может можно както правильнее обновлять?

(в данном случае информация отображается на Гриде)

А за функции, большое спасибо все пока работает на ура...!!!


← →
lexander   (2006-08-13 03:37) [21]

И сразу, пока вспомнил...

Если мне надо во время работы программы скопировать базу данных (сделать копию) - есть необходимость отключать ADOConnection

Это при том, что я не использую методы компонент для работы с БД, а все делаю через запросы (просто я так понял через методы БД не сразу обновляется)


← →
lexander   (2006-08-13 04:50) [22]

Простите за назойливость: еще один вопрос к 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

За ранее Вам благодарен!!!


← →
sniknik ©   (2006-08-13 13:39) [23]

> в случае если нет полей он суммирует и возвращает не ноль (как ожидалось) а NULL.
null как раз более правильно ожидать... ноль это когда чтото есть и у него в подсчитиваемом поле значение/я = 0, а если поля/значения вообще нет то null. это логично, а вот 0 и когда сумма = 0 и значений нет тоже = 0 нелогично.
лучше смени ожидания..., ну или два раза выполняй подсчет в функции. хотя может там есть и другой способ, я тоже далеко не все там знаю (слишком много всего, и если это чтото мне не нужно, то специально учить не собираюсь).


← →
Lexander   (2006-08-13 15:04) [24]

Спасибо, понял!
А что по поводу [20]и и[21]



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

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.03 c
2-1159340524
Alex_C
2006-09-27 11:02
2006.10.15
Пытаюсь рисовать на канве RichEdit. Не получается.


4-1148624062
Antonyan
2006-05-26 10:14
2006.10.15
Политика безопасности XP SP2


2-1159249362
Dr. Genius
2006-09-26 09:42
2006.10.15
OnClick для Edit’а, если Enabled := False


2-1159272126
flaxe
2006-09-26 16:02
2006.10.15
Комбинации символов


15-1156970785
Джо
2006-08-31 00:46
2006.10.15
Kiyiv Mastak Party




   Наверх