2017-01-07 4 views
-1

を押した後、私はこのコードを持っている同じ従業員との2時間の記録を入力防ぐことができます。どのように私は時間内のボタン

  conn.Open() 
      Dim cmd As SqlCommand = conn.CreateCommand 

      cmd.CommandText = "INSERT INTO timelogTB (EmpNo, Time_In, Date_)" & _ 
       "VALUES (@EmpNo, @Time_In, @Date_)" 

      Dim date1 As Date 
      date1 = New Date(dtpTime.Value.Ticks - (dtpTime.Value.Ticks Mod TimeSpan.TicksPerSecond)) 

      cmd.Parameters.AddWithValue("@EmpNo", comboxEmpno.Text) 
      cmd.Parameters.Add(New SqlParameter("@Time_In", date1)) 
      cmd.Parameters.Add(New SqlParameter("@Date_", dtpDate.Value.Date)) 

      Dim rowsAffected As Integer = cmd.ExecuteNonQuery() 

      If rowsAffected > 0 Then 
       MsgBox("Record save successfully!", MsgBoxStyle.Information, "Congratulations") 
       comboxEmpno.Text = "" 
       txtLname.Text = "" 
       txtFname.Text = "" 
       txtMname.Text = "" 
       txtPosition.Text = "" 
       txtEmpstat.Text = "" 

      Else 
       MsgBox("Error saving record!", MsgBoxStyle.Exclamation, "Unsuccessful") 
      End If 

のは、従業員#101は、時間内のボタンをクリックすると、それが記録しましょうと言ってみましょうを日付と時刻。

その後、彼は誤ってタイムインボタンをクリックし、再び新しい時刻を記録します。

「このユーザーは既にタイムインしている」というメッセージボックスを表示したいと考えています。

+0

従業員にその日の行がすでに存在するかどうかをテストするSQLを記述します。 –

+0

あなたは私にそれをどうするべきかに関するいくつかのコードを教えてもらえますか?私はvb.netで新しくなった – AtanHokage04

+0

あなたはSQLで直接行った場合、あなたはそれをどうやってやるか知っていますか?私。与えられた日付の与えられたempNoの行数のカウントを取得しますか? –

答えて

0

適切な解決策を得るためには、シナリオを詳しく説明する必要があります。テーブルには、従業員1日あたりの時間ログ、または1日あたりの1回のログレコード、またはテーブルごとの1番目のレコードのみが格納されますか?従業員一人当たりの一日あたりの時間のログと仮定すると、あなたのシナリオがあるかもしれないもので、以下の私の提案です: -

  1. 更新テーブルと、それが失敗した場合は、新しい行を挿入することができます。これにより、その従業員の1日1行だけが保存されます。クエリが

    cmd.CommandText = "アップデートtimelogTB設定Time_In = @ Time_In EMPNOを=" & @EmpNo & "AND DATE_ =「" &フォーマット(@Date_、 "YYYY/MM/DD")&」になります更新'; "

  2. 挿入する前の行の数を確認します(これは@Andrew Mortimerの提案と同じです)。 注:以下はメモ帳を使用して更新されたコードですので、文法上の間違いが見つかった場合は私の言い訳をしてください。

    conn.Open()  
    

    薄暗いcmdをあなたのシナリオは、フォーム/アプリケーションが実行され、セッションごとに基づいている場合は、レコードが挿入された後、SqlCommandオブジェクト= conn.CreateCommand

    count = Convert.ToInt16(cmd.ExecuteScalar()) 
    
    cmd.CommandText = "SELECT COUNT(Time_In) AS timelogTB FROM timelogTB WHERE EmpNo = " & @EmpNo & " AND Date_ = '" & Format(@Date_, "yyyy/MM/dd") & "';" 
    
    Dim count As Integer = Convert.ToInt16(cmd.ExecuteScalar()) 
    
    If count > 0 Then 
        'do not insert new record, exit from the function 
        'this depends on your implementation, you may prefer to use Else also. 
        MsgBox("Record already inserted!", MsgBoxStyle.Information) 
        Return 
    End If 
    
    cmd.CommandText = "INSERT INTO timelogTB (EmpNo, Time_In, Date_)" & _ 
        "VALUES (@EmpNo, @Time_In, @Date_)" 
    
    Dim date1 As Date 
    date1 = New Date(dtpTime.Value.Ticks - (dtpTime.Value.Ticks Mod TimeSpan.TicksPerSecond)) 
    
    cmd.Parameters.AddWithValue("@EmpNo", comboxEmpno.Text) 
    cmd.Parameters.Add(New SqlParameter("@Time_In", date1)) 
    cmd.Parameters.Add(New SqlParameter("@Date_", dtpDate.Value.Date)) 
    
    Dim rowsAffected As Integer = cmd.ExecuteNonQuery() 
    
    If rowsAffected > 0 Then 
        MsgBox("Record save successfully!", MsgBoxStyle.Information, "Congratulations") 
        comboxEmpno.Text = "" 
        txtLname.Text = "" 
        txtFname.Text = "" 
        txtMname.Text = "" 
        txtPosition.Text = "" 
        txtEmpstat.Text = "" 
    Else 
        MsgBox("Error saving record!", MsgBoxStyle.Exclamation, "Unsuccessful") 
    End If 
    
  3. として、あなたは時間内のボタンを無効にすることができ。

+0

ありがとうございました。私はこのコードを試し、私はあなたに戻ってきます。 – AtanHokage04

+0

あなたの最初の推測だったシナリオで。従業員は1日にタイムインします。 – AtanHokage04

+0

コードはまた、翌日にタイムアウトするのを防ぎ、メッセージが表示されます。それだけですべてを保存していませんでした。どのように修正する必要がありますか? – AtanHokage04

関連する問題