Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: vb6 Etsi- toiminto

Sivun loppuun

Apuvaaaa [02.07.2009 14:38:09]

#

Onko vb 6:ssa muutettu esim. - ohjekirjana nyt v.3 - käskyt FindFirst ja NoMatch? Herjaavat etsi- pätkässä.

Nakutin:

Private Sub Command6_Click()
Dim strHaku, Aktiivi As String
strHaku = InputBox$("Anna haettava tieto: ", "ETSI !")
If Len(strHaku) > 0 Then
Aktiivi = datPrimaryRS.Recordset.Bookmark
datPrimaryRS.Recordset.findFirst "Haettava = ' " & strHaku & " ' " '<- FindFirst
    If datPrimaryRS.Recordset.noMatch Then '<-NoMatch????
        datPrimaryRS.Recordset.Bookmark = Aktiivi
        MsgBox "Ei löydy tietoa !", 48, "ETSI !"
    End If
End If
End Sub

On tietenkin taas mahdollista, että olen tehnyt perustavaa laatua olevan virheen, mutta en nyt vain sitä huomaa.

Vb6 antaa valita pisteen jälkeen alaspudotuslaatikosta sen hetkiseen aiheeseen sopivia komentoja. Yleensä laatikoista löytyy juuri se mitä hakeekin, mutta NoMatch komentoa ei siellä ole lainkaan ja FindFirst komennosta vain Find.

Kiitoksia avusta jo etukäteen!

Mod. lisäsi kooditagit

Grez [02.07.2009 17:37:46]

#

Viestistäsi ei käy ilmi, mitä tyyppiä datPrimaryRS on, eikä näin ollen myöskään, mikä sen Recordset on.

Uskoisin kuitenkin että kyseessä on ADODB.Recordset, jolla ei ole FindFirst metodia tai NoMatch arvoa, mutta jolla on Find-metodi. Ilmeisesti olet lukenut DAO.Recordset:in ohjeita, sillä DAO.Recordsetillä on FindFirst ja NoMatch.

Kun valitittelit tuon "alapudotuslaatikon" toimintaa, niin se on selvästi paremmin kartalla kuin sinä ja toimii luultavasti moitteettomasti.

Suosittelen joko siirtymään dokumentaation osalta ActiveX Data Objectseihin (ADODB) tai muuttaa ohjelman käyttämään Data Access Objectseja (DAO).

Apuvaaaa [08.07.2009 23:34:25]

#

Jep! Grez

Jätin vastauksesi ensin vähän lapsipuolen asemaan, mutta täytyy taas myöntää, että Olit oikeassa. Tein siis kaksi tietokantaa Accesilla. Toinen Dao ja toinen ADO. Lähdin siis komentamaan tekemääni DAO:a, mutta ottaessani ohjelmaan tietokannan valitsin väärin. Olin siis tehnyt samaan hakemistoon kaksi saman nimistä tietokantaa ja... entten tentten -> väärä!

No nyt tietokantoihinkin oli jo tullut muutoksia. DAO:n muutoksia ei voi jälikäteen tehdä rikkomatta kantaa ja ADO:n niitä voi tehdä muuttamalla sittemmin data-objektiin tarvittavat muutokset ja tietysti lisäämällä lootat yms.

Päätin siis lähteä käskemään ADO:a ja välittömästi tuli taas ongelmia.

Nakutin:

Private Sub Command6_Click()
' Dim rstCD As ADODB.Recordset
Dim strHaku As String, sql As String, conn As String
strHaku = InputBox("Anna haettava tieto: ", "ETSI APUVAAAA")
conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "D:\Ohjelmoi\Huoltosopimukset\Huolto.mdb" & ";Persist Security Info=False"
datPrimaryRS.Recordset.Find "Asnro = #" & strHaku & "#"
'datPrimaryRS.Recordset.Find ("Yritys=" + "'" + strHaku + "'")
datPrimaryRS.RecordSource = "Select Asnro,Yritys,Nimi,Losoite,Posoite,Puhelin from tblHuolto"
'datPrimaryRS.Refresh' Jos laittaa tuon menee ensimmäiseen korttiin

  If datPrimaryRS.EOFAction Then

        MsgBox "Tallennetta ei löydy", "TIEDOTE"
        datPrimaryRS.Recordset.MoveFirst
    End If

PROC_EXIT:
    Exit Sub

PROC_ERR:
    MsgBox "Error In:  frmInstructors_command6_Click" & vbCrLf & vbCrLf & _
        "Virhe " & Err.Number & " - " & Err.Description, , _
        App.Title
    Resume PROC_EXIT




End Sub

Koodi toimii osittain, mutta ei hae haettavaa, vaan heittää joko tiedoston alkuun tai loppuun.

Kiitoksia vastauksistanne jo etukäteen!

Grez [09.07.2009 00:14:29]

#

Kirjoittelit, että lähdit käskemään ADOa, mutta eipä tuossa koodissa kyllä näytetä ADOa missään vaiheessa käytettävän.

Veikkaan että yksi ongelma on, että etsit jostain syystä päivämäärää (päätellen noista #:sta)

Apuvaaaa kirjoitti:

datPrimaryRS.Recordset.Find "Asnro = #" & strHaku & "#"

Sitten seuraavassa koodissa ei ole pahemmin järkeä. Jos olet määritellyt EOFActioniksi 0, niin koodiasi ei koskaan suoriteta, jos olet määritellyt jotain muuta, niin se suoritetaan aina.

If datPrimaryRS.EOFAction Then
    'Jos datacontrollille on määritelty EOFActioniksi jokin muu kuin 0
    'näytetään seuraava viesti ja siirrytään ensimmäiselle riville
    '0 = vbEOFActionMoveLast = Pysy viimeisessä
    '1 = vbEOFActionEOF = Validoi viimeisin rivi ja käynnistä reposition
    '    tapahtuma EOF-tietueelle, poista MoveNext käytöstä
    '2 = vbEOFActionAddNew = Validoi viimeisin rivi, lisää uusi ja siirry
    '    uudelle riville
    MsgBox "Tallennetta ei löydy", "TIEDOTE"
    datPrimaryRS.Recordset.MoveFirst
End If

Apuvaaaa [09.07.2009 00:42:28]

#

Noh!

Löysin pari aiheeseen liittyvää koodipätkää ja leikkaa liimasin ja sovittelin lisäten vähän omia sekaan -> sain näköjään aikaiseksi siansaksaa.

Noh2!

Muokkasin nyt näin ja tulos on sama.

Private Sub Command6_Click()
' Dim rstCD As ADODB.Recordset
Dim strHaku As String, sql As String, conn As String
strHaku = InputBox("Anna haettava tieto: ", "ETSI")
'conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Ohjelmoi\Huoltosopimukset\Huolto.mdb" & ";Persist Security Info=False"
'datPrimaryRS.Recordset.Find "Asnro = #" & strHaku & "#"
datPrimaryRS.Recordset.Find ("Yritys=" + "'" + strHaku + "'")
datPrimaryRS.RecordSource = "Select Asnro,Yritys,Nimi,Losoite,Posoite,Puhelin from tblHuolto"
'datPrimaryRS.Refresh

  If datPrimaryRS.EOFAction Then

        MsgBox "Tallennetta ei löydy", "TIEDOTE"
        datPrimaryRS.Recordset.MoveFirst
    End If

PROC_EXIT:
    Exit Sub

PROC_ERR:
    MsgBox "Error In:  frmInstructors_command6_Click" & vbCrLf & vbCrLf & _
        "Error " & Err.Number & " - " & Err.Description, , _
        App.Title
    Resume PROC_EXIT




End Sub

Jos tiedät hakumenetelmään vastauksen tai koodipätkän, voitko ystävällisesti kertoa? Teen ohjelmaa eräälle ystävälleni ilmaiseksi, koska hän tarvitsisi tällaista puljunsa pyörityksessä. Tästä syystä toivoisin saavani yhtä pyyteentöntä apua ohjelman rakentamisessa.

Ko. ADO:n liittyvää koodia on mielestäni todella vaikea metsästää netistä. Aivan, kuin siihen ei olisi hakutoimintoa keksittykään. Kaikki next, previous etc. löytyy, mutta ei ohjelman "suolaa" etsi- toimintoon liittyvää koodia.

Kiitos taas etukäteen!!!

Apuvaaaa [09.07.2009 01:03:13]

#

Noh!
Access tekee uudemmalla järjestelmällä "minulle kantautuneen tiedon mukaan" tietokannan ADODB, kuitenkin jossain esim. Running Access 2000 - John Viescas 2000 - puhutaan tietokannan nimenä ADO. Ensin luulin sen olevan lyhenne ADODB:stä. Joka tapauksessa em. kirjan ohjeet opastavat tekemään tietokannan samoin, kun olen sen aiemminkin oppinut ja valitsen lootasta Access 2000 *)-tietokannan. Teen siis tietokantoja Access 2000 Professional -ohjelmalla.

Samoin opastaa monet muutkin kirjat. Yhteistä kirjoille on se, että missään ei opeteta tekemään etsi- komentoa, mutta kaikissa huudetaan mm. näiden viimeinen, seuraava jne. nappien ohjelmointiin. Joissakin jopa useaan otteeseen.

*) Tässä vaiheessa on myös toinen vaihtoehto Remote(ODBC).

Vanhempi DAO tehdään vb:n omalla -> Add-Ins -> Visual Data Manager tai tekemällä Accessissa ensin t-kanta ja sen jälkeen muuttamalla se vanhempaan v.2.0 muotoon.

Grez [09.07.2009 01:09:44]

#

Siis joo, tosiaan, tätähän tuli ihmeteltyä jo silloin taannoin. Ja se muuten tuolla tavalla tehtynä käyttää Microsoft ADO Data Control (OLEDB):ia, lyhennetän myös ADODC, jonka kautta toki sitten käytetään ADODB:tä. Itse tullut käytettyä ADODB:tä enemmän suoraan ilman tuota OLEDB:tä.

Mutta ei tuon pitäisi olla mitenkään kovin kummallinen, ainakin itselläni toimii näin ihan moitteettomasti:

Private Sub cHae_Click()
    Dim strHaku As String
    strHaku = InputBox("Anna haettava tieto: ", "ETSI")
    If strHaku = "" Then Exit Sub
    datPrimaryRS.Recordset.Find ("Yritys='" & Replace(strHaku, "'", "''") & "'")
    If datPrimaryRS.Recordset.EOF Then
        MsgBox "Ei löydy"
    End If
End Sub

En kokeillut määrittää recordsourcea uudestaan tuon Find -komennon jälkeen. Tuskin se ainakaan parantaa toimivuutta. (kokeilin nyt sitäkin, mutta ei tuntunut vaikuttavan mitenkään)

Apuvaaaa [09.07.2009 01:23:18]

#

Noh

Tapahtui edistysaskel. Ohjelma nähtävästi hakee, kuten ennenkin, mutta antaa nyt virhekoodin. Heittää kuitnkin tiedoston -3 osiolle, kuten ennenkin.

Lähetänkö tuon tietokannan s-postilla onko siitä mitään hyötyä?

PS. Kokeilen vielä yhtä juttua tässä välissä, mitä pidän kuitenkin merkityksettömänä. -> Pitääkö Yritys olla Asnro, joka on kannan ensimmäinen tietue.

Grez [09.07.2009 01:26:36]

#

En usko että tarvitsen kantaasi. Tuossa useampia viestejä sitten olisi auttanut jos olisi ollut ohjelma ja kanta, mutta nyt tein jo omat versiot.

-3 on adPosEOF, eli tarkoittaa positiota EOF, eli ikäänkuin seuraava viimeisen jälkeen. Jos haluat että se menee vaikka ensimmäiseen, niin laita tuonne EOF-tarkistukseen esim. dataPrimaryRS.Recordset.MoveFirst

Apuvaaaa [09.07.2009 01:34:34]

#

Huuto takaisin!!!

Rupesi toimimaan MITÄ SUURIMMAT KIITOKSET!!!!!

Viimeisessä oli esteenä se, että en ennen kokeilua nähtävästi seivannut ohjelmaa. l. Oma moka taas.

Suurkiitokset kuitenkin pääsen vihdoin eteenpäin tämän jutun kanssa ja
rahaton ystävänikin pääsee tekemään enemmän rahaa, kun voi hoitaa tiettyjä
rutiineja oikein tietokoneella.

Vielä kiitokset!

ja kesän jatkoja.


Sivun alkuun

Vastaus

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

Tietoa sivustosta