![]() |
|
|
|
|
#1
|
|||
|
|||
|
Доброго дня! очень надеюсь на Вашу помощь!, надо в 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
|
|||
|
|||
|
Лень ковырять код, опишу на словах.
Итак, у тебя есть некоторый список процессов от 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;Как-то так. Мож там в расчетах надо что поправить и работы с экселем я написал схематично. Но идея такова. |