Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.042 c
2-1188704544
aibolit
2007-09-02 07:42
2007.09.30
как запустить bat файл


2-1189080006
maslcs
2007-09-06 16:00
2007.09.30
внешний вид scroll а в компоненте webBrowser


15-1188920033
Cyrax
2007-09-04 19:33
2007.09.30
Байка: мужик и справочник...


2-1188503226
Dmitry_177
2007-08-30 23:47
2007.09.30
MS SQL SERVER не знаю с чего начать..


15-1188378149
Ricks
2007-08-29 13:02
2007.09.30
Зацените рисовалку графиков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский