Текущий архив: 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.54 MB
Время: 0.006 c