Avatar billede koden12 Nybegynder
28. juni 2004 - 14:39 Der 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 ?

VH
koden12
Avatar billede borrisholt Novice
28. juni 2004 - 14:49 #1
Du gør det ved at Gemme månedens nummer og ikke dens navn !

Jens B
Avatar billede koden12 Nybegynder
28. juni 2004 - 15:02 #2
øøø den er jeg ikke rigtig med på ?
Det skulle gerne kunne ses i en DBGrid (resultatet)

VH
koden12
Avatar billede borrisholt Novice
28. juni 2004 - 15:27 #3
Så kan du lave en tabel med de 12 Måneder i, og så laven en Join i dit SQL

Jens B
Avatar billede koden12 Nybegynder
28. juni 2004 - 15:51 #4
øøø den er også sej, men måske kan jeg den... problemet er at brugeren
jo selv skriver måneden..de vælger ikke..

VH
kode12
Avatar billede koden12 Nybegynder
28. juni 2004 - 16:06 #5
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;

{Usage:}
ShowMessage(DateToStr(LastDayCurrMon)) ;


VH
koden12
Avatar billede koden12 Nybegynder
28. juni 2004 - 16:19 #6
Hej Boris (topscore)

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.. : )

VH
koden12
Avatar billede hrc Mester
28. juni 2004 - 23:40 #7
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.
Avatar billede koden12 Nybegynder
29. juni 2004 - 00:17 #8
ØØ 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..

VH
koden12
Avatar billede hrc Mester
29. juni 2004 - 00:22 #9
Ja, ja. Der skal lidt mere til.

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:

unit FMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls, ExtCtrls, DB, ADODB;

type
  TfrmMain = class(TForm)
    DBListBox1: TDBListBox;
    ADOTest: TADOTable;
    dsTest: TDataSource;
    DBNavigator1: TDBNavigator;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure DBListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
  private
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

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.
Avatar billede hrc Mester
29. juni 2004 - 00:29 #10
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.
Avatar billede hrc Mester
29. juni 2004 - 00:31 #11
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.
Avatar billede hrc Mester
29. juni 2004 - 00:39 #12
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
Avatar billede koden12 Nybegynder
29. juni 2004 - 11:04 #13
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...

VH
koden12
Avatar billede hrc Mester
29. juni 2004 - 11:38 #14
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.
Avatar billede koden12 Nybegynder
29. juni 2004 - 12:49 #15
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..

VH
koden12
Avatar billede koden12 Nybegynder
29. juni 2004 - 18:00 #16
Hej hrc

Det virker fint nok, MEN hvordan for du den til at skrive nummeret ind ?
Dobbelklikker du på den , måned og så ??

VH
koden12
Avatar billede koden12 Nybegynder
29. juni 2004 - 18:12 #17
Jeg har sådan en "spøgelses mails :

0tarsan@ofir.dk

den må du gerne sende den til... hvis du vil..

VH
koden12
Avatar billede koden12 Nybegynder
01. juli 2004 - 00:06 #18
hrc
Det virker fint.
Tak..
Det tog et par dage at finde ud af det  :)

VH
Koden12
Avatar billede hrc Mester
02. juli 2004 - 10:31 #19
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"...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester