Как создать 3 ексель-файла одновременно

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как создать 3 ексель-файла одновременно

Сообщение edward_K »

Поищите на форуме. Обычно матрицу создают на небольшое кол-во строк - типа 100 или 1000(в зависимости от предполагаемого объема) и каждые 100 строк пишут в файл и пересоздают ьатрицу. Другой вариант - сначала посчитать скока надо и создать матрицу под это кол-во строк. Писать за границу созданной матрицы бесполезно.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Как создать 3 ексель-файла одновременно

Сообщение m0p3e »

Обычно пишу в таблицу в памяти и матрица создается через RecordsInTable().

А ведь в моем варианте ExcelLib было динамическое увеличение матрицы в высоту. Зарезали редиски :(
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

Обычно матрицу создают на небольшое кол-во строк - типа 100 или 1000(в зависимости от предполагаемого объема) и каждые 100 строк пишут в файл и пересоздают матрицу
Матрицу я пересоздам, но получится, что записывать в файл я должна буду каждый раз все в тот же xls-файл, но уже со смещением, т.е., первый экземпляр матрицы с 1-й строки, второй - со 101-й.

А мне это надо делать с тремя разными матрицами.
Не понятно как каждую из них связывать с разными файлами, и записывать данные в разные файлы, да еще и не с первой ячейки, а все ниже и ниже.

Код: Выделить всё

procedure writeToExcel(_nM: word);
{ var j: word;
  _kolRow:=100;
  if _row[_nM]<_kolRow
    then _row[_nM]:=_row[_nM]+1
    else { j:=_factor[_nM]*_kolRow+1;
	     if not xlWriteMatrixToExcelex(_matrix[_nm],j,1) message('Не могу записать матрицу '+string(_nM));
             if not xlSaveAsWorkBook(_nM,_xlsfileName[_nM]) message('Не могу сохранить');
             xlFreeMatrixex(_matrix[_nm]);
	     _factor[_nM]:=_factor[_nM]+1; _row[_nM]:=1;
	   }
}
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Как создать 3 ексель-файла одновременно

Сообщение Den »

Да выгрузите Вы однажды все из БД во временную таблицу Ваш базовый набор данных.
Потом обходите его столько раз сколько нужно, пересоздавая матрицу и записывая в тот файл который нужно.
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

Нда, придется опять через временные таблицы.
Но, блин, Галактика..... других слов нет.
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Как создать 3 ексель-файла одновременно

Сообщение Den »

У Вас там десятки/сотни тысяч записей выгружаются ? или в чем проблема ?
А так да... XlCreateMatrix ,насколько я понимай ,может быть одна объявлена. Если у Вас будет разный набор данных на вывод - придется три раза матрицу делать.
Хотя может через объекты можно попробовать. Т.е. сделать 3 объекта(для 3 х файлов.). В них методы иннициализации экселя (В каждом объекте свой xlCreateExcelWithTemplate где будите открывать один из 3 шаблонов), методы записи нужной информации и закрытие. ну и в основном модуле ,в цикле по данным сразу пихать инфу в 3 разных места.
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

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

Или уж сразу определить размер на 2 порядка больший :grin: ?
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Как создать 3 ексель-файла одновременно

Сообщение Den »

если это ночью и никто не работает с тему таблицами ,которыми Вы оперируете в своем алгоритме, то можно заранее вычислять сколько будет записей для матрицы :
- в случае mssql или oralce платформы sql select count(*) from ...where....
- в случае битрива смотрите в документации по vip "вложенный запрос" там тоже можно count(*) использовать
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

у нас первасив, заранее посчитать можно только перегрузкой во временные таблицы (простым запросом не обойтись), а хотелось обойтись без двойного прохода.
Последний раз редактировалось s2176 24 сен 2014, 13:17, всего редактировалось 1 раз.
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Как создать 3 ексель-файла одновременно

Сообщение Den »

"- в случае битрива смотрите в документации по vip "вложенный запрос" там тоже можно count(*) использовать" (с)
LaaLaa

Re: Как создать 3 ексель-файла одновременно

Сообщение LaaLaa »

Den писал(а):"- в случае битрива смотрите в документации по vip "вложенный запрос" там тоже можно count(*) использовать" (с)
В случает первасива это и будет второй проход.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Как создать 3 ексель-файла одновременно

Сообщение Den »

LaaLaa писал(а):
Den писал(а):"- в случае битрива смотрите в документации по vip "вложенный запрос" там тоже можно count(*) использовать" (с)
В случает первасива это и будет второй проход.
В любом случае будет "второй проход" независимо от платформы -это же запрос к данным. Другое дело на sql-платформах это более эффективно будет
Ответить