Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

如何传递记录集的值以实现修改

Chen  发表于:2009-07-30 10:13:16  
复制

见附件,窗体frmMain中有一记录列表,要求选择一条记录并点“修改”按钮后打开frmEdit窗体,将该记录内容显示在frmEdit窗体中,修改完毕后点确定才生效,也就是先将记录集的值传递到frmEdit的文本框,修改后再将文本框中的值传回记录集。

要求用最简洁的代码,比如循环来实现。没有给frmEdit窗体设置数据源,为了防止多人访问时锁定数据库。

点击下载此附件

 

Top
点燃一支烟 发表于:2009-07-30 14:40:27
Chen 发表于:2009-07-30 15:53:38

这个并不是我想要的,其实我之前就是用的类似的方法,但是我实际使用的数据库表里面字段很多,有20个左右,这样逐条传递数据太繁琐了,而且我修改好之后还要传递回去,有简单一点的方法吗,谢谢dengshaobin老师!

我曾试想是不是能将字段名作为变量,将childfrm中的控件名取与字段相同的名称,然后将选定记录的字段值用循环语句传递到对应的控件中,但不知如何用代码实现。



点燃一支烟 发表于:2009-07-30 17:26:54

Private Sub cmdEdit_Click()
If IsNull(Me.childfrm.Form.id) Then MsgBox "请选择存在的记录!": Exit Sub
    DoCmd.OpenForm "frmEdit", acNormal
    Form_frmEdit.Form.id = Me.childfrm.Form.id
    Form_frmEdit.Form.id.Locked = True
    For i = 1 To 2 '这里是2,如果是20个就改为20
    Form_frmEdit.Form.Controls("fields_" & i & "") = Me.childfrm.Form.Controls("fields_" & i & "")
    Next i
End Sub

呵呵,搞了半天你的本意是这个吧,其实提问的时候你就要先声明你要的效果不是逐个文本框控件赋值,不然容易误导



点燃一支烟 发表于:2009-07-30 17:45:05

同理:具体修改的那个窗体的代码,即把修改值再传回去也如法炮制就是:

Private Sub cmdOK_Click()
For i = 1 To 2 '这里是2,如果是20个就改为20
CurrentDb.Execute "update tbl set fields_" & i & " ='" & Me.Controls("fields_" & i & "") & "'" & _
"where tbl.id= " & Me.id & ""
Next i
DoCmd.Close acForm, "frmEdit"
End Sub



点燃一支烟 发表于:2009-07-30 17:50:38
曹光耀 发表于:2009-07-30 19:55:52

点击下载此附件

按你的设想,修改了,请查看示例

一、不用“修改”按钮,直接在子窗体中,用鼠标双击,需要修改的记录,就能传递数据到"frmEdit"中,并打开"frmEdit"窗体

在子窗体中,鼠标双击代码:

Private Sub fields_1_DblClick(Cancel As Integer)
DoCmd.OpenForm "frmEdit"
Forms![frmEdit]![id] = Me.id
'Forms![frmEdit]![id].Locked = True
Forms![frmEdit]![fields_1] = Me.fields_1
Forms![frmEdit]![fields_2] = Me.fields_2
End Sub

Private Sub fields_2_DblClick(Cancel As Integer)
DoCmd.OpenForm "frmEdit"
Forms![frmEdit]![id] = Me.id
'Forms![frmEdit]![id].Locked = True
Forms![frmEdit]![fields_1] = Me.fields_1
Forms![frmEdit]![fields_2] = Me.fields_2
End Sub

Private Sub id_DblClick(Cancel As Integer)
DoCmd.OpenForm "frmEdit"
Forms![frmEdit]![id] = Me.id
'Forms![frmEdit]![id].Locked = True
Forms![frmEdit]![fields_1] = Me.fields_1
Forms![frmEdit]![fields_2] = Me.fields_2

End Sub
二、id字段不能修改,因为它是自动编号的
按"确定",会将修改后的数据保存到期tbl表中,并闭窗体

代码如下:

Private Sub cmdCancel_Click()
    DoCmd.Close
End Sub

Private Sub cmdOK_Click()
On Error GoTo Err_cmdOK_Click
Dim i As Integer
Dim str As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
str = "select * from tbl"
rs.Open str, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

rs.MoveFirst
For i = 0 To rs.RecordCount - 1
If rs!id = Me.id Then
    rs![fields_1] = Me.fields_1
    rs![fields_2] = Me.fields_2
    rs.Update
 End If
rs.MoveNext
Next
DoCmd.Close
rs.Close
Set rs = Nothing
Exit_cmdOK_Click:
    Exit Sub
Err_cmdOK_Click:
    MsgBox Err.Description
    Resume Exit_cmdOK_Click
End Sub



点燃一支烟 发表于:2009-07-30 21:14:52
其实楼主无非是想把控件名称作为变量的意思,对不?

Chen 发表于:2009-07-31 09:12:59

对的,太谢谢了,我要的就是这种效果,很简洁,再次感谢!

同时也感谢caoguangyao,感谢你的帮助!



总记录:8篇  页次:1/1 9 1 :