Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1139460201
DimonS
2006-02-09 07:43
2006.03.05
Кто юзал такой принтер?


3-1136542968
Дева
2006-01-06 13:22
2006.03.05
что лучше?


2-1140071932
dabreezy
2006-02-16 09:38
2006.03.05
Вопрос по TidHTTP


2-1140168238
maep
2006-02-17 12:23
2006.03.05
IP, Hostname


2-1139816777
Werwolf
2006-02-13 10:46
2006.03.05
Как работать со счетчиками производительности (counters)





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