winform+SQL server数据库制作上下班打卡小程序;员工自己登录自己账号,进行打卡如果已打卡;点击再上班打卡按钮时提示已打卡;并且判断打卡时间范围;晚上23点-早上7点30为休息时间,打卡视为无效并提示;8点到8点30分打卡为正常打卡;8点30分之后打卡为迟到,并计算迟到时长;具体实现过程以及代码
时间: 2024-03-13 13:43:15 浏览: 144
好的,我可以为您提供一些思路和代码示例,但需要说明的是,由于涉及到数据库连接和操作,代码示例可能无法直接运行,需要您根据自己的具体情况进行修改。
首先,我们需要创建一个 SQL Server 数据库,包括一个员工表和一个打卡记录表。员工表中需要包含员工的姓名、账号、密码等基本信息,打卡记录表中需要包含员工账号、打卡日期、打卡时间等信息。
接下来,我们需要创建一个 WinForm 窗体应用程序,用于实现员工登录、打卡等功能。在登录界面中,员工需要输入自己的账号和密码,程序会根据输入的账号和密码在员工表中进行验证,验证通过后跳转到打卡界面。
在打卡界面中,员工可以点击上班打卡或下班打卡按钮,程序会根据当前时间判断打卡是否有效,并在打卡记录表中添加一条记录。具体代码示例如下:
```
private void btnClockIn_Click(object sender, EventArgs e)
{
// 获取当前时间
DateTime now = DateTime.Now;
// 获取员工账号
string account = txtAccount.Text;
// 查询当天是否已经打卡
string sql = "SELECT COUNT(*) FROM ClockRecord WHERE Account = '" + account + "' AND Date = '" + now.ToString("yyyy-MM-dd") + "'";
int count = (int)ExecuteScalar(sql);
if (count > 0)
{
MessageBox.Show("您今天已经打过卡了!");
return;
}
// 判断打卡时间是否在有效范围内
if (now.Hour >= 23 || now.Hour < 7 || (now.Hour == 7 && now.Minute >= 30))
{
MessageBox.Show("现在不是上班时间!");
return;
}
// 添加打卡记录
sql = "INSERT INTO ClockRecord(Account, Date, Time, Type) VALUES('" + account + "', '" + now.ToString("yyyy-MM-dd") + "', '" + now.ToString("HH:mm:ss") + "', '上班')";
ExecuteNonQuery(sql);
MessageBox.Show("上班打卡成功!");
}
private void btnClockOut_Click(object sender, EventArgs e)
{
// 获取当前时间
DateTime now = DateTime.Now;
// 获取员工账号
string account = txtAccount.Text;
// 查询当天是否已经打卡
string sql = "SELECT COUNT(*) FROM ClockRecord WHERE Account = '" + account + "' AND Date = '" + now.ToString("yyyy-MM-dd") + "'";
int count = (int)ExecuteScalar(sql);
if (count == 0)
{
MessageBox.Show("您今天还没有打过卡!");
return;
}
// 判断打卡时间是否在有效范围内
if (now.Hour < 8 || (now.Hour == 8 && now.Minute < 30))
{
MessageBox.Show("现在不是下班时间!");
return;
}
// 更新打卡记录
sql = "UPDATE ClockRecord SET Time = '" + now.ToString("HH:mm:ss") + "', Type = '下班' WHERE Account = '" + account + "' AND Date = '" + now.ToString("yyyy-MM-dd") + "'";
ExecuteNonQuery(sql);
MessageBox.Show("下班打卡成功!");
}
```
在上面的代码示例中,ExecuteScalar 和 ExecuteNonQuery 分别是执行 SQL 查询和更新操作的函数,需要根据实际情况进行实现。
最后,我们需要实现迟到时长的计算。在员工打下班卡时,程序会根据打卡时间和规定的下班时间(下午 5 点)进行比较,如果员工迟到,则计算迟到时长并在打卡记录表中添加一条迟到记录。具体代码示例如下:
```
private void btnClockOut_Click(object sender, EventArgs e)
{
// 获取当前时间
DateTime now = DateTime.Now;
// 获取员工账号
string account = txtAccount.Text;
// 查询当天是否已经打卡
string sql = "SELECT COUNT(*) FROM ClockRecord WHERE Account = '" + account + "' AND Date = '" + now.ToString("yyyy-MM-dd") + "'";
int count = (int)ExecuteScalar(sql);
if (count == 0)
{
MessageBox.Show("您今天还没有打过卡!");
return;
}
// 判断打卡时间是否在有效范围内
if (now.Hour < 8 || (now.Hour == 8 && now.Minute < 30))
{
MessageBox.Show("现在不是下班时间!");
return;
}
// 更新打卡记录
sql = "UPDATE ClockRecord SET Time = '" + now.ToString("HH:mm:ss") + "', Type = '下班' WHERE Account = '" + account + "' AND Date = '" + now.ToString("yyyy-MM-dd") + "'";
ExecuteNonQuery(sql);
// 计算迟到时长
DateTime offTime = DateTime.Parse("17:00:00");
TimeSpan lateTime = now - offTime;
if (lateTime.TotalMinutes > 0)
{
sql = "INSERT INTO LateRecord(Account, Date, Time, Duration) VALUES('" + account + "', '" + now.ToString("yyyy-MM-dd") + "', '" + now.ToString("HH:mm:ss") + "', '" + lateTime.TotalMinutes.ToString() + "')";
ExecuteNonQuery(sql);
}
MessageBox.Show("下班打卡成功!");
}
```
在上面的代码示例中,LateRecord 表是用于存储迟到记录的,包含员工账号、日期、时间和迟到时长等信息。
以上就是制作上下班打卡小程序的基本思路和代码示例。需要注意的是,为了保证系统的安全性,我们需要对输入的账号和密码进行加密处理,并且在数据库连接和操作时需要使用事务来保证数据的完整性。
阅读全文