Tein tietokannan acces muodossa. Ohjelmani kirjoittaa ja lukee siihen kyllä tekstiä, mutta haluaisin siihen myös ETSI-komennon. Tein ohjelmaan inputBox:in, joka kyllä toimii.
Ongelmana on nyt saada kaiutettua tietokannasta löytyneet tiedot txtLootiin.
Select komentoa herjaa vaikka tekisin mitä.
Ellikä nakuttelin
Private Sub mEtsi_Click() Dim strHakusana As String strHakusana = InputBox("Kirjoita haettava tieto:", " ETSII APUVAAAA") Select * Alkoi, Email1, Email2, Nimi, Osoite1, Osoite2, Päättyi, Puh1, Puh2, Form Taulukko2 'Herjaa koko riviä punaisena.
Netissä kysymyksen vastaukselle tuntui olevan käyttöä useammalle. Samoin oli myös toinen toistaan hienompia vastauksia, mitkä eivät kuitenkaan pelittäneet.
Taas etukäteen kiitokset jeesistä!
Apuvaaaa kirjoitti:
Select * Alkoi, Email1, Email2, Nimi, Osoite1, Osoite2, Päättyi, Puh1, Puh2, Form Taulukko2 'Herjaa koko riviä punaisena.
No, ensinnäkin tuolla kyselynkin pitäisi olla muotoa:
Select Alkoi, Email1, Email2, Nimi, Osoite1, Osoite2, Päättyi, Puh1, Puh2 From Taulukko2
Edit: Kysyjällä olikin VB6 eikä VBA, joten seuraava ei ole relevantti. Jätetään kuitenkin tähän jos jollain on sama ongelma Access 2003:ssa tai vanhemmassa:
Mutta sitten VBA-koodin sekaan ei voi suoraan kirjoittaa sql-kyselyitä, vaan ne täytyy suorittaa, tyyliin:
Private Sub mEtsi_Click() Dim strHakusana As String strHakusana = InputBox("Kirjoita haettava tieto:", " ETSII APUVAAAA") Dim Tulos as Recordset Set Tulos = CurrentDb.OpenRecordset("Select Alkoi, Email1, Email2, Nimi, Osoite1, Osoite2, Päättyi, Puh1, Puh2 From Taulukko2") Do Until Tulos.Eof If MsgBox("Rivin Email1 on " & Tulos!Email1 & vbCrLf & vbCrLf & "Jatketaanko seuraavalle riville?", vbYesNo) = vbNo Then Exit Do Tulos.MoveNext Loop Tulos.Close End Sub
Nyt herjaa CurrentDB:tä.
Taidan olla aivan käsi tuon kyselyn kanssa?
Edit: Kysyjällä olikin VB6 eikä VBA, joten seuraava ei ole relevantti. Jätetään kuitenkin tähän jos jollain on sama ongelma Access 2007:ssa:
Private Sub mEtsi_Click() Dim strHakusana As String strHakusana = InputBox("Kirjoita haettava tieto:", " ETSII APUVAAAA") Dim Tulos as New Recordset Tulos.Open "Select Alkoi, Email1, Email2, Nimi, Osoite1, Osoite2, Päättyi, Puh1, Puh2 From Taulukko2", CurrentProject.AccessConnection Do Until Tulos.Eof If MsgBox("Rivin Email1 on " & Tulos!Email1 & vbCrLf & vbCrLf & "Jatketaanko seuraavalle riville?", vbYesNo) = vbNo Then Exit Do Tulos.MoveNext Loop Tulos.Close End Sub
Tiedosto on tehty office 2000 prof. Accesilla ja käännetty vanhempaan ilm. -97 muotoon. Muutenhan vb6:n ei edes lukisi/tuntisi sitä.
Eikä ole moduulissa.
Sorry, jäi huomaamatta otsikosta tuo vb6.. VB6:lla pystyy kyllä käyttämään myös Access 2000 ja vaikka Access 2007 kantoja, mutta se nyt menee ohi aiheen.
Eli käytät VB6:sta.. VB6:lla voi periaatteessa käyttää Access-kantoja neljällä vaihtoehtoisella kirjastolla, joista yleisimmin käytetyt on ADODB ja DAO. Kumpaa noista käytät? Jos et tiedä, niin olisiko laittaa sitä koodia, jolla sanoit onnistuneesi lukemaan ja kirjoittamaan siitä.
Jep tässä tätä ja itte ei ole tarvinnut, kuin tehdä se tietokanta Vb:n Data manageri kirjoitti suurimman osan jo valmiiksi.
Option Explicit Private Sub Form_Unload(Cancel As Integer) Screen.MousePointer = vbDefault End Sub Private Sub datPrimaryRS_Error(ByVal ErrorNumber As Long, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, fCancelDisplay As Boolean) MsgBox "Data virhe:" & Description End Sub Private Sub datPrimaryRS_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) datPrimaryRS.Caption = "Tallenne: " & CStr(datPrimaryRS.Recordset.AbsolutePosition) End Sub Private Sub datPrimaryRS_WillChangeRecord(ByVal adReason As ADODB.EventReasonEnum, ByVal cRecords As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Dim bCancel As Boolean Select Case adReason Case adRsnAddNew Case adRsnClose Case adRsnDelete Case adRsnFirstChange Case adRsnMove Case adRsnRequery Case adRsnResynch Case adRsnUndoAddNew Case adRsnUndoDelete Case adRsnUndoUpdate Case adRsnUpdate End Select If bCancel Then adStatus = adStatusCancel End Sub Private Sub cmdAdd_Click() On Error GoTo AddErr datPrimaryRS.Recordset.AddNew Exit Sub AddErr: MsgBox Err.Description End Sub Private Sub cmdDelete_Click() cmdDelete = InputBox("Syötä tietojen poiston salasana ", " Varmistus!") If (cmdDelete) <> "xxxx" Then MsgBox "Virheellinen salasana!", 16, "Salasana" Else On Error GoTo DeleteErr With datPrimaryRS.Recordset .Delete .MoveNext If .EOF Then .MoveLast End With Exit Sub DeleteErr: MsgBox Err.Description End If End Sub Private Sub cmdRefresh_Click() 'This is only needed for multi user apps On Error GoTo RefreshErr datPrimaryRS.Refresh Exit Sub RefreshErr: MsgBox Err.Description End Sub Private Sub cmdUpdate_Click() On Error GoTo UpdateErr datPrimaryRS.Recordset.UpdateBatch adAffectAll Exit Sub UpdateErr: MsgBox Err.Description End Sub Private Sub cmdClose_Click() Unload Me End Sub Private Sub mEtsi_Click() Dim strHakusana As String strHakusana = InputBox("Kirjoita haettava tieto:", " ETSII APUVAAAA") Dim Tulos As Recordset Set Tulos = CurrentDb.OpenRecordset("Select Alkoi, Email1, Email2, Nimi, Osoite1, Osoite2, Päättyi, Puh1, Puh2 From Taulukko2") Do Until Tulos.EOF If MsgBox("Rivin Email1 on " & Tulos!Email1 & vbCrLf & vbCrLf & "Jatketaanko seuraavalle riville?", vbYesNo) = vbNo Then Exit Do Tulos.MoveNext Loop Tulos.Close End Sub Private Sub mLisää_Click() On Error GoTo AddErr datPrimaryRS.Recordset.AddNew Exit Sub AddErr: MsgBox Err.Description End Sub Private Sub mnuApua_Click() Shell ("winhlp32.exe c:\xxxx.hlp") End Sub Private Sub mnuTietoja_Click() frmTietoja.Show End Sub Private Sub mPoista_Click() TempPassword = InputBox("Syötä tietojen poiston salasana ") If TempPassword <> "xxxx" Then MsgBox "Virheellinen salasana!", 16, "Salasana" Else On Error GoTo DeleteErr With datPrimaryRS.Recordset .Delete .MoveNext If .EOF Then .MoveLast End With Exit Sub DeleteErr: MsgBox Err.Description End If End Sub Private Sub mPoistu_Click() Unload Me End Sub
No tuossa nyt ei näy miten tietokantayhteys tuolle datPrimaryRS objektille määritellään, mutta voi sitä silti käyttää :D
Private Sub mEtsi_Click() Dim strHakusana As String strHakusana = InputBox("Kirjoita haettava tieto:", " ETSII APUVAAAA") Dim Tulos as New ADODB.Recordset Tulos.Open "Select Alkoi, Email1, Email2, Nimi, Osoite1, Osoite2, Päättyi, Puh1, Puh2 From Taulukko2", DatPrimaryRS.ActiveConnection Do Until Tulos.Eof If MsgBox("Rivin Email1 on " & Tulos!Email1 & vbCrLf & vbCrLf & "Jatketaanko seuraavalle riville?", vbYesNo) = vbNo Then Exit Do Tulos.MoveNext Loop Tulos.Close End Sub
Kooditagit muuten tekevät noista koodeista hieman luettavampia. (Siinä kirjoituslaatikon päällä on linkki ohjeisiin)
Ja nyt herjaa .ActiveConnection
Tässä käytetty ADODB:a. Vb6:n Visual Data Maker käyttää ainostaan tätä, kun valitsee käytettäväksi tietokannaksi Accesin. Ei anna muita vaihtoehtoja.
Tietenkin muitakin vaihtoehtoja on, mutta se vaatii tältä palstalta vielä
tuhansia typeriä kysymyksiä -> ainakin, jos ohjelman halutaan toimivan minun koneellani.
Kiitos taas vastauksista etukäteen.
Tv. jukka
Itse kun kokeilin, niin VB6:n Visual Data Maker käytti DAO:a eikä ADODB:tä.
Tosin eipä se kyllä missään vaiheessa antanut valitakaan mitään (otin vaan open database -> testi.mdb ja sitten Utility -> Data form designer)
Olipa jännä tuttavuus koko VDM, kaikkea kakkaa ne MS:llä näköjään on tuohon mukaan änkeneet.
MOI Apuvaaaa!
Imppaa & asentele Service Pack 6 for Visual Basic 6.0 sekä Microsoft Data Access Components 2.8 niin Access 2000 tietokanta pelittää VB6-ympyröissä
Grez
Kyllä se VDM antaa valita tietokannan. Avaa vb6, hyväksy exe, ota uusi formi ja siihen valitset Vb Data form Witzard. Nyt ohjelma kysyy haluamasi tietokannan, jota haluat käyttää. Jos valitsit Acces, niin ohjelma kysyy: Missä tehty tietokanta on? Valitset ennalta Accesilla tekemäsi tietokannan ja vot! vb6 täräyttää eteesi formin, missä on valintapainikkeita myöten kaikki muu, kuin etsi -toiminto.
Lähestulkoon täydellinen ohjelma saadaan aikaiseksi ilman koodin kirjoitusta.
Nopeaa ja helppoa pikaisiin projekteihin, miltä ei vaadita pitkäkestoisuutta.
Kiitokset kuitenkin, että yrititte auttaa! Nea tein nuo päivitykset ja Accesin 2000 tietokanta rupesi rokkaamaan, ilman kääntöä vanhempaan versioon. ->KIITOS!
Nyt koitan etsiä tuota etsi -koodia edelleen yrittäen kumpaakin tietokantaa.
Pakkohan tuon koodipätkän on jostain löytyä. Sen verran Wanhaa ohjelmointi -järjestelmää käytän.
Lisäksi painin muutaman muun ongelman keskellä. Minulla on kaksi projektia, jotka tekevät tulosteen suoraan exe:stä. Käytän niissä Printer.print -komentoa. Ellikä juniori tulee treeneistä ja täyttää päiväkirjan tekemistään harjoituksista. Pvm, alkoi, päättyi, aihe ja sisältö. Kaikki on tallennettu tietokantaan, mutta kun Hän haluaisi tulostaa yksittäisen treenin coachille tulee ongelmia.
Private Sub mTulosta_Click()
Printer.Font = "arial"
Printer.FontBold = True
Printer.FontSize = 14
Printer.Print Tab(15); " HARJOITUSPÄIVÄKIRJA "
Printer.Print ""
Printer.Print Tab(10)
Printer.FontBold = False
Printer.FontSize = 10
Printer.Print Tab(10); "Päivämäärä: "; txtFields(0)
Printer.Print Tab(10); "Harjoitus alkoi: "; txtFields(1)
Printer.Print Tab(10); "Harjoitus päättyi: "; txtFields(2)
Printer.Print Tab(10); "Harjoituspaikka: "; txtFields(3)
Printer.Print Tab(10); "Harjoituksen sisältö: "; txtFields(4)
Printer.NewPage
Printer.EndDoc
End Sub
Harjoituksen sisältö on "multilain" ominaisuudessa, mutta tulostin ei ymmärrä tätä, vaan jatkaa tulostusta yli paperin. Eikä tässä kaikki haluaisin tulostimen ottavan huomioon myös tab(x) komennon joka rivillä.
Tästä päästäänkin toiseen projektiini, missä em. lisäksi tulostimen tulisi ottaa huomioon myös "multilain".text jälkeen tietylle osalle tulevat tulosteet. l. ei saisi kirjoittaa enempää. kuin on tilaa.
Kiitoksia taas vastauksista jo etukäteen!
TV. jukka
Joo, tosiaan jos tuota kuvaamaasi polkua pitkin teki, niin se teki käyttäen ADODB:tä. Mutta aikaisemmin laittamasi koodin mukaan sinulla oli siellä määriteltynä datPrimaryRS. Sanot, että VB6 herjaa siitä, niinkuin luulisi arvaavankin, niin sen herjan sisältö auttaisi myös aika paljon.
Jos teen tuon formin kuvaamallasi tavalla ja laitan tuon edellisen laittamani koodin, niin se toimii muuten, mutta se valittaa datPrimaryRS:stä, että "Compile Error: Variable not defined". No tämähän ei ole hiveän yllättävää, kun tuo velho ei tehnyt moista. Jos korvaan sen omassa tapauksessani luodulla adoPrimaryRS:llä, niin toimii hienosti.
Suosittelen että joko luet mitä se VB6 sinulle sanoo ja korjaat ongelmat (esim tuossahan minun tapauksessa se selvästi sanoi, että ko. muuttujaa ei oltu määritelty - sinun tapauksista en tiedä kun et ole kertonut mitä se sanoo) tai sitten pistät koko roskan jonnekin ladattavaksi ja pyydät tutkimaan mikä siellä on vikana. Jostain syystä aika nopeasti loppuu into debugata toisten ongelmia kun autettava ei osaa kertoa kaikkia olennaisia tietoja vaan pitää yrittää varsinaisen ongelman ratkaisemisen lisäksi käyttää samalla kristallipalloa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.