【问题标题】:How to reset autonumber if the day changes in VB.Net?如果 VB.Net 中的日期发生变化,如何重置自动编号?
【发布时间】:2020-12-08 00:32:10
【问题描述】:

我在文本框 (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。

【问题讨论】:

  • 请发布 tblTesting 的架构。
  • 感谢您的回答。下面是tblTesting的示意图:Kd_Testing(短文本(5))、Name_Testing(短文本(20))、Date_Testing(短文本(20))。
  • 这里dataReader.Read() If Not dataReader.HasRows Then这样做:If dataReader.Read() Then ..... Else ....
  • 这是多用户环境吗?是否有多个人使用此数据库?
  • 为什么要将 Date_Testing 作为文本字段?它应该是一个日期字段!

标签: vb.net winforms ms-access


【解决方案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='" & Date.Now.ToString() & "' 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.Now 以获得正确的格式,以便您在 Date_Testing 中存储日期。

【讨论】:

    【解决方案2】:

    将您的连接保持在使用它们的方法的本地。 在 vb.net 中通常不需要 Call 关键字。 连接需要关闭和处理。需要处理命令。 Using...End Using blocks 会为你处理这个,即使有错误。

    我在您的 Select 语句中添加了一个 Where 子句,其中包含今天日期的参数。

    请开启 Option Strict。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。

    您会发现数据类型可能存在问题。我展示了如何使用 .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
    

    滚动您自己的汽车号码是个坏主意。数据库非常擅长为记录分配唯一编号。让他们去做吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2013-02-12
      • 2018-09-03
      • 2017-04-17
      相关资源
      最近更新 更多