#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
Изменение собственного автономера — плохая идея. Базы данных очень хороши в присвоении записи уникального номера. Позвольте им это сделать.