Avatar billede visuel Nybegynder
04. april 2004 - 19:47 Der 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.

Hvordan gøres dette??
Avatar billede visuel Nybegynder
04. april 2004 - 20:14 #1
Jeg har prøvet med nedenstående kode, men det giver følgende fejl:

********************************************************

Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket"Navn = Thomas s"

********************************************************
Koden:


procedure TAnsoeg.ListBox1DblClick(Sender: TObject);
var
  Q1: TADODataset;
begin
  Q1 := TADODataset.Create(self);
  Q1.Connection := ADOConnection1;

  Q1.Close;
  Q1.CommandText := 'SELECT * FROM Personer WHERE Navn = ' + ListBox1.Items.Strings[ListBox1.ItemIndex];
  Q1.Open;

  NavnTxt.Text := Q1.Parameters.ParamByName('Navn').Value;
  AdresseTxt.Text := Q1.Parameters.ParamByName('Adresse').Value;
  Q1.Free;
end;
Avatar billede visuel Nybegynder
04. april 2004 - 20:16 #2
Hvis jeg laver en anden der bare hedder Test får jeg følgende fejl:

Parameter Test har ingen standardværdi.
Avatar billede visuel Nybegynder
04. april 2004 - 23:13 #3
Er der slet ikke nogen der kan svare på dette?? :(
Avatar billede janbb Juniormester
05. april 2004 - 03:21 #4
Der har været mange gode spm. om det emne:

F.x.: http://www.eksperten.dk/spm/409310
Avatar billede janbb Juniormester
05. april 2004 - 03:36 #5
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.
Avatar billede janbb Juniormester
05. april 2004 - 03:40 #6
Det 'noget med' at du skal lave et itemindex og noget commandtxt der passer til

procedure TForm1.ListBox3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  valgt := ListBox3.ItemIndex;
  Listbox1.ItemIndex := valgt;
  Listbox2.ItemIndex := valgt;
end;

commandtexten ku saa se såån ud:

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.
Avatar billede janbb Juniormester
05. april 2004 - 04:09 #7
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.
Avatar billede janbb Juniormester
05. april 2004 - 04:17 #8
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 ?.
Avatar billede nca Juniormester
05. april 2004 - 08:33 #9
Avatar billede visuel Nybegynder
05. april 2004 - 09:31 #10
enten forstår jeg ikke helt svaret eller også snakker vi forbi hinanden. Kan jeg måske få et eksempel ud fra den kode jeg har i forvejen?? :)

Kommentar: visuel
04/04-2004 20:14:14
....................

Jeg har prøvet med nedenstående kode, men det giver følgende fejl:

********************************************************

Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket"Navn = Thomas s"

********************************************************
Koden:


procedure TAnsoeg.ListBox1DblClick(Sender: TObject);
var
  Q1: TADODataset;
begin
  Q1 := TADODataset.Create(self);
  Q1.Connection := ADOConnection1;

  Q1.Close;
  Q1.CommandText := 'SELECT * FROM Personer WHERE Navn = ' + ListBox1.Items.Strings[ListBox1.ItemIndex];
  Q1.Open;

  NavnTxt.Text := Q1.Parameters.ParamByName('Navn').Value;
  AdresseTxt.Text := Q1.Parameters.ParamByName('Adresse').Value;
  Q1.Free;
end;

.....................
Kommentar: visuel
04/04-2004 20:16:17
.....................

Hvis jeg laver en anden der bare hedder Test får jeg følgende fejl:

Parameter Test har ingen standardværdi.
Avatar billede nca Juniormester
05. april 2004 - 10:08 #11
Jeg har lavet et eksempel i 464591
Avatar billede janbb Juniormester
05. april 2004 - 15:25 #12
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.
Avatar billede koden12 Nybegynder
05. april 2004 - 22:44 #13
Den virker skal jeg hilse og sige..

VH
koden12
Avatar billede visuel Nybegynder
06. april 2004 - 22:21 #14
Jeg får altså en fejl:

Access violation at address 0048EE0A in module 'Ansoegning.exe'.Read of address 00000000
Avatar billede visuel Nybegynder
06. april 2004 - 22:21 #15
Fejlen opstår når jeg forsøger at hente dataene ind i ListBox
Avatar billede visuel Nybegynder
06. april 2004 - 22:23 #16
Den påstår at det er i denne linie:

for x:=0 to adotable1.Recordset.RecordCount -1 do begin
Avatar billede visuel Nybegynder
06. april 2004 - 22:49 #17
Nu ser det tilsyneladende ud til at noget virker ;)

Nu får jeg bare en >>Parameter 'Navn' not found<< når jeg forsøger at hente dem ind i mine edit felter.
Jeg henter dem ind med

      NavnTxt.Text := Q1.Parameters.ParamByName('Navn').Value;

Er det rigtigt?? eller hvad skal jeg gøre?
Avatar billede janbb Juniormester
07. april 2004 - 03:27 #18
'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.
Avatar billede janbb Juniormester
07. april 2004 - 03:34 #19
Du skal osse sætte tabellens aktive-property til true, men det har du vel gjort.
Avatar billede janbb Juniormester
07. april 2004 - 03:48 #20
Jeg går ud fra du har klaret det første punkt:

Forklaring:
Jeg har en ADOconnection, som peger på databasen.

idet du vistnok i dit eget eks. bruger kode til at lave denne.

Det kan man osse, men ellers dobbeltklik i feltet og følg anvisningerne,
som nca forslår man gør i dette eks.
Avatar billede janbb Juniormester
07. april 2004 - 03:59 #21
Hvis du heller vil bruge kode så kig lidt på kommentarer i dette spm.

http://www.eksperten.dk/spm/373263
Avatar billede koden12 Nybegynder
07. april 2004 - 11:29 #22
Under USES skal være DB og noget andet.

det er vel ikke det ?

VH
koden12
Avatar billede visuel Nybegynder
07. april 2004 - 13:17 #23
Hmm, jeg kan ikke vælge nogen fields til min ADOTable. Jeg kan heller ikke vælge nogen MasterSource. :/
Avatar billede visuel Nybegynder
07. april 2004 - 13:21 #24
Kan det ikke laves uden ADOTable?? Jeg synes ikke jeg har andet end problemer med det  ;)
Avatar billede nca Juniormester
07. april 2004 - 13:44 #25
Du er velkommen til at sende det hele til mig i en zipped fil. Husk også databasen.
Send til: nca@pmc.odense.dk
Avatar billede visuel Nybegynder
07. april 2004 - 16:15 #26
så det sendt ;)
Avatar billede visuel Nybegynder
08. april 2004 - 12:43 #27
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.
Avatar billede nca Juniormester
08. april 2004 - 20:59 #28
>>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.
Avatar billede visuel Nybegynder
09. april 2004 - 16:06 #29
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 :)

1.000.000 tak for hjælpen
Avatar billede visuel Nybegynder
09. april 2004 - 16:08 #30
Man kan også bruge insert istedet for append. Hvad er forskellen egentlig??

:)
Avatar billede visuel Nybegynder
09. april 2004 - 16:30 #31
men HOV.....

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!!!

Hvordan??
Avatar billede visuel Nybegynder
09. april 2004 - 16:51 #32
Ok, nu er problemet afgrænset til, at man KUN skal kunne ændre data ved at klikke på en knap og IKKE når man dobbeltklikker på en ny i listBoxen.

:)
Avatar billede nca Juniormester
09. april 2004 - 18:57 #33
Her er et svar.
Det glæder mig at du kom videre.
Avatar billede visuel Nybegynder
10. april 2004 - 02:01 #34
Men er der nogen af jer der kan svare på ovenstående??
Avatar billede janbb Juniormester
10. april 2004 - 04:14 #35
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..
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