none
[VB6.0]Checkbox判斷問題 RRS feed

  • 問題

  • 小弟做了一個會議室預約的小系統,在存檔時會和資料庫的欄位比對,哪個時段已被核取(chkUseTime.value=1),就exit sub,若選擇同一天,但不同時段仍可正常預約。

    小弟程式如下:

    Public Sub WriteUseRecords()    '儲存會議室使用預約資料
    On Error GoTo WriteUseRecords_Err
       
        RsClose
       
        SQLStr = "SELECT * FROM UseRecords WHERE UseDate = '" & dtpUseDate.Value & "' ORDER BY SN"
        Rs.Open SQLStr, Conn, adOpenDynamic, adLockOptimistic
       
        If -CInt(Rs("UseTime1")) = chkUseTime(0).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime2")) = chkUseTime(1).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime3")) = chkUseTime(2).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
         ElseIf -CInt(Rs("UseTime4")) = chkUseTime(3).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime5")) = chkUseTime(4).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime6")) = chkUseTime(5).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime7")) = chkUseTime(6).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime8")) = chkUseTime(7).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime9")) = chkUseTime(8).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime10")) = chkUseTime(9).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime11")) = chkUseTime(10).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime12")) = chkUseTime(11).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime13")) = chkUseTime(12).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime14")) = chkUseTime(13).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
        ElseIf -CInt(Rs("UseTime15")) = chkUseTime(14).Value Then
            Exit Sub
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
        Else
            RsClose
           
            '新增會議室預約相關資料
            Rs.Open "SELECT * FROM UseRecords ORDER BY SN", Conn, adOpenDynamic, adLockOptimistic
            Rs.AddNew
       
            Rs("SN") = Trim(lblSerial.Caption)      '預約流水號
            Rs("Dep_Id") = Trim(Left(cbbDepartment.Text, InStr(cbbDepartment.Text, ".") - 1)) '部門代碼
            Rs("UseDate") = Trim(Format((dtpUseDate.Value), "yyyy/MM/dd"))     '預約日期
            Rs("UseTime1") = IIf(chkUseTime(0).Value = 1, True, False)
            Rs("UseTime2") = IIf(chkUseTime(1).Value = 1, True, False)
            Rs("UseTime3") = IIf(chkUseTime(2).Value = 1, True, False)
            Rs("UseTime4") = IIf(chkUseTime(3).Value = 1, True, False)
            Rs("UseTime5") = IIf(chkUseTime(4).Value = 1, True, False)
            Rs("UseTime6") = IIf(chkUseTime(5).Value = 1, True, False)
            Rs("UseTime7") = IIf(chkUseTime(6).Value = 1, True, False)
            Rs("UseTime8") = IIf(chkUseTime(7).Value = 1, True, False)
            Rs("UseTime9") = IIf(chkUseTime(8).Value = 1, True, False)
            Rs("UseTime10") = IIf(chkUseTime(9).Value = 1, True, False)
            Rs("UseTime11") = IIf(chkUseTime(10).Value = 1, True, False)
            Rs("UseTime12") = IIf(chkUseTime(11).Value = 1, True, False)
            Rs("UseTime13") = IIf(chkUseTime(12).Value = 1, True, False)
            Rs("UseTime14") = IIf(chkUseTime(13).Value = 1, True, False)
            Rs("UseTime15") = IIf(chkUseTime(14).Value = 1, True, False)
            Rs("Decrip") = Trim(txtDescription.Text)        '用途說明
           
            Rs.Update
            RsClose
        End If
       
        MsgBox "會議室預約編號:『" & lblSerial.Caption & "』資料已儲存完畢...", vbInformation, "§新增作業.訊息提示 §"
        Exit Sub
           
    WriteUseRecords_Err:
        MsgBox "資料庫發生如下錯誤:" & Chr(10) & Chr(13) & Err.Number & "." & Err.Description, vbCritical, "◎WriteUseRecords.儲存會議室預約資料"
    End Sub

    試過用15個or來比較,是不可行的,只要其中一個有,就跳離了,if…elseif…也是一樣。

    想請教該如何修改?懇請各位大大不吝賜教。謝謝。

    ps.可選取的時段我以checkbox來做,共15個,由08:30~09:00,每半個小時為一個分界,中午12:00~13:00沒有選項,下午由13:00~17:00一樣半小時為一個分界。

    2010年8月25日 上午 03:05

解答

  • 依你的需求,資料庫增加一個欄位,表示旗標變數,分別為 2^0 ~ 2^14。

    SQL Server 支援整數的旗標運算,可直接過濾出時間重疊筆數,Access 可以先篩選出當天會議後,用迴圈一筆筆旗標變數比較。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年8月25日 下午 02:18

所有回覆

  • 不要用ElseIf看看, 改成:

    If -CInt(Rs("UseTime1")) = chkUseTime(0).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
    End If

    If -CInt(Rs("UseTime2")) = chkUseTime(1).Value Then
            MsgBox "您勾選的時段已被預約,請選擇其他時段或先瀏覽預約明細表再做勾選", vbCritical, "§ 更新作業.訊息提示 §"
            Exit Sub
    EndIf -CInt(Rs("UseTime3")) = chkUseTime(2).Value Then

    ...

    2010年8月25日 上午 03:20
  • tihs大:

    不要用ElseIF也不行,變成不管選哪一個時間都會秀出Msgbox說已預約,一筆也新增不了。

    用了另外在藍色小舖阿戊提供的方法

    If Rs("UseTime1") = True And chkUseTime(0).Value = 1 Then
            MsgBox "您勾選的『" & chkUseTime(0).Caption & "』時段已被預約," & Chr(10) & Chr(13) & "請選擇其他時段或先瀏覽預約明細表再做勾選。", vbCritical, "§ 儲存作業.訊息提示 §": Exit Sub
        ElseIf Rs("UseTime2") = True And chkUseTime(1).Value = 1 Then
            MsgBox "您勾選的『" & chkUseTime(1).Caption & "』時段已被預約," & Chr(10) & Chr(13) & "請選擇其他時段或先瀏覽預約明細表再做勾選。", vbCritical, "§ 儲存作業.訊息提示 §": Exit Sub
        ElseIf Rs("UseTime3") = True And chkUseTime(2).Value = 1 Then
            MsgBox "您勾選的『" & chkUseTime(2).Caption & "』時段已被預約," & Chr(10) & Chr(13) & "請選擇其他時段或先瀏覽預約明細表再做勾選。", vbCritical, "§ 儲存作業.訊息提示 §": Exit Sub

    ……

    是可以了,但另外又產生了另一個小小的問題,因為
    SQLStr = "SELECT * FROM UseRecords WHERE UseDate = '" & dtpUseDate.Value & "' ORDER BY SN"
    這一行的關係,所以都只和第一筆記錄做比較,之後新增的每一筆只要不要勾選到和第一筆記錄一樣的時間,無論有沒有時間重覆都可以新增,請問要如何和同一日期的每一筆記錄做比對?

    2010年8月25日 上午 07:23
  • 依你的需求,資料庫增加一個欄位,表示旗標變數,分別為 2^0 ~ 2^14。

    SQL Server 支援整數的旗標運算,可直接過濾出時間重疊筆數,Access 可以先篩選出當天會議後,用迴圈一筆筆旗標變數比較。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年8月25日 下午 02:18
  • 心冷熱情熄大大:

    您是說那個欄位和checkbox有沒有勾選做比較嗎?小弟的是sql server 2000,但對這個不是很懂,是否方便示範一下呢?

    2010年8月27日 上午 09:19