以数据表形式打开的ACCESS窗体,如何更新当前正在编辑的新记录到数据库、并让当前记录停留在刚编辑过的记录?

时间:2022-11-08 10:31:33
在以数据表形式打开的ACCESS窗体中,增加一条新纪录(暂且称为REC99)后,希望编辑该纪录的某个字段后,能为此纪录在另外一个表中增加一条关联纪录,这就需要REC99已经UPDATE到数据库里了,而不是像现在仍处于编辑未提交的状态。

当然,最简单的方式是人工在数据表的下一行点一下然后再点回刚才那一行,这样刚才那条纪录REC99就更新过了,就可以通过程序在别的表添加关联纪录。但是,每次都要这样多点一下好烦,有没有什么非人工的办法可以做到这一点呢?

所以,俺的问题是:

以数据表形式打开的ACCESS窗体,如何更新当前正在编辑的 新记录到数据库、并让 当前记录停留在刚编辑过的记录?

26 个解决方案

#1


很显然,ACCESS不是这种用法 。

ACCESS的设计目的本身就是不让用户直接面对数据表。 用户的操作应该通过窗体来实现。

#2


你需要想办法记录下来正在操作系统的记录的主键,然后保存在公共变量中, 然后再通过 FIND来定位。

#3


谢谢。那么更新纪录用那条语句呢?因为现在我并没有在程序里显示的打开一个记录集对象。是用窗体.recordset.update么?

#4


围观西西姐

#5


显示-》显式

#6


在文本框的更新后事件中写代码不行?

#7


引用 6 楼 wwwwb 的回复:
在文本框的更新后事件中写代码不行?


不行。因为要为当前纪录在另外一个表中增加一条关联纪录,可是当前记录在在文本框的更新后事件发生时还未提交入库。

#8


可是当前记录在在文本框的更新后事件发生时还未提交入库。
当前记录已经存入相应表的字段中了

#9


引用 8 楼 wwwwb 的回复:
可是当前记录在在文本框的更新后事件发生时还未提交入库。
当前记录已经存入相应表的字段中了


没有。系统提示“由于数据表'表1'需要一个相关记录,不能添加或修改记录。”

#10


上述提示是在 文本框的更新事件中 运行添加相关记录的语句时 出现的。

这可以证明,在文本框的更新事件发生时,当前记录并未提交入库。

#11


如果可以的话,
上传你的MDB到www.access911.net/csdn
只要有问题的表、查询,用WINRAR压缩

#12


引用 2 楼 acmain_chm 的回复:
你需要想办法记录下来正在操作系统的记录的主键,然后保存在公共变量中, 然后再通过 FIND来定位。


这些可以做到。可是我做不到先把REC99提交入库。我在某字段对应的文本框的更新后事件中分别试了如下语句,都不行。...

Me.Requery    
    Me.Refresh
    Me.Recordset.Update

#13


引用 11 楼 wwwwb 的回复:
如果可以的话,
上传你的MDB到www.access911.net/csdn
只要有问题的表、查询,用WINRAR压缩


谢谢,上传了。

http://access911.net/csdn/FileDescription.asp?mdb=2010-11-19&id=41

#14


窗体1对应的VBA模块里有简短的情况说明,劳烦版主查看下,谢谢!

#15


Private Sub 字段1_AfterUpdate()
MsgBox Me.编号
CurrentDb.Execute ("insert into 表2(流水号) values (" & Me.编号 & ")")
MsgBox "ok"
DoCmd.Close acTable, "表2"
DoCmd.OpenTable "表2"
DoCmd.GoToRecord acDataTable, "表2", acLast

#16


楼上的语句执行起来不会报错,但当在表1中输入新纪录,并编辑字段1、然后输入焦点移到字段2后(注意:不换行),上述语句会运行,但表2中的关联纪录并不会真正被加上。

#17


你去掉了MsgBox "ok"吧,估计是没有等到INSERT结束就执行正面的语句,加上试试

#18


OR
MsgBox "ok"->SLEEP 100 数字自行修改
在模块中:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

#19


(1)我没有去掉MsgBox "ok"
(2)加了SLEEP 1000,效果如旧
(3)程序运行完毕之后。手动打开表2,也没发现新添加的关联纪录。

#20


我用的是ACCESS 2003

#21


在2000中测试通过 ,关联字段是 表2的流水号 与 表1的编号,在代码中增加表2的流水号,其它字段
自行修改插入代码。

#22


在2003里还是不中。。

#23


你是在我上传的数据库里做的测试么?也许我设置的关系太强了,要求关联删除,强制一对一的那种。

#24


private void RecUpdate(
string strDbFileLoca,//Access 数据文件的位置
string strUpdt //拼接字符串
)
//20081001 更新数据的通用函数 ///////////////////
{
string strCon = "Provider = Microsoft.Jet.OLEDB.4.0;" +
//"Data Source = sample.mdb " ; 
"Data Source = " + strDbFileLoca;
OleDbConnection myConn = new OleDbConnection(strCon);
myConn.Open();

OleDbCommand myCommand = new OleDbCommand(
strUpdt, myConn);

Debug.WriteLine(strUpdt);
try
{
myCommand.ExecuteNonQuery();
}
catch
{
string strMsgTil = "ERROR",
strMsgTxt = @"存储失败。记录中有非法字符。";
MessageBox.Show(strMsgTxt, strMsgTil,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
myConn.Close();
}

在后台调用这个东东,然后打开数据库,覆盖相关记录以后,在当前面板定位到该记录,这样要得不?

#25


我把关系里的“实施参照完整性”取消掉,就可以了。看来这是症结所在。

'在窗体1中添加一条新纪录,录入各字段内容,录入完备注后,在表2自动添加一条关联纪录'
Private Sub 备注_AfterUpdate()
    '在表2中添加一条相应记录;
    CurrentDb.Execute ("insert into 表2(流水号) values (" & Me.编号 & ")")
            
    '打开表2以便进一步录入相应信息;
    DoCmd.Close acTable, "表2"
    DoCmd.OpenTable "表2"
    DoCmd.GoToRecord acDataTable, "表2", acLast
End Sub


楼上各位的回复都没回到点儿上。结分只为表示感谢。谢谢指点和关注。

#26


我的代码在2000中是可行的

#1


很显然,ACCESS不是这种用法 。

ACCESS的设计目的本身就是不让用户直接面对数据表。 用户的操作应该通过窗体来实现。

#2


你需要想办法记录下来正在操作系统的记录的主键,然后保存在公共变量中, 然后再通过 FIND来定位。

#3


谢谢。那么更新纪录用那条语句呢?因为现在我并没有在程序里显示的打开一个记录集对象。是用窗体.recordset.update么?

#4


围观西西姐

#5


显示-》显式

#6


在文本框的更新后事件中写代码不行?

#7


引用 6 楼 wwwwb 的回复:
在文本框的更新后事件中写代码不行?


不行。因为要为当前纪录在另外一个表中增加一条关联纪录,可是当前记录在在文本框的更新后事件发生时还未提交入库。

#8


可是当前记录在在文本框的更新后事件发生时还未提交入库。
当前记录已经存入相应表的字段中了

#9


引用 8 楼 wwwwb 的回复:
可是当前记录在在文本框的更新后事件发生时还未提交入库。
当前记录已经存入相应表的字段中了


没有。系统提示“由于数据表'表1'需要一个相关记录,不能添加或修改记录。”

#10


上述提示是在 文本框的更新事件中 运行添加相关记录的语句时 出现的。

这可以证明,在文本框的更新事件发生时,当前记录并未提交入库。

#11


如果可以的话,
上传你的MDB到www.access911.net/csdn
只要有问题的表、查询,用WINRAR压缩

#12


引用 2 楼 acmain_chm 的回复:
你需要想办法记录下来正在操作系统的记录的主键,然后保存在公共变量中, 然后再通过 FIND来定位。


这些可以做到。可是我做不到先把REC99提交入库。我在某字段对应的文本框的更新后事件中分别试了如下语句,都不行。...

Me.Requery    
    Me.Refresh
    Me.Recordset.Update

#13


引用 11 楼 wwwwb 的回复:
如果可以的话,
上传你的MDB到www.access911.net/csdn
只要有问题的表、查询,用WINRAR压缩


谢谢,上传了。

http://access911.net/csdn/FileDescription.asp?mdb=2010-11-19&id=41

#14


窗体1对应的VBA模块里有简短的情况说明,劳烦版主查看下,谢谢!

#15


Private Sub 字段1_AfterUpdate()
MsgBox Me.编号
CurrentDb.Execute ("insert into 表2(流水号) values (" & Me.编号 & ")")
MsgBox "ok"
DoCmd.Close acTable, "表2"
DoCmd.OpenTable "表2"
DoCmd.GoToRecord acDataTable, "表2", acLast

#16


楼上的语句执行起来不会报错,但当在表1中输入新纪录,并编辑字段1、然后输入焦点移到字段2后(注意:不换行),上述语句会运行,但表2中的关联纪录并不会真正被加上。

#17


你去掉了MsgBox "ok"吧,估计是没有等到INSERT结束就执行正面的语句,加上试试

#18


OR
MsgBox "ok"->SLEEP 100 数字自行修改
在模块中:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

#19


(1)我没有去掉MsgBox "ok"
(2)加了SLEEP 1000,效果如旧
(3)程序运行完毕之后。手动打开表2,也没发现新添加的关联纪录。

#20


我用的是ACCESS 2003

#21


在2000中测试通过 ,关联字段是 表2的流水号 与 表1的编号,在代码中增加表2的流水号,其它字段
自行修改插入代码。

#22


在2003里还是不中。。

#23


你是在我上传的数据库里做的测试么?也许我设置的关系太强了,要求关联删除,强制一对一的那种。

#24


private void RecUpdate(
string strDbFileLoca,//Access 数据文件的位置
string strUpdt //拼接字符串
)
//20081001 更新数据的通用函数 ///////////////////
{
string strCon = "Provider = Microsoft.Jet.OLEDB.4.0;" +
//"Data Source = sample.mdb " ; 
"Data Source = " + strDbFileLoca;
OleDbConnection myConn = new OleDbConnection(strCon);
myConn.Open();

OleDbCommand myCommand = new OleDbCommand(
strUpdt, myConn);

Debug.WriteLine(strUpdt);
try
{
myCommand.ExecuteNonQuery();
}
catch
{
string strMsgTil = "ERROR",
strMsgTxt = @"存储失败。记录中有非法字符。";
MessageBox.Show(strMsgTxt, strMsgTil,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
myConn.Close();
}

在后台调用这个东东,然后打开数据库,覆盖相关记录以后,在当前面板定位到该记录,这样要得不?

#25


我把关系里的“实施参照完整性”取消掉,就可以了。看来这是症结所在。

'在窗体1中添加一条新纪录,录入各字段内容,录入完备注后,在表2自动添加一条关联纪录'
Private Sub 备注_AfterUpdate()
    '在表2中添加一条相应记录;
    CurrentDb.Execute ("insert into 表2(流水号) values (" & Me.编号 & ")")
            
    '打开表2以便进一步录入相应信息;
    DoCmd.Close acTable, "表2"
    DoCmd.OpenTable "表2"
    DoCmd.GoToRecord acDataTable, "表2", acLast
End Sub


楼上各位的回复都没回到点儿上。结分只为表示感谢。谢谢指点和关注。

#26


我的代码在2000中是可行的