![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
может кто поможет (только если ругать то не сильно) [D5]
аматор © (2006-01-08 19:38:00)Привет…
Нужна помощь:
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;
IntruderLab (2006-01-08 19:59:00) [1]А кстати вопрос, а в чем трабла с запросами? почему работа с ними не возможна?
аматор (2006-01-08 19:41:00) [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 сек. (кажись – много).
аматор (2006-01-08 19:39:00) [3]// 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;