Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RFpro.ru: СУБД и Delphi/Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Victor Pyrlik
Статус: Мастер-Эксперт
Рейтинг: 1028
∙ повысить рейтинг »
Тимошенко Дмитрий
Статус: Практикант
Рейтинг: 538
∙ повысить рейтинг »
Чичерин Вадим Викторович
Статус: Студент
Рейтинг: 357
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Базы данных / СУБД и Delphi/Lazarus

Номер выпуска:563
Дата выхода:30.01.2011, 14:00
Администратор рассылки:Gh0stik (Академик)
Подписчиков / экспертов:157 / 79
Вопросов / ответов:1 / 1

Вопрос № 182015: Здравствуйте! Прошу помощи в следующем вопросе: Пишу курсовую работу по теме Бронирование путевок. Создал 2 таблицы в Access


Вопрос № 182015:

Здравствуйте! Прошу помощи в следующем вопросе:
Пишу курсовую работу по теме Бронирование путевок. Создал 2 таблицы в Access


связаны между собой по полю zaezd


Сделал добавление, редактирование и удаление. Потом нужно было сделать отчет, который я начал делать в QReport.

Для этого делаю запрос с параметром

Код:

if findwindow.ShowModal=mrOK then begin
datamodule2.ADOQueryFind.Active:=False;
DataModule2.ADOQueryFind.Parameters.ParamByName('zaezdid').Value:=strtoint(findwindow.DBLookupComboBox1.KeyValue);
otchetzaezd.zaezdname.Caption:=findwindow.DBLookupComboBox1.Text;
datamodule2.ADOQueryFind.Active:=True;
otchetzaezd.QuickRep1.PreviewModal;


и сам запрос в TADOQuery
Код:

SELECT nameorg, countput, status, COUNT(nameorg) AS количество, SUM(countput) AS ВсегоПутевок
FROM main
WHERE zaezd=:zaezdID
GROUP BY nameorg, countput, status;


Проблема заключ ается в том что в результате запроса в поле COUNT(nameorg) AS количество всегда выходит 1, а в SUM(countput) AS ВсегоПутевок значение количества путевок последней строки.

Помогите сделать правильный запрос, чтобы вычисления были верными.

Отправлен: 25.01.2011, 13:34
Вопрос задал: DaImeR (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает LanK (Профессионал) :
Здравствуйте, DaImeR!

Когда Вы используете групповые операции (у Вас это операции суммирования и количества записей) Вы должны указать по какому признаку (для каких полей) это будет происходить.
Когда Вы указываете GROUP BY nameorg, countput, status - Вы получаете ответ на зарос - СКОЛЬКО записей с nameorg, countput, status?

т.е. переведя на русский - СКОЛЬКО записей с "ИП Васильев,2,Забрали"? Ответ - таких записей 1 [COUNT(nameorg)=1] и [SUM(countput) = countput т.е. 2].

Можно создать составной запрос:
Код:

SELECT nameorg, countput, status, COUNT(nameorg) AS количество, SUM(countput) AS ВсегоПутевок
FROM main
WHERE zaezd=:zaezdID
GROUP BY nameorg, countput, status
UNION
SELECT 1,1,1,COUNT(nameorg) AS количество, SUM(countput) AS ВсегоПутевок
FROM mainWHERE zaezd=:zaezdID;

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

Итог - для того чтобы Ваш проект заработал необходимо ДВА запроса - первый ADOQueryFind:
Код:

SELECT nameorg, countput, status
FROM main
WHERE zaezd=:zaezdID


Который выводит всех покупателей путевок в выбранный заезд (:zaezdID)

И второй:
В DataModule2 добавьте новый запрос ADOQuerySummary:
Код:

SELECT COUNT(nameorg) AS количество, SUM(countput) AS ВсегоПутевок
FROM main
WHERE zaezd=:zaezdID;


Далее в Вашем проекте полям:
QRDBText4 QRDBText5
установите DataSet:
DataModule2.ADOQuerySummary

В процедуре:
procedure TForm1.N21Click(Sender: TObject);
добавьте строчки:

Код:

datamodule2.ADOQuerySummary.Active:=False;
DataModule2.ADOQuerySummary.Parameters.ParamByNam e('zaezdid').Value:=strtoint(findwindow.DBLookupComboBox1.KeyValue);
datamodule2.ADOQuerySummary.Active:=True;


Впрочем, если Вы очень хотите всё таки всё сделать одним запросом... можно и так... правда обычно так не программируют...

Вместо Вашего запроса ADOQueryFind напишите такой запрос:
Код:

SELECT nameorg, countput, status, количество, ВсегоПутевок

from

(
SELECT nameorg, countput, status
FROM main
WHERE zaezd=:zaezdID
) as tt,

(
SELECT COUNT(nameorg) AS количество, SUM(countput) AS ВсегоПутевок
FROM main
WHERE zaezd=:zaezdID2
) as t2


Да и не забудьте активировать ВТОРОЙ параметр в процедуре:

procedure TForm1.N21Click(Sender: TObject );

DataModule2.ADOQueryFind.Parameters.ParamByName('zaezdid2').Value:=strtoint(findwindow.DBLookupComboBox1.KeyValue);

-----
Пусть все будет хорошо! Давайте жить дружно! :) И будет жить еще лучше!

Ответ отправил: LanK (Профессионал)
Ответ отправлен: 27.01.2011, 12:23
Номер ответа: 265624
Россия, Мурманская обл.

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265624 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное