04. april 2004 - 19:47Der er
32 kommentarer og 3 løsninger
Hente data i en db ud fra et valg i en ListBox
Jeg har en ListBox, hvor jeg skal kunne dobbeltklikke på et emne. Herefter skal jeg ud fra det valgte emne kunne hente resten af oplysningerne omkring det emne fra en db.
Ex
Et emne i ListBox'en hedder Thomas. Dette emne er hentet ud fra et navn i en database (alle navne fra db er i ListBoxen). Nu skal jeg, ved at dbKlikke på Thomas, have hentet alle data omkring Thomas, dvs navn, adresse m.m. fra db'en ind i nogle editfelter.
Det er iøvrigt ikke noget banalt spm., men du kan jo selv studere koden i borrisholts eksempel sv.t. spm.et ovenfor, hvis det stadig ligger på adressen, der angives.Meget fornøjelig programmering, der såvidt jeg husker osse kunne udvides til det du efterspørger.
if ListBox3.ItemIndex >= 0 then begin ADOCommand1.CommandText := 'select * FROM tabel WHERE phone = :phone'; ADOCommand1.Parameters.ParamByName('phone').Value := ListBox3.Items.Strings[ListBox3.ItemIndex]; ADOCommand1.Execute; end else Showmessage('Du har ikke valgt et item!');
Det er ikke afprøvet, men bare for at gi lidt ideer.
Fandt 'by the way' et eks. med det du søger.Husker ikke hvad spm. det stammer fra:
procedure TForm1.Button1Click(Sender: TObject); var x:Integer; begin for x:=0 to adotable1.Recordset.RecordCount -1 do begin listbox1.Items.Add(ADOTable1.FieldByName('sogeord').AsString); ADOTable1.Next; end; ADOTable1.First; end; procedure TForm1.ListBox1Click(Sender: TObject); var AltOK: Boolean; begin AltOK:=ADOTable1.Locate('sogeord',ListBox1.Items[Listbox1.ItemIndex],[loCaseInsensitive]); end;
Her åbnes databasen altsaa med button1click, men den kan sikkert osse tages ind direkte.
soegeord er det field jeg tager ind i listboxen til at 'bladre' i db.en med. Fungerer fremragende, men hvorfor det lige er så meget smartere end en grid, hvor f.x. kun et field vises har jeg vist glemt i mellemtiden ?.
Kære visual: du kan ikke få en mere komplet og flot foklaring til dit spm:
nrc skriver:
Jeg har lavet et lille forsøg:
procedure TForm1.Button1Click(Sender: TObject); var x:Integer; begin for x:=0 to adotable1.Recordset.RecordCount -1 do begin listbox1.Items.Add(ADOTable1.FieldByName('Navn').AsString); ADOTable1.Next; end; ADOTable1.First; end;
procedure TForm1.ListBox1Click(Sender: TObject); var AltOK: Boolean; begin AltOK:=ADOTable1.Locate('Navn',ListBox1.Items[Listbox1.ItemIndex],[loCaseInsensitive]); end;
Forklaring: Jeg har en ADOconnection, som peger på databasen. Jeg har en ADOTable, som peger på navnetabellen i databasen Jeg har en Datasource som har ADOTable som dataset Jeg har en almindelig listboks. Derudover har jeg det ønskede antal DBLabels, som alle har DataSource1 som datasource og som så har forskellige Datafields fra tabellen, fx. Navn Ved et klik på Button1 får jeg fyldt alle navnene fra databasen ind i listboksen. Sætter en OnClick event på listboksen. Når jeg klikker på et navn i listboksen, bliver der lavet en søgning i databasen. Dette flytter den aktuelle pegepind i databasen og derved bliver også indholdet i de forskellige DBLabels opdateret.
Janbb (mig) har uddybet forklaringen med en lille kommentar:
Jeg vil bare give mit besyv med og udtrykke min begejstring for det smarte locate-trick i listboxe: flot og grundig forklaring nca. Man kunne måske have uddybet at adotabellen: "Jeg har en ADOTable, som peger på navnetabellen i databasen" - gør dette via AdoConnectionen - for de helt jomfruelige database-entusiaster.
'Navn' er jo et feltnavn.Du kunne jo prøve med et af dine andre fields, var det 'adresse' du havde i din tabel osse ? så prøv med den.Hvis du har klikket på din adotabel og derefter højreklikket får du en liste over feltnavne, hvis du højreklikker i listen og vælger 'all fields' listes de. Det er tit nødv. at lave denne manøvre, selvom der vist er noget med at man kan bruge andre metoder. Synd hvis du ikke får det til at virke.Har nylig fået øjnene op for at det er mere nyttigt end jeg først havde troet.Fx. check spm 486295, der kombineret med denne rutine giver et flot lille program.
Er der ikke mulighed for at man kan undgå at bruge dbNavigator, når jeg vil indsætte en ny post i db??
dvs. er det muligt at når man starter programmet op, kan indtaste nye data UDEN at den har hentet første element ind og herefter trykke på en knap "Tilføj" hvilket vil medføre, at dataene bliver gemt i db?
nca >> Har fået implementeret det i min EGEN kode og det virker ;) har dog stadig ovenstående problem.
>>visuel Jeg er da ked af at du synes jeg har ødelagt din kode. Håber du kan bruge den del af min hjælp, som du synes er relevant. Hvis du ikke vil bruge en navigator skal du bruge Open til at åbne dit dataset og bagefter Append for at tilføje din post.
nca>> Du ka' tro jeg er taknemmelig for din hjælp og jeg kunne bruge den til meget. Det er altid meget lærerigt at se hvordan andre implementerer kode. Jeg kan dog ikke se at det du ændrede i programmet og i db'en var særlig brugbart, men nu har jeg da fået det implementeret i min egen kode og det virker. hvis du lige smider et svar :)
Når jeg dobbeltklikker på et element i listBoxen og retter lidt i teksten og derefter klikker på et andet element i listBoxen, kan jeg ikke klikke tilbage på det første element igen?!!? Når jeg så genstarter programmet har den ændret dataene for det første element. Dataene må ikke blive ændret før der trykkes på en knap!!!
Nej, det virker fint hos mig.Man kan dog tilføje at man ved at lukke og åbne tabellen igen undgår at listningen bare fortsætter i listboxen.Desuden kan du ved at checke hjælpen/Help faa alle koder for navigator one-by-one First, last, edit, post osv.Så det sku ik være noet probl..
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.