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 SubNyt 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 SubTiedosto 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 SubNo 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 SubKooditagit 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.