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

Вниз

Неправильно работает фильтр!   Найти похожие ветки 

 
DimDim ©   (2006-01-12 14:13) [0]

Уважаемые Мастера, первый раз такое вижу и 2-й день не могу разобраться:

Пишу:
if Table1.Filtered=True then Table1.Filtered:=False;
Table1.Filter:="NumGrup=3";
Table1.Filtered:=True;


Поле NumGrup : Integer;
При этом фильтрация выполняется совсем по другому полю, а именно по полю AUTO : AutoInc.
Т.е. в результате всегда только одна запись с соответствующим номером в AUTO.

Это что такое и как с этим бороться?


 
DimonS ©   (2006-01-12 14:24) [1]

then Table1.Filtered:=False;

По-моему, тута собака и зарыта. Сам так нарывался. Сделай
then Table1.Filtered:=true; тогда и попробуй.


 
evvcom ©   (2006-01-12 14:25) [2]


> if Table1.Filtered=True then

:)
Зачем булево выражение сравнивать с булевой константой? Достаточно просто
if Table1.Filtered then
Но в данном случае (в [0]) этот if вообще не нужен.

> Это что такое и как с этим бороться?

Видимо, искать ошибку где-то в другом месте.


 
Reindeer Moss Eater ©   (2006-01-12 14:30) [3]

Это что такое и как с этим бороться?

Это обман зрения.
Фильтруем обну таблицу, а смотрим в другую


 
DimonS ©   (2006-01-12 14:34) [4]

То evvcom ©  
Согласен. Незачем делать Table1.Filtered:=False;
Фильтр и без этого неплохо работает.


 
DimDim ©   (2006-01-12 15:15) [5]

Дык, без первой строки та же хрень!
Специально, для наглядности, временно приклеил на форму Грид и кнопку с указанным кодом. Запускаю программу - в Гриде вся таблица. Нажимаю на кнопку и уже раз 58-й удивляюсь - осталась только одна запись с этим номером! (Первую строку убрал).


 
DimonS ©   (2006-01-12 15:21) [6]

То DimDim ©  

Для проверки сделай так.
Брось на форму тот же Edit1.
далее:
если писать по-твоему, то:

if Table1.Filtered=True then Table1.Filtered:=False;
Table1.Filter:="NumGrup=3";
Table1.Filtered:=True;

Edit1.Text:=Table1.Filter;

И проверь, какое поле у тебя фильтруется. Вот и все!


 
Johnmen ©   (2006-01-12 15:26) [7]

>удивляюсь - осталась только одна запись с этим номером!

Отсюда вывод - в НД только одна запись удовлетворяет выражению фильтра.


 
DimDim ©   (2006-01-12 15:51) [8]

> Edit1.Text:=Table1.Filter;
> И проверь, какое поле у тебя фильтруется. Вот и все!


Сделал. Чудес не произошло. в Едите NumGrup=3.
В отфильтрованной строке поле NumGrup=1, поле AUTO=3 (ну, или то число, которое указано в фильтре).
Вообще, в наборе данных и в Table порядок полей отличается. Может поэтому???


 
DimonS ©   (2006-01-12 16:01) [9]


> Вообще, в наборе данных и в Table порядок полей отличается.
>  Может поэтому???


В смысле, отображается не то, что в TTable? или как? И как отображается НД?


 
Johnmen ©   (2006-01-12 16:03) [10]

>Вообще, в наборе данных и в Table порядок полей отличается. Может поэтому???

Нет.

>В отфильтрованной строке поле NumGrup=1
>Чудес не произошло.

Чудес произошел! :)

А какие там у тебя поля в НД? И какой компонент "владелец" НД?


 
evvcom ©   (2006-01-12 16:57) [11]

ты в design-time пробовал такое же? Попробуй. Оставь run-time пока, может в рантайме у тебя еще где-то фильтр меняется.


 
Reindeer Moss Eater ©   (2006-01-12 17:15) [12]

Reindeer Moss Eater ©   (12.01.06 14:30) [3]
Это что такое и как с этим бороться?

Это обман зрения.
Фильтруем обну таблицу, а смотрим в другую


 
DimDim ©   (2006-01-12 23:00) [13]

> Это обман зрения.
> Фильтруем обну таблицу, а смотрим в другую


Я, конечно, хорошо отметил Новый год и Рождество, но не до такой же степени...

Для неверующих:
Сделал отдельный проект.
Выложил на форму DBISAMTable, DataSource, Грид, Едит и кнопку.
(из DBISAMTable удалил Lookup и Calculated поля, а остальное полностью едентично).
В onActivate:
 TableM_Rep.Open;
В onClick кнопки:
 TableM_Rep.Filter:="NumGrup=4";
 TableM_Rep.Filtered:=True;
 Edit1.Text:=TableM_Rep.Filter;


Та же хрень!

Это все с исходниками здесь: http://www.Belstroyka.narod.ru\Test\TestM_Rep.zip (должны быть установлены движки DBISAM v4.0).
EXE работает без движков.


 
DimDim ©   (2006-01-12 23:27) [14]

Исходники еще здесь: http://www.Belstroyka.narod.ru\Test\TestM_Rep.rar (если zip не читается)


 
DimDim ©   (2006-01-12 23:31) [15]

ой, извините, WWW. - не надо.
http://Belstroyka.narod.ru\Test\TestM_Rep.zip
http://Belstroyka.narod.ru\Test\TestM_Rep.rar


 
DimonS ©   (2006-01-13 06:38) [16]

Format C: /s
Далее Install Delphi
:)


 
DimDim ©   (2006-01-13 10:26) [17]

А может, заодно, и комп поменять???


 
asafr ©   (2006-01-13 13:38) [18]

Попробуй ка этоже самое, но с TQuery... :)
select * from Table
where NumGrup=3


 
DimonS ©   (2006-01-13 14:37) [19]

То DimDim ©  
Скинь, плз, мне на мыло свою БД, если небольшая.
Просто самому стало интересно, как это у тебя происходит!

А вообще, попробуй сделать, как тебе сказали в [18]. Это уже точно покажет ошибку (или не ошибку).


 
DimDim ©   (2006-01-18 11:51) [20]

После удаления Primary индекса фильтр стал работать как надо. Но для того, чтобы его удалить пришлось удалять все остальные индексы, иначе данные в таблице исчезали (т.е. записи оставалить, а в них - пустота)!

Никого так сильно не удивляет работа программы как ее разработчика!


 
DimonS ©   (2006-01-19 15:30) [21]


> DimonS ©   (13.01.06 14:37) [19]
> То DimDim ©  
> Скинь, плз, мне на мыло свою БД, если небольшая.
> Просто самому стало интересно, как это у тебя происходит!
>
>
> А вообще, попробуй сделать, как тебе сказали в [18]. Это
> уже точно покажет ошибку (или не ошибку).


мне интересно!!! :)
Скинь БД, плз!


 
Рустем ©   (2006-01-19 16:52) [22]


> После удаления Primary индекса фильтр стал работать как
> надо

Иногда переиндексация помогает... :)


 
SilverAlex ©   (2006-01-22 13:12) [23]

есть обработчик события TDataSet.OnFilterRecord посоветую пользоваться ним. Тот же фильтр, но надежней и гибче. Со свойством Filter не раз наблюдал галюны. А если датасет нестандартный, то тем более актуально.


 
zwsoft ©   (2006-01-22 21:08) [24]

Поле NumGrup должно иметь индекс

Table1.Close;
Table1.Filtered := true;
Table1.IndexName := "idx_NumGrup";
Table1.Open;

используй
OnFilterRecord event  в  Table1  в Object Inspector

procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
Accept := DataSet["NumGrup"] = 3 ;
end;


 
аматор ©   (2006-01-22 23:15) [25]

Привет...
Я, наверное, профан но почему ругать компонент: скачал, посмотрел, офиге...(это базу). Ничего себе структура таблицы (особено индексы :)). Зачем их сколько я в ужасе (не я понимаю быстрее поиск и т.д. и т.п.) но если есть возможность работы с запросами конечно индексы нужны, но основной индекс который, по идее, должен быть в единственном экземпляре - это кажись, уникальное поле, ну эт, наверное не три поля, хотя давайте запихнем десять или двадцать и может глюки вообще исчезнут. Хотя правильно: давайте будем ругать компоненты (там их всего десятка два програмеров делали и без понятия чёт писали). Между прочим, с оочень большим понятием: их dbsys.exe мне сподобался: удобен и лишнего нет. А вывод из всей моей ахинеи: пересмотри структуру таблицы (особено уникальное поле). Ссори если не много грубовато (я этот dbisam качал долго оф..... мона, а структуру увидел оф.. полностью). Может я не прав.


 
zwsoft ©   (2006-01-22 23:41) [26]

аматор, а ирокеза на башке у тебя нет случяйно?
ты менше травку кури, а читай книжек больше


 
zwsoft ©   (2006-01-23 00:35) [27]

это конечно шутка, так что не обижайся...


 
аматор ©   (2006-01-23 09:15) [28]

zwsoft - :) , а при чём тут индейцы, я что не прав? Если да то поясните плиз как можно создавать уникальное поле (при этом значение поля повторяется, я считаю, что NumGrup никак не может быть уникальным (Primary)) . Выкинте NumGrup из Primary и фильтр будет работать. И я настаиваю, пересмотрите структуру таблицы. Да насчёт книжек: в одной умной книге сказано Primary-уникальное и первое поле, далее идут индексный поля, потом обычные. К сожаленью в таблице этого я не увидел. Я опять извиняюсь за возможную грубость. zwsoft-насчет ирокеза Вам какой: большой, маленький, цветной...


 
zwsoft ©   (2006-01-23 11:50) [29]

уникальное поле - да все значения уникальны ( не могут повторятса ) и только такое поле может стать первичным клюуем таблицы
а фильтр можно поставит на любом поле ( на первичном тоже ) но при условии чо поле имеет свой индекс (secondary ) и до включения фильтра этот индекс станет текщим для таблицы ( Paradox )
с ирокезом я конечно пошутил, извиняюь...


 
DimDim ©   (2006-01-23 11:53) [30]

Дык, уже переделал структуру (а что делать!), а заодно и переписал примерно 28 страниц кода.
Согласен, что структура таблицы дурная (была). Все из-за того что программа существует уже 6 лет и постоянно (практически, каждую неделю) дорабатывается, меняется и т.д. Предусмотреть сразу все как должно быть - нереально. Я, пока, даром предсказания не обладаю. А выполнять нормальные корректировки баз - проблематично, т.к. программа работает примерно в 300 организациях и обслуживается через дилерскую сеть. Программно корректировки не всегда удается выполнить, да и опасно - иногда данные "улетают" (тогда столько интересного осебе узнаешь!). Лучше ручками. Поэтому, базы стараюсь без острой необходимости не изменять.


 
atruhin ©   (2006-01-23 14:22) [31]

>>а фильтр можно поставит на любом поле ( на первичном тоже ) но при >>условии чо поле имеет свой индекс
Это с каких же пор? Индекс стал иметь отношение к фильтру?


 
аматор ©   (2006-01-23 20:19) [32]

ирокез мелочь, меня и кротом и синичкой звали (прикольно), может ещё чё придумают :).
"чо поле имеет свой индекс (secondary ) и до включения фильтра этот индекс станет" в таблице я этого, кажись, не заметил (может плохо смотрел), иль оно там спряталось :).
[31] - похоже там именно так (уверености нет, может компонент такой (но факт остался - выбирается тока первая запись), попробую подобное у себя (интересно очень).
[30] - первичное поле краше делать авто... (ну это дело разработчика). А для Вашего варианта наверное, если нужен такой сложный индекс (как у Вас первичный (3 поля для меня многовато будет и тем более с повторением значений (б.. формулировку забыл), (может я книжки не те читал)) может его сделать обычным индексом, а первичным сделать авто. поле.

А компонент прикольный, тока бабки надо.......


 
аматор ©   (2006-01-23 22:12) [33]

http://sergamateur.narod.ru/Arh.rar - это не есть решением проблемы, но вариант (нажимаем кнопку 1 раз :) и фильт работает и индексы есть, кажись), а про фильтр посмотрите, плиз, в помощи (зачем её пишут) там я, мельком, о фильтре читал (много интересного увидел). Только я не понял: при простой перестройке индексов как мона повлиять на данные таблицы? Конечно, если структуру таблицы менять, и то не очень, тем более если база есть и работает можна работать с индексами без ущерба таблице (и не трогая структуру таблицы).



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

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

Наверх




Память: 0.54 MB
Время: 0.013 c
2-1140553896
Wel
2006-02-21 23:31
2006.03.12
TImage


4-1134578377
La_Grange
2005-12-14 19:39
2006.03.12
Работа с системным динамиком)


15-1139922163
Styx_
2006-02-14 16:02
2006.03.12
Вот кому Борланд продал Delphi :)


15-1140033510
Yeg
2006-02-15 22:58
2006.03.12
Геометрия - задача


3-1137503688
Бульбаш
2006-01-17 16:14
2006.03.12
Ограничение макс. значения поля.





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