【发布时间】:2019-11-12 22:46:41
【问题描述】:
第 1 部分
在 MySQL 数据库中,我创建了“leave”、“Sickness”、“Workers”、“Orders”、“Order_status”表。自动生成的 MySQL 代码如下链接:
第 2 部分
在桌面应用程序中,我编写了基于算法的代码,该算法按比例计算病假时间,模式如下图所示:
该代码的详细信息在这里:
private sick_leaves calculate_sickness_leaves(string NrOrder)
{
string query1 = string.Format("SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE) " +
"FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
"WHERE orders.ORDER_NUMBER = '" + NrOrder + "';");
SQLdata.connection.Open();
using (var command = new MySqlCommand(query1, SQLdata.connection))
{
using (var reader1 = command.ExecuteReader())
{
while (reader1.Read())
{
date_min = Convert.ToDateTime(reader1[0]);
date_max = Convert.ToDateTime(reader1[1]);
}
}
}
TimeSpan time_of_sickness_to_order = new TimeSpan(0, 0, 0);
TimeSpan time_of_leave_to_order = new TimeSpan(0, 0, 0);
for (DateTime date = date_min; date <= date_max; date = date.AddDays(1))
{
long hours_sickness_total = 0;
long hours_leave_total = 0;
TimeSpan time_of_all_orders;
TimeSpan time_of_order;
string query2 = $"SELECT COUNT(sickness.ID_WORKER) AS 'AMOUNT OF WORKERS ON SICKNESS' " +
$"FROM project1.sickness WHERE DATE(sickness.BEGIN_DATE) <= '{date}' AND DATE(sickness.END_DATE) >= '{date}';";
hours_sickness_total = SQLdata.load_amount_sql(query2) * 8;
string query3 = $"SELECT COUNT(leaves.ID_WORKER) AS 'AMOUNT OF WORKERS ON LEAVE' FROM project1.leaves" +
$" WHERE DATE(leaves.BEGIN_DATE) <= '{date}' AND DATE(leaves.END_DATE) >= '{date}';";
hours_leave_total = SQLdata.load_amount_sql(query3) * 8;
string query4 = $"SELECT IFNULL(TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(order_status.END_DATE) - TIME_TO_SEC(order_status.BEGIN_DATE))), '%H:%i:%s'), '00:00:00') AS 'REALIZATION TIME OF ALL ORDERS IN DAY' " +
$"FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
$"WHERE (DATE(order_status.BEGIN_DATE) = '{date}' AND DATE(order_status.END_DATE) = '{date}');";
time_of_all_orders = SQLdata.load_time_sql(query4);
string query5 = $"SELECT IFNULL(TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(order_status.END_DATE) - TIME_TO_SEC(order_status.BEGIN_DATE))), '%H:%i:%s'), '00:00:00') AS 'REALIZATION TIME OF ORDER IN DAY' " +
$"FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
$"WHERE (DATE(order_status.BEGIN_DATE) = '{date}' AND DATE(order_status.END_DATE) = '{ date}') " +
$"AND orders.ORDER_NUMBER = '{NrOrder}';";
time_of_order = SQLdata.load_time_sql(query5);
hours_sickness_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_sickness_total);
time_of_sickness_to_order += new TimeSpan(hours_sickness_total * 10000000 * 60 * 60);
hours_leave_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_leave_total);
time_of_leave_to_order += new TimeSpan(hours_leave_total * 10000000 * 60 * 60);
}
SQLdata.connection.Close();
sick_leaves x = new sick_leaves();
x.sickness_time = time_of_sickness_to_order;
x.leave_time = time_of_leave_to_order;
return x;
}
我不得不编写额外的代码来加载以下数据:
1) 用户可以选择的订单时间(每天)load_time_sql 以及所选订单期间所有订单的时间(每天)。
2) 所选订单中每天的病假总次数。
public static TimeSpan load_time_sql(string query)
{
TimeSpan x = new TimeSpan(0, 0, 0);
using (var command = new MySqlCommand(query, SQLdata.connection))
{
using (var reader1 = command.ExecuteReader())
{
while (reader1.Read())
{
x = Convert.ToDateTime(reader1[0]).TimeOfDay;
}
return x;
}
}
}
public static int load_amount_sql(string query)
{
int x = 0;
using (var command = new MySqlCommand(query, SQLdata.connection))
{
using (var reader1 = command.ExecuteReader())
{
while (reader1.Read())
{
x = Convert.ToInt32(reader1[0]);
}
return x;
}
}
}
第 3 部分
现在在这个应用程序中,我想选择“TEST”订单。至于按顺序显示工人的病假和休假时间,然后在“私人病假计算病假”的数据网格视图上生成结果,在下面的链接中是这样写的:
生成此订单的报告后,我得到以下结果:
来自 MySqlDataAdapter 适配器4:
+---------+---------+---------------+---------------+------------+------------+
| FNAME | LNAME | BEGIN_DATE | END_DATE | LEAVE_TIME |
+---------+---------+---------------+---+-----------+------------+------------+
| ADAM | GAX | 2019-03-19 7:00:00 | 2019-03-19 15:00:00 | 08:00:00 |
+---------+---------+---------------+---------------+------------+------------+
| ANDREW | WORM | EMPTY | EMPTY | 00:00:00 |
+---------+---------+---------------+---------------+------------+------------+
来自 MySqlDataAdapter 适配器5:
+---------+---------+---------------+---------------+------------+---------------+
| FNAME | LNAME | BEGIN_DATE | END_DATE | SICKNESS_TIME |
+---------+---------+---------------+---+-----------+------------+---------------+
| ADAM | GAX | EMPTY | EMPTY | 00:00:00 |
+---------+---------+---------------+---------------+------------+---------------+
| ANDREW | WORM | 2019-03-19 7:00:00 | 2019-03-20 15:00:00 | 16:00:00 |
+---------+---------+---------------+---------------+------------+---------------+
来自私人病假计算病假:
+----------------+--------------+
| sickness_time | leave_time |
+----------------+--------------+
| 00:00:00 | 00:00:00 |
+----------------+--------------+
至于sickness_time 和leave_time 的结果,我认为是不正确的。这些应该是“00:00:00”以外的其他值,因为我看到了 ADAM GAX 的休假和 ANDREW WORM 的病假。那么计算应该是正确的,当然是按比例计算的。
我有一个问题:如何按比例正确地总结休假时间和病假时间的错误?有任何想法吗?我可以指望任何帮助或建议吗?提前致谢。
我的代码在链接中以下载该或其他内容:
https://www.mediafire.com/folder/pue5ainu4w4a6ii,r9frx0713s2iy51/shared
【问题讨论】:
-
你的问题太长了。尽量减少到相关部分。
-
@juergend 我刚刚通过减少问题进行了编辑。现在呢?
-
int(11)?(11)没有 zerofill 什么都不做。而且INT(11)和INT具有相同的数字范围(11)不会改变这一点。 -
假设您对工人故障报告感到满意,看起来问题出在您的
calculate_sickness_leaves函数上。我建议在调试时单步执行此功能。在您的hours_x_total calculations中,我会密切注意会导致这些变量等于 0 的变量并重新访问相关查询.. -
@Prochu1991 不,我没有 C# 环境,我的评论是基于帖子的。老实说,这个问题本身已经很长,没有下载更多文件。如果您仍然需要帮助,我建议您尝试在一个更简单的示例中重新创建问题。如果做不到这一点,让您逐行逐行执行代码的正确调试过程是您的朋友!
标签: c# mysql .net datetime datagridview