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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2018, 00:27   #1
Gul'ka
Пользователь
 
Аватар для Gul'ka
 
Регистрация: 11.02.2011
Сообщений: 69
Восклицание Вывод отчета в Excel

Добрый день, имеется такая проблема. Мне нужно вывести отчет, который показан на рисунке.
Подробнее: имеются платные кружки. Необходимо вывести информацию по всем кружкам (выделено красным) - с этим проблем нет. Выводится хорошо.
Но нужно еще сделать вывод по каждому учителю (выделено синим). - вот с этим проблема, поскольку таких отчетов еще не делала. И если честно даже не знаю как выводить, чтобы отдельно по каждому учителю делился такой отчет.
Изображения
Тип файла: png пример.png (23.3 Кб, 243 просмотров)
Gul'ka вне форума Ответить с цитированием
Старый 01.03.2018, 09:34   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Это вопрос для телепатов?

Что у Вас есть, что сделано, что не получается?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.03.2018, 10:41   #3
Gul'ka
Пользователь
 
Аватар для Gul'ka
 
Регистрация: 11.02.2011
Сообщений: 69
По умолчанию

Первую часть, я сделала. Выводит хорошо. Код прикладываю. Я не знаю как сделать вторую часть.

Код:
var
i, a: integer;
dir: string;
begin
  a := 4;
  Excel := CreateOleObject('Excel.Application');
  GetDir(0, dir);
  chdir (dir);
  dir := dir + '\Документы\Общий отчет_кружки.xltx';
  WorkBook := Excel.WorkBooks.Open(dir);
  Sheet := WorkBook.Sheets[1];
  Excel.Visible:=True;
  with DataModule4.ADOTable3 do begin
    Last;
    First;
    for i:= 1 to RecordCount do begin
          Sheet.Cells[a,1] := FieldByName('Наименование').AsString;
          Sheet.Cells[a,2] := FieldByName('Количество_часов').AsString;
          Sheet.Cells[a,3] := FieldByName('Количество_учеников').AsString;
          Sheet.Cells[a,4] := FieldByName('Цена_за_кружок').AsString;
          a := a + 1;
      Next;
    end;
  end;
end;
Gul'ka вне форума Ответить с цитированием
Старый 01.03.2018, 10:50   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

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

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


Цитата:
Сообщение от Gul'ka Посмотреть сообщение
Код:
with DataModule4.ADOTable3 do begin
    Last;
    First;
а зачем Last перед First ?! без него не работает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.03.2018, 10:58   #5
Gul'ka
Пользователь
 
Аватар для Gul'ka
 
Регистрация: 11.02.2011
Сообщений: 69
По умолчанию

Да, извиняюсь, забыла приложить.

Таблица кружки: Наименование, Количество часов, Количество учеников, Цена за кружок, Код учителя.

Таблица Учителя: Код учителя, ФИО, профиль, кабинет.
Gul'ka вне форума Ответить с цитированием
Старый 01.03.2018, 14:27   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, очень примерно решение может выглядеть так:

Код:
var
  i, a: integer;
  dir: string;
  cod_teacher : string;
begin
  a := 4;
  Excel := CreateOleObject('Excel.Application');
  GetDir(0, dir);
  chdir (dir);
  dir := dir + '\Документы\Общий отчет_кружки.xltx';
  WorkBook := Excel.WorkBooks.Open(dir);
  Sheet := WorkBook.Sheets[1];
  Excel.Visible:=True;
  with DataModule4.ADOTable3 do begin
    Last;
    First;
    for i:= 1 to RecordCount do begin
          Sheet.Cells[a,1] := FieldByName('Наименование').AsString;
          Sheet.Cells[a,2] := FieldByName('Количество_часов').AsString;
          Sheet.Cells[a,3] := FieldByName('Количество_учеников').AsString;
          Sheet.Cells[a,4] := FieldByName('Цена_за_кружок').AsString;
          a := a + 1;
      Next;      
    end;
  end;

  with DataModule4.ADOQueryTeachersRep1 do begin
    Close;
    SQL.Text := 'select A.*, B.FIO from Кружки A '+
        ' inner join Учителя B on A.Код_учителя = B.Код_учителя '+
        ' order by A.Код_учителя, A.Наименование';
    Open;    
    cod_teacher :=  '-------';
    while Not ADOQueryTeachersRep1.Eof() do begin
          if cod_teacher<>FieldByName('Код_учителя').AsString then begin
             Sheet.Cells[a,1] := 'Учитель: '+FieldByName('ФИО').AsString;
             cod_teacher := FieldByName('Код_учителя').AsString;
             Inc(a);
          end;
          Sheet.Cells[a,1] := FieldByName('Наименование').AsString;
          Sheet.Cells[a,2] := FieldByName('Количество_часов').AsString;
          Sheet.Cells[a,3] := FieldByName('Количество_учеников').AsString;
          Sheet.Cells[a,4] := FieldByName('Цена_за_кружок').AsString;
          Inc(a);
          Next;      
    end;
  end;  

end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.03.2018, 20:57   #7
Gul'ka
Пользователь
 
Аватар для Gul'ka
 
Регистрация: 11.02.2011
Сообщений: 69
По умолчанию

Спасибо Вам огромное.

И извините, не могли бы вы пояснить, что означает данная строчка
Код:
cod_teacher :=  '-------';
Gul'ka вне форума Ответить с цитированием
Старый 01.03.2018, 21:03   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Начальное значение, которое заведомо не равно ни какому коду учителя в таблице
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.03.2018, 23:42   #9
Gul'ka
Пользователь
 
Аватар для Gul'ka
 
Регистрация: 11.02.2011
Сообщений: 69
По умолчанию

Огромное Вам спасибо за помощь.
Можно еще вопрос, не совсем по теме?
У меня есть отчет, вывод аналогичный с тем, что я присылала. Только еще выводится после отчета итоговое значение: Итого; Всего количество часов и т.п.
Как можно реализовать так, чтобы только строку Итого сделать жирным шрифтом. После вывода данных таблицы написала такой код, он все хорошо считает (сумма рассчитывается вверху кода), выводит хорошо, но нужно Итого жирным шрифтом. Но не могу данную строку сделать жирной. Пыталась, так у меня получалось все после 3 строки - жирным шрифтом.
Код:
         
          a := a + 1;
      Next;         
          Sheet.Cells[a,1] := 'Итого';
          Sheet.Cells[a,2] := sum1;
          Sheet.Cells[a,3] := sum2;
          Sheet.Cells[a,4] := sum3;
          a := a + 1;
Еще раз большое спасибо за помощь, и приношу свои извинения за беспокойство.
Gul'ka вне форума Ответить с цитированием
Старый 12.03.2018, 23:55   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Gul'ka Посмотреть сообщение
Как можно реализовать так, чтобы только строку Итого сделать жирным шрифтом.
посмотрите в FAQ - Работа с EXCEL

в вашем случае это что-то вроде такого:
Код:
 Sheet.Rows[a].Font.Bold := True;
 Sheet.Cells[a,1] := 'Итого';
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод отчета(скриншота формы) в Word (Delphi) tito tarantula Помощь студентам 4 31.01.2015 23:57
Вывод отчета в Excel Настя Белова Microsoft Office Excel 20 24.04.2014 10:09
Вывод отчета в Эксель Azrael2155 БД в Delphi 6 20.11.2013 17:05
вывод всех возможных значений в примечании отчета Natasha63 Microsoft Office Access 1 16.12.2012 17:23
Вывод отчета в Word. Bulder Марат05 C++ Builder 9 16.05.2012 14:38