Avatar billede a38 Nybegynder
09. december 2002 - 21:54 Der er 29 kommentarer og
1 løsning

Action performed (mysql Søgning)

Lille forhistorie!

Jeg har en application der kan indsætte, hente og udskrive alle oplysninger på en database.

Nu vil jeg gerne lave et søge felt hvor jeg kan søge på enkelte navne i databasen.

Jeg opererer med en GUI klasse, hvor mine action performed metoder ligger. En DB klasse der håndterer SQL med DB og regner med at jeg skal have en 3. klasse der håndterer mine metoder. MEN hvordan dælen får jeg det til at funke??
Jeg stiller en ordelig røvfuld point på højkant for et godt svar med kode eksempler (jeg skal aflevere projekt onsdag, så jeg er lidt under pres!)

Ser dog nok ikke mere på det før imorgen ved 10 tiden, stil endelig spmg. så skal jeg nok uddybe hvis der er brug for det.
Avatar billede magoo20000 Nybegynder
09. december 2002 - 22:04 #1
Hvad mener du med enkelte navne i db? Er det bestemte tabeller eller dem alle sammen? En opdeling i grænseflade/funktionslag/model er tit en god ide..
Om der skal tages mønstre i brug afhænger af den konkrete problemstilling.
Avatar billede arne_v Ekspert
09. december 2002 - 22:04 #2
Det først du skal finde ud af er om du vil søge i
databasen eller i memory.

Hvis du søger i databasen, så erstatter du SELECT * FROM TABEL
med SELECT * FROM TABEL WHERE F=X eller SELECT * FROM TABEL WHERE F LIKE %X%,
så kan du bruge samme GUI del til at vide alle data elle til at vise
et subset af data med.

Hvis du søger i memory læser du alle records op fra
databasen i en data-struktur (f.eks. en eller flere Vector !)
og søger i den data-struktur.

Det sidste vil normalt være hurtigere, men vil også kræve
lidt mere hukommelse.
Avatar billede a38 Nybegynder
10. december 2002 - 00:41 #3
Databasen indeholder en tabel, jeg henter allerede alt data ind i en vector, det sker som strings en kolonne af gangen. ER det nemmest at søge på databasen, eller er det nemmest at søge lokalt i hukommelsen.
Der kommer ikke til at ligge uhyggeligt meget data i hukommelsen, så hvad skal jeg gøre hvis jeg vil søge lokalt? >>> ARNE!§?
Avatar billede arne_v Ekspert
10. december 2002 - 06:55 #4
Afhænger meget af konteksten, men her er nogle eksempler:

Vector v = new Vector();
v.add("aaa");
v.add("bbb");
String k = "bbb";
boolean fnd = false;
for(int i = 0; i < v.size(); i++) {
  String vv = (String)v.get(i);
  if(vv.equals(k)) fnd = true;
}
if(fnd) {
  System.out.println("fundet");
} else {
  System.out.println("er der ikke");
}

----

Vector v = new Vector();
v.add(new X("aaa", "xxx", 1));
v.add(new X("bbb", "yyy", 2));
String k = "bbb";
for(int i = 0; i < v.size(); i++) {
  X vv = (X)v.get(i);
  if(vv.getF1().equals(k)) {
      System.out.println(vv.getF1() + " " + vv.getF2() + " " + vv.getF3());
  }
  System.out.println(X
}

public class X {
  private String f1;
  private String f2;
  private int f3;
  public X(String f1, String f2, int f3) {
      this.f1 = f1;
      this.f2 = f2;
      this.f3 = f3;
  }
  public String getF1() { return f1; }
  public String getF2() { return f2; }
  public int getF3() { return f3; }
}
Avatar billede arne_v Ekspert
10. december 2002 - 06:59 #5
Ovenstående er forsøgt holdt lidt generelt.

k er det som du søger efter (kommer fra din GUI).

v er din Vector (kommer fra din database).

I det første eksempel indholde Vector'en kun
en streng. I det andet eksempel indeholder
Vector'en et Object med 2 strenge og 1 heltal.

Og jeg nøjes med at printe lidt. Du skal formentlig
have vist dem i din GUI (kun vise de fundne eller
åbne en nyt vindue med de fundne eller highligte
de fundene i den totale liste).
Avatar billede a38 Nybegynder
10. december 2002 - 12:35 #6
OK Arne

Vil du ikke kigge på vores kode, vi kan simpelthen ikke få det til at funke.

Jeg vil gerne sende dig det hele, men det er lidt nemmere at se på som dokumenter i word f.eks, points er dine hvis du kan få de her søge funktioner jeg spørger om til at virke. Min mail er Uggi_k@hotmail.com

Gider du?
Avatar billede arne_v Ekspert
10. december 2002 - 12:46 #7
Det kunne jeg måske godt.

Men:
  - jeg vil først have tid i aften
  - jeg tror at løsningen skal postes her ellers så
    får vi problemer med ekspertens regler
Avatar billede arne_v Ekspert
10. december 2002 - 12:47 #8
Og jeg kan ikke garantere noget.

Jeg har en pæn erfaring med data og databaser, men
jeg er ikke nogen ørn til GUI.
Avatar billede a38 Nybegynder
10. december 2002 - 12:58 #9
No problem!

hvad er din mail? og du må da endelig poste svaret her (så alle kan se det, jeg ville også gerne poste koden her, men jeg tror bare det er nemmere at overskue som et word dokument). Det er ikke så stort programmet som det måske lyder... og den reelle kode der skal skrives er nok kun ca 10 linier... det er bare lige med at få det rigtigt. (det samlede program er måske 7 sider hvor 4 af dem er gui, så der er ikke meget mere end 3 siders metode max.)

Jeg kan lige forklare kort. Jeg skal hente tekst fra et tekst felt (min gui klasse) den skal hentes over i en sql kommando til databasen (vores dbConnect klasse) jeg tror jeg skal bruge en sidste klasse til at hente string... altså noget med en get / set metode. Det skal bare laves for en enkelt søge funktion.

Altså: Jeg vil gerne kunne skrive et telefonnummer i et tekstfelt som jeg søger på i databasen. Hvis du kan hjælpe mig med det, som er den sidste del i mit projekt, så er vi (min læsegruppe og jeg) dig evigt taknemmelige! :)
Avatar billede arne_v Ekspert
10. december 2002 - 13:02 #10
Du kan emaile til arne_v@mail.danbbs.dk !
Avatar billede a38 Nybegynder
10. december 2002 - 13:14 #11
ok har lige sendt en lille mail!
Avatar billede a38 Nybegynder
10. december 2002 - 15:48 #12
HEy jeg prøver at bruge din kode til at søge lokalt... men det virker ikke helt

if(tryk.getSource() == telefonOK) {
        boolean fnd = false;
        Vector v = new Vector();
        v.add(""+db1.retunerVector());
        String k = ""+skrivTelefon.getText();
        for(int i = 0; i < v.size(); i++) {
        String vv = (String)v.get(i);
        if(v.equals(k))
        fnd = true;
        if(fnd) {
        System.out.println("fundet");
        }
        else {
        System.out.println("er der ikke");
      }
    }

Ser nogenlunde sådan ud nu... men den skriver bare hele tiden at den ikke finder noget match... hvis jeg ændrer til  "boolean fnd = true" skriver den hele tiden fundet... hvad gør jeg galt??
Avatar billede a38 Nybegynder
10. december 2002 - 15:51 #13
kan det være fordi jeg får vectoren tilbage som en lang string og ikke som de 6 kolonner DB indeholder?
At den så skal have hele string for at finde et match??
(jeg er jo ikke helt klar over hvordan sådan en søgning virker!)
Avatar billede arne_v Ekspert
10. december 2002 - 16:15 #14
Det der vil aldrig finde noget.

Måske:

    if(tryk.getSource() == telefonOK) {
        boolean fnd = false;
        Vector v = db1.retunerVector();
        String k = ""+skrivTelefon.getText();
        for(int i = 0; i < v.size(); i++) {
        String vv = (String)v.get(i);
        if(v.equals(k))
        fnd = true;
        if(fnd) {
        System.out.println("fundet");
        }
        else {
        System.out.println("er der ikke");
      }
    }

kunne finde noget.
Avatar billede arne_v Ekspert
10. december 2002 - 16:16 #15
Prøv evt. med:

    if(tryk.getSource() == telefonOK) {
        boolean fnd = false;
        Vector v = db1.retunerVector();
        String k = ""+skrivTelefon.getText();
        for(int i = 0; i < v.size(); i++) {
        String vv = (String)v.get(i);
        System.out.println(vv + " <-> " + k);
        if(v.equals(k))
        fnd = true;
        if(fnd) {
        System.out.println("fundet");
        }
        else {
        System.out.println("er der ikke");
      }
    }

for at se hvad der sker !
Avatar billede a38 Nybegynder
10. december 2002 - 16:32 #16
Ok men de ligge jo i to klasse (altså vector v ligge i db Connect, så hvis jeg ikke instantierer et nyt Objekt af Vector (vector v = new Vector();) så kommer der en Java.lang.Class exception ?? hvordan kommer jeg rundt om den?
Du skriver jo bare vector v = db1.returnervector...
det går kun variablen k, fordi den ligger i samme klasse.
Avatar billede a38 Nybegynder
10. december 2002 - 16:36 #17
Hvis du gerne vil have projectet som JBuilder fil siger du bare til!

PS: får du der her til at virke for os idag... så er du KONGEN!!!
Avatar billede a38 Nybegynder
10. december 2002 - 16:43 #18
OK til det sidste eksempel... den skriver ud i sys out.

[99999999 A38 UNIPARKEN JAVAKAFFE UNIPARKEN JAVA@JAVA.DK ]
<-> SKRIV TELE-FONNUMMER HER.*
er der ikke

så den finder altså oplysninger og tekst der er skrevet... men jeg har gjort sådan her:

if(tryk.getSource() == telefonOK) {
      if(tryk.getSource() == telefonOK) {

      Vector v = new Vector();

      boolean fnd = false;
      //Vector v = db1.retunerVector();
      String k = (""+skrivTelefon.getText());
      v.add(""+db1.retunerVector());
      for(int i = 0; i < v.size(); i++) {
      String vv = (String)v.get(i);
      System.out.println(vv + " <-> " + k);
      if(v.equals(k))
      fnd = true;
      if(fnd) {
      System.out.println("fundet");
      }
      else {
      System.out.println("er der ikke");
        }
      }
    }
  }

What is the problem?
Avatar billede arne_v Ekspert
10. december 2002 - 16:52 #19
Jeg kan se 2 mulige problemer:
1)  Du gemmer din Vector i en ny Vector med kun et element
    med kun et element i.
2)  Det ser ud som om k indeholde labelen for og ikke
    værdien af det indtastede.

Men måske skal jeg lige kigge på din email.

:-)
Avatar billede arne_v Ekspert
10. december 2002 - 16:53 #20
I må meget gerne sende JBuilder projektet per email.

Jeg vil prøve at se om jeg kan få det til at virke.
Avatar billede a38 Nybegynder
10. december 2002 - 17:11 #21
Ret sikker på, at jeg har fat i værdien af det der indtastes. Problemet kunne derimod meget vel være, at der kun gemmes et element i min vector. Kan bare ikke helt gennemskue, hvordan de enkelte elementer i min oprindelige vector hentes ud.
Ideen er jo egentlig, at jeg skal kunne sammenholde det indtastede telefonnummer med de telefonnumre, der ligger på databasen - og intet andet!
Avatar billede arne_v Ekspert
10. december 2002 - 19:59 #22
Her er et udsnit af telefon søge koden med mine rettelser:

    if(tryk.getSource() == telefonOK) {
        Vector v = db1.retunerVector();
        String k = skrivTelefon.getText();
        boolean fnd = false;
        for(int i = 0; i < v.size(); i++) {
            String vv = ((dbSoeg)v.get(i)).telefon;
            if(vv.equals(k)) fnd = true;
        }
        if(fnd) {
            System.out.println("fundet");
        } else {
            System.out.println("er der ikke");
        }
        telefonVindue.dispose();
    }
Avatar billede arne_v Ekspert
10. december 2002 - 20:01 #23
Det virker. I den forstand at hvis jeg søger på 9999999 så skriver
den "fundet" og hvis jeg søger på 11111111 skriver den "er der ikke".

Jeg går ud fra at I skal gør enoget andet end bare
skrive noget konsol output, når I har fundet et match.
Avatar billede a38 Nybegynder
10. december 2002 - 20:03 #24
Tester lige her med det samme!! :)
Avatar billede a38 Nybegynder
10. december 2002 - 20:09 #25
HEY! Du er KONGEN!!!!

Med hvad nu hvis jeg så vil have resultaterne (altså den linie der indeholder telefonnummer udskrevet i mit vindue... som en JList??... kan jeg det?)
Avatar billede arne_v Ekspert
10. december 2002 - 20:24 #26
Selvfølgelig kan du få det vist.

Hvis jeg skulle lave det så tror jeg at jeg ville gøre det som:

man trykker "telefon" i hoved framen
så popper der en ny mindre frame op
man indtaster telefonnummer
det fundne telefon nummer vises på den frame <--- nyt
man lukker selv vinduet når man ike vil søge mere <--- nyt
Avatar billede a38 Nybegynder
10. december 2002 - 20:31 #27
Kan man få udskrevet hele linien der hører til telefon nummeret? altså med mail og den slags... og kan man få det til at erstatte den Jlist vi allerede viser med alle søgeresultater fra databasen??

PS: du har tjent dine point! men hvis du gider at hjælpe med det sidste så er du sku god. Hvis du skal have flere point for det, så må jeg jo finde ud af det :)
Avatar billede arne_v Ekspert
10. december 2002 - 20:36 #28
Ja I kan hente de andre felter som:

((dbSoeg)v.get(i)).navn
...
((dbSoeg)v.get(i)).mail

og de kan sagtens vises.

Man burde også kunne udskifte alle data med de fundne data.
Men jeg kan dog ikke umiddelbart sige hvordan.

200 point er nok.
Avatar billede a38 Nybegynder
10. december 2002 - 20:46 #29
yes den har jeg grejet... men jeg mener er det muligt at få vist hele den række i tabellen som telefon nummeret er en del af?

Altså ligesom den bliver vist på vores Jframe nu?

telefon  +  navn  +  adrese.....
Avatar billede arne_v Ekspert
10. december 2002 - 20:48 #30
((dbSoeg)v.get(i)).toString

[i en del sammenhænge vil Java endda selv kunen finde
ud af at kalde toString for at konvertere til String, men
man kan altid kalde eksplicit hvis man vil]
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