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

Вниз

Проблема с БД   Найти похожие ветки 

 
Vsevolod   (2004-09-30 02:33) [0]

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


 
Zacho ©   (2004-09-30 08:03) [1]

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


 
msguns   (2004-09-30 09:32) [2]

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


 
1008 ©   (2004-09-30 10:12) [3]

Vsevolod  (30.09.04 02:33)

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


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

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;


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

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


 
Zacho ©   (2004-09-30 20:05) [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 21:10) [7]

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


 
Zacho ©   (2004-09-30 22:54) [8]

Сразу хочу дать небольшой совет - выкини 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-10-01 18:57) [9]

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


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

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


 
Zacho ©   (2004-10-01 20:25) [11]

Vsevolod   (01.10.04 18:59) [10]

ExtractFileDir(Application.ExeName)



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.338 c
14-1097499560
Xmen
2004-10-11 16:59
2004.10.31
Unistall Delphi


10-1056018991
landy
2003-06-19 14:36
2004.10.31
Вызов метода сервера через SocketConnection


14-1097718843
Думкин
2004-10-14 05:54
2004.10.31
С днем рождения! 14 октября


14-1097268788
Mishenka
2004-10-09 00:53
2004.10.31
Где можно скачать библиотеку Jedi?


3-1096459367
Bless
2004-09-29 16:02
2004.10.31
Почему парсер в queryAnalizer-е выдает ошибку