Процентные вычисления С# не вычисляются должным образом

Я разрабатываю простое приложение, которое записывает данные, а затем позволяет пользователям получать проценты на основе этих данных. Пройдено/не пройдено и т.д.

Мои общие расчеты работают просто отлично, но когда выполняются мои расчеты ящиков 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

person nulltron    schedule 27.02.2016    source источник


Ответы (2)


В нынешнем виде любой crate_total > 9 также будет оцениваться как > 3 и > 6.

if (crate_total >= 3)
if (crate_total >= 6)
if (crate_total >= 9)

Вам нужно будет указать верхний и нижний пределы в вашем операторе if.

// last 30 units stats
if (crate_total >= 3 && crate_total < 6)

// last 60 units stats
if (crate_total >= 6 && crate_total < 9)

// last 90 units stats
if (crate_total >= 9)
person Community    schedule 27.02.2016
comment
Да, я понимаю, что вы имеете в виду, я внедрил верхний и нижний пределы в свои операторы if, но проблема осталась. Я собираюсь опубликовать ответ, чтобы показать, как я решил проблему. Я изменил способ получения счетчиков пройдено/не пройдено, используя свою таблицу audit_results вместо таблицы crates. - person nulltron; 27.02.2016

Я изменил способ расчета. Проблема заключалась в том, что когда я меняю пользователей, общая статистика меняется, но статистика 30/60/90 единиц не меняется, она всегда остается неизменной. Я понял, что значения почему-то не очищаются каким-то образом (пришло мне в голову во время вождения). Поэтому я все разделил.

#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);

                if (crate_total >= 3)
                {
                    generate_3_crate_stats(user, crate_total);
                }
                if (crate_total >= 6)
                {
                    generate_6_crate_stats(user, crate_total);
                }
                //if (crate_total >= 9)
                //{
                //    generate_9_crate_stats(user, crate_total);
                //}


            }
            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_number)
        {

            metrics_qc_last30_group.Visible = true;
            int[] crate_stats = crate_stats_count_3(user.Last_name, crate_number);

            int tmp_total = crate_stats[0] + crate_stats[1];
            string pass_percent_30 = calc_percent(tmp_total, crate_stats[0]);
            string fail_percent_30 = calc_percent(tmp_total, crate_stats[1]);

            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_number)
        {

            metrics_qc_last60_group.Visible = true;

            int[] crate_stats = crate_stats_count_6(user.Last_name, crate_number);

            int tmp_total = crate_stats[0] + crate_stats[1];
            string pass_percent_60 = calc_percent(tmp_total, crate_stats[0]);
            string fail_percent_60 = calc_percent(tmp_total, crate_stats[1]);

            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_number)
        {
            metrics_qc_last90_group.Visible = true;

            int[] crate_stats = crate_stats_count_9(user.Last_name, crate_number);

            int tmp_total = crate_stats[0] + crate_stats[1];
            string pass_percent_90 = calc_percent(tmp_total, crate_stats[0]);
            string fail_percent_90 = calc_percent(tmp_total, crate_stats[1]);

            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;


        }
        private int[] crate_stats_count_3(string last_name, int crate_number)
        {
            int[] crate_numbers = new int[3];
            crate_numbers[0] = crate_number;
            crate_numbers[1] = crate_number--;
            crate_numbers[2] = crate_number -= 2;
            int crate_pass = 0;
            int crate_fail = 0;
            for (int i = 0; i < 3; i++)
            {
                crate_pass = crate_pass + (int)this.Audit_ResultsTableAdapter.count_pass_units_by_crate_number_and_tech(crate_numbers[i], last_name);
                crate_fail = crate_fail + (int)this.Audit_ResultsTableAdapter.count_fail_units_by_crate_number_and_tech(crate_numbers[i], last_name);
            }
            int[] crate_stats = new int[2];
            crate_stats[0] = crate_pass;
            crate_stats[1] = crate_fail;

            return crate_stats;
        }
        private int[] crate_stats_count_6(string last_name, int crate_number)
        {
            int[] crate_numbers = new int[6];
            crate_numbers[0] = crate_number;
            crate_numbers[1] = crate_number--;
            crate_numbers[2] = crate_number -= 2;
            crate_numbers[3] = crate_number -= 3;
            crate_numbers[4] = crate_number -= 4;
            crate_numbers[5] = crate_number -= 5;

            int crate_pass = 0;
            int crate_fail = 0;
            for (int i = 0; i < 6; i++)
            {
                crate_pass = crate_pass + (int)this.Audit_ResultsTableAdapter.count_pass_units_by_crate_number_and_tech(crate_numbers[i], last_name);
                crate_fail = crate_fail + (int)this.Audit_ResultsTableAdapter.count_fail_units_by_crate_number_and_tech(crate_numbers[i], last_name);
            }
            int[] crate_stats = new int[2];
            crate_stats[0] = crate_pass;
            crate_stats[1] = crate_fail;

            return crate_stats;
        }
        private int[] crate_stats_count_9(string last_name, int crate_number)
        {
            int[] crate_numbers = new int[9];
            crate_numbers[0] = crate_number;
            crate_numbers[1] = crate_number--;
            crate_numbers[2] = crate_number -= 2;
            crate_numbers[3] = crate_number -= 3;
            crate_numbers[4] = crate_number -= 4;
            crate_numbers[5] = crate_number -= 5;
            crate_numbers[6] = crate_number -= 6;
            crate_numbers[7] = crate_number -= 7;
            crate_numbers[8] = crate_number -= 8;

            int crate_pass = 0;
            int crate_fail = 0;

            for (int i = 0; i < 9; i++)
            {
                crate_pass = crate_pass + (int)this.Audit_ResultsTableAdapter.count_pass_units_by_crate_number_and_tech(crate_numbers[i], last_name);
                crate_fail = crate_fail + (int)this.Audit_ResultsTableAdapter.count_fail_units_by_crate_number_and_tech(crate_numbers[i], last_name);
            }
            int[] crate_stats = new int[2];
            crate_stats[0] = crate_pass;
            crate_stats[1] = crate_fail;

            return crate_stats;
        }

        #endregion

Показанный выше код вычисляет, надеюсь, правильные проценты на основе запросов count() от crate_number / repair_technician. Теперь при изменении имени в поле со списком статистика обновляется корректно.

С одной проблемой почему-то мои 60 и 90 статы остались прежними. Я еще не смотрел дальше, обнаружив ошибку, но я исправлю ее сегодня вечером или завтра.

person nulltron    schedule 27.02.2016