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

Вниз

Проблема с фильтрацией 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.013 c
1-9837
VDen
2002-06-21 09:18
2002.07.04
Поиск в TMemo


3-9717
Wassily
2002-06-11 12:07
2002.07.04
Книга по реляционным БД


3-9763
Siv Soft
2002-06-12 14:32
2002.07.04
Как правильно использовать CT-lib и CashedUpdates?


1-9801
ewsd
2002-06-22 09:40
2002.07.04
подчеркивание части строки в RichEdit


8-9928
QueenOfRain
2002-02-27 12:06
2002.07.04
Scanline