Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.18;
Скачать: CL | DM;

Вниз

ADOTable + фильтр   Найти похожие ветки 

 
linox   (2008-12-01 13:35) [0]

Добрый день! У меня такой вопрос: есть ADOTable подключенный к базе Access через адоконнекш. У базе есть поле - Дата. Как сделать чтобы записи в таблице упорядовачились по дате автоматически.


 
clickmaker ©   (2008-12-01 13:37) [1]

ADOdataSet
order by в селекте


 
Сергей М. ©   (2008-12-01 13:49) [2]


> linox


Ты не понимаешь разницы между фильтрацией и сортировкой.

Включение  (неважно в каком порядке) в результирующий НД записей, соответствующих неким условиям отбора - это фильтрация.

Упорядочивание записей результирующего НД по каким-либо правилам - это сортировка.


 
linox   (2008-12-01 14:37) [3]

2 Сергей М:
я понимаю.... филтрацию я сделал -

begin
if edit10.Text="" then
 ADOTable1.Filtered:=false
else
 begin
  ADOTable1.Filter:="Дата="""+edit10.Text+"""";
  ADOTable1.Filtered:=true;
 end;

а сортировку не могу....


 
Сергей М. ©   (2008-12-01 14:40) [4]

А индекс по полю даты у тебя вообще существует ?


 
Palladin ©   (2008-12-01 14:40) [5]

как же"ш ты ее сделаешь, коли у тебя дата все время одинаковая...


 
linox   (2008-12-01 15:14) [6]

дата разная..... есть 300 записей.... от 12.10.2008 до 01.12.2008. Записи раскиданы... нужно чтобы новая запись с новой датой добавлялась в конце таблици


 
linox   (2008-12-01 15:34) [7]

2 Сергей М.:
можно попордобней? ключевое поле по "Код"


 
Правильный$Вася   (2008-12-01 15:43) [8]


> нужно чтобы новая запись с новой датой добавлялась в конце таблици

талбицы или отображаемого набора данных?
это  разные вещи
место хранения определяется СУБД, место показа в выборке - тобой


 
Сергей М. ©   (2008-12-01 15:46) [9]


> linox   (01.12.08 15:14) [6]
>
> дата разная


Какая же разная ?
Перевожу тебе на русский то что ты понаписал в строчках

>   ADOTable1.Filter:="Дата="""+edit10.Text+"""";
>   ADOTable1.Filtered:=true;


"Отобрать из таблицы только те записи, в поле "Дата" которых записана такая-то конкретная дата.


> ключевое поле по "Код"


В таблице д.б. индекс (по возрастанию или по убыванию - решать тебе) по полю "Дата".
Имя этого индекса ты cможешь назначить св-ву TADOTable.IndexName.
Решение годится для сравнительно небольших по объему данных таблиц.


 
Anatoly Podgoretsky ©   (2008-12-01 15:47) [10]

> linox  (01.12.2008 15:14:06)  [6]

У Акцесс нет понятия позиция в таблице. Сделай такое поле и работай.


 
linox   (2008-12-01 15:59) [11]

2 Сергей М:
это я написал пример кода фильтрации а мне нужно сделать, сортировку от А до Я (только дату)


 
clickmaker ©   (2008-12-01 16:01) [12]

> А до Я (только дату

может, от Я до Д? -)


 
Сергей М. ©   (2008-12-01 16:02) [13]

Ответы тебе даны - создавай индекс по полю "Дата" и задействуй его тем или иным образом (см. [1] или [9])


 
linox   (2008-12-01 16:16) [14]

2 Сергей М. в свойствах ADOTable в поле IndexName есть только primarykey, ито если его выберать или вписывать туда "Дата" лезет ерор "Текущий проводник не поддердивает необходимый интерфейс для функции Index", а то что написал clickmaker ©   (01.12.08 13:37) [1]
ADOdataSet
order by в селекте
я не могу найти где это есть


 
Сергей М. ©   (2008-12-01 16:22) [15]


> в свойствах ADOTable в поле IndexName есть только primarykey


Чтобы там появился индекс по дате, этот индекс необходимо создать.

Открой свою таблицу в MSAccess в режиме конструктора, в свойствах поля ДАТА укажи , что поле индексированное (допускаются в поле совпадения или не допускаются - тебе лучше знать) и сохрани изменения.


> не могу найти где это есть


"Это" есть на той же закладке АДО-компонентов, где ты имел несчастье обнаружить компонент TADOTable/


 
linox   (2008-12-01 16:31) [16]

спасибо..... и если можно еще один вопрос, уже по фильтрации:
Фильтр идет по нескольким полям: (Дата, название, количество). Как сделать, чтобы я сначала вводил Дату, оставались поля с указаной датой, потом в другой едит вводил название и оставались поля с этой же датой и названием. У меня фильтрует ли одно либо другое. Код:
procedure TForm1.Edit9Change(Sender: TObject);
begin
if edit9.Text="" then
 ADOTable1.Filtered:=false
else
 begin
  ADOTable1.Filter:="Название="""+edit9.Text+"""";
  ADOTable1.Filtered:=true;
 end;
end;

procedure TForm1.Edit10Change(Sender: TObject);
begin
if edit10.Text="" then
 ADOTable1.Filtered:=false
else
 begin
  ADOTable1.Filter:="Дата="""+edit10.Text+"""";
  ADOTable1.Filtered:=true;
 end;
end;


 
Сергей М. ©   (2008-12-01 16:34) [17]


> linox   (01.12.08 16:31) [16]


Выражение, указанное значением св-ва Filter, должно синтаксически  соответствовать WHERE-статье эквивалентного SQL-запроса к конкретной твоей СУБД.


 
linox   (2008-12-01 16:40) [18]

c sql не умею работать и никогда не работал ((


 
Сергей М. ©   (2008-12-01 16:41) [19]


> не умею работать и никогда не работал


А придется.


 
clickmaker ©   (2008-12-01 16:41) [20]

> [16] linox   (01.12.08 16:31)

я бы вынес формирование фильтра в отдельный метод

function BuildFilter: string;
begin
 Result := "";
 if Trim(edit9.Text)<>""  then
   Result := "Название="""+edit9.Text+"""";
 if Trim(edit10.Text) <> "" then
 begin
   if (Result <> "") then Result := Result + " and ";
   Result := Result + "Дата="""+edit10.Text+"""";
 end;
 ...
end;

procedure TForm1.Edit9Change(Sender: TObject); // этот же обработчик подцепить к 10
begin
 ADOTable1.Filter:=BuildFilter;
end;


 
linox   (2008-12-01 16:53) [21]

спасибо... сейчас попробую


 
linox   (2008-12-01 17:00) [22]

только начинаю вводить цифру в поле дата, выдает эрор "Несовпадение типов" и указатель становится на ADOTable1.Filter:=BuildFilter;


 
clickmaker ©   (2008-12-01 17:04) [23]

ну правильно. Надо дождаться ввода хотя бы полной даты
Или подставлять что-то по умолчанию
Скажем, начинаешь вводить день - месяц и год подставляешь текущие


 
clickmaker ©   (2008-12-01 17:05) [24]

а еще лучше - для дат использовать специально обученные компоненты, как DateTimePicker


 
linox   (2008-12-01 17:58) [25]

так я только стаю на поле дата, начинаю вводить и сразу такая ошибка... данные я заполняю через DBGrid,  DateTimePicker там не присунеш....


 
clickmaker ©   (2008-12-01 18:02) [26]

> данные я заполняю через DBGrid

а причем тут Edit10 тогда?


 
linox   (2008-12-01 18:06) [27]

Edit9,10,11, 12 и т.д. я использую для фильтрации полей Adotable, данные из которой отображаются в DBGrid1


 
clickmaker ©   (2008-12-01 18:10) [28]

запутать хочешь?
если для фильтрации, и они отдельно, то причем тут "DateTimePicker там не присунеш"?


 
linox   (2008-12-01 18:12) [29]

)))) ну а как я DateTimePicker привяжу к адотейбл?


 
clickmaker ©   (2008-12-01 18:16) [30]

так же, как и Edit10
только понадобится еще функция DateToStr


 
linox   (2008-12-01 18:49) [31]

ок... посмотрю.... если что напишу ))))


 
linox   (2008-12-02 09:29) [32]

2 clickmaker

я бы вынес формирование фильтра в отдельный метод

function BuildFilter: string;
begin
Result := "";
if Trim(edit9.Text)<>""  then
  Result := "Название="""+edit9.Text+"""";
if Trim(edit10.Text) <> "" then
begin
  if (Result <> "") then Result := Result + " and ";
  Result := Result + "Дата="""+edit10.Text+"""";
end;
...
end;

я что-то не уловил логики (если мне надо сделать ето в десяти едитах)?


 
Anatoly Podgoretsky ©   (2008-12-02 09:33) [33]

> linox  (02.12.2008 9:29:32)  [32]

Логика простая, если 10 то и 10 проверок и конкатенаций


 
clickmaker ©   (2008-12-02 11:11) [34]

> если мне надо сделать ето в десяти едитах

метод можно еще сократить, если написать что-то типа
for i := 1 to EditCount do begin
 Edit := TEdit(FindComponent("Edit" + IntToStr(i)));
 ...


 
Anatoly Podgoretsky ©   (2008-12-02 11:15) [35]

Ты напрасно думаешь, что у него поля ввода фильтра пронумерованы от 1 до 10. Вот прямая речь


> Edit9,10,11, 12 и т.д.


 
sniknik ©   (2008-12-02 12:52) [36]

это... вы решили поиздеваться над человеком? типа пусть помучится, может и поумнеет, сам...

linox
то что ты делаешь это маразм, ADOTable не предназначен для работы! его сомнительное предназначение в переводе программ с BDE Table на ADO ADOTable, типа заменил компонент и все заработало, худо бедно, с потерей производительности, но заработало. и все, больше вариантов применений нет.

прислушался бы к первому совету
> ADOdataSet
> order by в селекте
все бы и работало быстрее и решалось проще, и про локальную сортировку(индекс) уже давно бы кто сказал, а ты все еще с фильтрами бьешься и сортировку видно серверным индексом хочешь  делать. не, так тоже можно, у аксесса есть такой режим, но это гораздо сложнее и запутанее в логике получается, + ограничения (вдруг нужно будет сортировку не имеющему индекса полю сделать?), + это эксклюзивно аксессный вариант, а для начала бы учился классической клиент серверной логике...

> не умею работать и никогда не работал
или учи, или бросай использование баз. нужно по работе? бросай работу, потому что без sql ничего путного у тебя не выйдет. (если только не вернешься/нужны исключительно старые файл серверные технологии, но для этого ты уже неправильную базу/средство доступа выбрал)


 
linox   (2008-12-02 15:30) [37]

2 sniknik:
Так мне не нужна клиент серверная технология... мне просто нужно делать выборку по нескольким полям в базе данных ексес, вот и все... выборка по одному полю делается, если начинаю подлючать другое поле (нужен выбор из оставшихся) оно сбивает прошлый отбор и начинает новый по новому полю


 
linox   (2008-12-02 17:28) [38]

если можно,... то кинуть код )


 
sniknik ©   (2008-12-02 17:32) [39]

> Так мне не нужна клиент серверная технология...
база аксесс в нормальном режиме уже клиент серверная... несмотря на то, что файл базы лежит локально. но оно называется так не по признаку, что где лежит, а по принципам по которым работает.
т.что делай выводы.


 
linox   (2008-12-02 17:46) [40]

ну для професионалов которые здесь на сайте,.. я не думаю что для них сложно помочь сделать, то что я написал по фильтрации



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

Текущий архив: 2009.01.18;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.014 c
2-1228244925
Serg
2008-12-02 22:08
2009.01.18
Статус интернет


15-1227097144
Труп Васи Доброго
2008-11-19 15:19
2009.01.18
Тип данных


1-1206455265
XAOC
2008-03-25 17:27
2009.01.18
проблема при установке indy 10


4-1204619883
Тфьу
2008-03-04 11:38
2009.01.18
Как узнать высоту заврапленного текста?


15-1226873370
wl
2008-11-17 01:09
2009.01.18
сниму коннату в москве или области