Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизПроблема с БД Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c