найти способ проверить с помощью счета - PullRequest
3 голосов
/ 19 марта 2019

Не могли бы вы помочь мне найти решение моей проблемы?Я использую базу данных SQL Server, это программа гимнастики, и я хочу получить чек на клиенте, когда он приходит в спортзал, у меня есть два способа предложить первый - ежемесячный, а второй - ежедневныйВо-первых, у меня нет проблем с этим, и я использую этот код для регистрации;

using (SqlCommand com = new SqlCommand("select count(*)from enddate where ID=@ID and startdate <=@C1 and endDate >=@C2", con))
                {

                    com.Parameters.AddWithValue("@ID", ID.Text);
                    com.Parameters.AddWithValue("@C1", DateTime.Now);
                    com.Parameters.AddWithValue("@C2", DateTime.Now);

                    int count = (int)com.ExecuteScalar();
                    if (count > 0)
                    {
                        using (SqlCommand com1 = new SqlCommand("INSERT INTO [checkin] (ID,time,username) VALUES (@ID,@time,@username)", con))
                        {
                            com1.Parameters.AddWithValue("@ID", ID.Text);

                            com1.Parameters.AddWithValue("@time", txttime.Text);

                            com1.Parameters.AddWithValue("@username", txtusername.Text);
                            com1.ExecuteNonQuery();
                        }
                        MetroFramework.MetroMessageBox.Show(this, "Check In Sucssesfuly ................... ", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MetroFramework.MetroMessageBox.Show(this, "this ID Expired .....................", "Message", MessageBoxButtons.OK, MessageBoxIcon.Warning);


                    }
                    con.Close();
                }

Я хочу добавить к этому коду второе условие (ежедневное предложение) У меня есть таблица конечных дат, как;

| ID | Startdate | month | day | enddate |          offer       |
| 1  | 20-3-2019 |   3   |null |20-6-2019|( summer ) monthly    |
| 2  | 20-3-2019 | null  | 5   |20-3-2019|( student )  daily    |

в этом случае первый может прийти в любое время в течение 3 месяцев, во втором он может прийти только 5 раз.

моя таблица регистрации;

| ID |   Time   | username |
| 1  | 21-3-2019| test     |
| 1  | 25-3-2019| test     |
| 2  | 27-3-2019| test 2   | 

Я могу посчитать, сколько раз он приходит в спортзал, но я не знаю, как добавить это в мой код

1 Ответ

2 голосов
/ 19 марта 2019

Я думаю, вы, возможно, захотите переосмыслить подход к решению проблемы.Если бы я был вами, я бы:

  1. Получить запись в таблице конечных дат, используя ID.text, я предполагаю, что это ваша таблица предложений клиентов.Таким образом, у вас есть данные STARTDATE, ENDDATE, Offer и другой информации для этого идентификатора клиента.
  2. Если ENDDATE равен нулю и Offer = dayly, ENDDATE = DATE (Datetime.Now)
  3. Подсчитайтезапись из таблицы регистрации с использованием ID.text.Таким образом, у вас есть сумма посещений с помощью следующего утверждения.

SELECT COUNT(*) From checkin WHERE Time >= STARTDATE and (Time <= ENDDATE)

Теперь у вас есть счетчик посещений, вы можете поставить условие, чтобы проверить, не использовал ли клиент предложение «день», равным 5.

Потратив немного времени, я попыталсячтобы завершить всю логику в C #:

var goodForVisit = false;
int visitedCount;
int offerDayCount;
var endDate = DateTime.MinValue;
DateTime startDate = DateTime.MinValue;

using (SqlCommand com = new SqlCommand("select * from [enddate] where ID=@ID", con))
{
    com.Parameters.AddWithValue("@ID", ID.Text);
    using (SqlDataReader reader = com.ExecuteReader())
    {
        if (reader.Read())
        {
            //get information from enddate table
            var offer = “”;
            if(reader[“offer”] != null)
                  offer = reader["offer"].ToString();
            if (reader[“day”] != null)
                  offerDayCount = (int)reader["day"];
            startDate = (DateTime)reader["Startdate"];
            if (reader["enddate"] != null)
                endDate = (DateTime)reader["enddate"];


            if (reader["enddate"] == null && offer == "dayly")
            {
                endDate = DateTime.Now.Date;
            }

            //count the visit from checkin table
            using (var com2 = new SqlCommand("SELECT COUNT(*) as count From checkin WHERE Time >= @STARTDATE and (Time <= @ENDDATE)"))
            {
                com.Parameters.AddWithValue("@STARTDATE", startDate);
                com.Parameters.AddWithValue("@ENDDATE", endDate);

                using (SqlDataReader reader2 = com2.ExecuteReader())
                {
                    if (reader2.Read())
                    {
                        visitedCount = (int)reader2["count"];
                        if (offer == "dayly" && visitedCount < offerDayCount)
                            goodForVisit = true;

                        if (offer == "monthly" && DateTime.Now >= startDate && DateTime.Now <= endDate)
                            goodForVisit = true;
                    }
                }
            }
        }
    }
}

if (goodForVisit)
{
    using (SqlCommand com1 = new SqlCommand("INSERT INTO [checkin] (ID,time,username) VALUES (@ID,@time,@username)", con))
    {
        com1.Parameters.AddWithValue("@ID", ID.Text);

        com1.Parameters.AddWithValue("@time", txttime.Text);

        com1.Parameters.AddWithValue("@username", txtusername.Text);
        com1.ExecuteNonQuery();
    }
    MetroFramework.MetroMessageBox.Show(this, "Check In Sucssesfuly ................... ", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    MetroFramework.MetroMessageBox.Show(this, "this ID Expired .....................", "Message", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...