el_tot93 Ответов: 2

Найти способ зарегистрироваться с графом [ трудно ]


Не могли бы вы помочь мне найти решение моей проблемы? Я использую базу данных 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();
                }


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

| 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 месяцев, во втором ID он может прийти только 5 раз.

мой контрольный стол ;

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


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

Что я уже пробовал:

<pre>var goodForVisit = false;
        int visitedCount;
        int offerDayCount;
        var endDate = DateTime.MinValue;
        DateTime startDate = DateTime.MinValue;
        using (SqlConnection con = new SqlConnection("Data Source=SQL5037.site4now.net;Initial Catalog=DB_A448D1_Dragon;User Id=**********;Password=************"))
        {
            con.Open();
            //try
            //{
                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 = 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["month"] == null && offer != null)
                            {
                                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)"))
                            {
                                com2.Parameters.AddWithValue("@STARTDATE", startDate);
                                com2.Parameters.AddWithValue("@ENDDATE", endDate);

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

                                        if (offer != null && 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);
                }

Richard MacCutchan

Просто предположение ...
Если регистрация рассчитана на месяц, то установите maxvisits равным -1 и проверьте дату окончания.
Если регистрация рассчитана на один день, то установите maxvisits равным 5 и игнорируйте конечную дату.

Maciej Los

Звучит как решение проблемы ;)

2 Ответов

Рейтинг:
1

Maciej Los

Не прямое решение, а общий совет...

Я бы использовал хранимая процедура[^] для такого требования. Использование хранимых процедур (SP) дает массу преимуществ...

Как написать такую хранимую процедуру. У вас есть 2 идеи:
1) Маккатчан Ричардса - в комментарии к вопросу
2) Герри Шмитц - в решении №1.

Я бы также улучшил ваш offer стол:

UserID | Startdate | Periodtype | Periodvalue |  enddate  |          offer       |
  1    | 20-3-2019 |   'M'      |     3       | 20-6-2019 |  ( summer ) monthly  |
  2    | 20-3-2019 |   'D'      |     5       | 20-3-2019 |  ( student )  daily  |


Затем Оди из SP, который возвращается true/false может выглядеть так:
DECLARE @limitOfVisits INT = 0;
DECLARE @isValidOffer BIT = 0; --or BOOLEAN

--check how many times user can access to gym
SELECT @limitOfVisits = CASE
    WHEN Periodtype = 'M' AND Stardate>=@startdate AND enddate <=@enddate THEN PeriodValue
    WHEN Periodtype = 'D' AND Stardate>=@startdate THEN PeriodValue
   ELSE 0 END
FROM offertable
WHERE UserID=@UserID;

--check if limit of entries has not been exceeded
SELECT @isValidOffer = COUNT(*)<@limitOfVisits
FROM [checkin]
WHERE UserID = @UserID AND Stardate>=@startdate AND enddate <=@enddate;

RETURN @isValidOffer;


Как видите, это реализация идей других участников.

Для получения более подробной информации, пожалуйста, смотрите:
Процедура создания (Transact-SQL) - SQL Server | Microsoft Docs[^]
Как создать хранимую процедуру SQL Server с параметрами[^]

Удачи вам!


el_tot93

мне нужна помощь с моим кодом на языке Си#

Maciej Los

Ух ты! Неужели? И вы хотите проигнорировать хороший совет?

Рейтинг:
1

Gerry Schmitz

("Контрольная таблица" требует только ID; имя пользователя является избыточным и проблематичным.)

1) Создайте метод под названием "HasValidOffer( int id )"
2) позвонить HasValidOffer( int идентификатор ) с идентификатором "возвращающихся" клиентов (что подразумевает "клиент-мастер" в дополнение к тому, что вы показали). В Хасвалидоффере():

- Проверьте, есть ли у клиента предложение; если нет, верните false (нет действительного предложения).
- Если срок действия предложения истек, верните false.
- Если предложение ежедневное, считайте визиты в течение периода; если визиты < max, возвращайте true, иначе false.

3) Итак, если HasValidOffer() возвращает true, есть предложение (и, следовательно, признаю), еще не действует предложение в силе.


Maciej Los

5ed!
Ваше решение очень похоже на решение Ричарда приведенное в комментарии ;)

el_tot93

помогите мне с моим кодом плз