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
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).
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!
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
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!!!
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.
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)
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.
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
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.