Access数据库After Insert触发器:实现姓名转换或调用现有模块
解决方案:Access自动同步Agents与AgentInfo记录
一、关于在触发器(数据宏)中使用Split()函数
Access的表级数据宏(即你所说的“触发器”)不支持VBA的Split()函数,只能使用Access内置的表达式函数。不过可以通过内置函数组合实现姓名格式转换:
要将「姓, 名」转为「名 姓」,可以用以下表达式:
Mid([Agent_Name], InStr([Agent_Name], ", ") + 2) & " " & Left([Agent_Name], InStr([Agent_Name], ", ") - 1)
数据宏实现步骤:
- 打开
Agents表的设计视图 - 点击「创建」选项卡 → 「数据宏」 → 选择「After Insert」
- 添加「Create Record」操作,目标表选择
AgentInfo - 依次设置各字段值:
Agent_Access_ID:选择[Agent_Access_ID](当前插入记录的ID)FirstLast:粘贴上面的表达式- 其他字段(如
pattern、lunchduration等)直接填入固定值即可
- 保存数据宏,之后插入新Agent记录时会自动同步到AgentInfo
二、调用已有VBA模块的方法
数据宏无法直接调用Sub过程,但可以通过RunCode操作调用VBA函数,或者在窗体的After Insert事件中执行代码:
方法1:修改模块为可调用的函数
将现有Sub改为接收参数的Function,以便数据宏调用:
Function addAgentInfoForNewRecord(agentID As Long, agentName As String) Dim mydb As DAO.Database, rs2 As DAO.Recordset Set mydb = CurrentDb Set rs2 = mydb.OpenRecordset("SELECT * FROM AgentInfo WHERE Agent_Access_ID = " & agentID) If rs2.EOF Then rs2.AddNew rs2!Agent_Access_ID = agentID rs2!FirstLast = Split(agentName, ", ")(1) & " " & Split(agentName, ", ")(0) rs2!pattern = "5x8" rs2!lunchduration = 30 rs2!starttime = "8:00 AM" rs2!endtime = "4:30 PM" rs2!scheduleinfo = "" rs2!istempshift = False rs2!notes = "" rs2!loa = False rs2!fmla = False rs2!PendingLOA = False rs2!PendingFMLA = False rs2!LOAFMLAStartDate = Null rs2!LOAFMLAEndDate = Null rs2.Update End If rs2.Close Set rs2 = Nothing Set mydb = Nothing End Function
然后在Agents表的After Insert数据宏中添加「RunCode」操作,函数名填写:
addAgentInfoForNewRecord([Agent_Access_ID], [Agent_Name])
方法2:通过窗体事件调用原模块
如果是通过窗体添加Agent记录,直接在窗体的After Insert事件中执行代码:
Private Sub Form_AfterInsert() Dim mydb As DAO.Database, rs2 As DAO.Recordset Set mydb = CurrentDb Set rs2 = mydb.OpenRecordset("SELECT * FROM AgentInfo WHERE Agent_Access_ID = " & Me.Agent_Access_ID) If rs2.EOF Then rs2.AddNew rs2!Agent_Access_ID = Me.Agent_Access_ID rs2!FirstLast = Split(Me.Agent_Name, ", ")(1) & " " & Split(Me.Agent_Name, ", ")(0) ' 其他字段赋值同原代码 rs2.Update End If rs2.Close Set rs2 = Nothing Set mydb = Nothing End Sub
内容的提问来源于stack exchange,提问作者Guy Cothal
相关产品推荐
相关产品推荐

