Зертханалық жұмыс

Зертханалық жұмыс №11-12

Тақырыбы: Сұрыптау. Мәліметтерді сүзу (фильтрация)

Мақсаты:      Delphi ортасында мәліметтер қорындағы кесте мәліметтерін сұрыптауды және сүзгілеуді үйрету

 

Жұмысты орындауға нұсқау

Осы зертханалық жұмыста алдында дайындалған Телефон анықтамасы жобасымен жұмысты жалғастырамыз. Енді бұл жобаға жазбаларды белгілі өріс бойынша сұрыптауды және мәліметтерді сүзуді қосуға болады. Айталық мәліметтерді Тегі өрісі бойынша сұрыптау қажет болсын. Бұл өте жеңіл жасалынады. Ол үшін индекстелген өрістерді қолданамыз.

Кез-келген мәліметтер қорында индекстелген өріс ұғымы болады. Біз әзірше счетчик типті өріске тек басты бір ғана индекс құрдық. Бұл міндетті индекс және үнемі бар болады, бірақ сіз кез-келген уақытта қосымша индекстер құра аласыз. Бұл мәліметтер қорының барлық өрістерін индекстелген өрістер ету емес, себебі индекстеу дискіде қосымша орын алады және программаның жылдамдығын азайтады.

Қандай өрістерді индекстеуге болады? Көбінесе іздеу жүргізілетін өрістерді индекстеген дұрыс. Телефон анықтамалығынан телефон номері немесе тегі бойынша іздеу жүргізіледі. Кейде мекен-жай бойынша да іздейді. Айталық, сіз досыңызды іздегіңіз келсе мәндетті түрде тегі бойынша қарайсыз. Сондықтан біз анықтамалықта Тегі өрісін индекстейік.

Индекстер мәліметтерді іздеу жылдамдығын ұлғайтады және барлық жазбаларды сұрыптауға мүмкіндік береді.

Анықтама кестесін Access программасының Конструктор режімінде аш. Мұнда Тегі өрісін ерекшелеп, индекстелген өріс қасиетіне қараңыз. Қасиетте қажетті параметрді таңдауға арналған ашылатын тізім бар. Мұнда үш нұсқа көрсетілген.

§  Нет – индекстелмеген өріс;

§  Да (доспускается совпадения) - өріс индекстелген және екі (немесе одан да көп) жазба бірдей мәнге ие бола алады. Бұл, мысалы, Тегі өрісінде бірдей екі Асанов бола алады дегенді білдіреді. Бұл біздің жағдайымызға келетін нұсқа. Себебі, тектері бірдей адамдар өте көп.

§  Да (совпадения не допускается) – егер бұл параметр таңдалынған болса, онда индекстелген өрісте әртүрлі жазбаларда бірдей мән сақтауға болмайды. Өрістің бірегейлігін мәліметтер қорының өзі бақылайды.

Енді Тегі, Телефон өрістерін индекстейік. Екеуінде де индекстелген өріс қасиетінде Да (доспускается совпадения) параметрін таңдаңыз. Осымен мәліметтер қорын жауып, жобаға көшейік. Енді біздің алдыңғы зертханалық жұмыста дайындалған жобамызды Delphi ортасында ашып, оған сұрыптауды қосайық.

Алдымен біздің формамызды жаңартайық. Ол үшін жоғарғы мәзірге Сұрыптау пунктін және оған Тегі бойынша және Телефоны бойынша деген ішкі пунктер қосу керек (19-сурет).

Тегі бойынша пункті үшін келесі кодты жаз:

procedure TForm1.N11Click(Sender: TObject);

begin

DataModule2.BookTable.IndexFieldNames:='Тегі';

end;

Телефоны бойынша пункті үшін келесі кодты жаз:

procedure TForm1.N12Click(Sender: TObject);

begin

DataModule2.BookTable.IndexFieldNames:='Телефон';

end;

image

Екі жағдайда да BookTable кестесінің IndexFieldNames қасиетіне жазбасын сұрыптау қажет өрісті көрсетеміз.

 

Мәліметтерді сүзу

Телефон анықтамалығы жаңа мүмкіндіктермен толықтырылуда, дегенмен онда ең бастысы – Іздеу жоқ. Мысалы, мәліметтер қорында мыңдаған мәлімет болса, белгілі адамның телефонын қалай жылдам табуға болады? Әрине, мұнда мүмкіндігін қосу керек.

Іздеу үшін TADOTable компонентінің Filter қасиеті бар. Онда мәліметтерді бейнелеу шартын көрсетуге болады. Мысалы, онда Тегі өрісінің Асанов мәнін қамтитын жазбаларды бейнелеу шартын көрсетуге болады. Сүзгі жұмыс істеуі үшін біздің кестенің Filtered қасиетіне True мәнін орнату керек. Осыдан кейін қасиетін өзгертуге болады, содан кейін барлық өзгерістер өз күшіне енеді.

Filter қасиеті – бұл жол. Онда шарт мәтінін төмендегі түрде жазу керек.

Өріс [салыстыру операторы] ‘Мән’

Мысалы, егер сіз Тегі өрісіндегі мәні Асанов болатын барлық жазбаларды бейнелегіңіз келсе, онда былай жазу керек:

AdoTable1.Filter:=’Тегі=’’Асанов’’’;

Егер тырнақшаларды қолданғыңыз келмесе, онда QuotedStr функциясын қолдануға болады. Оған жолды көрсетсеңіз сізге оны тырнақшаға алып, қайтарады. Осылайша код келесі түрде болуы мүмкін:

AdoTable1.Filter:=’Тегі=’+QuotedStr(Асанов);

Бұл теңдікке тексерудің қарапайым мысалы болған. Сіз басқа кез-келген салыстыру операторын қолдана аласыз. Бірден екі немесе одан да көп мән тексерілетін салыстырудың құрама операторларын жасай аласыз.

AdoTable1.Filter:=’Тегі=’ ’Асанов’’’ or Телефон=’’355335’’’;

Бұл мысалда, Тегі өрісінің мәні Асанов болатын және Телефон өрісі мәні 355335 болатын барлық жазбаларды іздеу қарастырылған. Екі шартты біріктіру үшін or операторы қолданылады. Сол сияқты логикалық типті AND операторында қолдануға болады.

Ескерту:

Сүзгіні программалау кезінде тырнақшаларға мұқият болу керек. Мәндердің бірегей тырнақшамен ерекшеленетінін есте ұстаңыз, яғни жол ішінде бірегей тырнақшадан екеу қоюға тура келеді (екі тырнақшалы қолданылмайды).

Егер өріс атауы екі сөзден тұратын болса, онда оны тік жақшаға алу керек. Мысалы, Қала атауы өрісіне қойылатын сүзгі төмендегідей болады:

ADOTable1.Filter:=’[Қала атауы]=’’Астана’’’;

Енді алдыңғы мысалға келейік. Қазір оған іздеу мүмкіндігін қосайық.

Алдымен форманың түрін жаңартайық. Ол үшін формаға «Іздеу» мәтіні орналасатын панель және FindEdit атаулы Tedit енгізу жолы компонентін қосайық (20-сурет).

Енді енгізу жолы үшін OnChange оқиғасын өңдейік. Пайдаланушы енгізу жолындағы мәтінді өзгерткен кезде біз сүзгіні де өзгертуіміз керек. Бұл өңдеушіде келесі кодты жазыңыз:

procedure TForm1.FindEditChange(Sender: TObject);

begin

If Length(FindEdit.Text)>0 then

DataModule2.BookTable.Filtered:=true else DataModule2.BookTable.Filtered:=false;

DataModule2.BookTable.Filter:='Тегі>'''+FindEdit.Text+'''';

end;

Алдымен жолды тексереміз. Егер іздеу жолында бір мән болса, онда сүзгіні қосамыз, әйтпесе бүкіл кестені көрсету үшін өшіріп тастаймыз. Осыдан кейін сүзгі шарты жасалады: 'Тегі>'''+FindEdit.Text+''''; Мұнда енгізілген мәтінге ұқсас барлық жазбалар бейнеленуі үшін «үлкен» (>) белгісі қолданылады.

 

image

Ескерту:

Егер теңдік белгісін қойсақ және пайдаланушы «С» әріпін енгізсе, онда кестеде ештеңе бейнеленбейді, себебі тегі «С» болатын адам жоқ. Ал үлкен белгісін қойсақ, онда «С» әріпінен басталатын барлық тектер бейнеленеді.

Сүзгі соңында төрт бірегей тырнақша жазылды. Неліктен төртеу? Себебі, мәннен кейін бір тырнақша жазуымыз керек. Ол үшін тырнақшасы бар жол қосуымыз керек. Сондықтан осы жолды ашу және жабу үшін екі бірегей тырнақша тұр. Бұл тырнақшаны жол ішіне қоямыз, ол үшін бірегей тырнақшадан екеу қоямыз, нәтижесінде ол бір бірегей тырнақша болады.

Жоғарыда айтылғандай ADO-да сүзгі нашар жұмыс істейді. Бірақ сүзгілеу мүмкіндігін кеңейтуге жақсы мүмкіндік береді. DataModuleUnit мәліметтер модуліне өтіңіз және BookTable компоненті үшін OnFilterRecord оқиғасын өңдейік. Ол қосылған сүзгі кезінде және программаның жолдың сүзгіге сәйкестігін әрбір анықтау кезінде шақырылады. Бұл жерде біз өз бетімізбен сүзгілеу логикасын басқаруымызға болады. Дайындалған өңдеушіде келесі кодты жазыңыз:

procedure TDataModule2.BookTableFilterRecord(DataSet: TDataSet;

  var Accept: Boolean);

begin

Accept:=false;

If Copy(BookTableDSDesigner.AsString,1,Length(Form1.FindEdit.Text))=Form1.FindEdit.Text then Accept:=true;

end;

Өңдеушіге екінші параметр ретінде Accept бульдік айнымалы беріледі. Егер біз оған False мәнін енгізсек, онда ағымдағы жол сүзгіге сәйкес келмейді. Егер true болса, онда жол сәйкес келеді және оны бейнелеуге болады.

Ең басында Accept айнымалысына false мәнін береміз. Осыдан кейін ағымдағы жолдың сүзгіге сәйкестігі тексеріледі. Ол үшін екінші жолда не жазылғанын ұғу керек. Оны бөліктерге бөліп қарастырайық.

Copy(BookTableDSDesigner.AsString,1,Length(Form1.FindEdit.Text))

Мұндағы BookTableDSDesigner – тегі жазылған өріс атауы. Егер BookTable компонентіне екі рет шертіп пайда болған өріс редакторындағы Тегі өрісінің Name қасиетіне қарайтын болсаңыз осы атауды көресіз.

Сонымен, Copy функциясы бірінші параметр ретінде көрсетілген жолдан, екінші параметр ретінде көрсетілген орыннан бастап, үшінші параметрге тең символдар санын қайтарады.

Нәтижені сүзгіге арналған енгізу жолының мазмұнымен салыстырамыз. Егер ағымдағы жолдағы адамның тегі сүзгі ретінде көрсетілген мәтіннен басталса, онда бұл жол бейнеленеді.

Енді мысалды жүктеп, оның дұрыс жұмыс істейтініне көз жеткізейік.

 

Тапсырма:

1.    Осы нұсқаулықты пайдаланып, алдыңғы зертханалық жұмыста дайындалған Студент жобасына Сұрыптау және Сүзгілеу мүмкіндіктерін қос.

2. Өз бетіңмен дайындаған Кітапханадағы кітап қоры туралы мәліметтер қорын да жоғарыдағы нұсқауды пайдаланып жетілдір және түсіндіріп бер.

 

Бақылау сұрақтары:

1.    Сұрыптау қандай жолмен жүргізіледі?

2.    Сүзгіні орындау үшін қандай код қолданылады және қалай жұмыс істейді?

3.    Бірегей тырнақшалардың қолданылу ретін түсіндір?

 


Ұқсас жұмыстар

Зертханалық жұмыстарды ұйымдастыру
Физикалық зертханалық жұмыстардың міндеттері
Биологиядан зертханалық жұмыстар
Биология пәнінен зертханалық және практикалық жұмыстардың айырмашылығы
Биология сабақтарындағы оқыту технологиясы
Оқушылардың өзіндік жұмыс істеу дағдыларын қалыптастырудың педагогикалық негіздері
Биологиядан зертханалық жұмыстарды өткізу әдістемесі
Химияны оқытуда зертханалық жұмыстарды жүргізу әдістемесі
Виртуалды зертханалық жұмыстар
Зертханалық жануарларды күтіп - бағу, өсіру, көбейту