28. juni 2004 - 14:39Der er
18 kommentarer og 1 løsning
sortering på måned hvordan
Jeg har en access database med ADO . En af dem hedder måned (maned)... her sætter brugeren ind : Januar, Juli, august osv. Jeg ville gerne have at de kunne visen som fortløbende måneder ? altså : januar, februar osv. Der ligger en ID autonummer i Databasen Hvordan gøres det ? sql asc og de der vil jo fejle.. da august jo så vil komme forrest ?
Jeg ved godt den ikke dur men jeg fandt da noget lidt derhenad...
function LastDayCurrMon: TDate; var y, m, d: word; begin decodedate(now, y, m, d) ; m := m + 1; if m > 12 then begin y := y + 1; m := 1; end; result := encodedate(y, m, 1) - 1; end;
Kan man lave sådan en "vis (find) alle januar " smides ind i et eller andet og noget viser dem alle , et eller andet... tænkte jeg på.. Du har vist engang lavet sådan noget ligende. Måske skal jeg se i mine "gemmer" igen.. : )
Du kan jo bruge en TDBListBox eller en TDBComboBox til at rumme alle årets måneder. I databasen gemmer du ItemIndex i et numberfelt. Lige ud af landevejen.
ØØ noget med Items line 1 ?? .. jeg kan godt se at Items laver et line nummer med jeg er ikke helt med alligevel.. For hver gang der vælges line1 eller line 2 database := line.index ??? kan jeg bede om lidt mere hjælp.. jeg er jo lidt tumpet..
Din TDBListBox.Style sættes til lbOwnerDrawFixed. ItemHeight sættes til 13, svarende til højden på tallene i items (måske kan textheight bruges der). DataField sættes til det numeriske felt som skal indeholde værdierne 0 til 11
Jeg lavede dette testprogram som du måske kan bruge til noget:
const MonthConsts : array[0..11] of string = ('Jan','Feb','Mar','Apr', 'Maj','Jun','Jul','Aug', 'Sep','Okt','Nov','Dec');
procedure TfrmMain.FormCreate(Sender: TObject); begin ADOTest.Open; end;
procedure TfrmMain.FormDestroy(Sender: TObject); begin ADOTest.Close; end;
procedure TfrmMain.DBListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); const Offset = 2; begin with (Control as TDBListBox).Canvas do begin FillRect(Rect); TextRect(Rect,Rect.Left + Offset,Rect.Top,MonthConsts[Index]); if (State = [odFocused]) then DrawFocusRect(Rect); end; // with end;
end.
Adotabellen er koblet på TDataSourcen som igen er koblet på TDBListBox og TDBNavigatoren.
I TDBListBoksens Items laver du tolv linier fra 0 til 11 som er de værdier der bankes i tabellen - dette forudsat at du gemmer den numeriske værdi i tabellen.
Det var nemlig hvad jeg ville, men fik det problem at komponenten kun ville gemme den tekst jeg havde skrevet i .Items-listen. Troede at jeg kunne sætte månedernes navne ind i Items og få den til at gemme dets ItemIndex (0..11). Det kunne jeg ikke!
Derfor valgte jeg at sætte TDBListBoksen til OwnerDrawFixed sådan at jeg, hen over de 12 tal, kunne overskrive med de tilsvarende navne for månederne.
Hvis du er godt tilfreds med at gemme månedernes navne - hvilket er lidt spild af plads - så er det meget lettere.
I stedet for at rode med tallene ovenfor og tegne på et canvas, så skriver du bare månedernes navne i Items-listen og sætter DataField til at pege på et tekstfelt i tabellen.
Vælger du den sidste løsning (uden OwnerDrawFixed og med strenge ned i tabellen) kan jeg ikke give dig et eksempel da jeg ikke behøver skrive bare en enkelt linie kode.
Borrisholts forslag med en tabel indeholdende månederne er lidt overkill idet du ender med en tabel der altid kun indeholder de 12 værdier. Men det virker. En nem måde at implementere det på uden joins og SQL er at bruge en TDBLookupListBox eller TDBLookupComboBox - men det er en anden historie.
Du skriver at du er lidt tumpet - hvad er jeg så? Sidder kl. 0:40 og taster løs, vel vidende at jeg skal på arbejde i morgen tidlig. G'nat
Gisp , det var lidt af en overraskelse. Jeg havde end ikke nogen anelse om at jeg stillede et svært spørgsmål. Den skal jeg nok bruge nogle dage til at teste og tygge igennem. Hvad indeholder din database fx... (Nej sov nu hellere) (ikke på arbejdet altså : ) Er der et felt tekst og et felt nummer ? Nå jeg kan også bare teste den først. Mange tak.. Du behøver ikke haste...
Jeg valgte at bruge TDBListBox og TDBComboBox da de er beregnet til at indeholde værdier der ikke ændres og som man ikke vil oprette en tabel for - f.eks. måneder eller tipskuponens 1/X/2.
Desværre var det ikke muligt (en eller anden, ret mig hvis jeg tager fejl) at vise tekst og gemme tal: Gemme som månedsnummer (0..11) samtidig med at månednavnene vises på skærmen. Jeg måtte forbi OwnerDrawFixed.
Resultatet blev et simpelt program hvor kun OnDrawItem gav problemer (glemte at TextRect skulle have Rect's X og Y positioner - så intet kom ud på skærmen).
Hvis man bare gemmer strengen er sagen ligetil.
I test-databasen har jeg tre felter: Primærnøgle ID (auto-inc), MaanedID (num) og MaanedText (str) for at kunne teste begge løsninger. Hvis du har probl. kan jeg evt. sende programmet til dig.
Jeg har ikke haft tid til at teste endnu.. : ) For så vit er det jo ligemeget om det kan ses på skærm eller ej, den skal bruges til at sorterer og vil nok blive ikke synlig..
Det lyder godt. Beklager at jeg ikke så dine efterfølgende indlæg - der kommer efterhånden en del mails dumpende på min "notfikations-email"...
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.