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

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

Проблема с БД [D7, IB6.x]


Vsevolod ©   (2004-09-30 02:33:00) 

Нужно сделать прогу, которая формирует отчет и бросает его в Word. Это моя первая прога которая использует базы данных и Word. Необходимо отфильтровать 2 таблицы - первую по вводимому признаку, вторую поочередно по всем признакам полученным после первой фиьтрации и кинуть результаты в Word.Возникло 2 проблемы:
1. Неправильно фильтруется первая таблица - остается пустой при повторном вводе того же признака фильтрации. После ввода другого признака и возврата к первому фильтрация происходит правильно.
2. Неправильно фильтруется вторая талица - при получении нескольких признаков из первой, по первому признаку выводится только 1 результат (а удовлетворяют признаку несколько), а фильтрация по остальным признакам выполняется корректно. Проблема решается после помещения компонентов DataSourse и DBGrid и их связывании со второй фильтруемой таблицей.
Использую Interbase 6
В чем может быть проблема ? Буду благодарен за любую помощь.


Zacho   (2004-10-01 20:25:00) [1]

Vsevolod   (01.10.04 18:59) [10]

ExtractFileDir(Application.ExeName)


Vsevolod   (2004-10-01 18:59:00) [2]

Попутно возник еще один вопрос: Как узнать из какой папки запускается программа.


Vsevolod   (2004-10-01 18:57:00) [3]

Zacho, спасибо за помощь больше TIBTable использовать не буду. CachedUpdates не использовал, а переход на TIBDataSet помог.


Zacho   (2004-09-30 22:54:00) [4]

Сразу хочу дать небольшой совет - выкини TIBTable и используй только TIBDataSet. Кстати, "фильтр" в TIBTable реализован просто добавлением выражения из него в where запроса. Так что никакой локальной фильтрации в нём нет.

> Но дело не в этом я использую .Fetchall

Тогда RecordCount должен работать корректно. Но лучше избавиться от этой вредной привычки, цикл по Eof всегда работает правильно, в отличии от.

> Связь Master-detail не подходит очень большая БД,
> много таблиц, фиксированная структура и много людей
> делают разные части АСУ.

Не понимаю, какое это имеет отношение.
Вообще-то я ошибся, не в student, а в groups. Гораздо проще вместо TIBTable взять TIBDataSet, в SelectSQL написать запрос типа SELECT ... FROM .. WHERE SPECCODE=:SPEC , в groups.DataSource поставить DataSource, подключенный к spec - и никакой возни с фильтром.

> Насчет CachedUpdates не знаю объясни чуть подробней.

В IBX6.0 был баг, когда в некоторых случаях при CachedUpdates:=true и Filtered:=true датасет забивался мусором. Не знаю, исправили ли это в более поздних версиях.

> Еще немного посидел и понял, что первая проблема
> решается также как и вторая - DataSourse и DBGrid.
 ...
> Судя по всему при связи с DataSourse и DBGrid
> выполняются какие-то действия незнаешь какие ?

Чудеса какие-то, даже предположить не могу с чего бы это :)

В общем мой тебе совет - TIBTable замени на TIBDataSet, не используй CachedUpdates, а фильтрацию делай или запросом или с помощью OnFilterRecord. По крайней мере точно будешь знать что происходит и сможешь нормально отладить, вместо того чтобы гадать "что же такое там TIBTable с Filter делает, и каким загадочным образом на это грид влияет ?"


Vsevolod   (2004-09-30 21:10:00) [5]

За MyDataSet.Eof спасибо не знал. Но дело не в этом я использую .Fetchall. Связь Master-detail не подходит очень большая БД, много таблиц, фиксированная структура и много людей делают разные части АСУ.
Компоненты IBTable IBDataSet IBTransaction
Насчет CachedUpdates не знаю объясни чуть подробней.
Еще немного посидел и понял, что первая проблема решается также как и вторая - DataSourse и DBGrid.
2 проблема - Из Spec - несколько значений и по ним фильтруется Groups. По первому значению фильтруется неправильно - только одно значение из Groups а удоветворяют фильтру несколько. По остальным значениям из Spec фильтруется правильно.
Судя по всему при связи с DataSourse и DBGrid выполняются какие-то действия незнаешь какие ?


Zacho   (2004-09-30 20:05:00) [6]

Бегло просмотрел код, грубых ошибок вроде бы нет. Есть несколько замечаний:
1. Использовать RecordCount не корректно, в разных компонентах доступа/с разными СУБД он может работать по разному. Лучше используй while not MyDataSet.Eof do ..Возможно, у тебя проблема именно в этом.
2. В коде есть излишества,например вместо
 facnum:=strtoint(combobox1.Text);
 spec.Filter:='FAC='+inttostr(facnum);

можно написать просто
 spec.Filter:='FAC='+combobox1.Text;

3. Вместо фильтра в student можно использовать связь Master-detail, проще и удобнее.

Твоей проблемы 2 я вообще не понял, попробуй объяснить подробнее.
И не плохо было бы указать, какие компоненты доступа используешь.  Подозреваю, что BDE, но подозрение не есть уверенность :)

Да, ещё: используешь ли CachedUpdates ? Помнится в IBX6.0 был баг с CachedUpdates и фильтрацией, как с этим в BDE - не знаю.


Vsevolod   (2004-09-30 19:00:00) [7]

ZACHO, вот и код посмотри если время есть
msguns, в Word потому что в надо в Word


Vsevolod   (2004-09-30 18:58:00) [8]

procedure TForm1.Button1Click(Sender: TObject);
var ItemIndex, Docs:olevariant;
oldstr,newstr,replase:olevariant;
t1:boolean;
facnum,i,i1,i2,i3:longint;
str:string;
begin

   itemIndex := 1;
   Wordapplication.Connect;
   groups.Open;
   spec.Open;
   student.Open;
   groups.FetchAll;
   spec.FetchAll;
   if wordapplication.Visible=false then
   Wordapplication.Visible := True;
   WordApplication.Caption := 'Ïðèêàç î ôîðìèðîâàíèè ãðóïï';
   Docs := WordApplication.Documents;
   Docs.Add(template);
   WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));
 
 spec.Filtered:=false;
 facnum:=strtoint(combobox1.Text);
 spec.Filter:='FAC='+inttostr(facnum);
 spec.Filtered:=true;
 spec.First;
 for i1:=1 to spec.RecordCount do
 begin

   groups.Filtered:=false;
   groups.Filter:='SPECCODE='+inttostr(spec.FieldValues['SPEC']);
   groups.Filtered:=true;
   groups.First;
   for i2:=1 to groups.RecordCount do
   begin
     student.Filtered:=false;
     student.Filter:='GROUPID='+inttostr(groups.FieldValues['GROUPID']);
     if (radiobutton1.Checked)
       then student.Filter:='('+student.Filter+')and (OBUCHCODE='+inttostr(1)+')'
       else student.Filter:='('+student.Filter+')and (OBUCHCODE='+inttostr(2)+')';
     student.Filtered:=true;
     student.First;
     i:=0;
     str:='Ñïåöèàëüíîñòü '+spec.FieldValues['SPEC']+' ãðóïïà '
     +inttostr(groups.FieldValues['GROUPNO']);
     worddocument.Range.InsertAfter(#13);
     worddocument.Range.InsertAfter(str);
     worddocument.Range.InsertAfter(#13);
     groups.Next;
     label3.Caption:=inttostr(i2);
   end;
 spec.Next;
 label2.Caption:=inttostr(i1);
 end;
end;


1008   (2004-09-30 10:12:00) [9]

Vsevolod  (30.09.04 02:33)

Я использую IBQuery - может не очень рационально, зато я точно знаю, что он делает. Сам формирую запрос - сам ответственен за результат.


msguns   (2004-09-30 09:32:00) [10]

А почему таблицу - и в Ворд ? А не в Ексель ? С таблами в последнем работать намного удобнее.


Zacho   (2004-09-30 08:03:00) [11]

Типичная "ошибка в 17-й строке". Телепатов здесь нет, код показывай и/или более конкретно объясняй проблему.
P.S. IB 6 использовать не стоит - слишком глючен. Переходи на FB.


Наверх

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