public void LoadResults() { stackPanel.Children.Clear(); List <ResultPreview> resultsList = new List <ResultPreview>(); SqlConnection connection = new SqlConnection("Data Source=DESKTOP-JOHEOHB\\SQLEXPRESS;Initial Catalog=dpl;User ID=sa;Password=12345"); connection.Open(); string command = "select Результаты.Идентификатор as Идентификатор, Тесты.Название as Тест, Шкалы.Название as Шкала, Пользователи.Имя as Имя, Пользователи.Фамилия as Фамилия, Пользователи.Логин as Логин, Значение, Максимум " + "from Результаты " + "join Пользователи on Пользователи.Идентификатор = Результаты.Идентификатор_пользователя " + "join Тесты on Тесты.Идентификатор = Результаты.Идентификатор_теста " + "join Шкалы on Тесты.Идентификатор_шкалы = Шкалы.Идентификатор"; if (MainWindow.Role == "user") { command += " where Логин = '" + MainWindow.Login + "'"; } SqlDataReader reader = new SqlCommand(command, connection).ExecuteReader(); while (reader.Read()) { ResultPreview preview = new ResultPreview(reader.GetInt32(reader.GetOrdinal("Идентификатор")), reader.GetString(reader.GetOrdinal("Тест")), reader.GetString(reader.GetOrdinal("Имя")), reader.GetString(reader.GetOrdinal("Фамилия")), reader.GetString(reader.GetOrdinal("Логин")), reader.GetInt32(reader.GetOrdinal("Значение")), reader.GetInt32(reader.GetOrdinal("Максимум")), reader.GetString(reader.GetOrdinal("Шкала"))); resultsList.Add(preview); } reader.Close(); if (resultsList.Count < 1) { Label label = new Label(); label.FontSize = 24; label.Content = "Пока нет результатов для указанного пользователя"; label.HorizontalAlignment = HorizontalAlignment.Center; stackPanel.Children.Add(label); return; } foreach (ResultPreview result in resultsList) { Border border = new Border(); border.BorderThickness = new Thickness(1); border.BorderBrush = Brushes.Black; border.Margin = new Thickness(10); TextBlock resultText = new TextBlock(); resultText.Text = result.Test + "\n" + result.Surname + " " + result.Name + " (" + result.Login + ")\nБаллы: " + result.Value + " из " + result.Maximum + " (" + result.Scale + ")\n" + result.Test; resultText.Height = 65; resultText.Margin = new Thickness(10); border.Child = resultText; stackPanel.Children.Add(border); } }
public void LoadResults(string login) { stackPanel.Children.Clear(); List <ResultPreview> resultsList = new List <ResultPreview>(); SqlConnection connection = new SqlConnection("Data Source=DESKTOP-JOHEOHB\\SQLEXPRESS;Initial Catalog=dpl;User ID=sa;Password=12345"); connection.Open(); string command = "select Результаты.Идентификатор as Идентификатор, Тесты.Название as Тест, Шкалы.Название as Шкала, Пользователи.Имя as Имя, Пользователи.Фамилия as Фамилия, Пользователи.Логин as Логин, Значение, Максимум " + "from Результаты " + "join Пользователи on Пользователи.Идентификатор = Результаты.Идентификатор_пользователя " + "join Тесты on Тесты.Идентификатор = Результаты.Идентификатор_теста " + "join Шкалы on Тесты.Идентификатор_шкалы = Шкалы.Идентификатор " + "where Логин = '" + login + "'"; SqlDataReader reader = new SqlCommand(command, connection).ExecuteReader(); while (reader.Read()) { ResultPreview preview = new ResultPreview(reader.GetInt32(reader.GetOrdinal("Идентификатор")), reader.GetString(reader.GetOrdinal("Тест")), reader.GetString(reader.GetOrdinal("Имя")), reader.GetString(reader.GetOrdinal("Фамилия")), reader.GetString(reader.GetOrdinal("Логин")), reader.GetInt32(reader.GetOrdinal("Значение")), reader.GetInt32(reader.GetOrdinal("Максимум")), reader.GetString(reader.GetOrdinal("Шкала"))); resultsList.Add(preview); } reader.Close(); if (resultsList.Count < 1) { Label label = new Label(); label.FontSize = 24; label.Content = "Пока нет результатов для указанного пользователя"; stackPanel.Children.Add(label); return; } Dictionary <string, List <int> > percentages = new Dictionary <string, List <int> >(); foreach (ResultPreview result in resultsList) { if (!percentages.ContainsKey(result.Scale)) { percentages.Add(result.Scale, new List <int>()); } percentages[result.Scale].Add(result.Value * 100 / result.Maximum); } Dictionary <string, int> percentage = new Dictionary <string, int>(); foreach (string result in percentages.Keys) { int scaleSum = 0; foreach (int res in percentages[result]) { scaleSum += res; } int scaleResult = scaleSum / percentages[result].Count; percentage.Add(result, scaleSum); } Dictionary <string, int> scaleSummary = new Dictionary <string, int>(); foreach (string key in percentages.Keys) { int summary = 0; foreach (int value in percentages[key]) { summary += value; } summary /= percentages[key].Count; scaleSummary.Add(key, summary); } command = "select Отделы.Название as Отдел, Должности.Название as Должность, Шкалы.Название as Шкала, Требования_шкал.Требования as Требования from Должности " + "join Требования_шкал on Требования_шкал.Идентификатор_должности = Должности.Идентификатор " + "join Шкалы on Требования_шкал.Идентификатор_шкалы = Шкалы.Идентификатор " + "join Отделы on Должности.Идентификатор_отдела = Отделы.Идентификатор"; //выбрать все должности с отделами, собрать в словарь необходимые для них шкалы. показать принадлежность как среднее арифметическое перцентажа всех СУЩЕСТВУЮЩИХ результатов шкал, указать полноту в виде процента шкал, которые существуют reader = new SqlCommand(command, connection).ExecuteReader(); Dictionary <string, List <ScaleContext> > prescriptionContext = new Dictionary <string, List <ScaleContext> >(); while (reader.Read()) { string prescriptionName = reader.GetString(reader.GetOrdinal("Отдел")) + "\n" + reader.GetString(reader.GetOrdinal("Должность")); if (!prescriptionContext.ContainsKey(prescriptionName)) { prescriptionContext.Add(prescriptionName, new List <ScaleContext>()); } prescriptionContext[prescriptionName].Add(new ScaleContext(reader.GetString(reader.GetOrdinal("Шкала")), reader.GetInt32(reader.GetOrdinal("Требования")))); } reader.Close(); connection.Close(); Dictionary <string, int[]> prescriptionResults = new Dictionary <string, int[]>(); foreach (string key in prescriptionContext.Keys) { //percentage - результаты тестов, ключ - шкала, значение - список процентажей тестов с этой шкалой int scalesCount = prescriptionContext[key].Count; int scalesGiven = 0; prescriptionResults.Add(key, new int[2]); //0 индекс массива - результат, 1 индекс - полнота foreach (ScaleContext scaleCon in prescriptionContext[key]) //scales - список шкал (название+требование) { string scale = scaleCon.Name; if (percentage.ContainsKey(scale)) { scalesGiven++; prescriptionResults[key][0] += percentage[scale] * 100 / scaleCon.Percentage;//доля набранного результата от необходимого } } prescriptionResults[key][0] /= scalesGiven; prescriptionResults[key][1] = scalesGiven * 100 / scalesCount; } foreach (string key in prescriptionResults.Keys) { int[] result = prescriptionResults[key]; Border border = new Border(); border.BorderThickness = new Thickness(1); border.BorderBrush = Brushes.Black; border.Margin = new Thickness(10); TextBlock resultText = new TextBlock(); resultText.Text = key + "\nУровень знаний: " + result[0] + "%\nПолнота информации: " + result[1] + "%"; resultText.Height = 65; resultText.Margin = new Thickness(10); border.Child = resultText; stackPanel.Children.Add(border); } }