Главная страница
    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]

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


 
clickmaker ©   (2008-12-02 17:46) [41]

> [38] linox   (02.12.08 17:28)
> если можно,... то кинуть код )

а в [20] и [34] что?


 
linox   (2008-12-02 17:53) [42]

[34]
Edit := TEdit(FindComponent("Edit" + IntToStr(i)));
FindComponent - программа не знает


 
clickmaker ©   (2008-12-02 17:56) [43]

> FindComponent - программа не знает

то есть?


 
MsGuns ©   (2008-12-02 18:03) [44]

Для сортировки в АДО не нужны ни индексы, ни запросы
Вполне достаточно присвоить св-ву TCustomADODataSet.Sort строку, перечисляющую имена нужных полей в SQL-манере
Например: TADOTable1.Sort := "Pole1, Pole2, Pole3 DESC"

Хотя все, что здесь сказано по поводу "порочности" компонент TXXTable, правильно :)


 
sniknik ©   (2008-12-02 18:13) [45]

> Для сортировки в АДО не нужны ни индексы, ни запросы
> Вполне достаточно присвоить св-ву TCustomADODataSet.Sort строку
это создание локального индекса и есть. просто оно вот так просто делается (в отличии от клиентского датасета, там нужно явно задавать)


 
sniknik ©   (2008-12-02 18:19) [46]

> Например: TADOTable1.Sort := "Pole1, Pole2, Pole3 DESC"
и после
ShowMessage(TADOTable1.IndexFieldNames)


 
linox   (2008-12-02 18:30) [47]

я уже шото запутался... что в каком событии должно быть?? Еще раз: я условия фильтрации задаю в едитах. У меня выборка по одному полю делается, если начинаю подлючать другое поле (нужен выбор из оставшихся) оно сбивает прошлый отбор и начинает новый по новому полю. Нужно делать выборку по нескольким полям


 
clickmaker ©   (2008-12-02 18:32) [48]

> [47] linox   (02.12.08 18:30)

так... чукча похоже не читатель
в [20] и [34] дан намек, как можно "слепить" условия хоть из 20 эдитов. Используя " and "


 
linox   (2008-12-02 18:37) [49]

еще раз в (34)
Edit := TEdit(FindComponent("Edit" + IntToStr(i)));
FindComponent - что это?...
[Error] Unit1.pas(106): Undeclared identifier: "findcomponent"


 
clickmaker ©   (2008-12-02 18:43) [50]

> [49] linox   (02.12.08 18:37)

а F1 не нажать на нем?
в каком методе ты этот код используешь?


 
MsGuns ©   (2008-12-02 19:34) [51]

Фильтрация даст побочные эффекты - правильное решение это переход на TADODataSet и динамическое формирование текста запроса с учетом "фильтра". А с SQL все равно рано или поздно придется познакомиться - по сравнению с дельфей - это абсолютная "легкотня" :)
Про сортировку в АДО уже говорено выше - не читаем ?


 
Anatoly Podgoretsky ©   (2008-12-02 19:55) [52]

> linox  (02.12.2008 17:28:38)  [38]

Тебе опасно давать код, вдруг на работу примут.


 
linox   (2008-12-03 09:50) [53]

та это не на работу.... ) девушка попросила сделать ей....
сиквел начну изучать, после того, как доделаю эту прогу, обещаю )))
2 clickmaker:
использую в той функции, которую ты мне скинул (function BuildFilter: string;)


 
Anatoly Podgoretsky ©   (2008-12-03 09:59) [54]

> linox  (03.12.2008 9:50:53)  [53]

Бедная девушка.


 
linox   (2008-12-03 10:10) [55]

2 Anatoly Podgoretsky: я понимаю, что Вам вприкол издеватся,.. но давайте все же по делу... это не форум петросяна


 
Palladin ©   (2008-12-03 10:23) [56]


> Anatoly Podgoretsky ©   (03.12.08 09:59) [54]

Ну почему сразу бедная. Просто сделала не верный выбор :)


 
Anatoly Podgoretsky ©   (2008-12-03 11:09) [57]

> Palladin  (03.12.2008 10:23:56)  [56]

А выбор плачет на форуме.


 
clickmaker ©   (2008-12-03 11:12) [58]

> [53] linox   (03.12.08 09:50)

не понимаю, что так трудно дотянуться до F1 и почитать уже.
Ты бы девушку тогда сразу сюда присылал. От тебя ей толку мало будет, я так чувствую


 
Anatoly Podgoretsky ©   (2008-12-03 11:52) [59]

> clickmaker  (03.12.2008 11:12:58)  [58]

Зачем нам кузнец, нам кузнец не нужен.


 
sniknik ©   (2008-12-03 12:30) [60]

> сиквел начну изучать, после того, как доделаю эту прогу, обещаю )))
благими намерениями...

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

> я понимаю, что Вам вприкол издеватся,.. но давайте все же по делу... это не форум петросяна
это вопрос петросяна, вот все и радуются, когда и где еще придется...

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



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

Форум: "Начинающим";
Текущий архив: 2009.01.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.007 c
2-1228294295
NieL
2008-12-03 11:51
2009.01.18
Сохранение геометрических параметров формы


15-1227340742
palva
2008-11-22 10:59
2009.01.18
Чернобыльская зона отчуждения


2-1228379830
b@v
2008-12-04 11:37
2009.01.18
База данных


2-1228379285
linx
2008-12-04 11:28
2009.01.18
Функция округления до данного знака.


15-1227268072
newbie
2008-11-21 14:47
2009.01.18
Dcu to pas





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