, Roz21 (2) 

[ Pobierz całość w formacie PDF ]
.Pola obliczane sÄ… szczególnieprzydatne w przypadku tych danych, które musimy wyÅ›wietlać, lecz których niemusimy przechowywać.Aby utworzyć pole obliczane, trzeba wykonać dwie podstawowe czynnoÅ›ci:1.Zdefiniować pole w Edytorze pól (Fields Editor) dla danego komponentuDataSet.2.Przypisać polu wartoÅ›ci w procedurze OnCalcFields komponentuDataSet.A oto kroki, które trzeba wykonać przy tworzeniu pola obliczanego:1.WyÅ›wietl Edytor pól dla danego komponentu DataSet, klikajÄ…c komponentdwukrotnie.2.Kliknij prawym klawiszem myszy listÄ™ pól i z menu kontekstowego wybierzNew field.3.W oknie dialogowym New Field wpisz nazwÄ™, jakÄ… chcesz nadać nowemu poluobliczanemu, wybierz jego typ (Type) danych i w grupie pól opcji Field typekliknij pole Calculated.4.ZakoÅ„cz definiowanie klikajÄ…c OK.Po powrocie do Edytora pól powinniÅ›myw Inspektorze obiektów Delphi zobaczyć wylistowane wÅ‚aÅ›ciwoÅ›ci nowegopola.Zauważmy, że wÅ‚aÅ›ciwość Calculated ustawiona jest na True.5.Po zdefiniowaniu pola można już zaprogramować zdarzenie OnCalcFieldsdla naszego DataSet, które nowemu polu przypisuje wartość.Oto przykÅ‚adtakiego przypisania:taORDERSOrderDateTime.Value := Now;Powyzsza linia kodu przypisuje polu obliczanemu o nazwie taORDERSOrderDateTime wartość dostÄ™pnej w Delphi funkcji Now, czyli bieżącÄ… datÄ™ i czas.Pola obliczane sÄ… szczególnie użyteczne przy wykonywaniu ustalonych obliczeÅ„obejmujÄ…cych kolumny tabeli.Pola obliczanego moglibyÅ›my na przykÅ‚ad użyć dozakodowania kwoty pieniÄ™dzy, jakÄ… instytucja wypÅ‚aca za przebyta mile wtedy,gdy pracownik używa prywatnego samochodu w sprawach sÅ‚użbowych.Podobniedo zdarzenie OnCalcFields można by wbudować prowizjÄ™, którÄ… firma pÅ‚acizwykle swym handlowcom.MożliwoÅ›ci sÄ… tu nieograniczone.WażnÄ… rzeczÄ…,o której należy przy tym pamiÄ™tać, jest konieczność maksymalnego ograniczania RozdziaÅ‚ 21 ReguÅ‚y logiki aplikacji w aplikacjach Delphi 637iloÅ›ci obliczeÅ„, aby aplikacji nie spowolnić wiÄ™cej, niż jest to bezwzglÄ™dniekonieczne.OnValidateInna droga do ustanowienia reguÅ‚ logiki aplikacji w TField wiedzie poprzezzdarzenie OnValidate.Każdy TField ma zwiÄ…zane ze sobÄ… zdarzenieOnValidate, którego można użyć do weryfikacji jego wartoÅ›ci.Kod, który siÄ™w nim znajdzie, może zrobić praktycznie wszystko - może porównać wartoÅ›ci, jakapole otrzymuje, ze staÅ‚ymi, innymi polami lub rezultatami zapytania.JeÅ›listwierdzimy, że wartość, którÄ… pole otrzymuje, jest nieprawidÅ‚owa, po prostugenerujemy wyjÄ…tek.Powoduje to wyÅ›wietlenie komunikatu o bÅ‚Ä™dziei uniemożliwia zatwierdzenie wiersza.Możemy tworzyć nasze wÅ‚asne, pochodnetypy wyjÄ…tków lub korzystać tylko z tych, których dostarcza Delphi.OnExitInnym powszechnie wykorzystywanym miejscem implementowania bazujÄ…cych napolach reguÅ‚ logiki aplikacji jest zdarzenie OnExit w skojarzonych z danymi(data-aware) komponentach, takich jak DBEdit.Do zdarzenie OnExit możemydoÅ‚Ä…czyć kod, który bÄ™dzie siÄ™ wykonywać w momencie, gdy użytkownik zaczniewychodzić z danej kontrolki.Kod ten może przypisywać wartoÅ›ci innym polom(na przykÅ‚ad, przypisywać datÄ™ zakoÅ„czenia w oparciu o dostarczonÄ… datÄ™rozpoczÄ™cia), dokonywać sprawdzenia wartoÅ›ci lub też uwidaczniać albo ukrywaćinne komponenty na formularzu w zależnoÅ›ci od wprowadzonych wczeÅ›niejwartoÅ›ciZbiory danych a reguÅ‚y logiki aplikacjiNastÄ™pnym poziomem, na którym konstruować można reguÅ‚y logiki aplikacjiaplikacji, jest poziom zbiorów danych (DataSet).W klasie komponentówDataSet (której pochodnymi sÄ… wszystkie komponenty Table, Queryi StoredProc) wystÄ™pujÄ… trzy zdarzenia, które zasÅ‚ugujÄ… na specjalnÄ… uwagÄ™:OnNewRecord, BeforeDelete i BeforePost.OdpowiadajÄ… one z grubszaprocedurom zdarzeÅ„ INSERT, DELETE I UPDATE, które można podÅ‚Ä…czać dotabel bazy danych.OnNewRecordZdarzenie OnNewRecord zachodzi za każdym razem, gdy do tabeli dodawanyjest nowy rekord.Można go wykorzystać do nadawania wartoÅ›ci kolumnom tabeli.A oto próbka kodu, dostarczajÄ…ca domyÅ›lnych wartoÅ›ci kolumnom PetDepositi LawnService z tabeli LEASE, wykorzystywanej w sekcji  Tutorial książki: 638 Część IVprocedure TForm1.taLEASENewRecord(DataSet: TDataSet);begintaLEASEPetDeposit.Value:=0;taLEASELawnService.Value:=True;end;BeforeDeleteZdarzenie BeforeDelete, jak sama nazwa wskazuje, poprzedza kasowaniewiersza.Zdarzenia BeforeDelete można użyć do sprawdzenia poprawnoÅ›ciusuwania wiersza zanim zostanie ono wykonane.Na przykÅ‚ad można jewykorzystać aby zapobiec usuniÄ™ciu wiersza, który jest powiÄ…zany z wierszamiinnej tabeli.JeÅ›li w trakcie obsÅ‚ugi tego zdarzenia wygenerujemy wyjÄ…tek,usuwanie zostaje przerwane.Poniżej podajemy próbkÄ™ kodu używajÄ…cego tabelLEASE i PROPERTY z części drugiej tej książki:taLEASE.IndexName:= Propery_Number ;If taLEASE.FindKey([taPROPERTYProperty_Number.AsInteger]) thenraise EDatabaseError.Create( Property_Number is in use - deletefailed );Ten fragment programu zabezpiecza przed usuniÄ™ciem wierszy tabeli PROPERTYktóre posiadajÄ… odwoÅ‚anie do wierszy w tabeli LEASE.BeforePostZdarzenie BeforePost, jak sama nazwa wskazuje, zachodzi tuż przedzapisaniem wiersza w jego rodzimej tabeli.Zdarzenia BeforePost można użyćdo sprawdzenia poprawnoÅ›ci wartoÅ›ci w nowym wierszu lub zmian dokonanychw wierszu istniejÄ…cym.JeÅ›li w trakcie obsÅ‚ugi tego zdarzenia wygenerujemywyjÄ…tek, zatwierdzanie zostaje przerwane.Poniżej podajemy próbkÄ™ koduzapewniajÄ…cÄ…, że chronologicznie data LeaseEndDate wypadnie zawsze podacie LeaseBeginDate:procedure TForm1.taLEASEBeforePost(DataSet: TDataSet);beginIf (taLEASELeaseBeginDate.AsDateTime >¥' taLEASELeaseEndDate.AsDateTime) thenraise EDatabaseError.Create( Lease ending date m.¥' ust come after its beginning date );end;Istnieje kilka innych specjalnych zdarzeÅ„ DataSet, które można wykorzystać doimplementowania bazujÄ…cych na programie reguÅ‚ logiki aplikacji.Tabela 21.1 RozdziaÅ‚ 21 ReguÅ‚y logiki aplikacji w aplikacjach Delphi 639zawiera listÄ™ zdarzeÅ„ dostÄ™pnych w klasie komponentów DataSet, które majÄ…zwiÄ…zek z projektowaniem reguÅ‚ logiki aplikacji.Tabela 21.2.Metody DataSet, które mogÄ… siÄ™ przydać przy implementowaniubazujÄ…cych na aplikacji reguÅ‚ biznesowych.Zdarzenie Czynnik wywoÅ‚ujÄ…cyAfterCancelZachodzi po CancelAfterCloseZachodzi po zamkniÄ™ciu DataSetAfterDeleteZachodzi po DeleteAfterEditZachodzi po EditAfterInsertZachodzi po Insert lub AppendAfterOpenZachodzi po otwarciu DataSetAfterPostZachodzi po PostBeforeCancelZachodzi przed CancelBeforeCloseZachodzi przed zamkniÄ™ciem DataSetBeforeEditZachodzi przed EditBeforeInsertZachodzi przed Insert lub AppendBeforeOpenZachodzi przed otwarciem DataSetOnCalcFieldZachodzi gdy pole obliczane potrzebuje wartoÅ›ciOnDeleteErrorZachodzi gdy przy kasowaniu rekordu pojawia siÄ™problemOnEditErrorZachodzi gdy przy redagowaniu rekordu pojawia siÄ™problemOnFilterRecordZachodzi gdy filtrowanie jest uaktywnione i DataSetpotrzebuje wiersza [ Pobierz caÅ‚ość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • anikol.xlx.pl