我有一个带有一个combox框和一个绑定到表的文本框的表单,还有一个显示内容的表和一个用于保存reocrd的按钮。
我想知道如何在单击保存按钮时创建新记录而不是覆盖当前的记录?
我目前正在使用一个具有RunCommand SaveRecord和Refresh的宏来更新表。
我是否需要使用vba代码来实现我的目标?
答案 0 :(得分:7)
我认为最简单的答案是在VBA中构建一个快速宏 - 将新记录添加到表中的代码非常简单:
Private Sub cmdAddRecord_Click()
Dim db As Database
Dim rs As DAO.Recordset
Set dbVideoCollection = CurrentDb
Set rs = db.OpenRecordset("TableName") //<- Or a specific query in the parentheses.
rs.AddNew
rs("Column1").Value = "Blah"
rs("Column2").Value = "Blah"
rs("Column3").Value = "Blah"
rs("Column4").Value = "Blah"
rs("Column5").Value = "Blah"
rs.Update
End Sub
您可以通过添加变量并读取数据来从表单上的文本框(或您正在使用的任何输入)中提取数据,例如:
strPnum = Me.txtPNum.Value
这是我用于类似程序的代码 - 它更复杂,但它根据数据库中的条件和表单上的输入添加行。
Private Sub Add()
''Add the Item to the Database
Dim Checker As Integer ''Used to check if all of the essential information is present on the form
Dim strPNum As String ''Hold's the Parent Item Value
Dim strSIM As String ''Hold's the SIM number Value
Dim rs As DAO.Recordset ''Used for the Routing table record set
Dim lrs As DAO.Recordset ''Used for the Labor Code table record set
Dim db As Database ''Database variable
Dim i As Integer
Dim OpDesc, LabCode, DBLRCodes(50), DBLRClong, DBLRDesc(50), a As String
Dim RoutSeq, LabHour, LabUnits, LRChecker, b, c As Integer
Set db = CurrentDb
Set rs = db.OpenRecordset("tblTestForRoutingInput")
Set lrs = db.OpenRecordset("tblLaborRateCodes")
Checker = 0
i = 1
''Debug.Print "For Cycling through manually."
''Verify that the essential fields have values.
If IsNull(Me.txtPNum.Value) Then
Checker = MsgBox("Please enter a value for the Parent Item Number", vbOKOnly, "Blank Parent Item Number")
ElseIf IsNull(Me.txtSIM.Value) Then
Checker = MsgBox("Please enter a value for the SIM number", vbOKOnly, "Blank SIM Number")
ElseIf Len(Me.txtSIM.Value) <> 11 Then
Checker = MsgBox("The SIM # must be 11 characters.", vbOKOnly, "Invalid SIM Number")
ElseIf IsNull(Me.txtStep1.Value) Then
Checker = MsgBox("Please enter at least ( 1 ) routing step.", vbOKOnly, "No Routing Steps")
End If
''If none of the essential fields are empty, proceed with the add.
If Checker = 0 Then
''Pull the Parent Item and SIM number values
strPNum = Me.txtPNum.Value
strSIM = Me.txtSIM.Value
''Search the table to see if the PNum or SIM already exists. If it does, end the function.
Do While Not rs.EOF
If rs("Parent_Item") = strPNum And Checker = 0 Then
Checker = MsgBox("Parent Item#: " + strPNum + " already exists in the database. If you wish to edit the item, please use the [Edit] screen.", vbOKOnly, "Item Already Exists")
i = 20
ElseIf rs("SIM") = strSIM And Checker = 0 Then
Checker = MsgBox("SIM#: " + strSIM + " already exists in the database. If you wish to edit the item, please use the [Edit] screen.", vbOKOnly, "Item Already Exists")
i = 20
End If
rs.MoveNext
Loop
''Determine the step to read in.
Do Until i = 20
If i = 1 Then
OpDesc = Me.txtStep1.Value
RoutSeq = Me.txtSeq1.Value
LabCode = Me.txtCode1.Value
LabHour = Me.txtHours1.Value
LabUnits = Me.txtUnits1.Value
ElseIf i = 2 Then ''I have a long string of If statement in the original code that are just used to get the data from the different text boxes but would take up another few hundred lines here.
End If
''If the current step has no data, end the function
If IsNull(OpDesc) Then
Checker = MsgBox("Item: " + strPNum + " has been added with (" + Str(i - 1) + ") Routing Steps", vbOKOnly, "Item Added")
i = 20
Else
''Define the variables to use for the Labor Rate Checker
LRChecker = 0
DBLClong = ""
b = 0
c = 1
''Check the entered Labor Rate Code against what is in the database, and pull the data into parallel arrays
Do While Not lrs.EOF
b = b + 1
If LabCode = lrs("Labor_Rate_Code") Then
LRChecker = 1
End If
DBLRCodes(b) = lrs("Labor_Rate_Code")
DBLRDesc(b) = lrs("Labor_Rate_Description")
lrs.MoveNext
Loop ''While Loop
''Compile the LR array data into 1 string for the Message Box
Do Until c > b
If DBLClong = "" Then
DBLClong = DBLRCodes(c) + " - " + DBLRDesc(c)
Else
DBLClong = DBLClong & vbNewLine & DBLRCodes(c) + " - " + DBLRDesc(c)
End If
c = c + 1
Loop ''Until Loop
lrs.MoveFirst
''If the Labor Rate code entered does not match one in the system, prompt the user to input a new code.
If LRChecker = 0 Then
LabCode = InputBox("The Labor Rate Code entered for Routing Step: " + Str(i) + " does not match any in the database. Please enter one of the following codes: " & vbNewLine & vbNewLine & DBLClong + ".", "Invalid Labor Rate Code", "Enter Code Here")
End If
''Add the new record into the DB
rs.AddNew
rs("Parent_Item") = strPNum
rs("Operation_Description") = OpDesc
rs("Routing_Sequence") = RoutSeq
rs("Labor_Code") = LabCode
rs("Labor_Hours") = LabHour
rs("Labor_Units") = LabUnits
rs("Quantity") = 10000
rs("SIM") = strSIM
rs("Effective_Date") = Date
rs.Update
i = i + 1
End If
Loop
''Close the recordsets
rs.Close
lrs.Close
End If
End Sub