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

Вниз

Ускорение обработки записей   Найти похожие ветки 

 
Натик   (2003-04-29 15:23) [0]

Помогите.
Есть две базы и Excel-файл с коэффициентами. Из одной базы с помощью Query выбираю записи(около 4000). Из Excel экспортирую коэф. в StringGrid. Каждую запись из Query с помощью коэф. разделяю на несколько записей и записываю их в другую базу. Получается около 25000 записей во второй базе. Очень долго выполняется программа. Подскажите способы уменьшения времени обработки записей.


 
Johnmen   (2003-04-29 15:33) [1]

Именно обработки ?
Может быть запихивания в во вторую базу ?


 
KoluChi   (2003-04-29 15:36) [2]

Очень долго - это сколько?
Время обработки = время выборки данных из БД1 + время выборки коэффициентов + время обработки данных из БД1 + время записи в БД2.
Нужно постараться уменьшить каждое слагаемое. По каждому эз этопов недостаточно данных.


 
Натик   (2003-04-29 15:50) [3]

время выборки данных из БД1 и выборки коэффициентов очень мало. Много времени занимает обработка данных и время записи в БД2.
Перебираю записи в Query. По ключу записи из Query нахожу нужную строку в StringGrid. Перебираю столбцы SDtringGrida - вычисляю сумму для каждого столбца и записываю AppendRecord в БД2.


 
Соловьев   (2003-04-29 16:02) [4]


> Много времени занимает обработка данных и время записи в
> БД2.

какой алгоритм обработки?
может можно будет записывать не по одной, а пакетом -
insert into <table>
select * from <table2>


 
KoluChi   (2003-04-29 16:03) [5]

1) Оптимизировать обработку можно только увидев код.
2) Добавлять в любом случае придется по одной записи. Здесь остается только выбор компонентов доступа.


 
KoluChi   (2003-04-29 16:04) [6]

2Соловьев © (29.04.03 16:02)
А прокатит - 2 базы DBF разного формата?


 
Соловьев   (2003-04-29 16:13) [7]


> 2 базы DBF

это не две БД - а все навсего 2 таблицы. Даже если в разных каталогах - BDE поддерживает работу с разными алиасами. BatchMove накрайняк.


 
KoluChi   (2003-04-29 16:29) [8]

2Соловьев © (29.04.03 16:13)
В любом случае не прокатит - table2 нет.


 
sniknik   (2003-04-29 16:59) [9]

KoluChi © (29.04.03 16:04)
2Соловьев © (29.04.03 16:02)
А прокатит - 2 базы DBF разного формата?

если ADO + Jet то прокатит не только разного но и перекрестно (запросы к) dBase - Paradox - Excel .... еще несколько исамов, и плюс всю (ну или большую часть) обработку можно в запросе делать. минус нужен mdb файл (Access база) для связки.


 
Натик   (2003-04-30 13:02) [10]

вставляю код программы

while not OutputQuery.Eof do begin

if OutputQuery.FieldValues["сумма"]=0 then goto New;

s:=Copy(OutputQuery.FieldValues["дебет"],7,2);
if Copy(S,1,1)=" " then Delete(S,1,1);
Sh:=FloatToStr(OutputQuery.FieldValues["шифр"]);

for I:=I1 to I2 do begin //перебираем строки 2 столбца, где записался субсчет
V:=FStringGrid.StringGrid1.Cells[2,I];
if Copy(V,1,1)="0" then Delete(V,1,1);
if V=s then begin // если субсчета равны
Vh:=FStringGrid.StringGrid1.Cells[3,I];//в 3 столбце записан шифр Дт
if Copy(Vh,1,1)="0" then Delete(Vh,1,1)
else Vh:="0";
if Vh=Sh then begin // если шифры равны
sum_prov:=0;
for J:=J1 to J2 do begin // перебираем столбцы для подходящей строки по субсчету
// Определение суммы проводки по долям
if FStringGrid.StringGrid1.Cells[J,I]<>"" then begin
koef:=StrToCurr(FStringGrid.StringGrid1.Cells[J,I]);
sum:=Round(OutputQuery.FieldValues["сумма"]*koef*100)/100;
if sum<>0 then begin
// Определение Дебета счета по заголовку в 1 строке
if Copy(FStringGrid.StringGrid1.Cells[J,1],3,1)="0" then Deb:=" "+Copy(FStringGrid.StringGrid1.Cells[J,1],1,2)+" "+Copy(FStringGrid.StringGrid1.Cells[J,1],4,1)
else Deb:=" "+Copy(FStringGrid.StringGrid1.Cells[J,1],1,2)+" "+Copy(FStringGrid.StringGrid1.Cells[J,1],3,2);
Cod:=" "+ Copy(FStringGrid.StringGrid1.Cells[J,1],5,2);

// Запись данных в Provzar
DM.Provzar.AppendRecord(["",Dat,0,"Р33","","Затраты 33 счета, распределяемые на услуги",Deb,Cod,OutputQuery["дебет"],OutputQuery["шифр"],sum,OutputQuery["скв1"],OutputQuery["скв2"]," 1",2,0,0,0,0,"",0,"","",""]);

sum_prov:=sum_prov+sum;
end;//if sum<>0
end;//if FStringGrid.StringGrid1.Cells[J,I]<>""
end;//for по столбцам
if sum_prov=0 then begin //если сумма для распределения очень мала и никуда не распределилась
//ищем по строке максим. % и относим эту сумму на этот счет

//задание начальных максим.значений
if FStringGrid.StringGrid1.Cells[J1,I]="" then koefmax:=0
else koefmax:=StrToCurr(FStringGrid.StringGrid1.Cells[J1,I]);
Jmax:=J1;
for J:=J1 to J2 do begin // перебираем столбцы для поиска max значения %
if FStringGrid.StringGrid1.Cells[J,I]<>"" then begin
koefJ:=StrToCurr(FStringGrid.StringGrid1.Cells[J,I]);
if koefmax< koefJ then begin
Jmax:=J;
koefmax:=StrToCurr(FStringGrid.StringGrid1.Cells[J,I]);
end;//if
end;//if
end;//for
//нашли max
sum:=OutputQuery.FieldValues["сумма"];
if Copy(FStringGrid.StringGrid1.Cells[Jmax,1],3,1)="0" then Deb:=" "+Copy(FStringGrid.StringGrid1.Cells[Jmax,1],1,2)+" "+Copy(FStringGrid.StringGrid1.Cells[Jmax,1],4,1)
else Deb:=" "+Copy(FStringGrid.StringGrid1.Cells[Jmax,1],1,2)+" "+Copy(FStringGrid.StringGrid1.Cells[Jmax,1],3,2);
Cod:=" "+ Copy(FStringGrid.StringGrid1.Cells[Jmax,1],5,2);

// Запись данных в Provzar
DM.Provzar.AppendRecord(["",Dat,0,"Р33","","Затраты 33 счета, распределяемые на услуги",Deb,Cod,OutputQuery["дебет"],OutputQuery["шифр"],sum,OutputQuery["скв1"],OutputQuery["скв2"]," 1",2,0,0,0,0,"",0,"","",""]);
sum_prov:=sum_prov+sum;
end;//if sum_prov=0

//если распределяемая сумма <> распределенным
if OutputQuery.FieldValues["сумма"]<>sum_prov then begin
if DM.Provzar.FieldValues["Summa"]+(OutputQuery.FieldValues["сумма"]-sum_prov)=0 then begin
DM.Provzar.Delete;
end
else begin
DM.Provzar.Edit;
DM.Provzar.FieldByName("Summa").AsCurrency:=DM.Provzar.FieldValues["Summa"]+(OutputQuery.FieldValues["сумма"]-sum_prov);
end;
end;//if
goto New;
end;//if
end;//if
end;//for


New: OutputQuery.Next;
end;//while


 
Johnmen   (2003-04-30 13:06) [11]

Никаких AppendRecord"ов и им подобных !
Использовать только явные параметрические запросы на вставку (INSERT INTO...).


 
Натик   (2003-04-30 13:15) [12]

не поняла
я ведь для каждой записи вычисляю все поля


 
Соловьев   (2003-04-30 13:17) [13]


> Натик (30.04.03 13:02)

не хило, чего тут удивляться...

> goto New;

от этого уже давно отказались, еще с Basic. Разве что Asm...



 
Натик   (2003-04-30 13:22) [14]

подскажите как ХИЛО сделать....


 
Соловьев   (2003-04-30 13:30) [15]

алгоритм. приведи.


 
Mike Kouzmine   (2003-04-30 13:35) [16]

if Copy(S,1,1)=" " then Delete(S,1,1);
S := Trim(S)
А зачем стринггрид? А если дбгрид?
Сплошная работа со строками. А нельзя ли с числами


 
Натик   (2003-04-30 13:50) [17]

БД1 - в Query выбрала по дате, Дебету, шифру, скв шифру1, скв. шифру2 записи. В Excel файле хранятся коэффициенты на разные виды кредита для каждого вида дебета и шифра
кредит
дебет шифр 20 01 20 02 20 03......
33 1 0 17% 23% 50%
33 2 1 10%.......

Для текущей записи из Query находим по дебету и шифру строку в коэффициентах. По столбцам находим коэффициенты, поучаем суммы для каждого кредита, по столбцу пределяем кредит.
Таким образом запись из Query разбивается на нексколько записей в БД2.


 
Натик   (2003-04-30 13:58) [18]

В стринггриде хронятся коэффициенты из Excel-кого файла импортированные


 
sniknik   (2003-04-30 14:26) [19]

если хочеш чтобы работало быстро от стринггрида нужно отказатся. вариантов много (хотя бы импорт из Excel в другую таблицу которую можно связать по JOIN) уже будет быстрее.
на самом деле связь можно и так прямо сделать но у тебя не ADO.
от сравнений строк тоже отказатся в пользу численных. от чтения значений полей по имени тоже желательно, также как и от AppendRecord в том виде что сейчас или вообще (в том что сейчас изменение структуры таблици (поля местами поменять) смертельно для программы).

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


 
Соловьев   (2003-04-30 14:37) [20]


> вывод: тебе не повезло. :-((

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



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

Форум: "Базы";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.006 c
1-70283
Deus
2003-05-11 16:55
2003.05.22
Ошибка Internal Error: L594.


1-70393
MAX22
2003-05-10 22:14
2003.05.22
Код для создаваемого объекта


4-70573
dv81
2003-03-21 23:37
2003.05.22
Как отобразить стандартное окно поиска Windows ?


1-70326
Viktor
2003-05-07 11:51
2003.05.22
Модальные формы и данные


14-70473
bokus
2003-05-01 20:34
2003.05.22
Через что лучше делать





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский