Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

может кто поможет (только если ругать то не сильно)   Найти похожие ветки 

 
аматор ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
1-1138610190
Альф
2006-01-30 11:36
2006.03.05
Заполнение свойств класса из XML


15-1139642716
Ega23
2006-02-11 10:25
2006.03.05
С Днём рождения! 11 февраля


6-1132648372
AndreyS
2005-11-22 11:32
2006.03.05
График в ISAPI


2-1139853465
13
2006-02-13 20:57
2006.03.05
проблемы с панелями ToolBar to CoolBar


11-1120726093
chum
2005-07-07 12:48
2006.03.05
KOL DB и обработка ошибок