[ Pobierz całość w formacie PDF ]
.W czasieprzeksztaÅ‚ceÅ„ elementy formularza powinny zachowywać pewne podstawoweproporcje (można to sprawdzić powiÄ™kszajÄ…c blankiet do peÅ‚nego ekranu).Kolejne udoskonaleniaMożna zaprojektować jeszcze jedno udoskonalenie, majÄ…ce na celu zwiÄ™kszenieprzydatnoÅ›ci formularza.Ponieważ każda wartość pola WORK_TYPE_CODEniesie informacjÄ™ o czasie trwania pracy okreÅ›lonej w odpowiednim rekordzietabeli WORKTYPE, może być korzystne wyliczanie przez aplikacjÄ™przewidywanego czasu wykonywania zadania i regulowanie czasem zakoÅ„czeniaprac objÄ™tych wykazem.NajproÅ›ciej osiÄ…gnąć to dziÄ™ki zapytaniom SQL.Budowanie zapytaÅ„ przy pomocy konstruktora zapytaÅ„ (Query Builder)UWAGANie wszystkie wersje Delphi zawierajÄ… wizualnego konstruktora zapytaÅ„ (VisualQuery Builder).JeÅ›li posiadana przez czytelnika wersja produktu nie jestwyposażona w to narzÄ™dzie, można opuÅ›cić fragment Kolejne udoskonaleniaPracÄ™ z wizualnym konstruktorem zapytaÅ„ rozpoczniemy od nastÄ™pujÄ…cychczynnoÅ›ci:1.Zamknąć aplikacjÄ™ RENTMAN i powrócić do Delphi.2.W wizualnym projektancie formularzy uaktywnić moduÅ‚ danych dmRENTMANi umieÅ›cić w nim komponent Query.368 Część II3.Zmienić nazwÄ™ elementu Query na quWorkDuration i ustawić wÅ‚aÅ›ciwośćDatabase na dbRENTMAN.4.Prawym klawiszem myszy kliknąć na komponencie Query i wybrać z menupozycjÄ™ Query Builder.5.JeÅ›li wyÅ›wietli siÄ™ okienko dialogowe z zapytaniem o wybór używanej bazydanych, to należy kliknąć dwukrotnie na zbiorze dbRENTMAN.6.Kolejne okienko dialogowe sÅ‚uży do wyboru interesujÄ…cych nas tabel.Dwukrotnie kliknąć na tabeli WODETAIL, po czym to samo zrobić z tabelÄ…WORKTYPE.Po zamkniÄ™ciu okna Add Table ukaże siÄ™ kolejne okno,zawierajÄ…ce obie tabele obok siebie, tak jak na rysunku 11.12.Rysunek 11.12.Główny ekrankonstruktorazapytaÅ„ (Delphi sQuery Builder).7.PrzeciÄ…gnąć kolumnÄ™ WORK_TYPE_KODE tabeli WODETAIL nad pole o tejsamej nazwie w zbiorze WORKTYPE, co powinno spowodować poÅ‚Ä…czenieliniÄ… obu pól.Oznacza to ustanowienie poÅ‚Ä…czenia miÄ™dzy tabelami,wykorzystujÄ…cego wspólnÄ… pozycjÄ™ WORK_TYPE_KODE.DziÄ™ki temuzwiÄ…zkowi bÄ™dziemy Å›ciÄ…gać z tabel interesujÄ…ce nas informacje.8.Dwukrotnie kliknąć kolumnÄ™ WORDER_NUMBER tabeli WODETAIL, abydodać jÄ… do zapytania.Jej nazwa powinna pojawić siÄ™ w dolnej części oknadialogowego.9.Przewinąć listÄ™ w dół i w polu kryteria wpisać = :WORDER_NUMBER, abyokreÅ›lić otrzymane informacje.10.Prawym klawiszem myszy kliknąć okno Option pod rubrykÄ…WORDER_NUMBER i z podrÄ™cznego menu wybrać pozycjÄ™ Group.DziÄ™kitemu pola bÄ™dÄ… grupowane zgodnie z zawartoÅ›ciÄ… kolumnyWORDER_NUMBER.11.Na pasku narzÄ™dzi kliknąć przycisk Expression Builder (ikona a+b ).Przypomocy otwartego w ten sposób okna dialogowego Expression, zdefiniowaćwyrażenie sÅ‚użące do sumowania caÅ‚kowitego czasu trwania prac z wykazu:Formularze 36912.Wpisać WorkDuration w linii Expression Name, nastÄ™pnie - z listyrozwijalnej - wybrać nazwÄ™ tabeli WORKTYPE.13.Na liÅ›cie Functions podwójnie kliknąć funkcjÄ™ sum (), a nastÄ™pnie równieżpodwójnie na pozycji TaskDuration listy Column.14.Kliknąć kolejno przyciski Save i Close, aby powrócić do głównego oknadialogowego konstruktora zapytaÅ„.(por.Rysunek 11.13).Rysunek 11.13.Pole oknadialogowegoExpressionz konstruktorazapytaÅ„ Delphi.Aby zobaczyć rezultat pracy, należy kliknąć ikonÄ™ SQL (ikona w ksztaÅ‚cieokularów na pasku narzÄ™dziowym).Wygenerowany przez konstruktora zapytaÅ„kod SQL bÄ™dzie wyglÄ…daÅ‚ mniej wiÄ™cej tak:SELECT WODETAIL.WORDER_NUMBER ,(sum( WORKTYPE.TASKDURATION)) as WorkDurationFROM WODETAIL WODETAIL, WORKTYPE WORKTYPEWHERE (WODETAIL.WORK_TYPE_CODE=WORKTYPE.WORK_TYPE_CODE)AND(( WODETAIL.WORDER_number= :WORDER_number ))GROUP BYWODETAIL.WORDER_NUMBERPo uproszczeniu zapytanie może wyglÄ…dać nastÄ™pujÄ…co:SELECT SUM ( WORKTYPE.TASKDURATION) WorkDurationFROM WODETAIL, WORKTYPEwhere WODETAIL.WORK_TYPE_CODE=WORKTYPE.WORK_TYPE_CODEand WORDER_NUMBER= :WORDER_NUMBERZapytanie sumuje czas pracy, okreÅ›lony w wykazie prac w rozbiciu na zadaniaelementarne.Podczas pracy programu pole WORDER_NUMBER jest wypeÅ‚nionewartoÅ›ciami, wiÄ™c zapytanie bÄ™dzie dodawaÅ‚o jedynie wartoÅ›ci rekordówodpowiadajÄ…cych aktualnemu numerowi zestawienia prac.370 Część IIPracÄ™ koÅ„czymy zamykajÄ…c okna SQL Statement oraz konstruktora zapytaÅ„.Nowezapytanie zostanie zachowane automatycznie, jako wÅ‚aÅ›ciwość SQL komponentuquWorkDuration.Wykorzystanie zapytania w formularzuAby móc wykorzystać zapytanie w formularzu, należy:1.Kliknąć podwójnie wÅ‚aÅ›ciwość Params nowego komponentu quWorkDurationi okreÅ›lić typ danych parametru WORK_ORDER_NUMBER na Integer;wciskajÄ…c klawisz OK zachować wprowadzone zmiany.2.Podwójnie kliknąć na komponencie Query, aby otworzyć edytor pól.3.Prawym klawiszem myszy kliknąć na edytorze i wybrać opcjÄ™ Add fields.4.Wybrać z listy pozycjÄ™ WorkDuration, kliknąć OK i zamknąć edytor pól.Umożliwi to Å‚atwe odwoÅ‚ywanie siÄ™ do kolumny poprzez jej nazwÄ™.Zdarzenie AfterPostPo skompletowaniu zapytania jesteÅ›my gotowi do poÅ‚Ä…czenia go z tabelÄ…WODETAIL.W tym celu klikamy komponent taWODETAIL, a nastÄ™pnie stronÄ™Event inspektora obiektów.Podwójnie klikamy na zdarzeniu AfterPosti dodajemy nastÄ™pujÄ…cy kod:with quWorkDuration do beginif Active then Close;ParamByName( WORDER_NUMBER ).AsInteger:=taWODETAILWORDER_NUMBER.¥' AsInteger;Open;taWORDEREndDate.AsFloat:=taWORDERStartDate.AsFloat+quWorkDurationWorkDuration.AsFloat;end;Arytmetyka dat w DelphiNastÄ™pny fragment programu uruchamia zapytanie, po czym dodaje jego rezultatdo kolumny StartDate w tabeli WORDER, okreÅ›lajÄ…c datÄ™ zakoÅ„czenia prac.TakiepodejÅ›cie oparte jest na dwóch podstawowych przesÅ‚ankach.Pierwsza wynika zesposobu przechowywania daty i czasu (w postaci liczby zmiennoprzecinkowej).Jej część caÅ‚kowita okreÅ›la liczbÄ™ dni od 31 grudnia 1899 r., zaÅ› część uÅ‚amkowaczas obliczony jako uÅ‚amek doby.Umożliwia to dodanie dni do daty przezzsumowanie caÅ‚kowitych części liczb
[ Pobierz całość w formacie PDF ]