2015-07-21 69 views
0

我在Access 2002中有一个表单,其中的字段由查询提供。它逐行显示记录数据。结尾处有一个复选框,标题为“已确认”。该表格的目标是让用户承认看过该记录。在复选框的“OnClick”事件中,我有自动填充用户名字段和当前日期字段的代码。有四种不同的记录/通知类型。所有这些都适用于这一点。有一种通知类型,类型编号为2.Access 2002 VBA - 尝试向表中输入值时出现追加查询错误

当试图确认这种类型的记录时,必须将用户名和日期输入到当前查询以外的另一个表中。这里是代码:

If NotType = 2 Then 
     strSQL = "INSERT INTO Maintenance (AckBy, AckDate) VALUES('" & AckName & "', '" & AckDate & "');" 
     'DoCmd.SetWarnings False 
     'CurrentDb.Execute strSQL, dbSeeChanges 
     DoCmd.RunSQL strSQL 
     DoCmd.SetWarnings True 
    End If 

我同时具有DoCmd.RunSQL和CurrentDb.Execute的原因是出于测试目的。运行CurrentDb.Execute时,我不会遇到任何错误,但该表不会填充该记录的这两个值。当我使用DoCmd.RunSQL时,我得到一个确认窗口询问我是否要追加该行。当我说是时,有一个错误,说明我不能追加追加查询中的记录。我只是想把这些值放到这张表里。

更新:在MS SQL 2008,Access 2002中创建的链接表创建表的SQL:CREATE TABLE [dbo].[Maintenance]( [MaintenanceID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, [AssetID] [int] NOT NULL, [MaintenanceDate] [datetime] NULL, [MaintenanceDescription] [nvarchar](255) NULL, [MaintenancePerformedBy] [nvarchar](100) NULL, [MaintenanceCost] [float] NULL, [NextMaintenanceDate] [datetime] NULL, [Acknowledged] [bit] NOT NULL, [AckTimeStamp] [timestamp] NULL, [AckBy] [varchar](50) NULL, [AckDate] [datetime2](7) NULL, CONSTRAINT [PK_Maintenance] PRIMARY KEY CLUSTERED ( [MaintenanceID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

回答

2

如果AckDate确实是一个日期,然后在Access中,你应该附上日期##而不是''如下。 ..

strSQL = "INSERT INTO Maintenance (AckBy, AckDate) VALUES('" & AckName & "', #" & AckDate & "#);" 

CREATE TABLE SQL,可以看出你有需要强制值,以允许INSERT ...两列和Acknowledged ...您需要在INSERT声明中包含这些信息,否则您将收到错误!

+0

试过了,但它仍然给我一个错误。说:由于类型转换失败,限制将0字段设置为Null,并且由于键违规,没有向该表添加1条记录,由于违反锁的0个记录以及0条记录(s)由于违反验证规则。 – user3608243

+1

如果你插入这一行,会发生什么......'MsgBox strSQL' ...在这行之前......'DoCmd.RunSQL strSQL' ...你看到你期望的SQL吗? –

+0

它包含我需要的信息。 msgbox显示:INSERT INTO维护(AckBy,AckDate)VALUES('user1','7/21/2015 11:06:28 AM'); – user3608243

相关问题