Здраствуйте Уважаемые!!
Столкнулся со следующей проблемой, пишу дипломную работу по автоматизации учёта продукции на складе, использую Access, delphi 2005, Excel. Проблема следующего характера: выкидываю отчёты из Access в Excel, у меня их 5 видов, если выкидываю какой - то один (любой) отчёт то всё в порядке, а если разом то получается странная картина. Первый всё ок , в следующих отчётах их структура получается правельная но данные в них заносятся по одной и тойже ,первой, строке из таблицы Access'а ( такое подозрение что команда dam.t_tovar.Next не передвигает курсор на следующую строку в таблице). Использую компаненты ADOConnection и ADOTable
модули
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Menus, Grids, ToolWin, ExtCtrls, XPMan, StdCtrls,IniFiles,
Mask, DBGrids, TeeProcs, TeEngine, Chart, Series, ExcelXP, ComObj,ActiveX, DB,
ADODB;
Процедура для отчётов построена на case, по номеру в кейсе вызываю тот отчёт который мне нужен.
procedure Treport.Button1Click(Sender: TObject);
begin
form1.report_xl(1);
end;
//то всё ок
А если
procedure Treport.Button1Click(Sender: TObject);
begin
form1.report_xl(1);
form1.report_xl(2);
..................
end;
//то уже проблема!!
Плиз помогите до защиты 20 дней, а нервы на пределе!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
09-07-2006 06:33
>>> for x:=1 to dam.t_tovar.RecordCount do
Так никогда не делай - только while not Eof do begin...end;
И наконец, попробуй экспортировать сперва в текстовый файл - тогда разберешься с ошибками, а уж затем и в Excel. А еще лучше - использовать генератор отчетов, поддерживающий экспорт в Excel. Поиметь его можно http://softsl.hut1.ru/components.html
уточнение!
Вот один из отчётов
должно получатся например слудующее:
//Оно получается, если я запускаю только один отчёт.
//////////////////////////////////////////////////
Сальдо на конец месяца за Январь 2006 г.
///////////////////извеняюсь за кривизну таблицы (когда писал была ровная)
А если несколько разных друг за другом получается следующее:
///////////////////////////////////////////////////////
Сальдо на конец месяца за Январь 2006 г.
Извеняюсь, вот кусок кода процедуры отчётов ...
в упрошённом варианте,
dam.t_tovar - таблица справочник с товарами
dam.t_hand - таблица справочник с покупателями
procedure tform1.report_xl(num:integer);
var
px_cnt,rs_cnt,c_tmp,r_tmp,x,y,n_t,vz,pr,ra,n,iter,iter2,iter3 :integer;
excel:variant;
begin
case num of
1:begin
r_tmp:=5; //позиция строки в отчёте
excel:=CreateOleObject('Excel.Application');
excel.WorkBooks.Add;
dam.t_tovar.First;
//.....настройка шапки и т.п............
excel.WorkBooks[1].WorkSheets[1].name:='Отчёт по всей продукции';
//...сам цикл
for x:=1 to dam.t_tovar.RecordCount do
begin
px_cnt:=0;//сюда считается сколько пришло товара на склад (общее)
rs_cnt:=0;//сколько товара ушло (общее)
еxcel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,1]:=dam.t_tovar.Fields.Fields[1].AsString;//название продукта
r_tmp:=r_tmp+2;
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 1]:='дата';
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 2]:='№ Накладной';
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 3]:='Получатель';
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 4]:='Приход';
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 5]:='Расход';
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 6]:='Остаток';
n_t:=dam.t_tovar.Fields.Fields[0].AsInteger;//id товара в справочнике товаров
form1.do_que(8,n_t); //вызываю процедуру sql запроса из главной таблицы где находится вся инфа о передвижении продкции по складу
r_tmp:=r_tmp+1;
dam.Query.First;//Query - sql зарос о всех передвижениях по данному товару (результат form1.do_que(8,n_t))
if dam.Query.RecordCount <> 0 then
begin
for y:=1 to dam.Query.RecordCount do
begin
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,1]:=dam.Query.Fields.Fields[1].AsString;//дата
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,2]:=dam.Query.Fields.Fields[2].AsString;//накладная
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,3]:=dam.t_hand.Lookup('id',(dam.Query.Fields.Fields[3].AsInteger),'hand');//покупатель
if dam.Query.Fields.Fields[6].AsInteger = 2 then //определяю вид передвижения то есть приход, расход, возврат
begin
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,5]:=dam.Query.Fields.Fields[4].AsString;//расход
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 4]:='0';//заполняю пустую ячейку прихода
rs_cnt:=rs_cnt+dam.Query.Fields.Fields[4].Asinteger;//считаю расход
end
else
begin
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,4]:=dam.Query.Fields.Fields[4].AsString;//приход
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp, 5]:= '0';//заполняю пустую ячейку расхода
px_cnt:=px_cnt+dam.Query.Fields.Fields[4].Asinteger;//считаю приход
end;
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,6]:=dam.Query.Fields.Fields[5].Asstring;//заношу остаток
if y = dam.Query.RecordCount then
begin
r_tmp:=r_tmp+1;
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,4]:=inttostr(px_cnt);//общий приход excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,5]:=inttostr(rs_cnt);//общий расход
excel.WorkBooks[1].WorkSheets[1].Cells[r_tmp,6]:=inttostr(px_cnt-rs_cnt);//остаток
end;
dam.Query.Next;
r_tmp:=r_tmp+1;
end;
dam.t_tovar.Next;//следующий товар
r_tmp:=r_tmp+2;
end;
end;
/////////////////////////////////////
Все остальные отчёты по такой же схеме.
22-05-2006 03:55 | Вопрос к автору: запрос дополнительной информации
Приведите фрагмент кода экпорта из Access в Excel - пример "Процедура для отчётов построена на case, по номеру в кейсе вызываю тот отчёт который мне нужен" ни о чем не говорит.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.