Как сбросить автономер, если день меняется в VB.Net ?

#vb.net #winforms #ms-access

#vb.net #winforms #ms-access

Вопрос:

Я создал автономер в текстовом поле (TxtNumb.Text), где, если база данных пуста, в ней будет отображаться REG01, а если есть какое-либо содержимое, то в текстовом поле будут отображаться REG02, REG03 и так далее.

В программе есть текстовое поле для отображения даты в формате TxtDate.Text = Date.Now.ToString("dd MMM yyyy") . Вопрос в том, как сбросить автономер, если день меняется (текстовое поле снова становится REG01)?

Ранее я это делал, но это не сработало, если на следующий день, вот код, который я создал:

 Sub AutoNumb()
    Call Connection() `This section is for connecting to the MS.Access DB`
    dbCommand = New OleDbCommand("select Kd_Testing from tblTesting order by Kd_Testing desc", dbConn)
    dataReader = dbCommand.ExecuteReader
    dataReader.Read()
    If Not dataReader.HasRows Then
        TxtNumb.Text = "REG01"
    Else
        TxtNumb.Text = "REG"   Format(Microsoft.VisualBasic.Right(dataReader("Kd_Testing"), 2)   1, "00")
    End If
End Sub
  

Ранее спасибо за ответ.

#Редактировать, добавление

Я хочу создать программу, сохранив в базе данных, как в примере ниже, код, который я создал выше, может автоматически нумеровать только ее, например: REG01, REG02, …, REG05 и так далее.

 |Kd_Testing|Name_Testing        |Date_Testing|
|REG01     |Testing 01, day 20th|20 Aug 2020 |
|REG02     |Testing 02, day 20th|20 Aug 2020 |
|REG01     |Testing 01, day 21th|21 Aug 2020 |
|...       |...                 |...         |
|REG10     |Testing 10, day 21th|21 Aug 2020 |
|REG01     |Testing 01, day 22th|22 Aug 2020 |
  

Затем во время REG99 программа выдаст сообщение об ошибке, поэтому я хочу, чтобы при изменении дня Kd_Testing снова запускался с REG01.

Комментарии:

1. Пожалуйста, опубликуйте схему для tblTesting.

2. Спасибо, что ответили на это. Ниже приведена схематическая таблица tblTesting: Kd_Testing (короткий текст (5)), Name_Testing (короткий текст (20)) и Date_Testing (короткий текст (20)).

3. здесь dataReader.Read() If Not dataReader.HasRows Then сделайте это: If dataReader.Read() Then ..... Else ....

4. Это многопользовательская среда? Использует ли эту базу данных более одного человека?

5. Зачем вам Date_Testing в качестве текстового поля? Это должно быть поле даты!

Ответ №1:

Измените свой SQL, чтобы извлекать только записи, в которых дата сегодняшняя, вот так.

 Sub AutoNumb()
    Call Connection() *This section is for connecting to the MS.Access DB*
    dbCommand = New OleDbCommand("select Kd_Testing from tblTesting where Date_Testing='" amp; Date.Now.ToString() amp; "' order by Kd_Testing desc", dbConn)
    dataReader = dbCommand.ExecuteReader
    dataReader.Read()
    If Not dataReader.HasRows Then
        TxtNumb.Text = "REG01"
    Else
        TxtNumb.Text = "REG"   Format(Microsoft.VisualBasic.Right(dataReader("Kd_Testing"), 2)   1, "00")
    End If
End Sub
  

Возможно, вам потребуется скорректировать дату.Теперь, чтобы получить правильный формат для того, как вы храните даты в Date_Testing .

Ответ №2:

Сохраняйте локальные подключения к методу, в котором они используются. Ключевое слово Call обычно не требуется в vb.net. Соединения должны быть закрыты и разнесены. Команды должны быть удалены. Using...End Using блоки обрабатывают это за вас, даже если возникает ошибка.

Я добавил предложение Where к вашему оператору Select с параметром для сегодняшней даты.

Пожалуйста, включите опцию Строгий. Это процесс, состоящий из двух частей. Сначала для текущего проекта — В обозревателе решений дважды щелкните Мой проект. Выберите Compile слева. В раскрывающемся списке Option Strict выберите ВКЛ. Второй для будущих проектов — Перейдите в меню Сервис -> Параметры -> Проекты и решения -> VB Defaults. В раскрывающемся списке Option Strict выберите ВКЛ. Это избавит вас от ошибок во время выполнения.

Вы увидите, что у вас могут возникнуть проблемы с типами данных. Я показал, как использовать методы .net вместо старых методов vb6. Я также показал, как использовать интерполированную строку, которая доступна в Visual Studio 2015 forward.

 Sub AutoNumb()
    Using cn As New OleDbConnection("Your connection string"),
            dbCommand As New OleDbCommand("select Kd_Testing from tblTesting Where Date_Testing = @Date order by Kd_Testing desc", cn)
        dbCommand.Parameters.Add("@Date", OleDbType.VarChar).Value = Now.ToString("dd MMM yyyy")
        cn.Open()
        Using dataReader As OleDbDataReader = dbCommand.ExecuteReader
            If Not dataReader.HasRows Then
                TxtNumb.Text = "REG01"
            Else
                dataReader.Read()
                Dim firstRecord = dataReader.GetString(0)
                Dim last2Characters = firstRecord.Substring(firstRecord.Length - 2)
                TxtNumb.Text = $"REG{CInt(last2Characters)   1:00}"
            End If
        End Using
    End Using
End Sub
  

Изменение собственного автономера — плохая идея. Базы данных очень хороши в присвоении записи уникального номера. Позвольте им это сделать.