Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: vb6 SQL kysely (VB6, VBA)

Sivun loppuun

Apuvaaaa [15.06.2009 20:52:30]

#

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ä!

Grez [15.06.2009 21:07:27]

#

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

Apuvaaaa [15.06.2009 21:13:48]

#

Nyt herjaa CurrentDB:tä.

Taidan olla aivan käsi tuon kyselyn kanssa?

Grez [15.06.2009 21:15:46]

#

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

Apuvaaaa [15.06.2009 21:37:33]

#

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.

Grez [15.06.2009 21:45:05]

#

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ä.

Apuvaaaa [15.06.2009 22:04:48]

#

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

Grez [15.06.2009 22:14:44]

#

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)

Apuvaaaa [15.06.2009 22:30:24]

#

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

Grez [15.06.2009 23:34:22]

#

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.

neau33 [16.06.2009 08:07:33]

#

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ä

Apuvaaaa [16.06.2009 23:37:46]

#

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

Grez [17.06.2009 00:18:48]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta