Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Присвоить полю возвращаемое агрегатной функцией, MS Access/ADO 
:(
    Опции темы
THuman
Дата 23.3.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.3.2007
Где: Диптаун

Репутация: нет
Всего: нет



Код

UPDATE TestArchive
SET UserID = 
    (SELECT COUNT(*)
         FROM Users);

Выдает ошибку.
Как мне присвоить некоторому полю значение возвращаемое агрегатной функцией некоторого 
подзапроса? 

http://forum.vingrad.ru/topic-121224.html#go_p
Там не нашел ответа.
PM ICQ   Вверх
DimW
Дата 26.3.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата(THuman @  23.3.2007,  21:47 Найти цитируемый пост)
Выдает ошибку.

а ошибка наверное о нарушении уникальности поля UserID?!...

так попробуй:

Код

UPDATE TestArchive
SET UserID = 
    (SELECT COUNT(*)
         FROM Users)
where UserID = 10;



Это сообщение отредактировал(а) DimW - 26.3.2007, 08:10
PM MAIL ICQ   Вверх
SergeBS
Дата 26.3.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



THuman, 
телепатирую:
Цитата

Обязательно указание:
1. Базы данных (Paradox, Oracle и т.п.)
2. Способа доступа (ADO, BDE и т.д.)

т.е. телепаты в отпуске. И что за зверь такой - обновляемый запрос? Дай НОРМАЛЬНУЮ формулировку, или пример.
Добавлю:
Цитата

UPDATE TestArchive
SET UserID = 
    (SELECT COUNT(*)
         FROM Users);

Такого духа код - пример КЛАССИЧЕСКОЙ ошибки получения уникального значения при многопользовательской работе. И дурной тон в любом случае.

PM MAIL   Вверх
THuman
Дата 26.3.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.3.2007
Где: Диптаун

Репутация: нет
Всего: нет



Цитата(SergeBS @  26.3.2007,  09:20 Найти цитируемый пост)
телепатирую:

Цитата(SergeBS @  26.3.2007,  09:20 Найти цитируемый пост)
т.е. телепаты в отпуске. 

А телепаты не нужны,достаточно просто глаз,чтоб посмотреть в заголовок темы. smile 
Цитата

Присвоить полю возвращаемое агрегатной функцией, MS Access/ADO

Цитата(DimW @  26.3.2007,  09:08 Найти цитируемый пост)
так попробуй:

Не катит.
Цитата(DimW @  26.3.2007,  09:08 Найти цитируемый пост)
а ошибка наверное о нарушении уникальности поля UserID?!...

Operation must use an updateable query.
Цитата(SergeBS @  26.3.2007,  09:20 Найти цитируемый пост)
И что за зверь такой - обновляемый запрос?

Я незнаю что это за ошибка,из-за чего возникает и как от нее избавиться,именно поэтому и обратился сюда.
Цитата(SergeBS @  26.3.2007,  09:20 Найти цитируемый пост)
Такого духа код - пример КЛАССИЧЕСКОЙ ошибки получения уникального значения при многопользовательской работе. И дурной тон в любом случае.

Уникальное значение не требуется.Это вторичный ключ,идентифицирующий номер пользователя,но уже в другой таблице.
Это был просто пример того,как я хочу использовать этот запрос.
А вот реальный запрос,который мне нужен:
Код
UPDATE TestArchive X

SET Score =
   (  (SELECT COUNT(*)
         FROM TestQuests
        WHERE (X.ID = TestQuests.TestArchiveID)AND(Correct = true) )  /
       
      (SELECT COUNT(*)
         FROM TestQuests
        WHERE (X.ID = TestQuests.TestArchiveID)) );

Он вычисляет отношение правильно отвеченных вопросов,к общему их числу для конкретного теста.
И далее полученный результат присваивает соответствующему полю записи.
В итоге получается табличка,где слева дата теста,а справа колонка показывающая процент верно отвеченных вопросов.


Это сообщение отредактировал(а) THuman - 26.3.2007, 10:08
PM ICQ   Вверх
SergeBS
Дата 26.3.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



THuman, 
Убил. Тему я действительно прохлопал. Пардон. 
1 вариант. Непосредственно в ADOQuery:
Код

ADOQuery.SQL.Clear
ADOQuery.SQL.add(' (SELECT COUNT(*)  FROM TestQuests' +
' WHERE (X.ID = TestQuests.TestArchiveID) AND (Correct = true) )  /  (SELECT COUNT(*) ' +
' FROM TestQuests  WHERE (X.ID = TestQuests.TestArchiveID)) );')
ADOQuery.Open;
x := ADOQuery.Fields[0].Value;

Но вначале я прокатал бы запрос в Access - мне не нравится деление результатов агрегирующих функций. Поскольку легко можно получить null или 0 и неопределенность 0/0. Я вычислял бы суммы по отдельности, записывал их, а процент - как вычисляемое поле получал.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.