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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.005 c
4-1204619883
Тфьу
2008-03-04 11:38
2009.01.18
Как узнать высоту заврапленного текста?


1-1206525888
Still Swamp
2008-03-26 13:04
2009.01.18
CustomDrawSubItem как получить Rect?


1-1205913105
Aleksandr
2008-03-19 10:51
2009.01.18
dll, получить события самого приложения


2-1228715571
lex123
2008-12-08 08:52
2009.01.18
Соединение с интернет


2-1228213679
Sasha
2008-12-02 13:27
2009.01.18
TServerSocket и интернет





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