Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: SQL + VB6 + Access (VBA)

Sivun loppuun

arisau [08.04.2004 15:43:09]

#

Avuton tässä taas kontallaan...
Kun SQL lauseeseen SELECT sukunimi, etunimi, osoite jne. halutaan syöttää DataComboista sarakkeet niin muuttujaan laitto ja hipsutus ei tomikkaan kuten WHERE:ssä eli SQL = "SELECT * FROM jokutaulu WHERE jokuarvo = '" & teksti & "'"

Mutta SELECT '" & DataCombo1 & "' , '" & DataCombo2 & "' , '" &DataCombo3 & "' jne ei pelaakkaan.
Onko tässä siis joku toinen hipsutus tarpeen, vai yritänkö mahdotonta. Kyselyn tulos laitetaan MSHFlexGrid:in katselua varten.

...ja onnistuuko MSHFlexGrid:n sisälön tulostus paperille??
Haaveilenko siinäkin mahdottomia?

...ja entäs tietyn ehdon täyttävien tietueiden laskenta.

Kaikki tämä siis VB6 + Access

-A

eakem [08.04.2004 21:38:16]

#

Ihan kuin olisi jotakin outoa tuon datacombo selectin muodostuksessa.
Kokeile tätä:
"SELECT " & Datacombo1 & "," & Datacombo2 & "," & Datacombo3 & " from jokutaulu Where jokuarvo=" & teksti jne...

Tietueiden laskenta:
Select count(*) from .... Where ..ja tähän sitten ehdot.
Eli tuo count(*) palauttaa rivien lukumäärän.

arisau [12.04.2004 15:47:52]

#

Combosta se onnistuu noin, mutta taitaa johtua DataCombon asetuksista etten siitä saa ulos tekstiä.
Onnistuin siis tuomaan Comboista sarakkeet FlexGridiin, mutta saakohan FlexGridiä tulostettua tai vietyä exceliin??

arisau [13.04.2004 20:52:56]

#

Jotain tässä laskurissa on pielessä, mutta mitä...

Dim Tietueidenlkm As String
Tietueidenlkm = "Select count Sukunimi FROM Henkilo WHERE Kaupunki = Helsinki "
txttTietlkm.Text = Count

Tietueiden lukumäärä on 9, mutta laskurissa 172 ??

mike patto [16.04.2004 09:29:03]

#

ÖÖh, kokeiles näin
Dim Tietueidenlkm As String
Tietueidenlkm = "Select count (Sukunimi) FROM Henkilo WHERE Kaupunki = Helsinki "
txttTietlkm.Text = Tietueidenlkm

Antti [16.04.2004 14:10:39]

#

arisau:

Oikea syntaksi olisi: "Select count FROM Henkilo WHERE Kaupunki = 'Helsinki'"

lainaus:

Lainaus:
Dim Tietueidenlkm As String
Tietueidenlkm = "Select count Sukunimi FROM Henkilo WHERE Kaupunki = Helsinki"
txttTietlkm.Text = Count

Ei taatusti toimi - Count ei ole muuttuja, jossa olisi lukumäärä.

Oikeampi (joskaan ei paras tai edes järkevin) tapa olisi:

Dim Tietueidenlkm As String
Tietueidenlkm = "Select count Sukunimi FROM Henkilo WHERE Kaupunki = Helsinki"
txttTietlkm.Text = Tietueidenlkm

Datacombosta saat valitun tekstin ulos: DataCombo1.Text

lainaus:

Mutta SELECT '" & DataCombo1 & "' , '" & DataCombo2 & "' , '" &DataCombo3 & "' jne ei pelaakkaan.
Onko tässä siis joku toinen hipsutus tarpeen, vai yritänkö mahdotonta. Kyselyn tulos laitetaan MSHFlexGrid:in katselua varten.

Sarake nimiin EI laiteta hipsuja eli oikea syntaksi olisi:
strSQL="Select " & DataCombo1.Text & " From Datatable"

Lopuksi: Opetteleppa RecordSetin käsittely: esim. ADODB 2.8 tai Microsoft ADO 6.0 Data Controllin käyttö...

arisau [17.04.2004 01:38:36]

#

Joku tuossa tietueiden laskennassa mättää, eli en saa tulosta ulos. Pitäisikö recordsetti olla rimpsussa mukana?
Antti, mainitset olevan parempia ja järkevämpiä tapoja. Valottaisitko mitä ne ovat?

Antti [17.04.2004 12:28:48]

#

Huoh... Ok.

Tässä malli dataluokka. Muistathan laittaa referenssin: "Microsoft ActiveX Data Objects 2.x Library"

Option Explicit
Dim Connect As ADODB.Connection
Dim ADOrst As ADODB.Recordset
Dim ADOCmd As ADODB.Command

'****************************************************************************
' Methodname:   SQLExecute
' Parameters:   SQLString - SQL Clause to be executed
'               strConnString - Connection string to database
'               iCursor - Cursor enumeration
' Definition:   Executes SQLString into database and returns a recordset
'****************************************************************************

Public Function SQLExecute(ByVal SQLString As String, strConnString As String, iCursor As CursorLocationEnum) As ADODB.Recordset
On Error GoTo ErrorHandler

    Set Connect = New ADODB.Connection
    If strConnString = "0" Then Err.Raise -3

    ' Kursori vaikuttaa tietueiden lukitukseen
    ' ja recordsetin paikallisuuteen

    If iCursor = 1 Then
        Connect.CursorLocation = adUseServer
    Else
        Connect.CursorLocation = adUseClient
    End If

    Connect.ConnectionString = strConnString
    Connect.ConnectionTimeout = 30
    Connect.Open
    ' edellyttää nopeaa yhdistämistä - omassa wrapperissa käsittelin
    ' connectionin erillisessä metodissa.
    ' Jos tietokanta yhteyden luominen vie pidemmän ajan
    ' Command yrittää suorittaa vaikka yhteyttä ei ole vielä luotu.
    ' Jos taas laitat odottavan yhteyden (loopin) voi käydä ettei
    ' yhteyttä saada ollenkaan ja olet ikuisessa loopissa.

    If SQLString = "" Then Err.Raise -5

    Set ADOCmd = New ADODB.Command
    ' ADOCmd parameters
    ADOCmd.CommandType = adCmdText
    ADOCmd.CommandText = SQLString
    Set ADOCmd.ActiveConnection = Connect

    ' Recordset
        Set ADOrst = New ADODB.Recordset

    ' Execution of Stored procedure
        ADOrst.Open ADOCmd, , adOpenStatic, adLockBatchOptimistic

    'Set ADOrst = ADOCmd.Execute
        Set SQLExecute = ADOrst

    ' Cleanup
        If Not ADOCmd Is Nothing Then Set ADOCmd = Nothing

Exit Function
ErrorHandler:
    MsgBox Err.Number & ":" & Err.Source & ":" & Err.Description
End Function

Ohessa luokan käyttömalleja:
(Käytin connection stringissä SQLServeriä - muotoilse se haluamallasi tavalla)

Muistathan, että editoitavana sarakkeena ei saa olla PrimaryKey

Dim oData As New Dataclass
Dim oRs As New ADODB.Recordset
Set oRs = oData.SQLExecute("Select * from Taulu", "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=TIETOKANNANNIMI;Data Source=TIETOKANTAPALVELIMENNIMI", 1)

Set Text1.DataSource = oRs
Text1.DataField = oRs.Fields.Item("Sarake1").Name

Set Adodc1.Recordset = oRs

Set DataList1.DataSource = oRs
Set DataList1.RowSource = oRs
DataList1.DataField = oRs.Fields.Item("Sarake2").Name
DataList1.ListField = oRs.Fields.Item("Sarake2").Name
DataList1.BoundColumn = oRs.Fields.Item("Sarake3").Name
DataList1.BoundText = oRs.Fields.Item("Sarake3").Name

Testaa ja kysy jos on kysyttävää

arisau [28.04.2004 00:53:27]

#

kiitokset esimerkistä. Muutin käsittelyn järkevämmäksi ja ehkä jotain siitä ymmärsinkin :-)
Mutta tuo laskenta on vielä on vielä epäselvä... ...mutta ehkä sekin vielä joskus aukeaa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta