![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с фильтрацией TTable. [D5, Win2k]
Solod © (2002-05-31 10:30:00)Добрый день, уважаемые Мастера.
Помогите, пожалуйста, разобраться со следующей проблемой.
1. Открываю TTable и устанавливаю фильтр.
2. Открываю Отчёт, в котором TQuery повторяет тот же набор данных, что и в TTable.
3. Закрываю Отчёт, TQuery.Active:=False.
4. В TTable меняю фильтр и при Filtered:=True происходит ошибка.
Причём я не могу понять её природу(try тоже не срабатывает), а компилятор выдаёт состояние регистров CPU(насколько
я понимаю, а я, честно говоря, ничего не понимаю - не дорос ещё).
Ещё интересное замечание: при TTable.Exclusive=False ошибка не выходит.
БД - файлы FoxPro.
SoloD (2002-06-11 05:39:00) [1]Exclusive необходим, но не это важно, а то, что я просто не могу понять природу ошибки.
Способов обхода много и, конечно, самый простой - LockTable и он проходит.
У меня осталось два вопроса:
1. Почему при задании фильтра для текстового поля нет разницы ставлю я ковычки или нет - chr(39). Хотя при отсутствии ковычек должна выходить ошибка?
2. Часто ли вам, господа, приходится сталкиваться с непонятными ошибками, и что в таких ситуациях лучше всего делать?
skiph (2002-06-10 10:27:00) [2]а зачем Exclusive нужен, может можно как без него обойтись?
Val (2002-06-07 15:20:00) [3]Попробуйте на время выполнения запроса все-таки использовать метод LockTable, а не свойство Exclusive.
SoloD (2002-06-07 12:45:00) [4]Как не печально, не помогает.
Val (2002-06-07 10:41:00) [5]ужас какой, а попробуй стандартный драйвер парадокса по умолчанию выставить.
SoloD (2002-06-07 05:38:00) [6]Попробовал под Win98: Вышла недопустимая ошибка - "Программа вызвала слой при обращение к странице памяти в модуле IDDBAS32.DLL". Что это значит?
SoloD (2002-06-06 06:08:00) [7]LOCAL SHARED стоял FALSE, но я сейчас попробовал TRUE, то же самое.
Путь указан через подключенный сетевой диск.
skiph (2002-06-06 04:46:00) [8]Путь-то какого типа? \\Server\Shared\table.dbf или D:\Shared\table.dbf (где D - подключенный сетевой диск). Попробуй второй способ, поскольку в первом случае иногда всякая фигня проскакивает
Val (2002-06-05 13:51:00) [9]LOCAL SHARED=TRUE?
SoloD (2002-06-05 12:38:00) [10]>Val, я и не обиделся.
Alias"ы я не использую, а в имени БД прописываю полное имя, т.е. путь. Исправил только кодировку на Рус и в Configuration\INIT\ DefaultDriver = FoxPro.
Val (2002-06-05 12:07:00) [11]>SoloD © (05.06.02 11:53)
так нас и надо неопытных.
не стоит обижаться, это просто призыв к внимательности.
а что у вас по поводу настроек BDE?
SoloD (2002-06-05 11:53:00) [12]>Val, я имею ввиду, что в этой ситуации не в ковычках дело. А за замечание спасибо, так нас и надо неопытных.
Только что обнаружил: ошибка происходит если файл-DBF, расположен на сетевом диске. При работе с локальным диском ошибка отсутствует.
Сеть - NetWare.
Val (2002-06-05 11:40:00) [13]>SoloD © (05.06.02 11:20)
их нельзя "оставить в покое", вы ведь программированием занимаетесь, а не крестиком вышиваете? Строковое значение для фильтра должно быть в кавычках.
SoloD (2002-06-05 11:20:00) [14]Ковычки - chr(39) не помогают.
Я сам не понимаю, почему всё работает одинаково с ними и без них.
Всётаки дело не в них и, я думаю, можно оставить их в покое. Ошибка явно кроется где-то в другом, НО вот вопрос - ГДЕ?
skiph (2002-06-05 10:05:00) [15]Поставь ковычки и снова попробуй
skiph (2002-06-05 10:04:00) [16]А не должно.... :\ Если с ковычками (для стринговых полей), то ты выбираешь записи с определенным значением поля, в противном случае ты приравниваешь два поля
SoloD (2002-06-05 09:36:00) [17]Вообщето, skiph, chr(39) я поставил после твоего совета. Я с таким же успехом убираю её, и ничего не изменяется.
skiph (2002-06-05 06:34:00) [18]Так погоди! При создании формы ты значение параметра заключаешь в кавычки: Filter:="NOMDOK="+chr(39)+cbNomReport.Text+chr(39);
А во второй раз нет: Filter:="NOMDOK="+Strg;
SoloD (2002-06-05 05:17:00) [19]На вопрос 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 03:40:00) [20]Напиши код программы, может в нет какие загвоздки.