Форум: "Базы";
Текущий архив: 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