На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Сортировка + Поиск в БД Access используя C++ Builder через ADO , Как сделать сортировку и поиск?
    Теперь осмелюсь попросить реальной помощи.

    В БД Access используя C++ Builder и технологию ADO нужно сделать сортировку и поиск. Как это правельно сделать?

    И где можно найти описание технологии ADO? Нашел только Хомоненко - Работа С Базами Данных В C++ Builder и то, там одна глава, и я ничего не понял... Больше по этой технологии только обравки информации из форумов.

    Помогите. Заранее спасибо.
      Как тут уже говорилось телепатов нет (!) по какому критерию поиск, по чему сортировка и т.д.

      Цитата kizer @
      Как это правельно сделать?

      Как сделать есть множнство способов, например можеш все сделать через запросы!
        Цитата PIKSEL_IT @
        Как тут уже говорилось телепатов нет (!) по какому критерию поиск, по чему сортировка и т.д.


        Простите меня, просто я новичок. Ну жно сделать поиск по значению взятому с элемента Edit. Например в БД хранится Ф.И.О, место работы и дата рождения. Я делаю отдельную форму на которой есть два отдельных Edit в первый вводится фамлиля, а во второй (ну или только фамилия или только место работы) место работы и программа должна вывести результаты в BDGrid.

        А сортировка по алфавиту, по месту работу и по дате рождения. Что бы княпочку нажал и мне база вся от самых старых до самых молодых выстроилась)))

        Помогите, пожалуйста.
          TADOQuery + F1 + поиск по форуму + поиск в инете.
          Сортировка
          - select * from atable ORDER BY afield [asc] - по умолчанию возрастание
          - select * from atable ORDER BY afield desc - по убыванию, надо указывать явно
          ЗЫ - никто не запрещает сортировать по двум и более полям - ... ORDER BY afield1, afield2
            Принцыпе все можно сделать через запросы кидаеш на форму компоненты
            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 обратно на таблицу!

            А сортировку можно вып так (для запроса допишеш сам.)
            Сортировка будет выполняться при клике на заголовок поля!
            ExpandedWrap disabled
              void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column)
              {
                ADOTable1->Sort=Column->FieldName+" ASC" then
                ADOTable1->Sort=Column->FieldName+ " DESC" else
                ADOTable1->Sort=Column->FieldName+ " ASC";
              }
            Сообщение отредактировано: PIKSEL_IT -
              Цитата PIKSEL_IT @
              Принцыпе все можно сделать через запросы кидаеш на форму компоненты
              ADOConnection
              ADOQuery
              А зачем ADOConnection? Можно ведь сразу в ADOQuery прописать ConnString. В чем преимущество ADOConnection?
                Цитата Aracul @
                А зачем ADOConnection? Можно ведь сразу в ADOQuery прописать ConnString. В чем преимущество ADOConnection?

                Почитай литературу! Ответ крайне банален (В данной ситуации). Я исп. ADOConnection поскольку подключаю ещё и ADOTable зачем писать мне два раза connectionstring, а если таких компонентов не 2 а скажем 10 и тебе надо изменить что-то скажем указать путь к другой базе, так меняеш 1 строку, а так 10.
                  Цитата 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 спасибо огромное. Потом доложу о результатах.
                  Спасибо!
                    Цитата kizer @
                    А вот с поиском буду разбираться
                    Query, Query и ещё раз Query! :yes: Удачи.
                      PIKSEL_IT Все, что ты мне ответил, я уже знаю. Ничего интересного не нашел. И заметь, я не собирался критиковать использование ADOConnection, а лишь хотел узнать, есть ли еще какие либо плюсы в использовании этого компонента. ADOConnection я использую, если нужно получить список таблиц в базе данных или нужно окно авторизации. Я считал, что, возможно, кроме перечисленных тобой плюсов, есть более существенные. Лично я довольно редко использую ADOConnection. А строку инициализации нетрудно и вручную назначить компоненту ADOQuery (даже если их будет десять, ИМХО) ;) :
                      ExpandedWrap disabled
                        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:
                      ExpandedWrap disabled
                          TLocateOptions SearchOptions;
                          ADOQuery1->Locate("FIO", Edit1->Text, SearchOptions<<loPartialKey<<loCaseInsensitive); // ("Поле для поиска", "Ключ поиска", "Опции поиска")
                        /*
                        SearchOptions - опции поиска:
                        <<loPartialKey - искать частичное совпадение;
                        <<loCaseInsensitive - искать без учета регистра.
                        */

                      Этот код целесообразно вставить в событие Button OnClick либо в событие Edit OnChange, в зависимости от желаемого результата. Можно и в другие события, на Ваше усмотрение.
                      Сообщение отредактировано: Aracul -
                        Цитата Aracul @
                        строку инициализации нетрудно и вручную назначить компоненту ADOQuery (даже если их будет десять, ИМХО)
                        Твоё ИМХО изменится. И знаешь когда? Тогда, когда тебе придётся заниматься проектированием/реализацией НАСТОЯЩЕЙ БД :yes:
                        ---
                        А вот теперь моё ИМХО - коннектиться в FormCreate() - дурной тон. После запуска программы юзер может передумать и просто закрыть её. Так нафих цеплять БД? :D
                          Aracul а банально книги почитать не пробовал по этой теме, я сказал его конкретное преимущество в данной ситуации, а их намного больше (разрабы тоже не дураки еслибы не надо не писалибы)!
                          Цитата Aracul @
                          строку инициализации нетрудно и вручную назначить компоненту ADOQuery

                          А насчет производительности ты подумал десять раз писать подсоединение или перебор компонентов тоже неочень!
                          Сообщение отредактировано: PIKSEL_IT -
                            #SI#А где ты увидел коннект?
                              Цитата
                              А вот теперь моё ИМХО - коннектиться в FormCreate() - дурной тон.

                              а где коннектиться?
                                PIKSEL_IT, да расслабься ты :yes: . Чел знаком с этим делом на уровне екзамплов. Реальных БД он не создавал. Отсюда же - и его совет по пользованию Query->Locate(). :whistle:

                                Добавлено
                                Цитата Aracul @
                                #SI#А где ты увидел коннект?
                                О! Молодец! Таки ты мне нос утёр! :D
                                Цитата Alca @
                                а где коннектиться?
                                По клику в меню, по кнопке, по событию в самой программе...
                                  #SI# Согласен! :good:
                                    #SI#Не спорю, программ имеющих серьезные базы данных не создавал, работаю так, как учили(А обучение закончилось на BDE). И как сам научился. Поэтому и спрашиваю про ADOConnection. Я не говорю, что я мастер, гуру и т.п. PIKSEL_IT еще раз, я лишь хотел получить ответ на вопрос, а не доказывать то, что ADOConnection является лишним.
                                    #SI#, PIKSEL_IT спасибо за ответы. Сделал вывод, что стоит использовать ADOConnection.
                                    Цитата #SI# @
                                    Отсюда же - и его совет по пользованию Query->Locate().
                                    Чем плох Query->Locate()? Если отсылаете к книжкам, прошу давать названия этих книжек, а еще лучше, ссылки ;) .
                                    Сообщение отредактировано: Aracul -
                                      Цитата Aracul @
                                      Чем плох Query->Locate()?
                                      Да не плох он. Он - печальное наследие от TTable. Лично я этот метод в Query вообще бы ликвидировал! :D
                                      Цитата Aracul @
                                      обучение закончилось на BDE
                                      И что - не рассказали, что такое TSeeeion TSession и TDatabase?
                                      Цитата Aracul @
                                      Сделал вывод, что стоит использовать ADOConnection.
                                      :yes:
                                      Сообщение отредактировано: #SI# -
                                        Цитата #SI# @
                                        Да не плох он. Он - печальное наследие от TTable. Лично я этот метод в Query вообще бы ликвидировал!
                                        Я сам недавно на Query перешел. Еще не так уж хорошо знаю SQL комманды. Пока что меня устраивает Locate, предельная простота и приемлимая скорость, а мне больше и не надо.
                                        Цитата #SI# @
                                        И что - не рассказали, что такое TSeeeion и TDatabase?
                                        Нет, к сожалению не рассказали. Решили наверное, что прикладникам это не пригодится. Буду сам изучать, еще раз спасибо за ответы.
                                        Сообщение отредактировано: Aracul -
                                          Цитата Aracul @
                                          Еще не так уж хорошо знаю SQL комманды
                                          Без знания SQL о серьёзной работе с БД говорить не стоит. Разберёшься. :yes:
                                            Цитата Aracul @
                                            Нет, к сожалению не рассказали. Решили наверное, что прикладникам это не пригодится.

                                            а в шоке чему вообще сейчас учат... :(
                                              Приветсвтуйю. Вот такая проблема:
                                              На код сортировки:

                                              Цитата 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); // ("Поле для поиска", "Ключ поиска", "Опции поиска")


                                              тоже самое...

                                              Помогите разобраться
                                                kizer кинь проект посмотрю!

                                                Добавлено
                                                Цитата kizer @
                                                отвечает [C++ Error] Basic_Form.cpp(77): E2316 '_fastcall TForm_basic::DBGrid1TitleClick(TColumn *)' is not a member of 'TForm_basic'.

                                                Вопрос тут ты просто вставил код или создал событие?

                                                Цитата PIKSEL_IT @
                                                так и не разобрался... Компилируется без ругательств, вот только ничего при нажатии бутона не происходит... Может он и работает, только вот результат не показывает...

                                                Что ты тут намудрил без проекта не разобраться!
                                                  Цитата 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 можешь дать? Просто архив с проэктом весит около метра...
                                                    Цитата PIKSEL_IT @
                                                    так и не разобрался... Компилируется без ругательств, вот только ничего при нажатии бутона не происходит... Может он и работает, только вот результат не показывает...


                                                    Он то работает только ты обращаешся к DataSource1 c другой формы, там я коечто подправил и кинул обратно на почту!
                                                      Цитата PIKSEL_IT @
                                                      Цитата PIKSEL_IT @
                                                      так и не разобрался... Компилируется без ругательств, вот только ничего при нажатии бутона не происходит... Может он и работает, только вот результат не показывает...


                                                      Он то работает только ты обращаешся к DataSource1 c другой формы, там я коечто подправил и кинул обратно на почту!

                                                      Спасибо огромное. Надеюсь дальше разберусь
                                                        Ребята. :oops: Последний вопрос. По существу...

                                                        Есть запрос

                                                        ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = 'key'");

                                                        Как мне всунуть на место 'key' значение, которое будет вводится в Edit1->Text?
                                                        Я начал так

                                                        AnsiString key;
                                                        key = Edit1->Text;
                                                        А теперь как мне эту переменную указать ключом поиска в БД?

                                                        Заранее спасибо.
                                                        Сообщение отредактировано: kizer -
                                                          Вроде как-то вот так (не тестил но должно работать!)!
                                                          Смысл в том что в этой тсроке ты строиш запрос и строиш его со стракой и следственно можеш делать с ней что угодно в том числе и подставлять некоторые значения!
                                                          ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = "+key);

                                                          А в твоем примере перменная key была как литералл! Тут как переменная!
                                                          Сообщение отредактировано: PIKSEL_IT -
                                                            Цитата PIKSEL_IT @
                                                            Вроде как-то вот так (не тестил но должно работать!)!
                                                            Смысл в том что в этой тсроке ты строиш запрос и строиш его со стракой и следственно можеш делать с ней что угодно в том числе и подставлять некоторые значения!
                                                            ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = "+key);

                                                            А в твоем примере перменная key была как литералл! Тут как переменная!


                                                            Неа... Пишет, что параметр не имеет значения по умолчанию...

                                                            Я уже и просто
                                                            ADOQuery1->SQL->Add("SELECT * FROM Таблица1 WHERE Таблица1.[П І Б] = " + Edit1->Text); пробовал...
                                                            Сообщение отредактировано: kizer -
                                                              Цитата kizer @
                                                              Неа... Пишет, что параметр не имеет значения по умолчанию...

                                                              Это потому что она считает запрос параметречиским!

                                                              Смотри почту!
                                                              И ещё избавься от руских названий полей и т.д. потом с этим могут быть проблеммы!
                                                              Сообщение отредактировано: PIKSEL_IT -
                                                                Спасибо большое! Всё. Дальше уже точно закончу сам. Огромное спасибо PIKSEL_IT
                                                                  Поделитесь решением, тоже интересно.
                                                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                  0 пользователей:


                                                                  Рейтинг@Mail.ru
                                                                  [ Script execution time: 0,0685 ]   [ 15 queries used ]   [ Generated: 18.07.25, 04:03 GMT ]