Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];

Вниз

Проблема с фильтрацией TTable.   Найти похожие ветки 

 
Solod   (2002-05-31 10:30) [0]

Добрый день, уважаемые Мастера.
Помогите, пожалуйста, разобраться со следующей проблемой.
1. Открываю TTable и устанавливаю фильтр.
2. Открываю Отчёт, в котором TQuery повторяет тот же набор данных, что и в TTable.
3. Закрываю Отчёт, TQuery.Active:=False.
4. В TTable меняю фильтр и при Filtered:=True происходит ошибка.
Причём я не могу понять её природу(try тоже не срабатывает), а компилятор выдаёт состояние регистров CPU(насколько
я понимаю, а я, честно говоря, ничего не понимаю - не дорос ещё).
Ещё интересное замечание: при TTable.Exclusive=False ошибка не выходит.
БД - файлы FoxPro.


 
Solod   (2002-06-03 04:15) [1]

Здравствуйте, с наступлением лета.
Всё таки, помогите, пожалуйста, решить мою проблему.


 
skiph   (2002-06-03 04:55) [2]

Перед изменением фильтра делай Filtered:=False, а уже после изменения - Filtered:=True; - может помочь.
А вообще какой фильтр ставишь?


 
SoloD   (2002-06-03 05:53) [3]

То, что Filtered:=False, это само собой. Я так и делаю.
Фильтр простой "Filter:="NOMDOK="+cbNomReport.Text".
Поле NOMDOK строка, длина 6.
И действия эти осуществляю в обработчике cbNomReportChange.


 
skiph   (2002-06-03 06:43) [4]

Если значение строковое, то нужно его в кавычки брать:
Filter:="NOMDOK="+chr(39)+cbNomReport.Text+chr(39)


 
SoloD   (2002-06-03 08:27) [5]

А почему это проходит в первый раз, когда ещё не открывал отчёт, а во второй раз выдаётся ошибка, да ещё неизвестно какая?


 
skiph   (2002-06-03 09:08) [6]

Я так понимаю под отчетом ты понимаешь запрос. А какое значение фильтра ты устанавливаешь в первый раз?


 
SoloD   (2002-06-03 09:24) [7]

Да, отчёт - это запрос. Фильтр тот же.
Более того, обработчик cbNomReportChange выполняется успешно
сколько угодно раз, пока не откроешь отчёт.


 
Бежечаночка   (2002-06-03 10:41) [8]

Так у тебя первый фильтр наверно стоит в Инспекторе при дизайне, поэтому и работает.


 
SoloD   (2002-06-04 06:28) [9]

Да нету у меня фильтра в Инспекторе.
Даже если бы было так, то как бъяснить, что,повторяюсь: "обработчик cbNomReportChange выполняется успешно сколько угодно раз, пока не откроешь отчёт" или,как правильно заметил skiph, отчёт - это запрос.


 
skiph   (2002-06-04 10:37) [10]

Ну если в первый раз проходит, то и во второй должен. А вообще что система кричит?


 
SoloD   (2002-06-04 11:27) [11]

Система ничего не кричит.
Кстати, пробовал chr(39) тот же эффект: ни пользы, ни вреда.
Да ещё, что интересное, ошибка может и не возникнуть, а может возникнуть.
У пользователей она возникает постоянно и просто молча закрывает приложение.
Я ничего не понимаю.


 
skiph   (2002-06-04 11:37) [12]

Что так просто вылетает без сообщений?


 
Johnmen   (2002-06-04 11:52) [13]

Под W2K такое может быть (без предупреждения).
Пройдись с трассировкой, чтобы найти ошибку...


 
DmitryS   (2002-06-04 12:11) [14]

Попробуй
Filter:="[NOMDOK]="+chr(39)+cbNomReport.Text+chr(39),
я обычно имена полей всегда закрываю квадратными скобками (для TTable)и все работает без проблем


 
SoloD   (2002-06-04 12:28) [15]

И квадратные скобки не помогают.


 
SoloD   (2002-06-04 12:39) [16]

Ошибку выдаёт Debugger:
"Project C:\Banks.exe faulted with message: "access violation at 0x4de3b711: read of address 0xf1312be8". Process Stopped. Use Step or Run to continue."
и далее информация CPU и всё. Я ничего не понимаю.


 
roottim   (2002-06-04 12:47) [17]

>Ещё интересное замечание: при TTable.Exclusive=False ошибка не выходит

а захват таблицы(Exclusive=true)... c запросом разве не конфликтуют?


 
SoloD   (2002-06-04 13:00) [18]

TTable.Exclusive=True с запросом не конфликтует.
А разве запрос на выборку может конфликтовать?


 
Vint   (2002-06-04 17:06) [19]

Попробуй написать так:
Filter:="NOMDOK="+""""+cbNomReport.Text+""""

или попробуй вместо FoxPro использовать dbase или Paradox, хотя бы ради эксперемента, будет вылетать ошибка или нет?


 
skiph   (2002-06-05 03:40) [20]

Напиши код программы, может в нет какие загвоздки.


 
SoloD   (2002-06-05 05:17) [21]

На вопрос Vinta.
При добавление "" компилятор сразу ругается на синтаксис.
Отказаться от FoxPro я не могу: моя программа лишь маленькая примочка к большой работающей БД.

На вопрос skipha.
Вот полный код модуля:

procedure TfmChangeReport.RefreshReport;
var SumGod: Currency;
i: Byte;
begin
SumGod:=0;
i:=0;
with tbBbank do
begin
First;
while NOT EOF do
begin
SumGod:=SumGod+FieldByName("GOD").AsFloat;
inc(i);
Next
end;
First
end;
lb13.Caption:=FloatToStrF(SumGod, ffCurrency,100,2);
DBCtrlGrid1.RowCount:=i
end;

procedure TfmChangeReport.dtpDateReportCloseUp(Sender: TObject);
var fName, fNameNew, Strg: String;
begin
with tbBbank do
begin
if Active then Active:=False;
if Filtered then Filtered:=False;
end;
if pn2.Visible then pn2.Visible:=False;
if pn1.Visible then pn1.Visible:=False;
if DBCtrlGrid1.Visible then DBCtrlGrid1.Visible:=False;
if cbNomReport.Enabled then cbNomReport.Enabled:=False;
if bbPreview.Enabled then bbPreview.Enabled:=False;

ShortDateFormat:="ddmm";
if DateToStr(dtpDateReport.Date)=DateToStr(Date) then
begin
fNameNew:="Bnk"+DateToStr(Date)+".DBF";
fName:=FIni.ReadString("Paths","Bank1Bbank","C:\")+"Bbank.DBF"
end
else
begin
fNameNew:="Bnk"+DateToStr(dtpDateReport.Date)+".DBF";
fName:=FIni.ReadString("Paths","ArhBbank","C:\")+fNameNew
end;
ShortDateFormat:="dd.mm.yyyy";
if FileExists(fName) then
if CopyFile(PChar(fName),PChar(FIni.ReadString("Paths","ChngBbank","C:\")+fNameNew),False) then
begin
with tbBbank do
begin
DatabaseName:=FIni.ReadString("Paths","ChngBbank","C:\");
TableName:=fNameNew;
try
Active:=True;
if (IsEmpty) OR (RecordCount=1) then
MessageDlg("Файл "+FIni.ReadString("Paths","ChngBbank","C:\")+fNameNew+" не содержит записей.",mtInformation,[mbOK],0)
else
begin
First;
Next;
cbNomReport.Items.Clear;
Strg:=FieldByName("NOMDOK").AsString;
Filter:="NOMDOK="+Strg;
cbNomReport.Text:=Strg;
cbNomReport.Items.Append(Strg);
while NOT EOF do
begin
if Strg<>FieldByName("NOMDOK").AsString then
begin
Strg:=FieldByName("NOMDOK").AsString;
cbNomReport.Items.Append(Strg)
end; //if Strg<>FieldByName("NOMDOK")
Next
end; //while NOT EOF
Filtered:=True;
RefreshReport;
pn1.Visible:=True;
pn2.Visible:=True;
DBCtrlGrid1.Visible:=True;
cbNomReport.Enabled:=True;
bbPreview.Enabled:=True;
end //if IsEmpty else
except
on E: EDatabaseError do MessageDlg("!!! Ошибка: [84808965]"+E.Message,mtError,[mbOK],0);
on E: EAbort do MessageDlg("!!! Ошибка: [6D4CC616]"+E.Message,mtError,[mbOK],0)
else
MessageDlg("!!! Ошибка: [79605C4D]. Не предвиденная.",mtError,[mbOK],0)
end //try
end
end //if CopyFile(PChar(fName),PChar(FIni.ReadString("Paths","ChngBbank","C:\")+fNameNew),False)
else
MessageDlg("!!! Ошибка: [5A9A5229]. Копирования файла "+fName+" в файл "+FIni.ReadString("Paths","ChngBbank","C:\")+fNameNew,mtError,[mbOK],0)
else //if FileExists(fName)
MessageDlg("Файл "+fName+" не найден",mtError,[mbOK],0)

end;

procedure TfmChangeReport.FormCreate(Sender: TObject);
begin
dtpDateReport.Date:=Date
end;

procedure TfmChangeReport.cbNomReportChange(Sender: TObject);
begin
if cbNomReport.Items.IndexOf(cbNomReport.Text)=-1 then
begin
MessageDlg("Реестр с номером "+cbNomReport.Text+" отсутствует.",mtError,[mbOK],0);
cbNomReport.Text:=cbNomReport.Items.Strings[0]
end
else
with tbBbank do
begin
Filtered:=False;
Filter:="NOMDOK="+chr(39)+cbNomReport.Text+chr(39);
Filtered:=True;
Refresh
end
end;

procedure TfmChangeReport.bbPreviewClick(Sender: TObject);
begin
with fmReport.qrBank1 do
begin
DatabaseName:=tbBbank.DatabaseName;
with SQL do
begin
Append("FROM "+tbBbank.TableName);
Append("WHERE NOMDOK=""+cbNomReport.Text+""")
end;
Active:=True;
end;
fmReport.Report.Preview;
with fmReport.qrBank1 do
begin
Active:=False;
SQL.Delete(2);
SQL.Delete(1)
end


 
skiph   (2002-06-05 06:34) [22]

Так погоди! При создании формы ты значение параметра заключаешь в кавычки: Filter:="NOMDOK="+chr(39)+cbNomReport.Text+chr(39);
А во второй раз нет: Filter:="NOMDOK="+Strg;


 
SoloD   (2002-06-05 09:36) [23]

Вообщето, skiph, chr(39) я поставил после твоего совета. Я с таким же успехом убираю её, и ничего не изменяется.


 
skiph   (2002-06-05 10:04) [24]

А не должно.... :\ Если с ковычками (для стринговых полей), то ты выбираешь записи с определенным значением поля, в противном случае ты приравниваешь два поля


 
skiph   (2002-06-05 10:05) [25]

Поставь ковычки и снова попробуй


 
SoloD   (2002-06-05 11:20) [26]

Ковычки - chr(39) не помогают.
Я сам не понимаю, почему всё работает одинаково с ними и без них.
Всётаки дело не в них и, я думаю, можно оставить их в покое. Ошибка явно кроется где-то в другом, НО вот вопрос - ГДЕ?


 
Val   (2002-06-05 11:40) [27]

>SoloD © (05.06.02 11:20)
их нельзя "оставить в покое", вы ведь программированием занимаетесь, а не крестиком вышиваете? Строковое значение для фильтра должно быть в кавычках.


 
SoloD   (2002-06-05 11:53) [28]

>Val, я имею ввиду, что в этой ситуации не в ковычках дело. А за замечание спасибо, так нас и надо неопытных.

Только что обнаружил: ошибка происходит если файл-DBF, расположен на сетевом диске. При работе с локальным диском ошибка отсутствует.
Сеть - NetWare.


 
Val   (2002-06-05 12:07) [29]

>SoloD © (05.06.02 11:53)
так нас и надо неопытных.
не стоит обижаться, это просто призыв к внимательности.
а что у вас по поводу настроек BDE?


 
SoloD   (2002-06-05 12:38) [30]

>Val, я и не обиделся.

Alias"ы я не использую, а в имени БД прописываю полное имя, т.е. путь. Исправил только кодировку на Рус и в Configuration\INIT\ DefaultDriver = FoxPro.


 
Val   (2002-06-05 13:51) [31]

LOCAL SHARED=TRUE?


 
skiph   (2002-06-06 04:46) [32]

Путь-то какого типа? \\Server\Shared\table.dbf или D:\Shared\table.dbf (где D - подключенный сетевой диск). Попробуй второй способ, поскольку в первом случае иногда всякая фигня проскакивает


 
SoloD   (2002-06-06 06:08) [33]

LOCAL SHARED стоял FALSE, но я сейчас попробовал TRUE, то же самое.
Путь указан через подключенный сетевой диск.


 
SoloD   (2002-06-07 05:38) [34]

Попробовал под Win98: Вышла недопустимая ошибка - "Программа вызвала слой при обращение к странице памяти в модуле IDDBAS32.DLL". Что это значит?


 
Val   (2002-06-07 10:41) [35]

ужас какой, а попробуй стандартный драйвер парадокса по умолчанию выставить.


 
SoloD   (2002-06-07 12:45) [36]

Как не печально, не помогает.


 
Val   (2002-06-07 15:20) [37]

Попробуйте на время выполнения запроса все-таки использовать метод LockTable, а не свойство Exclusive.


 
skiph   (2002-06-10 10:27) [38]

а зачем Exclusive нужен, может можно как без него обойтись?


 
SoloD   (2002-06-11 05:39) [39]

Exclusive необходим, но не это важно, а то, что я просто не могу понять природу ошибки.
Способов обхода много и, конечно, самый простой - LockTable и он проходит.

У меня осталось два вопроса:
1. Почему при задании фильтра для текстового поля нет разницы ставлю я ковычки или нет - chr(39). Хотя при отсутствии ковычек должна выходить ошибка?
2. Часто ли вам, господа, приходится сталкиваться с непонятными ошибками, и что в таких ситуациях лучше всего делать?



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

Форум: "Базы";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.006 c
8-9931
Maiki
2002-02-26 18:34
2002.07.04
Вывод текста поверх игрушки (в.т.ч. OpenGL)


1-9858
Exploited
2002-06-20 16:03
2002.07.04
Курсоры.


4-10048
Artemkin
2002-05-06 15:01
2002.07.04
Легкий Quesion about Tbutton.Caption


3-9703
matvey
2002-06-10 21:12
2002.07.04
Запись после выборки


7-10027
der
2002-04-10 11:33
2002.07.04
печать напрямую на LPT.





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