Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1097833779
Артем К.
2004-10-15 13:49
2004.10.31
Как реализовать следующую штуку?


3-1096598953
Alex_V
2004-10-01 06:49
2004.10.31
Сохранение результатов запроса


1-1098101217
Кабан
2004-10-18 16:06
2004.10.31
Команда xlat


3-1096646480
Slaga
2004-10-01 20:01
2004.10.31
Мне нужно в ДатаСете перейти на определенную порядковую позицию (


14-1097664594
Demetrius2003
2004-10-13 14:49
2004.10.31
Исходник joiner a





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