Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: 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 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.044 c
15-1158503223
DiX
2006-09-17 18:27
2006.10.15
Защита от вмешательства


1-1157281395
Проггер из библиотеки
2006-09-03 15:03
2006.10.15
Что-то вроде TMemo


15-1158938224
MAster_
2006-09-22 19:17
2006.10.15
Ребята как написать плагин на Total


3-1155893152
BronOS
2006-08-18 13:25
2006.10.15
Ошибка при конвертации типов данных


15-1158949396
vidiv
2006-09-22 22:23
2006.10.15
Как правильно делать свой Edit?





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