none
資料判斷不能相同的時間再一問 RRS feed

  • 問題

  • 各位大大你們好,之前這個問題有提問過了,也感謝各位大大的幫忙讓問題解決了,但目前我又遇上了一個問題

     Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=e:\try.mdb"
            Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND 啟用時間<>? AND 結束時間<=?"
            Using connection As New OleDbConnection(connectionString)
                Dim command As New OleDbCommand(queryString, connection)
                command.Parameters.Add("用具", OleDbType.VarWChar).Value = ComboBox1.Text
                command.Parameters.Add("借用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("歸還時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                connection.Open()
                Dim reader As OleDbDataReader = command.ExecuteReader()
                If reader.HasRows Then
                    MessageBox.Show(DateTimePicker1.Value.ToString & "至" & DateTimePicker2.Value.ToString & "已有人在使用了,所以不能登記借用")
                Else
                End If
                reader.Close()
            End Using
        End Sub
    End Class

    如果我這樣下

     Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND 啟用時間<=? AND 結束時間>=?"

     Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND 啟用時間>=? AND 結束時間<=?"

     Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND 啟用時間<>? AND 結束時間<=?"
    時間上的控制都會有問題,假設資料庫裡有一筆10:00 至 12:00 時間內有人借用,照理來說不管我選擇09:00 至 11:00 或 10:30 至 11:00 應該是不能再被選用登記的,如果我選09:00 至 12:00 來做為登記的話,卻是可以再被登記的,這樣就會重覆選取了, 請問如果我要讓電腦自動判斷只要是在這時間以內的話,就不能再被選用登記的話,我是不是不能用這樣的語法來設計?,還是我該去參考那些文章,麻煩各位大大再給我一些意見,謝謝

    2010年6月22日 上午 02:24

解答

  • Hi!

    1. 您的 Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND 啟用時間<>? AND 結束時間<=?"

    欄位是 [用具]、[啟用時間]、[結束時間],然後您command.Parameters.Add加的是[用具]、[借用時間]、[歸還時間],是故意這樣寫的嗎?

     

    2. 下中斷點去確認 ComboBox1.Text、DateTimePicker1.Value.ToString("HH:mm")、DateTimePicker2.Value.ToString("HH:mm") 資料是否跟你想要的一樣

     

    3. 建議您先在 SQL Server Management Studio 中,把您的 SQL 語法寫好並且能查詢出您要的資料,再套到程式內

     


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 賀小美 2010年6月25日 上午 08:29
    2010年6月22日 上午 03:04
    版主
  • 另外提一下;在新增記錄的時候,不管是頭或是尾的時間都要抓出來判斷,只要其中一個是處於別人已經借用的時間段之內,就不允許借用。
    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    • 已標示為解答 賀小美 2010年6月25日 上午 08:28
    2010年6月22日 上午 03:09
    版主
  •  

    畫個圖來解釋bauann講的邏輯

    E 代表已存在於資料庫的時段, 而ABCD則代表了如果你輸入一定會重疊的狀態, 也就是這四個狀態應該都是不允許新增.

    A: A 的開始時間 <= E 的開始時間 且 A 的結束時間 <= E 的結束時間

    B: B 的開始時間 >= E 的開始時間 且 B 的結束時間  >= E 的結束時間

    C: C 的開始時間 >= E 的開始時間 且 C 的結束時間 <= E 的結束時間

    D: D 的開始時間 <= E 的開始時間 且 D 的結束時間 >= E 的結束時間

    所以只要非以上四個狀況, 就可以新增.


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 賀小美 2010年6月25日 上午 08:28
    2010年6月22日 上午 03:27
    版主
  •         Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND " _
            & "( (啟用時間<=? AND 結束時間>=?) OR (啟用時間<=? AND 結束時間>=?) OR (啟用時間<=? AND 結束時間>=?) OR (啟用時間>? AND 結束時間<?) )"
                command.Parameters.Add("用具", OleDbType.VarWChar).Value = ComboBox1.Text
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")

    • 已標示為解答 賀小美 2010年6月25日 上午 08:28
    2010年6月25日 上午 07:52

所有回覆

  • Hi!

    1. 您的 Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND 啟用時間<>? AND 結束時間<=?"

    欄位是 [用具]、[啟用時間]、[結束時間],然後您command.Parameters.Add加的是[用具]、[借用時間]、[歸還時間],是故意這樣寫的嗎?

     

    2. 下中斷點去確認 ComboBox1.Text、DateTimePicker1.Value.ToString("HH:mm")、DateTimePicker2.Value.ToString("HH:mm") 資料是否跟你想要的一樣

     

    3. 建議您先在 SQL Server Management Studio 中,把您的 SQL 語法寫好並且能查詢出您要的資料,再套到程式內

     


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 賀小美 2010年6月25日 上午 08:29
    2010年6月22日 上午 03:04
    版主
  • 另外提一下;在新增記錄的時候,不管是頭或是尾的時間都要抓出來判斷,只要其中一個是處於別人已經借用的時間段之內,就不允許借用。
    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    • 已標示為解答 賀小美 2010年6月25日 上午 08:28
    2010年6月22日 上午 03:09
    版主
  • 抱歉,我再貼一次,

    Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=e:\try.mdb"
            Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND 啟用時間<>? AND 結束時間<=?"
            Using connection As New OleDbConnection(connectionString)
                Dim command As New OleDbCommand(queryString, connection)
                command.Parameters.Add("用具", OleDbType.VarWChar).Value = ComboBox1.Text
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                connection.Open()
                Dim reader As OleDbDataReader = command.ExecuteReader()
                If reader.HasRows Then
                    MessageBox.Show(DateTimePicker1.Value.ToString & "至" & DateTimePicker2.Value.ToString & "已有人在使用了,所以不能登記借用")
                Else
                End If
                reader.Close()
            End Using
        End Sub
    End Class

    2010年6月22日 上午 03:11
  • 謝謝 bauann 大大的加註
    2010年6月22日 上午 03:18
  •  

    畫個圖來解釋bauann講的邏輯

    E 代表已存在於資料庫的時段, 而ABCD則代表了如果你輸入一定會重疊的狀態, 也就是這四個狀態應該都是不允許新增.

    A: A 的開始時間 <= E 的開始時間 且 A 的結束時間 <= E 的結束時間

    B: B 的開始時間 >= E 的開始時間 且 B 的結束時間  >= E 的結束時間

    C: C 的開始時間 >= E 的開始時間 且 C 的結束時間 <= E 的結束時間

    D: D 的開始時間 <= E 的開始時間 且 D 的結束時間 >= E 的結束時間

    所以只要非以上四個狀況, 就可以新增.


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 賀小美 2010年6月25日 上午 08:28
    2010年6月22日 上午 03:27
    版主
  • 各位大大,我找到了應該可以解決我這問題的文章,可是我真的不會修改,也不知道文章有沒有找對,能請各位大大幫我看看這文章對嗎?

    如果對的話,我又該去那參考別的文章來修改我的程式碼? 謝謝

    http://msdn.microsoft.com/zh-tw/library/ms179491.aspx

    2010年6月25日 上午 06:14
  •         Dim queryString As String = "SELECT * FROM 器材 WHERE 用具=? AND " _
            & "( (啟用時間<=? AND 結束時間>=?) OR (啟用時間<=? AND 結束時間>=?) OR (啟用時間<=? AND 結束時間>=?) OR (啟用時間>? AND 結束時間<?) )"
                command.Parameters.Add("用具", OleDbType.VarWChar).Value = ComboBox1.Text
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")
                command.Parameters.Add("啟用時間", OleDbType.VarChar).Value = DateTimePicker1.Value.ToString("HH:mm")
                command.Parameters.Add("結束時間", OleDbType.VarChar).Value = DateTimePicker2.Value.ToString("HH:mm")

    • 已標示為解答 賀小美 2010年6月25日 上午 08:28
    2010年6月25日 上午 07:52