Форум: "Базы";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Внизможет кто поможет (только если ругать то не сильно) Найти похожие ветки
← →
аматор © (2006-01-08 19:38) [0]Привет…
Нужна помощь:
procedure TFPeriod.NewExecute(Sender: TObject);//создание нового периода
var MaxGod (значение года), MaxMans (значение месяца) : integer;
Flt (переменная для фильтра: если не равна нулю то фильтрую) : string;
begin
MaxGod := 0;
MaxMans := 0;
Flt := DM.Baza.Filter;
DM.Baza.DisableControls;
DM.PeriodBaza.DisableControls;
//если база пуста то определяю значение переменных месяца и года
//потом получившееся добавляю в дополнительную форму – для выбора следующего периода
//в PeriodBaza всего два поля: God – поле года и Mans – поле месяца
// PeriodBaza связана с таблицей Baza (точнее Baza с PeriodBaza (главная таблица) по индексу)
if DM.PeriodBaza.RecordCount > 0 then begin
With DM.PeriodBaza do begin
First;
MaxGod := StrToInt(FieldByName("God").AsString);
While not Eof do begin
if StrToInt(FieldByName("God").AsString) > MaxGod then MaxGod := StrToInt(FieldByName("God").AsString);
Next;
end;
Filtered := False;
Filter := "God = " + chr(39) + IntToStr(MaxGod) + chr(39);
Filtered := True;
First;
MaxMans := StrToInt(FieldByName("Mans").AsString);
While not Eof do begin
if StrToInt(FieldByName("Mans").AsString) > MaxMans then MaxMans := StrToInt(FieldByName("Mans").AsString);
Next;
end;
Filtered := False;
Filter := "";
end;
end;
← →
аматор © (2006-01-08 19:39) [1]// FSelPeriod - это та маленькая формочка в которой пользователь выбирает значение периода
FSelPeriod := TFSelPeriod.Create(Application);
if MaxMans < 11 then begin
FSelPeriod.ESBMonthComboBox1.ItemIndex := MaxMans + 1;//
FSelPeriod.ESBYearSpinEdit1.Year := MaxGod;
MaxMans := MaxMans + 1;
end
else begin
FSelPeriod.ESBMonthComboBox1.ItemIndex := 0;
FSelPeriod.ESBYearSpinEdit1.Year := MaxGod + 1;
MaxMans := 0;
MaxGod := MaxGod + 1;
end;
FSelPeriod.ShowModal;
if FSelPeriod.ModalResult = mrOk then begin
//здесь разрушаю связь для работы просто с таблицей
With DM.Baza do begin
Active := False;
IndexFieldNames := "";
IndexName := "";
MasterFields := "";
MasterSource := nil;
Active := True;
end;
if DM.PeriodBaza.RecordCount = 0 then begin //эта процедура работае в том случае если пользователь только начал работать с базой
MaxMans := FSelPeriod.ESBMonthComboBox1.ItemIndex;
MaxGod := FSelPeriod.ESBYearSpinEdit1.Year;
DM.FirstStart(MaxMans, MaxGod); //это при первом обращении к базе, здесь всё нормально, вроде (кода не пишу)
end
else begin
DM.AddNewPeriod(MaxMans, MaxGod);//вот эта процедура меня и интересует !!!!!!!!
end;
///ну а здесь возвращаю всё на места свои
With DM.Baza do begin
Active := False;
IndexFieldNames := "NPPERIOD";
IndexName := "IDXNPPERIOD";
MasterFields := "Np";
MasterSource := DM.DataSource2;
Active := True;
end;
end;
FSelPeriod.Free;
FSelPeriod := nil;
if Flt <> "" then begin
DM.Baza.Filtered := False;
DM.Baza.Filter := Flt;
DM.Baza.Filtered := True;
end
else begin
DM.Baza.Filtered := False;
DM.Baza.Filter := "";
end;
Dm.PeriodBaza.EnableControls;
DM.Baza.EnableControls;
end;
← →
аматор © (2006-01-08 19:41) [2]//вот процедурка работы с базой
procedure TDM.AddNewPeriod(PMans, PGod : integer);//период который нужно создать
var OldMans, OldGod, NpT, NpPer : integer;
begin
//узнаю предыдущий период
if PMans = 0 then begin
OldMans := 11;
OldGod := PGod - 1;
end
else begin
OldMans := PMans - 1;/
OldGod := PGod ;/
end;
//узнаю значение поля Np из таблицы периодов
//и с его помощью фильтрую основную базу
With PeriodBaza do begin
Filtered := False;
Filter := "God = " + chr(39) + IntToStr(OldGod) + chr(39);
Filtered := True;
if not Locate("Mans", OldMans, []) then Exit;
NpT := FieldByName("Np").AsInteger;/
Filtered := False;/
Filter := "";
end;
//Добавляю новый период
With PeriodBaza do begin
Insert;
FieldByName("Mans").AsString := IntToStr(PMans);
FieldByName("God").AsString := IntToStr(PGod);
Post;
NpPer := FieldByName("Np").AsInteger;
end;
//В этой части создаю временну таблицу и добавляю нужные записи
//для последующей работы (т.е. добавления в основную таблицу
With Temp do begin
Active := False;
TableName := "temp.dbf";
With FieldDefs do begin
Clear;
Add("NpPeriod", ftInteger, 0, False);
Add("NpTe", ftInteger,0, False);
Add("NpSt", ftInteger, 0, False);
Add("FioSt", ftString, 100, False);
Add("EDolg", ftFloat, 0, False);
Add("EPerepl", ftFloat, 0, False);
end;
CreateTable;
Active := True;
end;
With Baza do begin
Filtered := False;
Filter := "NpPeriod = " + IntToStr(NpT);
Filtered := True;
end;
//В этом случае существуют две взаимосвязанные таблицы
//учеников – Student и svod (ну так назвал) свод
//в своде заложена связь учеников с преподами (т.е. у каждого ученика может быть несколько преподов)
Student.Active := True;//это ученики
svod.Active := True;//это свод
Student.First;
While not Student.Eof do begin
if Student.FieldByName("Active").AsBoolean = True then begin //проверяем учится ещё ученик или нет
//если да то работаем дальше, нет переходим к следующему
svod.First;
While not svod.Eof do begin
Temp.Insert;
// Temp.FieldByName("NpPeriod").AsInteger := NpPer;//поле связи с периодом
Temp.FieldByName("NpTe").AsInteger := svod.FieldByName("NpTe").AsInteger; //учителя
Temp.FieldByName("NpSt").AsInteger := Student.FieldByName("Np").AsInteger; //ученики
Temp.FieldByName("FioSt").AsString := Student.FieldByName("FIO").AsString; //это Ф.И.О. ученика
//ищу по основной базе ученика и добавляю задолженность или переплату
if Baza.Locate("NpSt", Student.FieldByName("Np").AsInteger, []) then begin
Temp.FieldByName("EDolg").AsFloat := Baza.FieldByName("EDolg").AsFloat; //долг
Temp.FieldByName("EPerepl").AsFloat := Baza.FieldByName("EPerepl").AsFloat; //переплата
end;
Temp.Post;
svod.Next;
end;
end;
Student.Next;
end;
Student.Active := False;
svod.Active := False;
//ну а здесь из временной таблицы в основную
Temp.First;
While not Temp.Eof do begin
Baza.Insert;
Baza.FieldByName("NpPeriod").AsInteger := NpPer;
Baza.FieldByName("NpTe").AsInteger := Temp.FieldByName("NpTe").AsInteger;
Baza.FieldByName("NpSt").AsInteger := Temp.FieldByName("NpSt").AsInteger;
Baza.FieldByName("FioSt").AsString := Temp.FieldByName("FioSt").AsString;
Baza.FieldByName("NDolg").AsFloat := Temp.FieldByName("EDolg").AsFloat;
Baza.FieldByName("NPerepl").AsFloat := Temp.FieldByName("EPerepl").AsFloat;
Baza.Post;
Temp.Next;
end;
Temp.Active := False;
end;
Вопросы:
1. Какие ошибки допущены.
2. Как увеличить скорость обработки (с запросами работать, к сожаленью работать не могу),
При около 100 записей время обработки около 4 сек. (кажись – много).
← →
IntruderLab (2006-01-08 19:59) [3]А кстати вопрос, а в чем трабла с запросами? почему работа с ними не возможна?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c