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
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.
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??
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 ??
ÖÖh, kokeiles näin
Dim Tietueidenlkm As String
Tietueidenlkm = "Select count (Sukunimi) FROM Henkilo WHERE Kaupunki = Helsinki "
txttTietlkm.Text = Tietueidenlkm
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ö...
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?
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 FunctionOhessa 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").NameTestaa ja kysy jos on kysyttävää
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.