![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с фильтрацией в Dbgrid
49 Cent © (2006-01-17 20:43:00)У меня есть аксесовский файл и в нем 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;
загрузить новую таблицу, так сразу начинаются проблемы с фильтрацией. Как это исправить?
49 Cent (2006-01-19 01:10:00) [1]2 sniknik
Большое спасибо за помощь! Проблема решена.
msguns (2006-01-18 09:47:00) [2]>evvcom © (18.01.06 08:58) [9]
>Интересное решение..
Угу.. Интересно чрезвычайно еще и тем, что надо бамбук курить при "листании" месяцев, ибо при активации каждой страницы идет переоткрытие таблицы.
Да и вообще решения типа "каждый месяц в отдельной таблице" просто смердят дремучим дилетантством.
evvcom (2006-01-18 08:58:00) [3]
> файл и в нем 12 таблиц по количеству месяцев
Интересное решение, довольно древнее правда. А еще есть года. Или история совсем на фиг?
sniknik (2006-01-18 08:34:00) [4]зачем сбрасывать фильтрацию в событии -> [3]? почему не в коде, ты же там явно закрываеш таблицу перед сменой имени, ну и выставляй Filtered := False;
Filter := ''; сразу после этого.
но почемуто кажется проблема не изза этого, чтото другое. "исчезает" первая запись? (та что должна быть первой) у меня был такой "косяк" при определенных настройках открытия рекордсета асинхронно (не используеш?)... "исчезал" первый пакет (CacheSize), по умолчани. 1-а запись. похоже. но к сожалению повторить не удается. (возможно и не удастся. апдейты системы с тех пор делал, а то был пожоже какойто глюк реализации определенного режема...)
в общем проверь (результат не гарантирую, ну а вдруг)
первое попробуй грубо RecNo:= 1; сразу после открытия
второе если в ExecuteOptions чтонибудь выбирал, убери.
и третье лучше вообше замени компонент "свежим" - TADODataSet, сними с палитры и не меняй никаких настроек по умолчанию... ну кроме CommandText, и Connection это обязательные, попробуй на нем.
49 Cent (2006-01-18 03:07:00) [5]2 sniknik
Спасибо. С сортировкой разобрался. Как бы еще и фильтр наладить?
sniknik (2006-01-18 00:52:00) [6]да, обратная сортировка (от большего к меньшему) - DESC везде в конце добавить
sniknik (2006-01-18 00:49:00) [7]ORDER BY поле
в запросе.
Sort:= 'поле'
в датасете
IndexName:= 'поле'
в ... ан нет, всеодно в датасете, таблицу выкини к чертовой бабушке и забудь о ее существовании (на время пользования ADO... вот вернешся на BDE...)
49 Cent (2006-01-18 00:36:00) [8]Если не возражаете еще один вопрос! От чего зависит последовательно отображения данных в DBgrid? В аксесовской таблице, с которой я фактически работаю, установлена сортировка по полю ID и соответсвенно все данные отображаются ориентируясь на это поле. Т.е теперь в самом начале таблицы значения ID которых больше всего, а в самом низу самые малые значения. А как бы мне отсортировать Dbgrid также... потому как сейчас в нем все перемешено.
49 Cent (2006-01-17 22:24:00) [9]Маленькое уточнение. Т.е набор данных - это как я понял ADOTable1. Сбрасывать фильтрацию надо после закрытия данных. У ADOTable1 есть событие ADOTable1AfterClose. Таким образом, на событие ADOTable1AfterClose я добавил код adotable1.Filtered:=false; , но ничего не происходит. Также косячит.
49 Cent (2006-01-17 22:18:00) [10]Я -начинающий, поэтому сильно извеняюсь за ламерский вопрос. А набор данных имеется ввиду компонент DataSource? Мне получается код (ADOTable1.Active:=false;) надо на событие AfterClose компонента DataSource добавить?
Johnmen (2006-01-17 22:06:00) [11]Сбрасывать фильтрацию после закрытия набора данных (ADOTable1.Active:=false;)