close
標題:

VB 6.0 資料庫設計 迴圈

發問:

aa.jpg

 

此文章來自奇摩知識+如有不便請留言告知

生產時間08:35:18 x(1) 08:37:38 x(2) 08:39:58 x(3) 08:42:1408:45:3408:48:0308:50:2208:52:3508:54:5008:57:0508:59:2109:01:3709:03:5109:06:0409:08:17 x(i-1)09:10:34 x(i)求 x(i)-x(i-1) 的值,再把所有的值做加總請問我要如何寫迴圈去做運算我有大概自己寫了程式,但是都會發生錯誤Private Sub Command1_Click() ... 顯示更多 生產時間 08:35:18 x(1) 08:37:38 x(2) 08:39:58 x(3) 08:42:14 08:45:34 08:48:03 08:50:22 08:52:35 08:54:50 08:57:05 08:59:21 09:01:37 09:03:51 09:06:04 09:08:17 x(i-1) 09:10:34 x(i) 求 x(i)-x(i-1) 的值,再把所有的值做加總 請問我要如何寫迴圈去做運算 我有大概自己寫了程式,但是都會發生錯誤 Private Sub Command1_Click() Adodc1.Refresh Adodc1.Recordset.MoveFirst x = Adodc1.Recordset.("生產時間") XX_temp = 0 For i = 2 To Adodc1.Recordset.RecordCount XX_temp = XX_temp + (x(i) - x(i - 1)) Next Text1.Text = XX_temp End Sub 我的寫法是不是有問題? 更新: 喔~我是要計算標準工時 第1 pcs 的生產時間 = 第 2 pcs 的生產開始時間-第 1 pcs 的生產開始時間 就是所謂的時間差 生產時間 08:35:18 --->x(1) 08:37:38 --->x(2) 08:39:58 --->x(3) ... 09:08:17 --->x(i-1) 09:10:34 --->x(i) 計算後以秒為單位 累加所有的時間差後算平均值 就可以求出我要的標準工時 這樣的話是不是應該要寫迴圈去計算所有的時間差? 謝謝您! 更新 2: 因為中間會扣除休息時間或是一些異常工時 所以時間並不是連續的 謝謝您!不厭其煩的給予指教! 我是一個VB新手目前在學寫VB6 資料庫程式設計 更新 3: 嗯~那...如果跳開計算工時問題 BOF x1 x2 ... ... x(i-1) xi 我要算X-Rm管制圖的管制中心 {(x2-x1)+(x3-x2)+......+[xi-x(i-1)]}/(i-1) 請問是否要用迴圈方式寫? 更新 4: 80 800------->abs(80-80) 764------->abs(76-80) 804------->abs(80-76) 899 7910----->abs(79-89) 736 752 750 761 760 742 731 730 774 770 725 742 751 71 +)4 55 (55/19)=2.89 更新 5: 若以(Xi-X1)/(i-1) = (71-80)/19 = -0.47 這樣就不是我要的 2.89 了 請問該怎麼寫? 還有 x = Adodc1.Recordset.("生產時間") XX_temp = 0 For i = 2 To Adodc1.Recordset.RecordCount XX_temp = XX_temp + (x(i) - x(i - 1))------------->這行會出現錯誤無法計算!? Next 更新 6: x1----->08:35:1880----->y10 x2----->08:37:3880----->y24 x3----->08:39:5876----->y34 x4----->08:42:1480----->y4 x5----->08:45:34 ... 更新 7: x2-x1=(08:37:38)-(08:35:18)=80秒---->y1 x3-x2=(08:39:58)-(08:37:38)=80秒---->y2 x4-x3=(08:42:14)-(08:39:58)=76秒---->y3 x5-x4=(08:45:34)-(08:42:14)=80秒---->y4 abs(y2-y1)=0 abs(y3-y2)=4 abs(y4-y3)=4 這樣子您了解我要表達的意思嘛? 不好意思喔!謝謝您一直幫我解答 更新 8: 啊~貼到眼花了... 資料都貼錯了... x2-x1=(08:37:38)-(08:35:18)=140秒---->y1 x3-x2=(08:39:58)-(08:37:38)=140秒---->y2 x4-x3=(08:42:14)-(08:39:58)=136秒---->y3 x5-x4=(08:45:34)-(08:42:14)=200秒---->y4 abs(y2-y1)=0 abs(y3-y2)=4 abs(y4-y3)=64 更新 9: Y是X-Rm裡面的R! 更新 10: Dim XX_temp As Long Dim x() As String Private Sub Command1_Click() Adodc1.Refresh Adodc1.Recordset.MoveFirst x() = Adodc1.Recordset("生產開始時間") ‘執行階段錯誤’13’:型態不符 XX_temp = 0 更新 11: For i = 2 To Adodc1.Recordset.RecordCount Step 1 XX_temp = XX_temp + DateDiff("s", x(0), x(1)) 'DateDiff("s", x(0), x(1)) ,以秒為單位("s"), 計算x(0)與x(1)的時間 Next i Text1.Text = XX_temp End Sub 更新 12: count 的部份會出現錯誤! 我有稍做修改 程式終於可以動了 謝謝您!

最佳解答:

你的x()是啥型態? String? 試試用 Dim XX_temp as Long XX_temp = XX_temp + DateTime.DateDiff("s", x(0), x(1)) 'DateTime.DateDiff("s", x(0), x(1)) ,以秒為單位["s"], 計算x(0)與x(1)的時間差 然後是一個數學上的小問題... 你這樣寫,XX_temp的結果會是 XX_temp = ( x(1) - x(0) ) + ( x(2) - x(1) ) + ( x(3) - x(2) ) + ... ( x(i+1) - x(i) ) + ( x(i+2) - x(i+1) ) + ... ( x(n-1) - x(n-2) ) ( x(n) - x(n-1) ) 你會發現消掉很多...N項的後一項可以和(N-1)項的前一項消掉 最後會簡化成 x(n) - x(0) 所以根本不用迴圈,用最後一項減第一項就行了 以邏輯而言 因為你把這次結束時間當作下次的開始時間 所以你的總時間就 = 最後一次的時間 - 第一次的時間 2008-10-20 17:38:17 補充: 你仔細的想一下 先畫條數線,上面標上幾個點 1-----------2----3-----------------------4-----------5 距離(1-2) + 距離(2-3) + 距離(3-4) + 距離(4-5) 是不是等於 距離(1-5) ? 是的話是否根本不用迴圈? 另外要提醒你一下 n個點只有n-1個間隔 這樣並沒有記錄最後一次的結束時間 (因為沒有下一次的開始時間了) 所以若你要算平均數,記得是 Total / RecordCount -1 2008-10-20 18:29:27 補充: 因為你要算的是標準工時不是? 照你的程式碼這樣給,並不用使用迴圈 (當然用也可以,效率會降低而已) 除非你有另外一組 y(n)為結束時間 才需要 y(i)-x(i) 的迴圈 For i = 2 To Adodc1.Recordset.RecordCount XX_temp = XX_temp + (x(i) - x(i - 1)) Next 就相當於相加連續的時間間格了 當然你的資料庫與程式裡面可能有加上一些判斷式,紀錄是否為異常工時 這樣的話的確需要用迴圈,又因為異常的時間一定比正常的少 比較快速的處理方式應該是,把異常的總時間用迴圈累加後 標準工時 = x(n) - x(0) - 異常總時間 2008-10-20 20:09:14 補充: 不用 以數學法判斷 {(x2-x1)+(x3-x2)+......+[xi-x(i-1)]}/(i-1) 觀察 第一個() 與 第二個() (x2-x1) + (x3-x2) , x2項可以消掉 觀察 第二個() 與 第三個() (x3-x2) + (x4-x3) , x3項可以消掉 以下同... 最後會剩下 -x1 + xi = xi - x1 不過如果你要順便練習程式 建議你兩種方法都寫寫看,再檢查結果是否相同 2008-10-20 22:13:02 補充: 80 x(1) 80 x(2) ------->abs(x(2)-x(1))=0 76 x(3) ------->abs(x(3)-x(2))=4 是哪來的? 和一開始問的 08:35:18 x(1) 08:37:38 x(2) 08:39:58 x(3) 並不相同阿 XX_temp = XX_temp + (x(i) - x(i - 1))的話 最上面有說 是型態的問題,我要先搞清楚 x(1)究竟是 80還是"08:35:18" ? 2008-10-20 23:20:04 補充: 嗯...所以Y是X-Rm裡面的R? 反正我不知道你的需求, 加上絕對值的確是要用迴圈算 回到最初的問題 XX_temp = XX_temp + (x(i) - x(i - 1)) 要改成 XX_temp = XX_temp + DateDiff("s", x(0), x(1)) 'DateDiff("s", x(0), x(1)) ,以秒為單位("s"), 計算x(0)與x(1)的時間差 不知道是不是我眼誤, 你的y都算錯了... (08:37:38)-(08:35:18)=140秒 才對? 2008-10-21 00:50:07 補充: 哈 你把資料庫想的太聰明了 x() = Adodc1.Recordset("生產開始時間") '是不能這樣的 基本上我是這樣做的 dim x() as String Dim y() as Integer Dim i as Long Dim count as Long Dim XX_temp as Long 2008-10-21 00:50:15 補充: Adodc1.Recordset.MoveFirst Do until Adodc1.Recordset.EOF ReDim Preserve x(i) x(i) = Adodc1.Recordset.Fields("生產開始時間") Adodc1.Recordset.MoveNext i=i+1 Loop count = i 2008-10-21 00:50:33 補充: '這時候資料都讀出了, 下面開始處理資料 ReDim y(count-1) XX_temp = x(0) For i = 1 to count-1 y(i) = DateDiff("s", x(i-1), x(i)) XX_temp = XX_temp + x(i) Next Text1.Text = XX_temp 2008-10-21 00:52:03 補充: 上面更正 '這時候資料都讀出了, 下面開始處理資料 ReDim y(count-2) XX_temp = x(0) For i = 0 to count-2 y(i) = DateDiff("s", x(i), x(i+1)) XX_temp = XX_temp + x(i+1) Next Text1.Text = XX_temp 2008-10-21 01:51:18 補充: 他好像要做X-Rm Control Chart 那東西我真的不太懂 不過隱約知道要用到組差的絕對值 所以還是得跑迴圈@@

其他解答:

頭 - 尾 再扣除休息時間跟異常工時 比較輕鬆吧~ 2008-10-21 06:53:02 補充: 原來是要作 X-Rm 那 ∑ | Xi - Xi-1 | 的確還是要算出來~ 計算管制上下限值.......都會用到BFC66BE0445C3814
arrow
arrow

    ddhdxb5 發表在 痞客邦 留言(0) 人氣()