Програмиране от издание 10

Добър ден, скъпи абонати!

Днес историята за компонента TOraQuery ще продължи.

В последната версия научихме как да изпълняваме всякакви заявки. В повечето случаи ще трябва да изберете информация, която отговаря на определени условия. Например, можете да изберете само хора, чието фамилно име започва с A:изберете фамилия, име, otch, рожден ден от clientphis, където fam като 'A*'Ако трябва да намерите хора с фамилия, започваща с G, тогава можете, разбира се, да напишете следната заявка m записи за избор. Но такива условия в процеса на работа на програмата могат да бъдат генерирани от няколкостотин, а за Oracle това ще бъдатуникалнизаявки, което ще се отрази негативно на производителността и мащабируемостта на цялата система.

В тази ситуация параметричните заявки идват на помощ. Горните заявки могат да бъдат преобразувани в параметрични по следния начин:изберете fam, name, otch, birthday от clientphis, където fam като :famОбърнете внимание на израза ":fam" - тази конструкция дефинира параметър с име fam. Името на параметъра може да бъде дадено произволно, а не само от името на полето, но в определени ситуации има някои правила за определяне на имена на параметри. Ще се върнем към тези правила в бъдеще.

Преди да изпълните такава заявка, е необходимо да зададете стойностите на параметрите. За да направите това, можете да използвате или колекцията Params, която съдържа списък с всички параметри на заявката (номерирането започва от 0), или метода ParamByName, който работи с параметър, зададен по име.

Нека променим нашия последен пример, за да изберем хора с фамилно име, започващо сна знаците, които сме въвели. 1. Променете заявката на OraQuery1 наизберете фамилия, име, otch, рожден ден от clientphis, където upper(fam) като upper(:fam)2. Нека пренапишем манипулатора OnClick на бутона: Както можете да видите, няма нищо сложно. Удобството на параметрите е особено очевидно, когато трябва да работите с дати, тъй като не е необходимо да конвертирате датата във формата, приет от сървъра.

Ако сте прочели до тези редове, вероятно сте си помислили, че параметрите могат да се използват не само за задаване на стойности на изрази, но и за дефиниране на полета и таблици, например, би било хубаво да изпълните следната заявка:select * from :table- за да изберете данни от произволна таблица илиselect * from table order by :ordfield- за да зададете сортиране по всяко поле.

За съжаление нито един сървър не може директно да изпълни такива заявки и веднага ще даде грешка. Разбира се, можете динамично да генерирате заявка, но ODAC има по-красиво решение, а именномакроси. Макросите са толкова лесни за използване, колкото и параметрите. Символът & се използва за указване на макрос. (и не :) и има метод MacroByName/Macros за работа с макроси (сравнете с ParamByName/Params).

Нека разгледаме работата с макроси, използвайки конкретен пример: Сега в реда за редактиране можете да посочите името на полето, по което ще се извърши сортирането.

Макросите могат да се използват и за динамично задаване на условия и т.н. без директно генериране на необходимия sql код, например: MyQuery.SQL.Text := 'SELECT * FROM Dept WHERE DeptNo > 20 &Cond1'; MyQuery.Macros[0].Value := 'и DName е NULL'; MyQuery.Execute; в този случай следната заявка ще отиде до сървъра: SELECT * FROM Dept WHERE DeptNo > 20 и DName е NULL

Както можете да видите, спараметри, такава заявка не може да бъде конструирана. Но какво ще стане, ако трябва периодично да деактивирате условието „и DName е NULL“? Разбира се, можете да зададете празен низ на макроса, но ODAC съдържа по-красиво и елегантно решение - достатъчно е да нулирате свойството Active на макроса (то е зададено по подразбиране): MyQuery.Macros[0].Active:= False; в този случай, заявкатаSELECT * FROM Dept WHERE DeptNo > 20

Няма нищо особено в използването на макроси и параметри, така че не се колебайте да се възползвате от тези функции. И не забравяйте, че Oracle много обича параметричните заявки.

Време е за връзката главен/детайл. Каква връзка няма да кажа, тъй като това е извън обхвата на статията. Просто ще ви кажа как може да се организира в ODAC.

Ако сте обърнали внимание на фразатапо какви начини, значи вече се досещате, че ODAC поддържа няколко начина за организиране на комуникацията master/detail. Нека ги разгледаме по-подробно (на примера на демо база, която се инсталира заедно с Oracle).

Обикновено връзката главен/подробен се установява за таблици, които са свързани на ниво СУБД чрез връзка външен ключ/първичен ключ. За да организираме връзката master/detail, имаме нужда от два компонента TOraQuery и един компонент TDataSource (TOraDataSource): Забележка. С помощта на дизайнера на формуляри можете да създадете връзка главен/подробен, без да пишете нито един ред код (. ), просто трябва да „хвърлите“ подходящите компоненти във формуляра и да зададете необходимите свойства. В най-лошия случай трябва да отворите тези набори от данни в правилния ред в кода.

Няколко важни уточнения. Името на параметъра в дъщерната заявка (подробен набор от данни) трябва да съвпада с името на полето в основната заявка. Стойността за втория параметър на заявката се взема автоматично отполета на основната заявка. При превъртане на основния набор от данни, дъщерната заявка автоматично ще се изпълни с необходимия параметър, така че ако дъщерната заявка е „тежка“, тогава ще се наблюдава известно „инхибиране“ на интерфейса. При добавяне на нов запис към дъщерна таблица (заявка), стойността на първичния ключ от текущия запис на основната таблица (заявка) автоматично се вмъква в полето с външен ключ.

ODAC поддържа друг начин за организиране на основни/подробни данни с помощта на свойствата MasterFields/DetailsFields: Във втория случай имената на полетата, чрез които се установява връзката, са посочени не в дъщерната заявка, а в специални свойства. Ако прочетете внимателно предишния брой, може да си помислите, че дъщерната заявка ще върне всички записи, а не само тези, от които се нуждаем. Обаче не е така. По време на изпълнението на програмата ODAC независимо ще промени заявката на SELECT * FROM Employee WHERE DepNo = :DepNo и ще работи както в първия случай.

От вас зависи да решите коя версия на комуникацията master/detail да използвате. По силата на навика използвам първия метод. В следващия брой ще продължа историята за OraQuery.

С уважение, пощенски координатор Алексей, известен още като Гелиос.