
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Сообщ.
#1
,
|
|
|
Теперь осмелюсь попросить реальной помощи.
В БД Access используя C++ Builder и технологию ADO нужно сделать сортировку и поиск. Как это правельно сделать? И где можно найти описание технологии ADO? Нашел только Хомоненко - Работа С Базами Данных В C++ Builder и то, там одна глава, и я ничего не понял... Больше по этой технологии только обравки информации из форумов. Помогите. Заранее спасибо. |
Сообщ.
#2
,
|
|
|
Как тут уже говорилось телепатов нет (!) по какому критерию поиск, по чему сортировка и т.д.
Цитата kizer @ Как это правельно сделать? Как сделать есть множнство способов, например можеш все сделать через запросы! |
Сообщ.
#3
,
|
|
|
Цитата PIKSEL_IT @ Как тут уже говорилось телепатов нет (!) по какому критерию поиск, по чему сортировка и т.д. Простите меня, просто я новичок. Ну жно сделать поиск по значению взятому с элемента Edit. Например в БД хранится Ф.И.О, место работы и дата рождения. Я делаю отдельную форму на которой есть два отдельных Edit в первый вводится фамлиля, а во второй (ну или только фамилия или только место работы) место работы и программа должна вывести результаты в BDGrid. А сортировка по алфавиту, по месту работу и по дате рождения. Что бы княпочку нажал и мне база вся от самых старых до самых молодых выстроилась))) Помогите, пожалуйста. |
Сообщ.
#4
,
|
|
|
TADOQuery + F1 + поиск по форуму + поиск в инете.
Сортировка - select * from atable ORDER BY afield [asc] - по умолчанию возрастание - select * from atable ORDER BY afield desc - по убыванию, надо указывать явно ЗЫ - никто не запрещает сортировать по двум и более полям - ... ORDER BY afield1, afield2 |
Сообщ.
#5
,
|
|
|
Принцыпе все можно сделать через запросы кидаеш на форму компоненты
ADOConnection ADOQuery ADOTable DataSource Edit и двe Button. Затем в Access создаеш БД, таблицы и т.д. (обязательно заполнить не всю инфу, но достаточное кол-во для тестов!) Затем возвращаешся к Buider и для компонента ADOConnection1 устанавливаеш свойство ConnectionString. Это делаеться так нажимаеш многоточие появляеться окно, вибираеш use Connectiion String и жмеш на кнопку Build там выбираеш Microsoft Jet 4.0 Ole DB Provider и жмеш на кнопку далее потом указываеш путь к БД (абсолютный или относительный как тебе надо). и жмеш ОК! в ADOConnection LodinPromt=false; Потом на компоненте ADOTable в параметре Cinnection выбираеш ADOConnection1, а в свойтве TableName выбираеш имя необходимой таблицы. И параметр Active=true; Компонент DataSource1 свойтво DataSet устанавливаеш в ADOTable1. компонент DBGrid1 свойство DataSource устанавливаеш в DataSource1. Поиск выполнять через ADOQuery1,(подключаеш ADOQuery по аналогии с ADOTable) открываеш Access и пишеш в нем запрос к базе потом запрос отоброжаеш в режиме SQL беоеш код переносиш его в ADOQuery1->SQL и в компоненте DataSource меняеш Dataset на ADOQuery1. Чтобы вернуться обратно меняеш Dataset обратно на таблицу! А сортировку можно вып так (для запроса допишеш сам.) Сортировка будет выполняться при клике на заголовок поля! ![]() ![]() void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column) { ADOTable1->Sort=Column->FieldName+" ASC" then ADOTable1->Sort=Column->FieldName+ " DESC" else ADOTable1->Sort=Column->FieldName+ " ASC"; } |
Сообщ.
#6
,
|
|
|
Цитата PIKSEL_IT @ А зачем ADOConnection? Можно ведь сразу в ADOQuery прописать ConnString. В чем преимущество ADOConnection? Принцыпе все можно сделать через запросы кидаеш на форму компоненты ADOConnection ADOQuery |
Сообщ.
#7
,
|
|
|
Цитата Aracul @ А зачем ADOConnection? Можно ведь сразу в ADOQuery прописать ConnString. В чем преимущество ADOConnection? Почитай литературу! Ответ крайне банален (В данной ситуации). Я исп. ADOConnection поскольку подключаю ещё и ADOTable зачем писать мне два раза connectionstring, а если таких компонентов не 2 а скажем 10 и тебе надо изменить что-то скажем указать путь к другой базе, так меняеш 1 строку, а так 10. |
Сообщ.
#8
,
|
|
|
Цитата PIKSEL_IT @ Принцыпе все можно сделать через запросы кидаеш на форму компоненты ADOConnection ADOQuery ADOTable DataSource Edit и двe Button. Затем в Access создаеш БД, таблицы и т.д. (обязательно заполнить не всю инфу, но достаточное кол-во для тестов!) Затем возвращаешся к Buider и для компонента ADOConnection1 устанавливаеш свойство ConnectionString. Это делаеться так нажимаеш многоточие появляеться окно, вибираеш use Connectiion String и жмеш на кнопку Build там выбираеш Microsoft Jet 4.0 Ole DB Provider и жмеш на кнопку далее потом указываеш путь к БД (абсолютный или относительный как тебе надо). и жмеш ОК! в ADOConnection LodinPromt=false; Потом на компоненте ADOTable в параметре Cinnection выбираеш ADOConnection1, а в свойтве TableName выбираеш имя необходимой таблицы. И параметр Active=true; Компонент DataSource1 свойтво DataSet устанавливаеш в ADOTable1. компонент DBGrid1 свойство DataSource устанавливаеш в DataSource1. Ну с этим у меня хватило ума разобраться. Я уже сделал добавление в базу через Билдер. А вот с поиском буду разбираться. Вот только обои в комнате поклею))) Спасибо всем кто откликнулся. В частности PIKSEL_IT спасибо огромное. Потом доложу о результатах. Спасибо! |
Сообщ.
#9
,
|
|
|
Цитата kizer @ Query, Query и ещё раз Query! А вот с поиском буду разбираться ![]() |
Сообщ.
#10
,
|
|
|
PIKSEL_IT Все, что ты мне ответил, я уже знаю. Ничего интересного не нашел. И заметь, я не собирался критиковать использование ADOConnection, а лишь хотел узнать, есть ли еще какие либо плюсы в использовании этого компонента. ADOConnection я использую, если нужно получить список таблиц в базе данных или нужно окно авторизации. Я считал, что, возможно, кроме перечисленных тобой плюсов, есть более существенные. Лично я довольно редко использую ADOConnection. А строку инициализации нетрудно и вручную назначить компоненту ADOQuery (даже если их будет десять, ИМХО)
![]() ![]() ![]() void __fastcall TForm1::FormCreate(TObject *Sender) { AnsiString bdConn, bdPath; bdConn = "Provider=Microsoft.ACE.OLEDB.12.0;Password=\"\";"; bdConn += "Data Source="; bdPath = GetCurrentDir(); bdPath += "\\BD\\MyBD.mdb;"; //путь к базе данных относительно текущей директории bdConn += bdPath; bdConn += "Persist Security Info=True"; ADOQuery1->ConnectionString = bdConn; ADOQuery1->SQL->Text = "SELECT * FROM Table"; // запрос } kizer Есть много методов для реализации поиска, но я думаю, Вас вполне удовлетворит метод TLocate: ![]() ![]() TLocateOptions SearchOptions; ADOQuery1->Locate("FIO", Edit1->Text, SearchOptions<<loPartialKey<<loCaseInsensitive); // ("Поле для поиска", "Ключ поиска", "Опции поиска") /* SearchOptions - опции поиска: <<loPartialKey - искать частичное совпадение; <<loCaseInsensitive - искать без учета регистра. */ Этот код целесообразно вставить в событие Button OnClick либо в событие Edit OnChange, в зависимости от желаемого результата. Можно и в другие события, на Ваше усмотрение. |
Сообщ.
#11
,
|
|
|
Цитата Aracul @ Твоё ИМХО изменится. И знаешь когда? Тогда, когда тебе придётся заниматься проектированием/реализацией НАСТОЯЩЕЙ БД строку инициализации нетрудно и вручную назначить компоненту ADOQuery (даже если их будет десять, ИМХО) ![]() --- А вот теперь моё ИМХО - коннектиться в FormCreate() - дурной тон. После запуска программы юзер может передумать и просто закрыть её. Так нафих цеплять БД? ![]() |
Сообщ.
#12
,
|
|
|
Aracul а банально книги почитать не пробовал по этой теме, я сказал его конкретное преимущество в данной ситуации, а их намного больше (разрабы тоже не дураки еслибы не надо не писалибы)!
Цитата Aracul @ строку инициализации нетрудно и вручную назначить компоненту ADOQuery А насчет производительности ты подумал десять раз писать подсоединение или перебор компонентов тоже неочень! |
Сообщ.
#13
,
|
|
|
#SI#А где ты увидел коннект?
|
Сообщ.
#14
,
|
|
|
Цитата А вот теперь моё ИМХО - коннектиться в FormCreate() - дурной тон. а где коннектиться? |
Сообщ.
#15
,
|
|
|
PIKSEL_IT, да расслабься ты
![]() ![]() Добавлено Цитата Aracul @ О! Молодец! Таки ты мне нос утёр! #SI#А где ты увидел коннект? ![]() Цитата Alca @ По клику в меню, по кнопке, по событию в самой программе... а где коннектиться? |
Сообщ.
#16
,
|
|
|
#SI# Согласен!
![]() |
Сообщ.
#17
,
|
|
|
#SI#Не спорю, программ имеющих серьезные базы данных не создавал, работаю так, как учили(А обучение закончилось на BDE). И как сам научился. Поэтому и спрашиваю про ADOConnection. Я не говорю, что я мастер, гуру и т.п. PIKSEL_IT еще раз, я лишь хотел получить ответ на вопрос, а не доказывать то, что ADOConnection является лишним.
#SI#, PIKSEL_IT спасибо за ответы. Сделал вывод, что стоит использовать ADOConnection. Цитата #SI# @ Чем плох Query->Locate()? Если отсылаете к книжкам, прошу давать названия этих книжек, а еще лучше, ссылки Отсюда же - и его совет по пользованию Query->Locate(). ![]() |
Сообщ.
#18
,
|
|
|
Цитата Aracul @ Да не плох он. Он - печальное наследие от TTable. Лично я этот метод в Query вообще бы ликвидировал! Чем плох Query->Locate()? ![]() Цитата Aracul @ И что - не рассказали, что такое обучение закончилось на BDE Цитата Aracul @ Сделал вывод, что стоит использовать ADOConnection. ![]() |
Сообщ.
#19
,
|
|
|
Цитата #SI# @ Я сам недавно на Query перешел. Еще не так уж хорошо знаю SQL комманды. Пока что меня устраивает Locate, предельная простота и приемлимая скорость, а мне больше и не надо.Да не плох он. Он - печальное наследие от TTable. Лично я этот метод в Query вообще бы ликвидировал! Цитата #SI# @ Нет, к сожалению не рассказали. Решили наверное, что прикладникам это не пригодится. Буду сам изучать, еще раз спасибо за ответы. И что - не рассказали, что такое TSeeeion и TDatabase? |
Сообщ.
#20
,
|
|
|
Цитата Aracul @ Без знания SQL о серьёзной работе с БД говорить не стоит. Разберёшься. Еще не так уж хорошо знаю SQL комманды ![]() |
Сообщ.
#21
,
|
|
|
Цитата Aracul @ Нет, к сожалению не рассказали. Решили наверное, что прикладникам это не пригодится. а в шоке чему вообще сейчас учат... ![]() |
Сообщ.
#22
,
|
|
|
Приветсвтуйю. Вот такая проблема:
На код сортировки: Цитата PIKSEL_IT @ void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column) { ADOTable1->Sort=Column->FieldName+" ASC" then ADOTable1->Sort=Column->FieldName+ " DESC" else ADOTable1->Sort=Column->FieldName+ " ASC"; } отвечает [C++ Error] Basic_Form.cpp(77): E2316 '_fastcall TForm_basic::DBGrid1TitleClick(TColumn *)' is not a member of 'TForm_basic'. А вот с этим Цитата PIKSEL_IT @ Поиск выполнять через ADOQuery1,(подключаеш ADOQuery по аналогии с ADOTable) открываеш Access и пишеш в нем запрос к базе потом запрос отоброжаеш в режиме SQL беоеш код переносиш его в ADOQuery1->SQL и в компоненте DataSource меняеш Dataset на ADOQuery1. Чтобы вернуться обратно меняеш Dataset обратно на таблицу! так и не разобрался... Компилируется без ругательств, вот только ничего при нажатии бутона не происходит... Может он и работает, только вот результат не показывает... Цитата Aracul @ TLocateOptions SearchOptions; ADOQuery1->Locate("FIO", Edit1->Text, SearchOptions<<loPartialKey<<loCaseInsensitive); // ("Поле для поиска", "Ключ поиска", "Опции поиска") тоже самое... Помогите разобраться |
Сообщ.
#23
,
|
|
|
kizer кинь проект посмотрю!
Добавлено Цитата kizer @ отвечает [C++ Error] Basic_Form.cpp(77): E2316 '_fastcall TForm_basic::DBGrid1TitleClick(TColumn *)' is not a member of 'TForm_basic'. Вопрос тут ты просто вставил код или создал событие? Цитата PIKSEL_IT @ так и не разобрался... Компилируется без ругательств, вот только ничего при нажатии бутона не происходит... Может он и работает, только вот результат не показывает... Что ты тут намудрил без проекта не разобраться! |
Сообщ.
#24
,
|
|
|
Цитата PIKSEL_IT @ Цитата (kizer @ Сегодня, 15:22) отвечает [C++ Error] Basic_Form.cpp(77): E2316 '_fastcall TForm_basic::DBGrid1TitleClick(TColumn *)' is not a member of 'TForm_basic'. Вопрос тут ты просто вставил код или создал событие? Тут я просто скопировал код. Щя попробую вставить событие. Цитата PIKSEL_IT @ Что ты тут намудрил без проекта не разобраться! тут я даже не спорю. вполне возможно что и намудрил... просто новичок, этим все сказано. А e-mail можешь дать? Просто архив с проэктом весит около метра... |
Сообщ.
#25
,
|
|
|
Цитата PIKSEL_IT @ так и не разобрался... Компилируется без ругательств, вот только ничего при нажатии бутона не происходит... Может он и работает, только вот результат не показывает... Он то работает только ты обращаешся к DataSource1 c другой формы, там я коечто подправил и кинул обратно на почту! |
Сообщ.
#26
,
|
|
|
Цитата PIKSEL_IT @ Цитата PIKSEL_IT @ так и не разобрался... Компилируется без ругательств, вот только ничего при нажатии бутона не происходит... Может он и работает, только вот результат не показывает... Он то работает только ты обращаешся к DataSource1 c другой формы, там я коечто подправил и кинул обратно на почту! Спасибо огромное. Надеюсь дальше разберусь |
Сообщ.
#27
,
|
|
|
Ребята.
![]() Есть запрос ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = 'key'"); Как мне всунуть на место 'key' значение, которое будет вводится в Edit1->Text? Я начал так AnsiString key; key = Edit1->Text; А теперь как мне эту переменную указать ключом поиска в БД? Заранее спасибо. |
Сообщ.
#28
,
|
|
|
Вроде как-то вот так (не тестил но должно работать!)!
Смысл в том что в этой тсроке ты строиш запрос и строиш его со стракой и следственно можеш делать с ней что угодно в том числе и подставлять некоторые значения! ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = "+key); А в твоем примере перменная key была как литералл! Тут как переменная! |
Сообщ.
#29
,
|
|
|
Цитата PIKSEL_IT @ Вроде как-то вот так (не тестил но должно работать!)! Смысл в том что в этой тсроке ты строиш запрос и строиш его со стракой и следственно можеш делать с ней что угодно в том числе и подставлять некоторые значения! ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = "+key); А в твоем примере перменная key была как литералл! Тут как переменная! Неа... Пишет, что параметр не имеет значения по умолчанию... Я уже и просто ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = " + Edit1->Text); пробовал... |
Сообщ.
#30
,
|
|
|
Цитата kizer @ Неа... Пишет, что параметр не имеет значения по умолчанию... Это потому что она считает запрос параметречиским! Смотри почту! И ещё избавься от руских названий полей и т.д. потом с этим могут быть проблеммы! |
Сообщ.
#31
,
|
|
|
Спасибо большое! Всё. Дальше уже точно закончу сам. Огромное спасибо PIKSEL_IT
|
Сообщ.
#32
,
|
|
|
Поделитесь решением, тоже интересно.
|