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