Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: tietueen etsiminen

Sivun loppuun

TJR [02.03.2005 12:54:33]

#

ja taas ongelma. tarkoitus olisi etsi tiekokannasta tietueita tietyillä hakuehdoilla. tietokantana käytän acces 2000. olen toteuttamassa sitä tähän tyyliin:

hakusana = InputBox("Kirjoita haluttupaikka", "hakusana")
Data1.Recordset.FindFirst "paikka =`" & hakusana & "´"

lopputulos on kuitenkin virheilmoitus:

missing ), ], or item expression.

jostain ilmeisesti puuttu sulku yms... mutta mistä ?

BadSource [02.03.2005 13:24:08]

#

Edit2: Tarkempi tarkastelu sai miettimään että käytätkö tarkoituksella tuossa haussa `´-merkkejä vai pitäisikö ne olla '-merkki? (Edelliset BackSpacen vieressä kun taas jälkimmäinen on Entterin ja Ä:n välissä.) `´ väärin, kun taas ' on oikein.

[Vanhoja horinoita]Käytkö recordsetin lopussa tutustumassa tietoihin (Miten populate suomentuu?)?

Muutenkin jos haet teksti-tietoa, niin kannattaa käyttää ennemmin Like-hakua, kuin antaa tarkka ehto = -merkillä.

Seuraavaan esimerkkiin toimii haut *- ja ?- jokerimerkeillä. Esim A*, ?a*, *A* jne.

Private Sub Command1_Click()
    Dim abu As String, haku As String, loyto As String
    Dim MyBookMark As Variant

    abu = InputBox("Anna Ehto:", "Haku")
    If abu = "" Then Exit Sub
    'kohdistimen paikka talteen paluuta varten
    MyBookMark = Data1.Recordset.Bookmark
    'Populate recordset
    Data1.Recordset.MoveLast
    haku = "Name Like '" & abu & "'"
    Data1.Recordset.FindFirst haku
    If Data1.Recordset.NoMatch Then
        MsgBox "Ei löytynyt mitään ehdolla " & haku & "."
        Data1.Recordset.Bookmark = MyBookMark
        Exit Sub
    End If
    loyto = Data1.Recordset!Name
    Do While True
        Data1.Recordset.FindNext haku
        If Data1.Recordset.NoMatch Or Data1.Recordset.EOF Then Exit Do
        loyto = loyto & vbCrLf & Data1.Recordset!Name
    Loop
    Data1.Recordset.Bookmark = MyBookMark
    MsgBox abu & " löytyi näistä" & vbCrLf & _
      String(Len(abu & " löytyi näistä"), "-") & vbCrLf & loyto

End Sub

Edit: Lisätty esimerkkiin Bookmarkin käyttö palauttamaan kohdistin sinne minne viimeksi on selailtu.[/Vanhoja horinoita]

TJR [02.03.2005 14:38:03]

#

kiitos jälleen kerran avusta, on se helppoa kun sen osaa !
(ehkä minäkin vielä joskus)

niin mietin vielä, onko mahdollista saada vb:llä tehdyssä ohjelmassa toimimaan windowsin oma haku, siis tarkoitan "ctrl+f" hakua ?

BadSource [02.03.2005 15:28:41]

#

En tiedä mitä tarkoitat tuolla "windowsin oma haku", mutta voit koodata ohjelmaasi ominaisuuden, että itse tekemäsi haku käynnistyy Ctrl+F:llä. Laittaa vain Formin KeyPreview päälle (True) ja KeyDown:in seuraava koodi.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    'Shift = 1 Shift
    'Shift = 2 Ctrl
    'Shift = 4 Alt
    'Shift = 6 Ctrl+Alt jne.
    If Shift = 2 And KeyCode = vbKeyF Then
        Call MunOmaHaku
    End If
End Sub

TJR [02.03.2005 15:33:05]

#

mutta onko mahdollista hakea niin että:
- valitaan ensikisi "kenttä" minkä tiedoilla haetaan
- painetaan esim: ctrl+f, ja kirjoitetaan hakukriteeri ja ok

haku aukaisee haetun tietueen tai siis ensimmäisen johon haku osuu.

näin toimii ainakin acces 2000 ohjelmassa.

kiitos kuitenkin tuosta aikaisemmasta, kommentista. siitäkin apua jatkossa.

Blaze [02.03.2005 15:45:24]

#

TJR kirjoitti:

mutta onko mahdollista hakea niin että

Tottakai on, koodaat sen vaan niin.

lainaus:

näin toimii ainakin acces 2000 ohjelmassa.

Niin, kun Accessin (kaks ässää) tekijät koodasivat siihen niin.

Sen hakudialogin saattaa saada jollain APIlla, mutta itse etsiminen pitää koodata itse.

BadSource [02.03.2005 15:54:18]

#

Eli hakea gridistä tai vastaavasta? Ei valmista, mutta äkkiä koodaat MunOmaHaku-aliohjelman... ;)

TJR [03.03.2005 09:08:51]

#

Nyt menee taas vaikeaksi, tuolla esimerkillä sain haun jopa toimimaan mutta, onko mahdollista muokata haun tuloksia vielä vähän. esimerkki: tietokannassa auton merkki, malli ja väri erikseen. haen auton merkillä ja msgboxiin tulisi haun tuloksena malli ja väri peräkkäin.

BadSource [03.03.2005 09:30:17]

#

Me.Data1.Recordset.FindFirst "Merkki = Helkama"
If Not Me.Data1.Recordset.NoMatch Then
   'Muutat vain tämän palautuksen...
   MsgBox Me.Data1.Recordset!Merkki
   'Muotoon...
   MsgBox Me.Data1.Recordset!Malli & "/" & _
     Me.Data1.Recordset!Vari, vbInformation, "Tulos"
End If

Mikäli data-kontrollisi viittaa koko tauluun pelkän sarakkeen sijaan (Query tms.), niin pystyt viittaamaan samalla rivillä oleviin tietoihin aivan normaalisti, kun sen kerran olet Find:lla löytänyt.

TJR [03.03.2005 09:57:14]

#

kun ei vaan ymmärrys riitä, tein haun tuolla aikaisemmin näyttämälläsi koodilla ja se toimii hyvin. ainoastaan haun tulokseen haluaisin enemmän tietoja ( väri ja malli )
voiko tuohon aikaisempaa esimerkkiä muokata niin että se toisi lisää tietoa haku tulokseen. ( saattaa olla vastaus jo tuossa aikaisemmassa mallissa, mutta en saa toimimaan )

BadSource [03.03.2005 12:21:04]

#

Tuo aikaisempi esimerkkini hakee kuvakannasta kuvien nimiä. Muutetaanpa sitä hieman, että se palauttaa nimen lisäksi kuvan koonkin. Data1-objektimme viittaa koko Pictures-tauluun (jossa on sarakkeet ID, Picture, Name, Size), eli Data1.RecordSource = "Pictures".

'Vanha löytö
'loyto = Data1.Recordset!Name
loyto = Data1.Recordset!Name & ":" & Data1.Recordset!Size
Do While True
    Data1.Recordset.FindNext haku
    If Data1.Recordset.NoMatch Or Data1.Recordset.EOF Then Exit Do
    'loyto = loyto & vbCrLf & Data1.Recordset!Name
    loyto = loyto & vbCrLf & Data1.Recordset!Name _
      & ":" & Data1.Recordset!Size
Loop

Eli jos kerran haet koko taulusta jostain sarakkeesta tietoa ja jos se löytyy, niin silloin vastauksena saat myös muut tiedot samalta riviltä.

TJR [03.03.2005 12:23:58]

#

kiitos jälleen


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta