Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Delphi + Excel + access = out of memory [D7, access]


Страницы:   1 2

timonissimo ©   (2007-04-10 17:45:00) 

В общем, программер я плохой, но диплом писать надо...
Смысл проги такой: есть таблица access со стат данными про предприятия (7 показателей за каждый квартал с 2000 по 2006 год, итого, 1000 строк и ок. 200 столбцов).  
Соединяюсь через ado, Делаю выборку из таблицы (выбрать предприятия опред. отрасли и района). Данные отображаются в dbgrid. Далее перегоняю в обычный массив.
Затем создаю E:=CreateOleObject('Excel.Application'); Пергоняю из массива в ячейки активной книги.
В итоге, после увеличения файла подкачки до 1 Гб прога начала работать (Athlon 2.0, 512 озу). Это дико, на многих слабых компах не работает! Не могу также при перегоне из массива в excel заполнить одну ячейки в строке (заголовки к таблице).
Короче, подскажите, что делать, плз!!!
Вот код программы:


var
 Form1: TForm1;
 nachalo, konec, kolzap, i, j: integer;
 e,sheet:variant;
 mas_data: array [1..10000, 1..10000] of real;
 mas_data2: array [1..10000, 1..10000] of real;
 mas_data3: array [1..10000, 1..5] of string;
 odna_firma: string;
 mas_pokaz: array [1..7] of string = ('Прибыль','Отгрузка','Обор. активы','Собст. кап.','заим. кап','бюдж. зад','кратк. зад');

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
with unit2.DataModule2.ADOQuery1 do
 begin
   Active:=false;
   sql.Clear;
   sql.Add('select * ');
   sql.Add('from alldata'); //+unit1.Form1.Edit1.Text+
   sql.add('where region like ''117%''');
   active:=true;
   unit1.Form1.Edit2.Text:=inttostr(unit1.Form1.DBGrid1.DataSource.DataSet.RecordCo unt);
 end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 with unit2.DataModule2.ADOQuery1 do
 begin
   Active:=false;
   datamodule2.ADOQuery1.Parameters.ParamByName('kodtown1').Value:=0;
   datamodule2.ADOQuery1.Parameters.ParamByName('kodtown2').Value:=10000000000;
   datamodule2.ADOQuery1.Parameters.ParamByName('otr1').Value:=0;
   datamodule2.ADOQuery1.Parameters.ParamByName('otr2').Value:=100000;
   active:=true;
   unit1.Form1.Edit2.Text:=inttostr(unit1.Form1.DBGrid1.DataSource.DataSet.RecordCo unt);
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 perem, otrasl: string;
 perem2, perem1, k, pi,pj: integer; // для города
 otr1, otr2:integer; //для отрасли

begin
 perem:=unit1.Form1.DBLookupComboBox1.Text; // считали название города
 with unit2.DataModule2.ADOQuery_town do //выбираем код города в соотв. с выбранным названием
 begin
   active:=false;
   sql.Clear;
   sql.Add('select * from soato');
   sql.Add('where name like '''+perem+'''');
   active:=true;
 end;
 perem:=unit2.DataModule2.ADOQuery_town.Fields[0].AsString; //считываем код города
 if form1.CheckBox1.Checked=false then
   begin
     perem2:=strtoint(perem)+1999;
     perem1:=strtoint(perem)-1;
   end
 else
   begin
     perem2:=strtoint(perem)+1;
     perem1:=strtoint(perem)-1;
   end;
 //----------- закончили с городом -----------------//
 otrasl:=unit1.Form1.DBLookupComboBox2.Text;
 with unit2.DataModule2.ADOQuery_otrasl do
 begin
   active:=false;
   sql.Clear;
   sql.Add('select * from okonh');
   sql.Add('where name like '''+otrasl+'''');
   active:=true;
 end;
 otrasl:=unit2.DataModule2.ADOQuery_otrasl.Fields[0].AsString; //считали отрасль
if form1.CheckBox2.Checked=false then
begin
  otr1:=strtoint(otrasl)-1;
  otr2:=strtoint(otrasl)+999;
end
else
begin
  otr1:=strtoint(otrasl)-1;
  otr2:=strtoint(otrasl)+1;
end;
//otr1:=0;
//otr2:=100000;
 //-------------- закончили с отраслью -------------//

with unit2.DataModule2.ADOQuery1 do
 begin
   Active:=false;
   datamodule2.ADOQuery1.Parameters.ParamByName('kodtown1').Value:=perem1;
   datamodule2.ADOQuery1.Parameters.ParamByName('kodtown2').Value:=perem2;
   datamodule2.ADOQuery1.Parameters.ParamByName('otr1').Value:=otr1;
   datamodule2.ADOQuery1.Parameters.ParamByName('otr2').Value:=otr2;
     // unit1.Form1.Edit2.Text:=unit2.DataModule2.ADOQuery1.SQL.GetText;
   active:=true;
   unit1.Form1.Edit2.Text:=inttostr(unit1.Form1.DBGrid1.DataSource.DataSet.RecordCo unt);
end;

//------------ начинаем отбор по периоду ----------------//
   kolzap:=unit1.Form1.DBGrid1.DataSource.DataSet.RecordCount;
   nachalo:=(strtoint(form1.ComboBox2.Text)-2000)*28+7*(strtoint(form1.ComboBox1.Text));
   konec:=(strtoint(form1.ComboBox4.Text)-2000)*28+7*(strtoint(form1.ComboBox3.Text)+1)-1;
      //---- создаем книгу excel ----//
   E:=CreateOleObject('Excel.Application');
   e.workbooks.add(-4167);
   e.workbooks[1].worksheets[1].name:='лист1';
   sheet:=e.workbooks[1].worksheets['лист1'];
    //------ считываем dbgrid (только 7 показателей) -----------------------//
   sheet.cells[1,1]:='код ОКПО';
   sheet.cells[1,2]:='Регион';
   sheet.cells[1,3]:='Тип';
   sheet.cells[1,4]:='Отрасль';
   sheet.cells[1,5]:='Название';
   sheet.cells[1,6]:='Адрес';
   k:=7;
      //------ заголовки первый прогон -------//

    pi:=strtoint(form1.ComboBox1.Text);
    pj:=strtoint(form1.ComboBox2.Text);
   sheet.range['A1:Gs1'].font.bold:=true;
   with unit2.DataModule2.ADOQuery1 do
     begin
       first;
       for i:=1 to kolzap do
         begin
mas_data2[i,1]:=fields[0].AsFloat;  sheet.cells[i+1,1]:=mas_data2[i,1];
mas_data2[i,2]:=fields[1].AsFloat;  sheet.cells[i+1,2]:=mas_data2[i,2];
mas_data2[i,3]:=fields[2].AsFloat;  sheet.cells[i+1,3]:=mas_data2[i,3];
mas_data2[i,4]:=fields[3].AsFloat;  sheet.cells[i+1,4]:=mas_data2[i,4];
mas_data3[i,1]:=fields[4].AsString; sheet.cells[i+1,5]:=mas_data3[i,1];
mas_data3[i,2]:=fields[5].AsString; sheet.cells[i+1,6]:=mas_data3[i,2];
           k:=7;
           for j:=(nachalo-1) to (konec-1) do
             begin
               mas_data[i,j]:=fields[j].AsFloat;
               sheet.cells[i+1,k]:=mas_data[i,j];
               k:=k+1;
             end;
           moveby(1);
         end;
     end;
    //-------------- выгружаем нужное в excel -----------------//
     if form1.CheckBox3.Checked=true then
       e.visible:=true;
 end;

procedure TForm1.Edit4KeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 with unit2.DataModule2.ADOQuery_firms do
 begin
   active:=false;
   sql.clear;
   sql.Add('select alldata.name');
   sql.Add('from alldata');
   sql.Add('where name like ''%'+unit1.Form1.Edit4.Text+'%''');
   active:=true;
 end;
end;


Ega23   (2007-04-10 17:51:00) [21]


> Далее перегоняю в обычный массив.


Это лишнее.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо