Wat is eigenlijk de makkelijkste manier om een DBCombo waardes te laten weergeven voor een database integer veld?
BIjvoorbeeld: maandnummer -> maandnamen.
Deze waarden komen niet uit een lookupdataset. Hoe terug te vertalen vanaf de combo.
Groet!
Wat is eigenlijk de makkelijkste manier om een DBCombo waardes te laten weergeven voor een database integer veld?
BIjvoorbeeld: maandnummer -> maandnamen.
Deze waarden komen niet uit een lookupdataset. Hoe terug te vertalen vanaf de combo.
Groet!
Wat bedoel je? Wil je een combo waar je als value een integer geeft, welke als tekst de maand naam weergeeft? Dan zou je zoiets zelf toch kunnen maken, denk niet dat dit zo moeilijk is
Mijn dataset bevat een int waarde van 1..12.
Ik zou niet weten hoe ik een (normale) DBCombo zou moeten maken die de maandnamen laat zien en het int veld ook kan bewerken.
Een eigen componenten schrijven op basis van dbcombo? Tis dat ik weinig tijd heb ander maakte ik er een voor je. Of op basis van gewone combo, en itemindex als waarde updaten
Ik maak dan gebruik van een TDBLookupComboBox in combinatie met een TClientDataset (memory dataset) die ik daarvoor in een aparte routine vul met de gewenste gegevens.
Ik zal hieronder even een kort stukje uit mijn programmatuur geven. Dan hoef je zelf niet te knutselen.
Gerbuik is met dit:
Delphi Code:
var JvRegels: TClientDataset; srRegels: tDataSource; Edit2: TDBLookupComboBox; // ... CreateSysTabel(Self, srRegels, JvRegels); if (uppercase(Field) = 'MAAND') then LoadSysTabel('Maanden', JvRegels); Edit2 := TDBLookupComboBox.Create(Box1); Edit2.Parent := Box1; Edit2.DataSource := pgs; Edit2.DataField := Field; Edit2.Name := 'e_' + Field; Edit2.ListSource := srRegels; Edit2.DropDownRows := 40; Edit2.KeyField := 'ID'; Edit2.ListField := 'Naam';
Unit die ik dan gebruik:
Delphi Code:
unit systab; interface uses Classes, DB, DBClient; procedure CreateSysTabel(AOwner: TComponent; var srRegels: TDataSource; var JvRegels: TClientDataset); procedure LoadSysTabel(Soort: string; JvRegels: TClientDataset); implementation uses SysUtils; procedure CreateSysTabel(AOwner: TComponent; var srRegels: TDataSource; var JvRegels: TClientDataset); begin JvRegels := TClientDataset.Create(AOwner); srRegels := TDataSource.Create(AOwner); srRegels.DataSet := JvRegels; JvRegels.FieldDefs.Add('ID', ftInteger); JvRegels.FieldDefs.Add('Naam', ftString, 50); JvRegels.CreateDataSet; JvRegels.Open; end; procedure LoadSysTabel(Soort: string; JvRegels: TClientDataset); var wd: Integer; procedure VulPickTitle(Value: string); begin end; procedure VulPickItem(I: Integer; S: string; E: String = ''); begin S := Trim(S); JvRegels.Append; JvRegels.Fieldbyname('ID').AsInteger := I; JvRegels.Fieldbyname('Naam').AsString := S; if Length(S) > wd then wd := Length(S); JvRegels.Fieldbyname('Naam').DisplayWidth := wd; JvRegels.Post; end; begin wd := 10; Soort := uppercase(Soort); if Soort = 'MAANDEN' then begin VulPickTitle('Maanden'); VulPickItem(1, 'Januari'); VulPickItem(2, 'Februari'); VulPickItem(3, 'Maart'); VulPickItem(4, 'April'); VulPickItem(5, 'Mei'); VulPickItem(6, 'Juni'); VulPickItem(7, 'Juli'); VulPickItem(8, 'Augustus'); VulPickItem(9, 'September'); VulPickItem(10, 'Oktober'); VulPickItem(11, 'November'); VulPickItem(12, 'December'); end; end; end.
Verstandig is om in je programma.dpr dan ook dit op te nemen zodat de dll automatisch geïntegreerd wordt in je programma.
Delphi Code:
uses MidasLib, // etc ...
FireDAC hier, maar op hetzelfde idee gekomen :-)
Memory lookup dataset. Thanks
PS. Dit zou ook nog een optie kunnen zijn
https://stackoverflow.com/a/3969560/1037511
met een TDictionary<string, Int64> in plaats van een TDictionary<string, Char>.
Maar dat is dan een TComboBox en geen TDBComboBox.
@Eric is dit wat je zoekt ?
@Rik is dat niet heel veel code ?
Sysutils.LongMonthNames[1..12] geeft gewoon de maand (januari.. december)
en voor de liefhebber bestaat er ook en korte versie
Sysutils.ShortMonthNames[1..12] geeft gewoon de maand (jan..dec)
Doe er je voordeel mee
Peter
10.4.2, Delphi2010, of Lazarus 2.2.0
Een combobox (of lookup) vullen met deze waarden en je itemindex (of je key) geeft het maandnummer
Delphi Code:
var I: Integer; begin for I := 1 to 12 do ComboBox1.Items.Add(longMonthnames[i]); end;
Last edited by Wok; 17-Nov-17 at 01:13.
10.4.2, Delphi2010, of Lazarus 2.2.0
@Reidinga: ik heb het (nu even) opgelost met een memtable
@WOK / @Reidinga,
De integerwaarde moet ook weer terugkomen in de database.
Ik gebruik ongeveer de zelfde manier als Rik. Ik heb 1 tabel met defaultwaarden en sleutels. Vandaar uit vul ik een memtable en koppel deze aan een DBLookupcombobox.
Delphi is great. Lazarus is more powerfull
Tevens hoeven met een memtable de waardes niet opvolgend te zijn. Je hebt ook veel betere controle over de volgorde. Je kunt wel weer met een array van records werken waar de nummers in staan en die bij OnChange uitlezen maar TDBLookupCombobox heeft eigenlijk ook meer voordelen boven een simpele TCombobox (zoals direct connected te zijn met de dataset en zo ook goed te reageren op Edit/Read only e.d.).
Zeker als je er een klein framework van gemaakt hebt is het veel makkelijker te gebruiken. Als het om één TCombobox gaat dan kun je de simpele methode wel gebruiken maar die werkt dus niet helemaal hetzelfde met de interactie met de dataset.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks