Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2009, 12:25   #1
sezam
 
Регистрация: 27.06.2008
Сообщений: 5
Печаль Свой генератор отчёта (Delphi 7)

Столкнулся с проблемой. Есть база на Access с несколькими таблицами. Попросили сделать вывод данных в Excel.

Сам запрос сделал динамическим, для выбора пользователем нужных данных:

Код:
with ADOCalculation do
    begin
      Active:=false;
      SQL.Clear;

SELECT DISTINCT Кафедра.Кафедра_сокр, Бюджет.Бюджет, Дисциплина.Дисциплина_сокр, Преподаватель.ФИО, Семестр.Семестр, Специальность.Специальность, Группа.Группа, Форма.Форма, Расчет.Штат, Расчет.Лекции, Расчет.Семинары, Расчет.Пр_Зан, Расчет.Конс_тек, Расчет.Конс_п_экз, Расчет.Прием_экз, Расчет.Прием_зач, Расчет.ВРК, Расчет.Пр_раб, Расчет.Реценз_реф, Расчет.Рук_конс, Расчет.Рук_дипл, Расчет.Рец_дипл, Расчет.ГАК, Расчет.Рук_практ, Расчет.Рук_кафедрой, Лекции+Семинары+Пр_Зан+Конс_тек+Конс_п_экз+Прием_экз+Прием_зач+ВРК+Пр_раб+Реценз_реф+Рук_конс+Рук_дипл+Рец_дипл+ГАК+Рук_практ+Рук_кафедрой AS Итог
FROM ((((((((Кафедра INNER JOIN Преподаватель ON Кафедра.id=Преподаватель.Кафедра_id) INNER JOIN Семестр ON Преподаватель.Семестр_id=Семестр.id) INNER JOIN Бюджет ON Преподаватель.Бюджет_id=Бюджет.id) INNER JOIN Период ON Семестр.Семестр=Период.Семестр_id) INNER JOIN Дисциплина ON Преподаватель.Дисциплина_id=Дисциплина.id) INNER JOIN Группа ON Преподаватель.Группа_id=Группа.id) INNER JOIN Специальность ON Группа.Специальность_id=Специальность.id) INNER JOIN Форма ON Преподаватель.Форма_id=Форма.id) INNER JOIN Расчет ON Преподаватель.id=Расчет.Преподаватель_id


        SQL.Add('WHERE Кафедра_сокр = '+#39+kaf+#39+' ')


      if ComboBox2.Text <> 'все' then
        SQL.Add('and ФИО = '+#39+ComboBox2.Text+#39+' ')
      else
        SQL.Add('and ФИО <> '+#39+#39+' ');

      if ComboBox3.Text <> 'все' then
        SQL.Add('and Семестр = '+ComboBox3.Text+' ')
      else
        SQL.Add(' ');

      if ComboBox4.Text <> 'все' then
        SQL.Add('and Период = '+#39+ComboBox4.Text+#39+' ')
      else
        SQL.Add(' ');

      if ComboBox5.Text <> 'все' then
        SQL.Add('and Бюджет = '+#39+ComboBox5.Text+#39+' ')
      else
        SQL.Add(' ');


ORDER BY Семестр, Бюджет, ФИО, Группа;

      Active:=true;

    end;
Следом провожу выгрузку в Excel. Для упрощения опустил некоторые параметры (в основном сам вывод):

Код:
sm := 0;
budg := 0;
while not ADOCalculation.Eof do begin
  if ADOCalculation.FieldByName('Семестр').AsInteger <> sm then begin

    //Вывод семестра

    sm := ADOCalculation.FieldByName('Семестр').AsInteger;
    budg := 0;
  end;
  if ADOCalculation.FieldByName('Бюджет').AsInteger <> budg then begin

    //Вывод бюджета

    budg := ADOCalculation.FieldByName('Бюджет').AsInteger;
  end;

  //Вывод ФИО

  ADOCalculation.Next;
end;
Всё работает прекрасно, и выводит такую таблицу:

Семестр
---Бюджет
------ФИО
---Бюджет
------ФИО
Семестр
---Бюджет
...

Но возникла проблема.
Как внедрить в эту структуру вывод итоговой строки по бюджету?
Нужно, чтобы получилась такая таблица:

Семестр
---Бюджет
------ФИО
---Итог по бюджету
---Бюджет
------ФИО
---Итог по бюджету
Семестр
---Бюджет
...

Пробовал сам побороть эту проблему, но неполучается ... помогите, плиз.
Использование стандартных отчётов, типа FastReport и QuicReport не предлагать!
sezam вне форума Ответить с цитированием
Старый 14.08.2009, 13:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

я бы в двух циклах выводил:
Код:
 while не конец
    while код бюджета=переменной
      выводим и суммируем
    выводим сумму
    переменная=код бюджета
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2009, 14:30   #3
sezam
 
Регистрация: 27.06.2008
Сообщений: 5
По умолчанию

Можете написать поподробнее?
sezam вне форума Ответить с цитированием
Старый 14.08.2009, 14:34   #4
sezam
 
Регистрация: 27.06.2008
Сообщений: 5
По умолчанию

Для суммирования, используется SQL-запрос:

Код:
with ADOQItog do
              begin
                Active:=false;
                SQL.Clear;
                SQL.Add('SELECT SUM(Лекции), SUM(Семинары), SUM(Пр_Зан), SUM(Конс_тек), SUM(Конс_п_экз), SUM(Прием_экз), ');
                SQL.Add('SUM(Прием_зач), SUM(ВРК), SUM(Пр_раб), SUM(Реценз_реф), SUM(Рук_конс), SUM(Рук_дипл), SUM(Рец_дипл), SUM(ГАК), SUM(Рук_практ), ');
                SQL.Add('SUM(Рук_кафедрой), SUM(Лекции+Семинары+Пр_Зан+Конс_тек+Конс_п_экз+Прием_экз+Прием_зач+ВРК+Пр_раб+Реценз_реф+');
                SQL.Add('Рук_конс+Рук_дипл+Рец_дипл+ГАК+Рук_практ+Рук_кафедрой)');
                SQL.Add('FROM (((((((Расчет INNER JOIN Преподаватель ON Расчет.Преподаватель_id=Преподаватель.id)');
                SQL.Add('INNER JOIN Группа ON Преподаватель.Группа_id=Группа.id) INNER JOIN Форма ON Группа.Форма_id=Форма.id)');
                SQL.Add('INNER JOIN Специальность ON Группа.Специальность_id=Специальность.id)');
                SQL.Add('INNER JOIN Семестр ON Преподаватель.Семестр_id=Семестр.id)');
                SQL.Add('INNER JOIN Дисциплина ON Преподаватель.Дисциплина_id=Дисциплина.id)');
                SQL.Add('INNER JOIN Кафедра ON Преподаватель.Кафедра_id=Кафедра.id)');
                SQL.Add('INNER JOIN Бюджет ON Группа.Бюджет_id=Бюджет.id');
                if ComboBox2.Text = 'все' then
                  SQL.Add('WHERE Кафедра_полн = '+#39+kaf+#39+' and Семестр = '+IntToStr(m)+' and Бюджет = '+#39+_l+#39+';')
                else
                  SQL.Add('WHERE Кафедра_полн = '+#39+kaf+#39+' and Семестр = '+IntToStr(m)+' and Бюджет = '+#39+_l+#39+' and ФИО = '+#39+ComboBox2.Text+#39+';');
                Active:=true;
              end;
Затем выводится полученная строка с итогом.
sezam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерация отчёта по таблице в БД (RaveDesigner) POPOV БД в Delphi 6 12.12.2007 10:56
Вывод отчёта в Word sphinx Microsoft Office Word 1 22.10.2007 13:19
Свой тип данных в Delphi - сверх длинные числа - хранение в переменных размером до 1 MB KLaiM Общие вопросы Delphi 9 16.06.2007 09:13
Свой генератор случайных чисел max4d Помощь студентам 15 03.04.2007 18:27