Как запустить один и тот же запрос в каждой строке таблицы?(MVC) - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время у меня есть таблица с именем «События», в которой есть столбцы «EquipApprovedDate», «EquipCalDueDate» и «ThemeColor». Я хочу обновить ThemeColor на основе оставшихся дней до EquipCalDueDate .

Зеленый = Хорошо

Оранжевый = Считается, хорошо

Красный = Критический

Общее количество дней будет отличаться для каждого оборудования, зарегистрированного в календаре. Он будет рассчитываться с использованием этой формулы ( totaldays = EquipCalDueDate - EquipApprovedDate). Остальные дни будут рассчитываться по этой формуле ( оставшиеся дни = EquipCalDueDate - DateTime.Now ).

Если оставшихся дней превышает 2/3 от всего дня , то оно будет помечено как «зеленый».

Если оставшихся дней меньше, чем 2/3 из totaldays , но более 1/3 от общего числа дней он будет помечен как ' оранжевый».

Если оставшихся дней меньше 1/3 от всего дня , то оно будет помечено как «красный».

Я хочу применить весь этот процесс к таблице каждый раз, когда страница загружается, особенно для каждой строки, найденной в базе данных. В основном, чтобы собрать данные и вернуть их для каждой строки. На данный момент он работает только частично там, где столбец ThemeColor обновляется до «зеленого» для каждой отдельной строки, несмотря ни на что. Какой правильный SQL-запрос?

Я приложил свою текущую работу вместе для вашего просмотра.

Image of 'Events' table data

Image of 'Events' table design

    con.Open();
        string yyy = "SELECT * FROM [Events]";
        using (SqlCommand cmd = new SqlCommand(yyy, con))
        {
            SqlDataReader reader = cmd.ExecuteReader();
            if (reader.Read())
            {
                String startdate = reader["EquipApprovedDate"].ToString();
                DateTime Sdate = DateTime.Parse(startdate);
                String enddate = reader["EquipCalDueDate"].ToString();
                DateTime Edate = DateTime.Parse(enddate);
                String themecolor = reader["ThemeColor"].ToString();

                double totaldays = (Edate - Sdate).TotalDays;
                double remainingDays = (Edate - DateTime.Now).TotalDays;

                if (remainingDays > (totaldays * (2 / 3)))
                {
                    string sqlCoC = "UPDATE Events SET ThemeColor = 'green'";

                    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MVCConnectionString"].ConnectionString))
                    {
                        SqlCommand coccmd = new SqlCommand(sqlCoC, con);
                        con.Open();
                        coccmd.ExecuteNonQuery();
                        con.Close();
                    }

                    //green = means good
                }
                else if ((remainingDays < (totaldays * (2 / 3))) && (remainingDays > (totaldays * (1 / 3))))
                {

                    string sqlCoC = "UPDATE Events SET ThemeColor = 'orange'";

                    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MVCConnectionString"].ConnectionString))
                    {
                        SqlCommand coccmd = new SqlCommand(sqlCoC, con);
                        con.Open();
                        coccmd.ExecuteNonQuery();
                        con.Close();
                    }

                    //orange = considered okay
                }
                else if (remainingDays < (totaldays * (1 / 3)))
                {

                    string sqlCoC = "UPDATE Events SET ThemeColor = 'red'";

                    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MVCConnectionString"].ConnectionString))
                    {
                        SqlCommand coccmd = new SqlCommand(sqlCoC, con);
                        con.Open();
                        coccmd.ExecuteNonQuery();
                        con.Close();
                    }

                    //red = critical
                }
                else { }
            }
            reader.Close();
            con.Close();
        }

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете фактически выполнить обновление всей таблицы одним запросом:

declare @remaining int, @total int; update events 
set @remaining=datediff(day, getdate(), equipcalduedate),
@total=datediff(day, equipapproveddate, equipcalduedate),
themecolor=(case
   when @remaining < @total/3 then 'red'
   when @remaining < 2*@total/3 then 'orange'
   else 'green'
end)

Для предоставленных вами образцов данных (плюс еще одно значение, которое я добавил для демонстрации «оранжевого» цвета темы, выходные данные извыберите:

select EventId, EquipApprovedDate, EquipCalDueDate, ThemeColor, datediff(day, getdate(), equipcalduedate) as remaining,
datediff(day, equipapproveddate, equipcalduedate) as total
from events

выглядит так, я думаю, что вы хотите:

EventId  EquipApprovedDate  EquipCalDueDate  ThemeColor  remaining  total
1        2018-04-17         2018-05-31       green       36         44 
2        2018-04-11         2018-04-27       red         2          16 
3        2020-04-20         2020-05-28       green       764        38 
4        2018-04-11         2018-05-15       orange      20         34 
8        2019-04-20         2019-05-31       green       401        41 
...