Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.11.2018, 13:55
YaMamina YaMamina вне форума
Прохожий
 
Регистрация: 15.11.2018
Сообщения: 1
Версия Delphi: delphi 2007
Репутация: 10
По умолчанию Отчет в excel

Доброго дня! очень надеюсь на Вашу помощь!, надо в excel сформировать отчет такого плана:
наименование тех. процесса
Материал| Наим. мат.| Марка| .........
Здесь таблица материалов по тех. процессу
Итого:
(пропуск 2 строки)
наименование тех. процесса
Материал| Наим. мат.| Марка| .........
Здесь таблица материалов по тех. процессу
Итого:
(пропуск 2 строки)
и так далее для каждого тех. процесса свой набор материалов.
для одного тех. процесса сделала отчет, а для всего набора - не получается...
Код:
index:=4;
   FData:=VarArrayCreate([1,PechatUdNormForm.ADOQuery1.RecordCount+2,1,PechatUdNormForm.ADOQuery1.Fields.Count],varVariant);
   for i := 0 to PechatUdNormForm.TehProcessComboBox.items.count-1 do begin
  // Заполняем массив
   PechatUdNormForm.ADOQuery1.First;
   k:=1;
   while not PechatUdNormForm.ADOQuery1.Eof do
    begin
       for j:=1 to PechatUdNormForm.ADOQuery1.Fields.Count do begin
       FData[k,j]:=PechatUdNormForm.ADOQuery1.Fields[j-1].Value;
       end;
       k:=k+1;
      PechatUdNormForm.ADOQuery1.Next;
     Excl.Range[Excl.ActiveSheet.Cells[index, 1], Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+3, PechatUdNormForm.ADOQuery1.Fields.Count]].Value:=FData;
    //index:=index+PechatUdNormForm.ADOQuery1.RecordCount+3;
    end;
    end;
Код:
for i:=0 to PechatUdNormForm.TehProcessComboBox.items.count-1 do begin
    with PechatUdNormForm.ADOQuery1 do begin
     Close;
     SQL.Clear;
     SQL.Add('select unr.obm, n051s.nam, n051s.mar, n051s.ram, n051s.gsm, ');
     sql.Add('n051s.gss, unr.unr1, unr.kets, unr.ets, n051s.cenp, unr.unr1*n051s.cenp as cen ');
     sql.Add('from unr INNER join [\\SERVER-BUH\Dbf\dbf\n051s.DBF] on n051s.obm=unr.obm ');
     sql.add('where tpr='+QuotedStr(PechatUdNormForm.TehProcessComboBox.items.Strings[i]));
     Open;
    end;
Ответить с цитированием
  #2  
Старый 15.11.2018, 19:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,475
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Лень ковырять код, опишу на словах.
Итак, у тебя есть некоторый список процессов от 1 до N, для каждого из которых надо вставить таблицу в итоговый отчет. Соответсвенно, нужно 2 процедуры. Первая - собственно вставка информации по одному процессу, вторая - для обработки списка процессов (вызывает первую для вставки информации об одном из процессов).
Теперь смотрим на логику. Информация о процессе занимает некоторое кол-во строк в экселе, заранее не известное. Соответсвенно, первая процедура должна получить некоторое смещение от начала листа (от первой строки) и должна вернуть информацию о том, сколько строк она использовала, что бы при следуюшем вызове было правильно рассчитано это смещение.
Тогда код (собственно логика перебора, саму вставку напишешь сама) будет выглядеть примерно так:
Код:
function InsertOneReport(Excel : OleVariant; ProcessName : String; Offset : Integer) : Integer;
begin
  Result := 0;
  Excel.ActiveSheet.Cells[1,Offset+0].Value := ProcessName;
  Excel.ActiveSheet.Cells[1,Offset+1].Value := 'Материал';
  Excel.ActiveSheet.Cells[2,Offset+1].Value := 'Наим. мат.';
  Result := 2;

  // получаем данные из БД в ADOQuery1

  ADOQuery1.First;
  While Not ADOQuery1.EOF Do
    Begin
      // Вставляем данные одной строки
      Excel.ActiveSheet.Cells[1,Offset+Result].Value := ADOQuery1.Fields[0].AsSTring;
      Excel.ActiveSheet.Cells[2,Offset+Result].Value := ADOQuery1.Fields[1].AsSTring;
      ...

      // Смещаем указатель на строку
      Inc(Result);
      ADOQuery1.Next;
    End;
  ADOQuery1.Close;
end;

procedure AddAllReports;
var
  I, R : Integer;
  Excel : OleVariant;
begin
  // Создаем объект excel
  ...

  R := 1; // Начальная строка в экселе
  For I := 1 To ComboBox1.Items.Count-1 Do // Как я понял, у тебя процессы в ComboBox1 перечислены
    Begin
      // Тут вызываем вставку
      R := R + 2 + InsertOneReport(Excel, ComboBox1.Items[i], R);
    End;

  Excel.SaveToFile(...); // созраняем/показываем/etc
  Excel := Nil; // Закрываем процесс
end;

Как-то так. Мож там в расчетах надо что поправить и работы с экселем я написал схематично. Но идея такова.
Ответить с цитированием
Ответ



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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter