ACCESS有一個名稱為"資料表"的資料庫,資料表只有兩列資料,一列是密度,一列是強度。
VB已經與ACCESS成功連接。
想實作找到資料表中密度增長10%時,強度增長最接近50%的對應強度的密度。text1.text最終得到這個密度。
我是新手,暫時寫了如下代碼,但是有問題,麻煩高手們幫忙修改下,具體需要怎么寫,萬分感謝!
Set Scnny = New ADODB.Connection
Scnny.CursorLocation = adUseClient
Scnny.Open "Provider=Microsoft.jet.oledb.4.0;Data source=" & App.Path & "\Data\Data.mdb;Persist Security Info=False;Jet OLEDB:Database Password=123456"
Set srt1y = New ADODB.Recordset
Set srt1y.ActiveConnection = Scnny
srt1y.Open "select * from 資料表 where abs((select 強度H from 資料表 where 密度 * 1.1) / (select 強度H from 資料表 where 密度 * 1)-1.5) in (select min((select 強度H from 資料表 where 密度 * 1.1) / (select 強度H from 資料表 where 密度 * 1)-1.5) from 資料表) "
If Not srt1y.EOF Then
Text1.Text = srt1y!密度
End If
srt1y.Close
補充說明:
我怕語言描述大神們不好理解,特意用EXCEL做了個計算實體,如下圖所示。不過這個只是用EXCEL計算的例子,最終是想把EXCEL這個效果在VB中用SQL陳述句連接ACCESS實作。
當密度增長10%時,強度增長50%,得到了最終想要的結果密度是15980。
思路是:15980對應的強度是0.3207,15980增加10%是17578,17578最接近的是17580,17580對應的強度是0.4790,0.4790除以0.3207=1.49356,最接近1.5倍,相當于0.3207到0.4790增長最接近50%,所以得到了最終的磁密是15980。
uj5u.com熱心網友回復:
感覺你是想在“SQL查詢操作”的同時,還要實作“迭代運算”啊(并且是“有條件的迭代”、還是“模糊條件”),它能支持你進行這樣的“操作”嗎…………
反正SQL操作我是外行,觀望一下。
uj5u.com熱心網友回復:
我感覺你在資料庫中增加1列,就是“密度增長10%時,強度增長了多少”,然后查詢這1列資料中,哪項最接近“目標值”還相對靠譜點兒。
uj5u.com熱心網友回復:
1 你寫入 密度*1.1 列的資料要事先在 10 位就近取整,以便查詢均以 10 位取整的密度列。2 你可能要進行兩層查詢(也許其他網友還有嵌套查詢的方案)
資料表名、列名最好不用漢字和標點符號,特別是可解釋為運算子的標點符號。
rs1.Open "SELECT * FROM [資料表]"
Do Until EOF(rs1)
rs2.Open "SELECT TOP 1 [密度] WHERE [密度] = " & rs1![密度*1.1] & " AND [強度] >= " & rs1![1.1倍密度對應的強度] & " ORDER BY [密度]"
If Not rs2.EOF Then Exit Do
rs1.MoveNext
Loop
rs2.Close
MsgBox rs1!密度
rs1.Close
uj5u.com熱心網友回復:
那個SQL陳述句徹底錯的吧uj5u.com熱心網友回復:
你的推演結果是錯的,你看密度15990那條的強度比15980那個更接近1.5倍uj5u.com熱心網友回復:
好吧,這是我覺得比較惡心的一個SQL陳述句了,為了在一句內搞定不用臨時表啥的,于是用了三層的子表嵌套。查詢出來第一行應該就是你要的。從實際查詢結果看也是15990那條記錄最匹配,15980那條排名第二。當然,我的比較差異的方式是取絕對值的,不知道是否符合你的要求
SELECT l33.密度, l33.匹配密度, l31.強度, l32.強度 AS 匹配強度, Abs(l31.強度*1.5-l32.強度) AS 強度差異
FROM 資料表 AS l31, 資料表 AS l32, (SELECT l21.密度, l21.匹配密度, l22.最小差異 FROM (SELECT l11.密度, l12.密度 AS 匹配密度, abs(l11.密度 * 1.1 - l12.密度) AS 差異 FROM 資料表 AS l11, 資料表 AS l12) AS l21, (SELECT l11.密度, min(abs(l11.密度 * 1.1 - l12.密度)) AS 最小差異 FROM 資料表 AS l11, 資料表 AS l12 GROUP BY l11.密度) AS l22 WHERE l21.差異 = l22.最小差異) AS l33
WHERE (((l31.密度)=l33.密度) And ((l32.密度)=l33.匹配密度))
ORDER BY Abs(l31.強度*1.5-l32.強度);

uj5u.com熱心網友回復:
Private Sub Command1_Click()
Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset, rs2 As ADODB.Recordset
Dim lngDensity As Long, dblStrength As Double
Set cn = New ADODB.Connection
Set rs1 = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
cn.Open "Provider=Microsoft.jet.oledb.4.0;Data source=c:\test\test.mdb;"
rs1.Open "SELECT * FROM data_table", cn
Do Until rs1.EOF
lngDensity = ((rs1!density * 1.1 + 5) \ 10) * 10
dblStrength = rs1!strength * 1.5
rs2.Open "SELECT density FROM data_table WHERE density = " & lngDensity & " AND strength >= " & dblStrength & " ORDER BY density", cn
If Not rs2.EOF Then
rs2.Close
Exit Do
Else
rs2.Close
End If
rs1.MoveNext
Loop
MsgBox rs1!density
rs1.Close
End Sub
的確,得到的查詢結果是 15990。如果將 1.5 改為 1.49 則得到 15980。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/45228.html
標籤:VB基礎類
上一篇:vb檔案操作
下一篇:求助 用VB撰寫串口通訊
