21. april 2010 - 09:20Der er
20 kommentarer og 1 løsning
Fileter på blok er langsom
Hej jeg skal "autoarkivere" i C5 og har dermed oprettet et index bestående af et aktivfelt og et dato felt
Jeg har lavet en frm_index på det aktive felt for at minimere mit indhold. Herefter har jeg lagt følgende på filter:
Return Date_ >= #MthFwd(Today(), -1)
Således jeg kun kigger en mpned tilbage ... mit problem er at det går ret langsomt efter at filteret er lagt på ... er der nogen der har en løsning til dette?
Hvad mener du egentlig med "autoarkivere" fra en form? Er det et under menupkt. eller....?
Nu ved jeg jo ikke hverken hvilken tabel eller hvilken form du sidder og arbejder med, men en Search løkke til at udvælge data fra en bestemt tabel i et bestemt dato interval fylder ganske få kodelinier! Skal du have koden så giv mig: Tabelnavn, Form og søge kriterier(felter). ....og selvfølgelig svar på de to spørgsmål i starten! :-)
Når det er en SQL-backend så skulle du lade den gøre arbejdet med at afgøre hvilke poster der skal vises i formen. Filter-metoden er meget langsom da, det først afgøres om posten skal vises når den ER hentet. Så det vil jo ske for samtlige records du henter.
Hvis du nu lod SQL-backenden om opgaven, er jeg sikker på, at svartiden ville blive noget bedre.
Prøv at undersøge SQL-makrobiblioteket, og du vil opdage, at man faktisk kan fodre en form med en SQL-WHERE CLAUSE.
Lokalmakroen hedder
#SQLSetWhereCondition
Og den tager tabelnavn som første parameter og where-clausen som anden parameter
Hehe. Jeg var ellers ved at lave et kodeeksempel til dig. :) Kan du ikke lige vise det kode som du har lavet her, så andre evt. kan få glæde af det også ?
PFT.
Jeg har selv godt nok på en XAL brugt metoden til at nedbringe svartiden i en form, som gik på tværs af en hulens masse regnskaber for at samle data sammen. Vi gik fra 1.5 - 3 min, ned til omkring 3 sek.
Så man kan i nogle tilfælde hente nogle ret kraftige performanceforbedringer.
hehe har faktisk ikke koden ... men kunne se det ville virke ... kunden ombestemte sig og ville faktisk bare starte i formen der hvor datoen var en måned gammel og så have mulighed for at scrolle op ... så opgaven blev løst med en #Frm_FIND og en SET CustJournal.Date_ :-)
Jamen så må jeg hellere komme med et eksempel :0) Godt nok taget fra XAL-verdenen, men det skulle også virke i c5 da kernen jo stort set er magen til.
" #SQLSetWhereCondition er af en eller anden grund ikke anvendt i standard applikationen, selvom den i mange tilfælde ville kunne eliminere brugen af temp-kartoteker eller suspekte filter-triggere.
Vi tager et eksempel .. koden kan f.eks. ligge i INIT-triggeren :
Her sætter vi det op så XAL'en præsenterer posterne i StockTable sorteret efter GroupItemIdx hvor gruppen er lig '20' og salgsprisen er større end 1 krone.
SQL-mæssigt bliver det til :
SELECT ROWNUMBER,LASTCHANGED,ITEMGROUP,ITEMNUMBER,ITEMNAME, …… STDCR,ROWID FROM STOCKTABLE WHERE DATASET = ‘DAT' AND SALESPRICE > 1 AND ITEMGROUP = '20' ORDER BY DATASET,ITEMGROUP,ITEMNUMBER,ROWNUMBER "
Synes godt om
Slettet bruger
22. april 2010 - 11:40#16
Til jasman:
Er #SQLSetWhereCondition ikke aktiv indtil man kører #SQLClearWhereCondition ?
D.v.s. hvis du springer fra din form i eksemplet til en anden form med StockTable vil #SQLSetWhereCondition stadig være aktiv. Det kan selvfølgelig både være godt og skidt - men det kan forklare hvorfor det ikke er benyttet i standard.
Lav et indeks på dit arkivfelt, og lad en kørsel sørge for at det blive opdateret hver morgen, så det kun er poster over 1 måned gamle, der har feltet aktivt. Kørslen kan også sagtens ligge i init-triggeren, hvsi det ikke er alt for mange poster, den skal igennem
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.