The Perpetual Newbie - Logg Entry # 6.1This artikkelen først dukket opp på http: //www.undu.comIf du har parameteriserte spørsmål, har du sannsynligvis får datoperioder for ett felt eller en annen i prosessen. En typisk behov kan være en salgs total rapport for en bestemt tid.Det enkel løsning er å sette opp et par datepickers og bruke params funksjon av spørringen for å tildele verdien. Personlig liker jeg å bygge spørringen dynamisk hver gang. Det er en smule tregere, men jeg kan se hele søket i min programmeringskode og det er ofte en boon.Additionally, liker jeg å tilby mine brukere en rask metode for å gå inn i slike tåkete tidsrammer som denne måneden, siste kvartal eller hittil i år. Så, det som følger er hvordan jeg bygge på en dato Ranger inn i min anvendelsene.Den første trinnet er å erverve ESB Datoer freeware bibliotek. Glen Crouch og bidragsytere har skapt en stor ressurs på nettsiden: www.esbconsult.com.auWhile du er på ESB nettstedet, ta tak i freeware bibliotekene for matematikk og rutiner. Hver har Koden og hans top-notch programmering. Og ta en titt på statistikken program som er den viktigste funksjonen av nettstedet. Hvis du gjør noen fancy matte i programmet, så er dette verktøyet for deg.Jeg bruke Dato Ranger skjemaet til å også fungere som en bekreftelse på at brukeren ønsker å kjøre rapporten. Den har to datepickers (hvis du har fulgt andre tråder på nettet, vil du vite om de siste frykt om de innfødte Delphi plukkere. Jeg bruker Orpheus versjon i stedet, med sin evne til å bare skrive korte engelske uttrykk for datoer. Orpheus er tilgjengelig fra TurboPower på www.turbopower.com). Still de to plukkere til dagens dato (eller den vanligste datointervall hvis det er en overveldende populær kravet) i form skape proc.One til fordelene ved å bruke Orpheus kontrollen er at den har en enkel funksjon for å konvertere datoer i fire- sifrede år strenger. Det kalles DateString og krever en maske, som du vil see.Inbetweeen de to datepickers, kalt dFrom og dfor henholdsvis, er en knapp med en enkel TIL bildetekst. Det fungerer som en etikett og en kanal til en popup-meny for å tillate enkel plukking av et sett datointervall. Prosedyren for denne knappen ser slik ut: prosedyren TFrmReport.BtnToClick (Sender: TObject); begynne pmDateRanger.Popup (FrmReport.Left + 120, FrmReport.Top + 84); end; I tvinge kall av popup, må du forteller det hvor du skal dukke opp. Du kan eksperimentere og få absolutte koordinater, eller du kan bruke en formel som kan bli ganske involvert. En ting for ikke å glemme, når du bruker følgende formel, må du lage en stor nok off-set for å imøtekomme den bildetekst og en meny høyde: (FrmReport.left + BtnTo.left, FrmReport.top + BtnTo.top + BtnTo. høyde + 25) Du kan også peke hurtigmenyen eiendom på knappen til pmDateRanger. På den måten, hvis brukeren klikker, viser det seg i forbudt sted. Hvis brukeren høyre klikk på knappen, dukker menyen opp på standard, noen antall piksler lavere og til høyre. Det er bare litt disconcerting.The popup-meny er befolket av dine menyvalg. Gruppen jeg bruker kanskje eller kanskje ikke passer deg. Jeg er sikker på at du vil ha en annen gruppering konsept enn min. Imidlertid er hemmeligheten i å sette merkelappen av hvert menyvalg, slik at det kan behandles av én sentral handler. Jeg bruker 11-13 dager, 21-23 uker, 31-33 måneder, 41-43 for kvartalene, 51-54 for to-date gruppe, 61-62 for biz dager, 71-72 år, og 80 for de allestedsnærværende alle datoer. Legg merke til at du kanskje ønsker å sette dFrom til en tidligere dato som 1 980 hvis du har behov for enda mer historisk dato ranging.It er viktig på dette punktet for å fortelle deg om en felle jeg falt inn i de første tre gangene jeg prøvde å programmere denne fra minnet. (Jeg er en nybegynner, afterall). Det er en følelse av at du bør bruke OnPopUp eller OnChange tilfelle av popup-menyen for å gjøre menyen plukke håndtering. Nope! Lag en egen prosedyre for bruk av onclick metoden for hvert menyelement, mens det viser i menyen designer. Deretter kan du skifte klikke på umiddelbare elementer alle handling meny og peker onclick til behandleren. IKKE inkluderer forelder til noen underordnede menyer du måtte ha. Gjorde at feil to.The kode for å oppdatere datovelgeren for et sett range kjøringer av pmMenuHandler proc: prosedyre TFrmReport.pmMenuHandler (Sender: TObject); Var t, s: TDateTime; begynne t: = dato; saken (avsender som TMenuItem) .tag av 11: begynne //går eDateFrom.date: = t - 1; eDateTo.date: = t - 1; slutt; 12: begynne //dag eDateFrom.date: = t; eDateTo.date: = t; slutt; 13: begynne //morgen eDateFrom.date: = t + 1; eDateTo.date: = t + 1; slutt; 21: begynne //forrige uke s: = t - 7; mens isMonday (s) = false do s: = s - 1; eDateFrom.date: = s; eDateTo.date: = s + 6; slutt; 22: begynne //denne uken s: = t; mens isMonday (s) = false do s: = s - 1; eDateFrom.date: = s; eDateTo.date: = s + 6; slutt; 23: begynne //neste uke s: = t + 7; mens isMonday (s) = false do s: = s - 1; eDateFrom.date: = s; eDateTo.date: = s + 6; slutt; 31: begynne //siste måneden s: = GetFirstDayOfMonth (t) -1; //Blir siste dag av siste mo. eDateFrom.date: = GetFirstDayOfMonth (s); eDateTo.date: = s; slutt; 32: begynne //denne måneden eDateFrom.date: = GetFirstDayOfMonth (t); eDateTo.date: = GetLastDayOfMonth (t); slutt; 33: begynne //neste måned s: = GetLastDayOfMonth (t) 1; //Blir første dag i neste mnd. eDateFrom.date: = s; eDateTo.date: = GetLastDayOfMonth (s); slutt; 41: begynne //siste kvartal s: = GetFirstDayOfQuarter (t) -1; //Blir siste dag av siste Q eDateFrom.date: = GetFirstDayOfQuarter (s); eDateTo.date: = s; slutt; 42: begynne //dette kvartalet eDateFrom.date: = GetFirstDayOfQuarter (t); eDateTo.date: = GetLastDayOfQuarter (t); slutt; 43: begynne //neste kvartal s: = GetLastDayOfQuarter (t) 1; //Blir første dag i neste Q eDateFrom.date: = s; eDateTo.date: = GetLastDayOfQuarter (s); slutt; 51: begynne //måned hittil eDateFrom.date: = EncodeDate (thisyear, ThisMonth, 1); eDateTo.date: = t; slutt; 52: begynne //hittil i år eDateFrom.date: = EncodeDate (thisyear, 1,1); eDateTo.date: = t; slutt; 53: Begynn //siste 365 dager eDateFrom.date: = t - 365; eDateTo.date: = t; slutt; 54: Begynn //siste 13 ukene eDateFrom.date: = t - 91; eDateTo.date: = t; slutt; 61: begynne //før biz dag s: = t-1; //Går mens isWeekend (e) gjør s: = s - 1; eDateFrom.date: = s; eDateTo.date: = s; slutt; 62: begynne //neste biz dag s: = t + 1; //Morgen mens isWeekend (e) gjør s: = s + 1; eDateFrom.date: = s; eDateTo.date: = s; slutt; 71: begynne //fjor s: = GetFirstDayOfYear (Date2Year (t)) - 1; //Blir siste dag av siste år. eDateFrom.date: = GetFirstDayOfYear (Date2Year (e)); eDateTo.date: = s; slutt; 72: begynne //år eDateFrom.date: = GetFirstDayOfYear (Date2Year (t)); eDateTo.date: = GetLastDayOfYear (Date2Year (t)); slutt; 73: begynne //neste år s: = GetLastDayOfYear (Date2Year (t)) + 1; //Blir første dag i neste mnd. eDateFrom.date: = s; eDateTo.date: = GetLastDayOfYear (Date2Year (e)); slutt; 80: begynne //alle datoer eDateFrom.date: = strToDate ('1/1/1980'); eDateTo.date: = strToDate ('1/1/2222'); slutt; end, end, Senere, en kode fragment å dra nytte av det vi får med datoperiode nå valgt. Her er koden for å starte en spørring ved hjelp av datoperioden valgt: prosedyre TFrmReport.BtnRepPrintClick (Sender: TObject); Var dStart, utbetaling: string; begynne dStart: = '(DateProd > =' '' + dFrom.DateString ('mm /dd /åååå ') +' '') '; utbetaling: = 'AND (DateProd < =' '' + dTo.DateString ('mm /dd /åååå') + '' ')'; med qValue gjøre begynne aktiv: = false; sql.beginUpdate; sql.clear; sql.add ('SELECT DISTINCT'); sql.add ('PartNum,'); sql.add ('LotNum,'); sql.add ('DateProd,'); sql.add ('Production,'); sql.add ('ProductionValue'); sql.add ('Fra'); sql.add ('"SALES.db"'); sql.add ('WHERE'); sql.add (DStart); sql.add (utbetaling); sql.add ('ORDER BY'); sql.add ('PartNum,'); sql.add ('LotNum,'); sql.add ('DateProd,'); sql.add ('Production,'); sql.add ('ProductionValue'); sql.EndUpdate; aktiv: = true; slutt; qrValue.Print; ende; Det er ingen tvil om jeg kunne ha paramaterized dette søket. Men det er veldig lett å bygge og endre. For eksempel har mange nummer redigeringsboksen på rapportskjema for å tillate valgfri begrense rapporten. En enkel linje å legge etter "legge utbetaling" linje vil være: hvis editLotNum.text < > '' Da sql.add ('OG LotNum = "' + editLotNum.text + '»)'; Hvis du har mange parametere for å fylle på denne måten, så gå til en av de dynamiske sql skape verktøy. De synes å være beskjæring opp overalt. Jeg bruker SimpleQuery fra lelSoft (http://lelsoft.hypermart.net). Men hvis dato alt er alt du trenger, bør du være spillet for å skrive din own.Gary MugfordIdea Mechanic, Bramalea ON [email protected] Anmeldelser
The Dating Game
Previous:Sikkerhet vite Whos Who
Next Page:Nå barn, ett spørsmål om tid