Я разрабатываю простое приложение, которое записывает данные, а затем позволяет пользователям получать проценты на основе этих данных. Пройдено/не пройдено и т.д.
Мои общие расчеты работают просто отлично, но когда выполняются мои расчеты ящиков 3,6,9, они, похоже, не меняются, хотя я переключил, для какого пользователя он должен получать статистику.
Я изменил свой код, чтобы он возвращал отформатированную строку процентов, рассчитанных в моем методе calc_percent(). Я также инкапсулировал свои расчеты различными методами, чтобы мне было легче их читать.
Вот ссылка на мой проект github. Проект не содержит набора данных или адаптеров таблиц, я думаю, что мои ошибки в расчетах могут быть связаны с моими запросами к набору данных, но я не уверен. У меня сложилось впечатление, что метод Fill() в адаптере таблицы заполнит входной набор данных результатами этого запроса. Это должно позволить мне предварительно сформировать дополнительные запросы, чтобы сузить мои результаты, верно? Возможно, я неправильно использую запросы tableadapter, но я не уверен.
#region Metrics Methods
private void generate_stats(User user)
{
int crate_total = 0;
try
{
crate_total = (int)this.CratesTableAdapter.count_crates_by_tech(user.Last_name);
generate_overall_stats(user);
// last 30 units stats
if (crate_total >= 3)
{
generate_3_crate_stats(user);
}
// last 60 units stats
if (crate_total >= 6)
{
generate_6_crate_stats(user);
}
// last 90 units stats
if (crate_total >= 9)
{
generate_9_crate_stats(user);
}
}
catch (NullReferenceException e)
{
MessageBox.Show(e.Message);
}
catch (OleDbException e)
{
MessageBox.Show(e.Message);
}
}
private string calc_percent(int total, int number)
{
double percentage = 0;
percentage = ((double)number / total) * 100;
string format_percent = string.Format("{0:0.00%}", percentage);
try
{
if (percentage == 0)
{
throw new NullReferenceException("Calculation Has Failed, Possible Data Inaccuracy");
}
}catch(NullReferenceException e)
{
MessageBox.Show(e.Message);
}
return format_percent;
}
private void generate_overall_stats(User user)
{
// Overall Stats
int total = (int)this.Audit_ResultsTableAdapter.count_units_by_user(user.Last_name);
int pass = (int)this.Audit_ResultsTableAdapter.count_pass_units_by_user(user.Last_name);
int fail = total - pass;
string ovr_pass_perc = calc_percent(total, pass);
string ovr_fail_perc = calc_percent(total, fail);
metrics_qc_overall_units_display.Text = total.ToString();
metrics_qc_overall_pass_display.Text = ovr_pass_perc;
metrics_qc_overall_fail_display.Text = ovr_fail_perc;
}
private void generate_3_crate_stats(User user)
{
int crate_pass = 0;
int crate_fail = 0;
metrics_qc_last30_group.Visible = true;
// Reset data set
this.CratesTableAdapter.Fill(this.android_teamDataSet.Crates);
// Get all crates by user in Desc order according to date (most recent dates at the top of the table)
this.CratesTableAdapter.get_crates_by_tech(this.android_teamDataSet.Crates, user.Last_name);
// Get the 3 most recent crates
this.CratesTableAdapter.get_top_3_crates(this.android_teamDataSet.Crates);
foreach (DataRow row in this.android_teamDataSet.Crates)
{
crate_pass = crate_pass + (int)row["passed_units"];
crate_fail = crate_fail + (int)row["failed_units"];
}
int tmp_total = crate_pass + crate_fail;
string pass_percent_30 = calc_percent(tmp_total, crate_pass);
string fail_percent_30 = calc_percent(tmp_total, crate_fail);
metrics_qc_last30_pass_display.Text = pass_percent_30;
metrics_qc_last30_fail_display.Text = fail_percent_30;
}
private void generate_6_crate_stats(User user)
{
int crate_pass = 0;
int crate_fail = 0;
metrics_qc_last60_group.Visible = true;
this.CratesTableAdapter.Fill(this.android_teamDataSet.Crates);
this.CratesTableAdapter.get_crates_by_tech(this.android_teamDataSet.Crates, user.Last_name);
this.CratesTableAdapter.get_top_6_crates(this.android_teamDataSet.Crates);
foreach (DataRow row in this.android_teamDataSet.Crates)
{
crate_pass = crate_pass + (int)row["passed_units"];
crate_fail = crate_fail + (int)row["failed_units"];
}
int tmp_total = crate_pass + crate_fail;
string pass_percent_60 = calc_percent(tmp_total, crate_pass);
string fail_percent_60 = calc_percent(tmp_total, crate_fail);
metrics_qc_last60_pass_display.Text = pass_percent_60;
metrics_qc_last60_fail_display.Text = fail_percent_60;
}
private void generate_9_crate_stats(User user)
{
int crate_pass = 0;
int crate_fail = 0;
metrics_qc_last90_group.Visible = true;
this.CratesTableAdapter.Fill(this.android_teamDataSet.Crates);
this.CratesTableAdapter.get_crates_by_tech(this.android_teamDataSet.Crates, user.Last_name);
this.CratesTableAdapter.get_top_9_crates(this.android_teamDataSet.Crates);
foreach (DataRow row in this.android_teamDataSet.Crates)
{
crate_pass = crate_pass + (int)row["passed_units"];
crate_fail = crate_fail + (int)row["failed_units"];
}
int tmp_total = crate_pass + crate_fail;
string pass_percent_90 = calc_percent(tmp_total, crate_pass);
string fail_percent_90 = calc_percent(tmp_total, crate_fail);
metrics_qc_last90_pass_display.Text = pass_percent_90;
metrics_qc_last90_fail_display.Text = fail_percent_90;
}
private void set_users_metrics_defaults()
{
metrics_qc_last30_group.Visible = false;
metrics_qc_last60_group.Visible = false;
metrics_qc_last90_group.Visible = false;
}
#endregion
#region Metrics Event Handlers
private void metrics_qc_display_panel_Paint(object sender, PaintEventArgs e)
{
}
private void metrics_auditor_combobox_SelectionChangeCommitted(object sender, EventArgs e)
{
}
private void metrics_qc_combobox_SelectionChangeCommitted(object sender, EventArgs e)
{
set_users_metrics_defaults();
User metrics_user = gen_user_for_metrics();
generate_stats(metrics_user);
}
#endregion