按照順序來講到網咖的顧客,分為兩種一是辦卡充錢的會員,一種是交錢上網的臨時使用者。充完錢之後,一般使用者(網管)就需要對顧客進行上機來記錄時間,下機時進行收費。
上機:上機過程比較簡單,涉及資料庫中的三張表:
online_info
、student_info
、basicdata_info
上機的判斷過程如下:1.從
student
表中判斷卡號是否存在、此卡狀態是否使用 2.
判斷卡內或者臨時使用者的金額是否充足(
>0??)
3.從online
表判斷此卡是否正在上機 4.
將資訊顯示到上級介面中,更新
online
表資訊
下機:下機過程涉及到收費的錢數計算,所以相對複雜,涉及資料庫中的四張表:
online_info
、student_info
、basicdata_info
、line_info
下機的判斷過程如下:1.從
student
表中判斷卡號是否存在、此卡狀態是否使用 2.
從online
表判斷此卡是否正在上機 3.
更新line
表和student
表中的金額
計算消費時間是乙個難點,用
datediff
函式計算間隔時間,但是使用者除了一天的上機時間,有時出現包宿或者兩天連續上網,就需要考慮進來。共分出三種情況:(1)、
24小時內的消費時間(2
)、沒有超過
24小時但是經過了
24:00:00時刻(
3)、超過了
24小時的消費時間
**如下:'datediff函式的格式:datediff(datepart,startdate,enddate),計算結果是後者減去前者
diffmtime = val(datediff("n", time, mrce.fields(7))) '時間差以分表示
diffhtime = val(datediff("h", mrce.fields(7), time)) '時間差以小時表示
diffdtime = val(datediff("d", mrce.fields(6), date)) '時間差以天表示
if diffhtime >= 0 and diffdtime = 0 then '24小時以內的時間計算
diffmtime = val(datediff("n", mrce.fields(7), time))
elseif diffhtime < 0 and diffdtime > 0 then '過了24:00:00但是沒有超過24小時
diffmtime = 24 * 60 + diffmtime
else
diffmtime = (diffdtime * 24 + diffhtime) * 60 '超過24小時
end if
txtsql = "select * from basicdata_info"
set mrcf = executesql(txtsql, msgtext)
'第一種情況:上機時間《準備時間
if abs(val(diffmtime)) < val(mrcf.fields(4)) then
txtoffdate = date
txtofftime = time
txtconsumetime.text = abs(diffmtime)
txtconsume.text = 0
msgbox "下機成功!", vbokonly + vbexclamation, "恭喜"
'第二種情況:準備時間《上機時間《至少上機時間
elseif abs(val(diffmtime)) <= val(mrcf.fields(3)) then
txtoffdate.text = date
txtofftime.text = time
txtconsumetime.text = abs(diffmtime)
if txttype.text = "固定使用者" then
txtconsume.text = round((mrcf.fields(3) / 60) * mrcf.fields(0))
else
txtconsume.text = round((mrcf.fields(3) / 60) * mrcf.fields(1))
end if
txtcash.text = mrcd.fields(7) - txtconsume.text
msgbox "下機成功!", vbokonly + vbexclamation, "恭喜"
exit sub
'把固定使用者、臨時使用者單位時間的費用分別賦給費用
'第三種情況:上機時間》至少上機時間
elseif abs(val(diffmtime)) > val(mrcf.fields(3)) then
txtconsumetime.text = abs(diffmtime)
txtoffdate.text = date
txtofftime.text = time
if txttype.text = "固定使用者" then
txtconsume = format(round(diffmtime / 60 * mrcf.fields(0), 2), "0.0")
else
txtconsume = format(round(abs(diffmtime) / 60 * mrcf.fields(1), 2), "0.0")
end if
round(number, num_digits)
引數number
必需。要四捨五入的數字。
num_digits
必需。位數,按此位數對
number
引數進行四捨五入。
round
函式不是一般意義上的四捨五入
,這改變了我以前的理解
四捨六入五單雙(舉例:
1.24=1.2 1.26=1.3)
五後非零應進一(舉例:
1.251=1.3)
五後皆零視奇偶
五前為偶應捨去(舉例:
1.25=1.2)
五前為奇則進一(舉例:
1.35=1.4)
format
格式轉換函式用來保留小數點前的零:
vb 中獨特的處理數字的格式使得小數在
text
中顯示時小數點前的零被省略,所以需要用到
format
函式。
舉例:小數點前全省略
format
(0.05,」
##.##「)
=.05
小數點前以0補齊
format
(0.05,「
00.00」)
=00.005
正確格式:
format
(0.05,「
0.00」)
=0.005
附加功能:考慮到理論和實際情況的聯絡,我們增加了實時動態更新上機費用,防止使用者剩餘金額出現零元或者負值的情況。
功能實現:新增
timer
控制項,編寫它的
timer
事件。動態下機和下機的**基本一致,只是通過乙個整體的
do while
…………
loop
語句實現對每乙個上機使用者的迴圈檢查,每一秒鐘迴圈檢查一次,一旦使用者餘額為「
0」,立即強制下機,更新
line
表和student表。
在上機和下機的過程中涉及到了乙個統計上機人數的問題,按照我自己的固有思路就是在上機和下機的**中增加上機人數的更新,每次上機增加
1每次下機減少
1,利用
mrc.recordcount
統計總上機人數,因此在上機和下機中都要新增
sql查詢語句,這種方法在思路和應用中沒有問題,只是增加了**量並且摻雜在本來就很大**量的上下機中會增加我們出錯的概率,參考師哥師姐部落格發現可以用到
timer
控制項,編寫它的
timer
時間,每次上機或者下機的下一秒都會觸發
timer
事件,及時計算上機人數,**如下:
private sub timer_timer() '利用timer控制項實時更新上機人數
dim txtsql as string
dim msgtext as string
dim mrc as adodb.recordset
txtsql = "select * from online_info "
set mrc = executesql(txtsql, msgtext)
label16.caption = mrcd.recordcount
mrcd.close
end sub
這就是我認識的上下機,本來一籌莫展的問題,只要有了方向和思路就很容易解決了。 機房收費系統 上下機
最近大家都在進行機房收費系統,看大家的部落格,基本上都是先理清思路再實現功能,回想自己當時做的時候就不夠好,只是盲目的敲 卻忽略了方向比努力更重要這個道理,導致最後出現了很多漏洞,於是又重新畫了一遍上下機的流程圖,希望能對以後機房的學習有幫助。上機 只要思路清晰,具體的 實現很簡單。下機 下機需要計...
機房收費系統 上下機
在 上機下機中 主要是要想到所有在上機中可能發生的事件 並作出相應的對策 確保使用者可以成功的上機 下 機。上機 卡號是否位數字,需要判斷卡號是否存在,卡內餘額是否充足,卡號是否正在被使用。首先 查詢資料庫 中的student表 判斷卡號是否存在,且 處於可使用狀態 如果均符合以上要求 那麼就要檢視...
機房收費系統 上下機
前言 這兩個窗體 邏輯基本類似,開始正文 邏輯圖 重要 展示 從下機來說下機時間的確定是乙個承上啟下的作用 basicsql select from basicdata info 連線基本資料表 set basicmrc executesql basicsql,basictext if online...