Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Особенности работы с запросами





При рассмотрении компонента Query мы уже отметили ряд различий в подходах к использованию этого компонента по сравнению с Table. Однако этим различия в приложениях, основанных на SQL, не ограничиваются. Основным преимуществом запросов на SQL является то, что они позволяют минимизировать объем данных, которыми обмениваются СУБД и приложение. Например, когда из таблицы требуется отобрать какую-то часть записей, то в случае использования фильтрации или иных "обычных" методов, приложение запрашивает у СУБД всю таблицу. В том же случае, когда используется запрос, приложение получает лишь то, что ему требуется. Это существенным образом сказывается на быстродействии, особенно если обрабатываются большие объемы данных и при передаче информации по сети.

Для иллюстрации возможностей SQL и компонента Query модифицируем приложение "База 1.0" таким образом, чтобы оно использовало данные технологии. В частности, SQL может нам понадобиться для таких вещей, как вывод счетов для клиента, подсчет суммы счетов, внесение новых счетов и клиентов или редактирование имеющихся.

При разработке нового варианта приложения заменять без оглядки все компоненты Table на Query не представляется рациональным. Например, CustTbl, представляющий таблицу клиентов, используется исключительно для вывода полного списка клиентов и для манипуляций над ним же. В то же время, компонент BillTbl было бы рационально заменить на компонент-запрос, поскольку по счетам будет производиться выборка. Кроме того, если рассматривать приближенный к практике случай, то таблица счетов со временем может стать весьма и весьма объемной, что в случае работы по сети может сказаться на производительности. Поэтому заменим этот компонент запросом Query и назовем его BillQry. При этом свойство DatabaseName у него так же будет MainDB. Кроме того, поскольку этот запрос у нас используется в качестве источника данных для таблицы DBGrid, в которую мы позволяем вносить правку, то свойство RecuestLive следует установить в истину. С учетом того, что в данном запросе используется только одна таблица (bill), это позволит нам обращаться с ним так же легко, как с обычной таблицей. После этого останется изменить в BillDS значение свойства DataSet - вместо ссылки на отсутствующий теперь компонент BillTbl укажем для него BillQry.

Наконец, нам понадобится еще один компонент Query - для выполнения вспомогательных задач - например, для добавления новых записей в таблицы. Назовем его StdQry и установим свойство DatabaseName в MainDB. Поскольку этот запрос не будет непосредственно выводить информацию, то добавляеть ему в пару компонент DataSource не требуется.

Теперь приступим к изменению в программном коде. Начнем с функции вывода баланса - обработчика события Click для кнопки BalanceBtn. Как раз в этом случае мы задействуем оба запроса - один для того, чтобы отобразить все нужные счета (BillQry), а другой - для того, чтобы вычислить сумму (StdQry). Вариант этой функции с использованием таблиц был приведен в листинге 20.4, теперь же мы рассмотрим новый вариант, с использованием SQL-запросов (листинг 21.2).

Листинг 21.2. Вывод счетов и вычисление суммы с использованием SQL

procedure TMainFrm.BalanceBtnClick(Sender: TObject); begin Data.BillQry.Close; Data.BillQry.SQL.Text:='SELECT * FROM bill WHERE BILL_CUST=' +Data.CustTbl.FieldByName('CUST_ID').AsString; Data.BillQry.Open; Data.StdQry.Close; Data.StdQry.SQL.Text:='SELECT SUM(BILL_SUMM) AS TOTAL FROM bill WHERE ' +'BILL_CUST='+Data.CustTbl.FieldByName('CUST_ID').AsString;; Data.StdQry.Open; BillsFrm.Caption:=Data.CustTbl.FieldByName('CUST_NAME').AsString+': ' +Data.StdQry.FieldByName('TOTAL').AsString; BillsFrm.ShowModal; end;

Очевидно, что вычислительные задачи в новом варианте, при помощи SQL мы полностью переложили на саму СУБД. Кроме того, объем информации, полученный приложением, заметно уменьшился, поскольку выборка нужных значений производится на стороне СУБД, и приложению будут переданы только те данные, которые реально необходимы.

Теперь перепишем код для кнопок "Новый счет" и "Новый клиент". В данном случае, поскольку производить выборки не требуется, нам будет достаточно только одного запроса - StdQry, как это показано в листинге 21.3.

Листинг 21.3. Создание новых записей в таблицах bill и customer при помощи SQL

procedure TMainFrm.NewBillBtnClick(Sender: TObject); begin with BillFrm do begin Caption:='Счет для '+Data.CustTbl.FieldByName('CUST_NAME').AsString; ShowModal; if ModalResult<>mrOk then exit; Data.StdQry.Close; Data.StdQry.SQL.Text:='INSERT INTO bill(BILL_CUST, BILL_SUMM, BILL_DATE)' +' VALUES ('+Data.CustTbl.FieldByName('CUST_ID').AsString+', '+ SummEd.Text+', '''+DateToStr(DatePick.Date)+''')'; Data.StdQry.ExecSQL; end; end; procedure TMainFrm.NewCustBtnClick(Sender: TObject); begin with CustFrm do begin ShowModal; if ModalResult<>mrOk then exit; Data.StdQry.Close; Data.StdQry.SQL.Text:='INSERT INTO customer (CUST_NAME, CUST_ADDRESS) ' +'VALUES ('''+NameEd.Text+''', '''+AddrEd.Text+''')'; Data.StdQry.ExecSQL; Data.CustTbl.Refresh; end; end;

Здесь следует отметить следующий момент: после выполнения запроса на добавление клиента для компонента, представляющего таблицу клиентов (CustTbl), вызывается метод Refresh. Если этого не сделать, то, хотя данные и будут добавлены в таблицу физически, обновления таблицы на экране не произойдет. В то же время для добавления счетов подобной операции делать не требуется, поскольку для того, чтобы просмотреть список счетов, пользователю в любом случае придется нажимать на кнопку "Баланс", процедура обработки которой будет всякий раз составлять и вызывать новый запрос.

Что касается изменения учетной записи клиента, то в данном случае, в принципе, можно ничего не делать, поскольку мы оставили таблицу. С другой стороны, вполне можно использовать для этих целей язык SQL и компонент запроса StdQry. Для этого достаточно заменить последние 4 строчки кода в обработчике двойного щелчка мышью у компонента CustGrd:

//старый вариант Data.CustTbl.Edit; Data.CustTbl.FieldByName('CUST_NAME').AsString:=NameEd.Text; Data.CustTbl.FieldByName('CUST_ADDRESS').AsString:=AddrEd.Text; Data.CustTbl.Post; //новый вариант Data.StdQry.Close; Data.StdQry.SQL.Text:='UPDATE customer SET CUST_NAME='''+NameEd.Text +''', CUST_ADDRESS='''+AddrEd.Text+''''; Data.StdQry.ExecSQL;

В то же время, подобный код в форме BillsFrm, несмотря на то, что в данном случае источник данных изменился с таблицы на запрос, можно не менять - как раз в этом случае и пригодится установленное в истину свойство запроса RequestAlive.

6. ОТЧЕТ ДОЛЖЕН СОДЕРЖАТЬ:

6.1. Номер практической работы, ее название, номер выполняемого варианта.

6.2. Цель работы.

6.3. Ответы на вопросы.

6.4. Распечатку запросов.

7. КОНТРОЛЬНЫЕ ВОПРОСЫ:

7.1. Какие объекты можно создать с помощью команды CREATE?

7.2. Какие действия можно совершить с помощью команды SELECT?

7.3. Опишите компонент запроса Query.

Date: 2015-07-27; view: 331; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию