Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

может кто поможет (только если ругать то не сильно) [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо