Форум: "Начинающим";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
ВнизПроблемы с фильтрацией в Dbgrid Найти похожие ветки
← →
49 Cent (2006-01-17 20:43) [0]У меня есть аксесовский файл и в нем 12 таблиц по количеству месяцев. Там же есть Dbgrid, который связан с DataSource, а DataSource c Adotable.
На форме расположен tabset с закладками. Имя каждой закладки соответсвует именам таблиц. Идея в том, чтобы кликая на закладку загружать в Adotable определенную таблицу.
Делаю это так на событие TabSet1Change:
ADOTable1.Active:=false;
ADOTable1.TableName:=s;
ADOTable1.Active:=true;
, где s имя выделенной закладки в tabset.
Проблема в фильтрации. Сама фильтрация проводится таким кодом:
s:=dbgrid1.SelectedField.FieldName;
s1:=dbgrid1.SelectedField.AsString;
with ADOTable1 do begin
Filtered := False;
Filter := s+"=" + QuotedStr(s1);
Filtered := True;
end;
Идея такой фильтрации в том, чтобы после фильтрации оставлять только те записи, которые были выделены в ячейке dbgrid. Проблема в том, что после смены таблицы, фильтрация проводится криво. И криво потому что данные отображаются без одной строки.
К примеру, если в таблице 2 записи одного клиента, то после фильтрации отображается только 1 запись, хотя следующий код говорит, что в таблице осталось после фильтрации 2 записи:
statusbar1.Panels[1].Text:="Записей:"+inttostr(ADOTable1.RecordCount);
Если покрутить колесиком мышки вверх, а потом вниз, то только в этом случае неожидано появляется запись. Немного помог код: adotable1.Refresh; Однако, он не помогает если в таблице только 1 запись. Я думаю, что проблема в коде
ADOTable1.Active:=false;
ADOTable1.TableName:=s;
ADOTable1.Active:=true;
потому как, первоначально, когда я вручную загрузил таблицу через Object Inspector, фильтр работает как часы. Стоит только с помощью кода:
ADOTable1.Active:=false;
ADOTable1.TableName:=s;
ADOTable1.Active:=true;
загрузить новую таблицу, так сразу начинаются проблемы с фильтрацией. Как это исправить?
← →
Johnmen © (2006-01-17 22:06) [1]Сбрасывать фильтрацию после закрытия набора данных (ADOTable1.Active:=false;)
← →
49 Cent (2006-01-17 22:18) [2]Я -начинающий, поэтому сильно извеняюсь за ламерский вопрос. А набор данных имеется ввиду компонент DataSource? Мне получается код (ADOTable1.Active:=false;) надо на событие AfterClose компонента DataSource добавить?
← →
49 Cent (2006-01-17 22:24) [3]Маленькое уточнение. Т.е набор данных - это как я понял ADOTable1. Сбрасывать фильтрацию надо после закрытия данных. У ADOTable1 есть событие ADOTable1AfterClose. Таким образом, на событие ADOTable1AfterClose я добавил код adotable1.Filtered:=false; , но ничего не происходит. Также косячит.
← →
49 Cent (2006-01-18 00:36) [4]Если не возражаете еще один вопрос! От чего зависит последовательно отображения данных в DBgrid? В аксесовской таблице, с которой я фактически работаю, установлена сортировка по полю ID и соответсвенно все данные отображаются ориентируясь на это поле. Т.е теперь в самом начале таблицы значения ID которых больше всего, а в самом низу самые малые значения. А как бы мне отсортировать Dbgrid также... потому как сейчас в нем все перемешено.
← →
sniknik © (2006-01-18 00:49) [5]ORDER BY поле
в запросе.
Sort:= "поле"
в датасете
IndexName:= "поле"
в ... ан нет, всеодно в датасете, таблицу выкини к чертовой бабушке и забудь о ее существовании (на время пользования ADO... вот вернешся на BDE...)
← →
sniknik © (2006-01-18 00:52) [6]да, обратная сортировка (от большего к меньшему) - DESC везде в конце добавить
← →
49 Cent (2006-01-18 03:07) [7]2 sniknik
Спасибо. С сортировкой разобрался. Как бы еще и фильтр наладить?
← →
sniknik © (2006-01-18 08:34) [8]зачем сбрасывать фильтрацию в событии -> [3]? почему не в коде, ты же там явно закрываеш таблицу перед сменой имени, ну и выставляй Filtered := False;
Filter := ""; сразу после этого.
но почемуто кажется проблема не изза этого, чтото другое. "исчезает" первая запись? (та что должна быть первой) у меня был такой "косяк" при определенных настройках открытия рекордсета асинхронно (не используеш?)... "исчезал" первый пакет (CacheSize), по умолчани. 1-а запись. похоже. но к сожалению повторить не удается. (возможно и не удастся. апдейты системы с тех пор делал, а то был пожоже какойто глюк реализации определенного режема...)
в общем проверь (результат не гарантирую, ну а вдруг)
первое попробуй грубо RecNo:= 1; сразу после открытия
второе если в ExecuteOptions чтонибудь выбирал, убери.
и третье лучше вообше замени компонент "свежим" - TADODataSet, сними с палитры и не меняй никаких настроек по умолчанию... ну кроме CommandText, и Connection это обязательные, попробуй на нем.
← →
evvcom © (2006-01-18 08:58) [9]
> файл и в нем 12 таблиц по количеству месяцев
Интересное решение, довольно древнее правда. А еще есть года. Или история совсем на фиг?
← →
msguns © (2006-01-18 09:47) [10]>evvcom © (18.01.06 08:58) [9]
>Интересное решение..
Угу.. Интересно чрезвычайно еще и тем, что надо бамбук курить при "листании" месяцев, ибо при активации каждой страницы идет переоткрытие таблицы.
Да и вообще решения типа "каждый месяц в отдельной таблице" просто смердят дремучим дилетантством.
← →
49 Cent (2006-01-19 01:10) [11]2 sniknik
Большое спасибо за помощь! Проблема решена.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c