Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Delphi + Excel + access = out of memory   Найти похожие ветки 

 
timonissimo ©   (2007-04-10 17:45) [0]

В общем, программер я плохой, но диплом писать надо...
Смысл проги такой: есть таблица 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) [1]


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


Это лишнее.


 
jack128 ©   (2007-04-10 17:56) [2]

Это нынче такие дипломы пошли?  Ахренеть.

А по сути - выгрузи данные в вариантый массив и далее одним махом перелей их в excel. На королевстве дельфи есть статья по этому поводу.


 
sniknik ©   (2007-04-10 18:04) [3]

> А по сути - выгрузи данные в вариантый массив и далее одним махом перелей их в excel. На королевстве дельфи есть статья по этому поводу.
и это лишнее... excel принимает адошный рекодсет ничуть не хуже (а скорее и лучше) вариантного массива.


 
timonissimo ©   (2007-04-10 18:31) [4]


> Это нынче такие дипломы пошли?  Ахренеть.

Я не програмист. Мне главное систему спроектировать (Уж тех задание я умею писать и неплохо)

Обычный массив нуна использовать. (кроме семи показателей будут еще несколько производных)
Если советуете, то, плз, пишите код, на словах я не очень понимаю


 
timonissimo ©   (2007-04-10 18:32) [5]


> Это нынче такие дипломы пошли?  Ахренеть.

Я не програмист. Мне главное систему спроектировать (Уж тех задание я умею писать и неплохо)

Обычный массив нуна использовать. (кроме семи показателей будут еще несколько производных)
Если советуете, то, плз, пишите код, на словах я не очень понимаю


 
MsGuns ©   (2007-04-11 21:09) [6]

Эта.. делайте то, что умеете делать, т.е. пишите ТЗ. А программировать..
Многие говорят, что кодить так же легко, как самачки грызть. Не верьте - брешут они


 
timonissimo ©   (2007-04-12 10:54) [7]


> Эта.. делайте то, что умеете делать, т.е. пишите ТЗ. А программировать.
> .Многие говорят, что кодить так же легко, как самачки грызть.
>  Не верьте - брешут они


Мне диплом писать надо, требования такие, что нужна прога.
Не можете подсказать, грызите самачки...


 
Desdechado ©   (2007-04-12 10:56) [8]

> Обычный массив нуна использовать. (кроме семи показателей
> будут еще несколько производных)
Производные можно посчитать прямо в SQL-запросе.


 
Sergey13 ©   (2007-04-12 11:11) [9]

> Обычный массив нуна использовать. (кроме семи показателей
> будут еще несколько производных)
> Если советуете, то, плз, пишите код, на словах я не очень
> понимаю
Прочитать побольше про датасет и работу с ним. Это тот-же самый "массив", где можно насобачить сколько угодно "производных" через вычисляемые поля.
А код писать - плати деньги - напишут.


 
timonissimo ©   (2007-04-12 11:16) [10]

Дело в том, что мне нужно делать еще выборку по столбцам, (выбрать показатели за определенные кварталы). Показатель за квартал обозначается например как 42001PR. Как же мне динамически формировать эти запросы?
В принципе, можно через sql add о это поможет?

___________________
А не может быть проблемы в том, что у меня остаются активными несколько ADOQuery и ADOTable ?
Где здесь вообще ошибка, на какой стадии: delphi и БД, delphi и excel?
почему после компиляции программа запускается только с гигабайтным файлом подкачки, хотя в процессе совершенно не тормозит?


 
Sergey13 ©   (2007-04-12 11:22) [11]

> Показатель за квартал обозначается например как 42001PR.
> Как же мне динамически формировать эти запросы?
А если бы он обозначался 278346287ЫЛОВРАФОЛ ты бы знал как? Ты попробуй хотя бы для себя (не говоря уж о других) формулировать задачу. Это реально помогает решать их.

> Где здесь вообще ошибка, на какой стадии

В отсутствии представления о том как это все работает.


 
Desdechado ©   (2007-04-12 12:15) [12]

> может быть проблемы в том, что у меня остаются активными
> несколько ADOQuery и ADOTable ?
Может. ADOTable вообще забудь, ибо оно (скорее всего) гребет все данные на клиента без разбора. Используй вместо этого ADODataset.


 
timonissimo ©   (2007-04-12 12:52) [13]


> В отсутствии представления о том как это все работает.


А я и не говорю, что я знаю, как все работает. Знал бы - сам бы и разобрался в задаче. Но так как опыта у меня нет никакого, в книжках я тоже не встречал ответа на свой вопрос.
____________________________________
А с такими заявлениями, типа "ты лох, ничего не знаешь"...
Знаешь - подскажи, хотя бы направление задай, где ошибку искать.
А не знаешь - нечего говорить, что "нет представления о том, как это все работает" и сам знаю, что не знаю.


 
Sergey13 ©   (2007-04-12 13:03) [14]

> [13] timonissimo ©   (12.04.07 12:52)

А чего ты так взъелся то? Я тебя лохом не называл. Но если ты не знаешь основных принципов работы с БД, какой смысл копаться в деталях? Направление я тебе дал - читай про датасет и вообще про БД. Писать за тебя диплом не буду.

ЗЫ: И повторюсь - учись формулировать свои вопросы (задачи).


 
timonissimo ©   (2007-04-12 18:03) [15]

Хм, но еще тогда вопросик: почему у меня даже .exe файл не открывается (пишет, что недостаточно памяти), хотя выборка данных и создание excel.application начинается только после нажатия одной кнопки на форме
(AdoConnection активно с самого начала)
_______________
Может быть такое, что прогу я компилил на мощном компе с большим файлом подкачки, а запускаю на менее мощном и из-за этого ошибка?


 
sniknik ©   (2007-04-12 19:56) [16]

> (AdoConnection активно с самого начала)
зачем? закрой. само откроется при первом же запросе. а так возможно открыт не только коннект но и какието рекордсеты неучтенные.

> exe файл не открывается (пишет, что недостаточно памяти)
в некоторых случаях достаточно коннекта и обращения к пустой таблице...
правда это не твой случай, т.к. у тебя написано access, а то что я имею ввиду это от исамов jet, тех которые работают через BDE, и конфликтуют с ним, если параллельно работает другая прога на "чистом" BDE.
(просто инфа, рассматривать ввиду не используемости данных исамов незачем. (чего зря голову забивать, ведь надо просто сдать курсовой и забыть...))


 
zardoz   (2007-04-17 15:51) [17]

А вы представляете себе размер в памяти 2-х массивов по 10000х10000 ???
Умножаем 10000х10000=100 млн. элементов !! Тип Real это 4 байта. Массива таких 2 штуки. Что итого??? 2*4*100 млн. = 800 МБайт памяти как с куста! Вы чего ??

С уважением.


 
ANB ©   (2007-04-17 16:36) [18]


> 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;

Вот здесь и живет косяк.
Какой же, звиняюсь м:%?:;%: такие здоровенные массивы объявляет глобально да еще и статически ? И после этого еще возмущается.


 
timonissimo ©   (2007-05-23 14:53) [19]

Всем спасибо, дело было в массиве...
Все теперь работает


 
Плохиш ©   (2007-05-23 15:04) [20]


> timonissimo ©   (10.04.07 18:32) [5]


> Если советуете, то, плз, пишите код,

Вот и "сами мы не местные" появилось :-)

> на словах я не очень понимаю

Прааавииильно, мы здесь на своём языке общаемся. А если до диплома языка не выучил, то и надо менять специальность...


 
Плохиш ©   (2007-05-23 15:06) [21]


> Где здесь вообще ошибка, на какой стадии: delphi и БД, delphi
> и excel?

Здесь ошибка в ДНК, а делфи, ексел и бд здесь совершенно не при делах...



Страницы: 1 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
2-1188558769
Dib@zol
2007-08-31 15:12
2007.09.30
SetWindowRgn


3-1176212743
timonissimo
2007-04-10 17:45
2007.09.30
Delphi + Excel + access = out of memory


15-1188915329
savyhinst
2007-09-04 18:15
2007.09.30
Лазарус


15-1188879768
Че
2007-09-04 08:22
2007.09.30
cmd


15-1188480916
Пилот
2007-08-30 17:35
2007.09.30
А дайте pls ссылку на архив с веткой про самолет на транспортере