Форум: "Начинающим";
Текущий архив: 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