Office中国论坛/Access中国论坛

标题: 子窗体里选中的记录如何复制 [打印本页]

作者: 简    时间: 2011-2-14 18:43
标题: 子窗体里选中的记录如何复制
我的主窗体是一个快速添加数据的窗体,子窗体是已经输入数据的数据表。我的要求是,在添加新记录时,如何把子窗体里选中的记录复制到主窗体的相关控件里,我写的代码如下:

Private Sub Form_DblClick(Cancel As Integer)
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim sql As String
    Set cn = CurrentProject.Connection
        sql = "select * from tblGSdengji"
        rs.Open sql, cn, adOpenKeyset, adLockPessimistic, 1
'        rs.AddNew
        With Forms!frmGSdengji1.Form
        !cboxiaozu = rs("小组")
        !txtpinghao = rs("品号")
        !txtgj = rs("工件")
        !cbogx = rs("工序")
        !cbogr = rs("操作工")
        
        !txtNo.SetFocus
        rs.Update
        rs.Close
        cn.Close
        Set cn = Nothing
   
    End With
End Sub


我知道问题出在sql = "select * from tblGSdengji" 代码,但对于选中的记录,我不知代码上该如何表达,所以特向大家请教,在此先谢了。

作者: todaynew    时间: 2011-2-14 19:03
本帖最后由 todaynew 于 2011-2-14 19:10 编辑

没道理。
rs.AddNew后rs的各个字段值为null,这个时候,向窗体控件赋值的话,等于将控件置空。

你是不是这么个意思:
Private Sub Form_DblClick(Cancel As Integer)
Dim rs As New ADODB.Recordset
Dim sql As String
Dim ctls as controls
set ctls=Forms("frmGSdengji1").controls
sql = "select * from tblGSdengji"
rs.Open sql, CurrentProject.Connection, adOpenKeyset, adLockPessimistic
rs.moveLast
ctls("cboxiaozu").value = rs("小组").value
ctls("txtpinghao").value = rs("品号").value
ctls("txtgj").value= rs("工件").value
ctls("cbogx").value = rs("工序").value
ctls("cbogr").value = rs("操作工").value
rs.close
set rs=nothing

作者: todaynew    时间: 2011-2-14 19:15
本帖最后由 todaynew 于 2011-2-14 19:17 编辑

实际上不用绕这个弯子,直接在子窗体的成为当前事件(或更新后事件)中,将子窗体的控件值赋值给主窗体控件即可:
set ctls=Forms("frmGSdengji1").controls
ctls("cboxiaozu").value = me.小组.value
ctls("txtpinghao").value = me.品号.value
ctls("txtgj").value= me.工件.value
ctls("cbogx").value = me.工序.value
ctls("cbogr").value = me.操作工.value


作者: 简    时间: 2011-2-14 19:57
todaynew 发表于 2011-2-14 19:15
实际上不用绕这个弯子,直接在子窗体的成为当前事件(或更新后事件)中,将子窗体的控件值赋值给主窗体控件即 ...

不是这样的,我把附件传上来了,麻烦你看看。

当子窗体处于新记录状态时,我希望我双击子窗体指定的记录,就可把该记录复制到主窗体中,以此提高输入效率。但我双击来,总是第一条记录,而不是我选中的记录。

另外一个问题,如何让子窗体显示的记录按照管理卡号降序排列呢。是不是必须要做个查询或者用VBA代码来设置子窗体的记录源SQL,从而达到管理卡号降序的要求呢。

[attach]44829[/attach]

作者: koutx    时间: 2011-2-14 21:23
本帖最后由 koutx 于 2011-2-14 21:29 编辑

看你的意思,似乎应是追加查询。
在窗体frmGSdengji设计视图的属性中,在排序依据中填上:     编号 DESC
然后,按下面代码改写你原先的.
Private Sub Form_DblClick(Cancel As Integer) '双击复制记录
DoCmd.RunSQL "INSERT INTO tblGSdengji(小组, 品号, 工件, 工序, 操作工, 工时类别) SELECT '" & Me.小组 & "' AS 小组, '" & _
Me.品号 & "' AS 品号, '" & Me.工件 & "' AS 工件, '" & Me.工序 & "' AS 工序, '" & Me.操作工 & "' AS 操作工, '" & _
Me.工时类别 & "' AS 工时类别"

Form_frmGSdengji.Requery
Form_frmGSdengji.OrderByOn = True
End Sub


作者: wancheng    时间: 2011-2-15 02:27

作者: 简    时间: 2011-2-15 07:44
koutx 发表于 2011-2-14 21:23
看你的意思,似乎应是追加查询。
在窗体frmGSdengji设计视图的属性中,在排序依据中填上:     编号 DESC
然 ...

我之复制子窗体的记录,只是为了提高输入效率,因为同一个管理卡号的记录有可能大同小异。当子窗体里选中的记录复制到主窗体后,然后我再进行相关数据的修改。可是我复制的记录,总是第一条,而不是选中的记录,这一点,我不知代码上如何修改。

用你的代码,我运行了来,也不行。
作者: todaynew    时间: 2011-2-15 09:50
简 发表于 2011-2-14 19:57
不是这样的,我把附件传上来了,麻烦你看看。

当子窗体处于新记录状态时,我希望我双击子窗体指定的记 ...

和复制没什么关系,主子窗体数据源是一个表,只是主子窗体同步的问题。
我以为大体应该如下:
[attach]44831[/attach]
[attach]44830[/attach]

作者: koutx    时间: 2011-2-15 12:05
简 发表于 2011-2-15 07:44
我之复制子窗体的记录,只是为了提高输入效率,因为同一个管理卡号的记录有可能大同小异。当子窗体里选中 ...

没有问题。不知你怎么试的。附上样例,你自己试试吧。
[attach]44834[/attach]

作者: roych    时间: 2011-2-15 14:24
我一般是设置一个非绑定窗体,引用到一个绑定窗体,再加上DoCmd.RunCommand acCmdRecordsGoToLast来处理的。。
作者: 简    时间: 2011-2-15 23:08
todaynew老汉,不是你这个意思。我的意思如图所示,先在主窗体进入添加新记录状态,然后在子窗体里选中要复制的记录,双击,该记录就复制在主窗体中了,接下来修改相关数据即可。不知我这样说,是否表达清楚我的意思没,koutx朋友上传的例子是我需要的效果,但说来也奇怪,我把koutx的代码粘贴在我的数据库里,运行结果就是不对头,折腾一下午都没搞懂原因。

[attach]44837[/attach]



作者: 简    时间: 2011-2-15 23:13
roych 发表于 2011-2-15 14:24
我一般是设置一个非绑定窗体,引用到一个绑定窗体,再加上DoCmd.RunCommand acCmdRecordsGoToLast来处理的。 ...

你也上传个例子,让我们学习学习,好吗?
作者: todaynew    时间: 2011-2-16 08:50
本帖最后由 todaynew 于 2011-2-16 10:01 编辑
简 发表于 2011-2-15 23:08
todaynew老汉,不是你这个意思。我的意思如图所示,先在主窗体进入添加新记录状态,然后在子窗体里选中要复 ...


这个事情很简单嘛,你在主窗体上建一个按钮,然后写如下代码:
Private Sub 复制_Click()
Dim ctls As Controls
Dim ctl As Control
Set ctls = Me.sub0.Form.Controls
For Each ctl In ctls
    If ctl.ControlType <> acLabel Then
        If ctl.Name <> "编号" Then
            Me.Controls(ctl.Name).Value = ctl.Value
        End If
    End If
Next ctl
End Sub

如果想用子窗体某字段的双击事件,则可以:
Dim ctls As Controls
Dim ctl As Control
Set ctls = Me.Controls
For Each ctl In ctls
    If ctl.ControlType <> acLabel Then
        If ctl.Name <> "编号" Then
            Me.Parent.Form.Controls(ctl.Name).Value = ctl.Value
        End If
    End If
Next ctl

如果想对子窗体所有控件的双击事件均加载复制功能,则可以:
Function AllDblClick()
Dim ctls As Controls
Dim ctl As Control
Set ctls = Me.Controls
For Each ctl In ctls
    If ctl.ControlType <> acLabel Then
        If ctl.Name <> "编号" Then
            Me.Parent.Form.Controls(ctl.Name).Value = ctl.Value
        End If
    End If
Next ctl
Me.Parent.Form.Requery
Me.Requery
Me.Parent.SetFocus
DoCmd.RunCommand acCmdRecordsGoToNew
End Function

Private Sub Form_Load()
Dim ctls As Controls
Dim ctl As Control
Set ctls = Me.Controls
For Each ctl In ctls
    If ctl.ControlType <> acLabel Then
        ctl.OnDblClick = "=AllDblClick()"
    End If
Next ctl
End Sub

[attach]44839[/attach]



作者: roych    时间: 2011-2-16 09:40
回复 的帖子

这是截屏图。我们是先录入了基本数据,然后再添加名单。。
[attach]44840[/attach]

作者: 简    时间: 2011-2-16 12:57
todaynew 发表于 2011-2-16 08:50
这个事情很简单嘛,你在主窗体上建一个按钮,然后写如下代码:
Private Sub 复制_Click()
Dim ctls A ...

我运行你的附件无法双击复制记录呢。

另外,登记日期不能复制,登记日期的默认值为date(),并且锁定,因为在输入工时时不准人为修改登记日期,并且这个登记日期是统计的基准。

我运行追加查询后,然后打开表,结果复制在主窗体里的记录并没有保存在表中,表中显示的是空白记录。这是怎么回事呢。
作者: todaynew    时间: 2011-2-16 14:12
简 发表于 2011-2-16 12:57
我运行你的附件无法双击复制记录呢。

另外,登记日期不能复制,登记日期的默认值为date(),并且锁定, ...

加一句排除某些字段即可:
Function AllDblClick()
Dim ctls As Controls
Dim ctl As Control
Set ctls = Me.Controls
For Each ctl In ctls
    If ctl.ControlType <> acLabel Then
        If ctl.Name <> "编号" Then
            If ctl.Name <> "登记日期" Then
                Me.Parent.Form.Controls(ctl.Name).Value = ctl.Value
            End If
        End If
    End If
Next ctl
Me.Parent.Form.Requery
Me.Requery
Me.Parent.SetFocus
DoCmd.RunCommand acCmdRecordsGoToNew
End Function

我运行的时候可以,不知道你为什么不行,呵呵:
[attach]44847[/attach]


作者: 简    时间: 2011-2-16 17:45
本帖最后由 简 于 2011-2-16 17:58 编辑
todaynew 发表于 2011-2-16 14:12
加一句排除某些字段即可:
Function AllDblClick()
Dim ctls As Controls


我要双击后主窗体里显示刚才复制的记录,这样才便于修改,而你这是双击复制后就又进入添加新记录的状态。

我把DoCmd.RunCommand acCmdRecordsGoToNew      改为     DoCmd.RunCommand acCmdRecordsGoToLast

好像正确了。

我晓得为什么我运行你的例子失败的原因了,因为我是习惯了双击记录选择器来复制,而你是双击子窗体的任一控件来复制。为了更好的运行出你例子的效果,我把记录选择器取消了。

作者: todaynew    时间: 2011-2-16 18:55
DoCmd.RunCommand acCmdRecordsGoToNew      比     DoCmd.RunCommand acCmdRecordsGoToLast  安全。
除非将主窗体改为非绑定窗体。


作者: 简    时间: 2011-2-16 20:00
todaynew 发表于 2011-2-16 18:55
DoCmd.RunCommand acCmdRecordsGoToNew      比     DoCmd.RunCommand acCmdRecordsGoToLast  安全。
除非 ...

我复制记录并不等于我采用这个记录的全部内空,有些内容我需要修改。为了安全,就像你所说的,我把主窗体采用非绑定形式,但出现了一个错误提示,如图所示。这是怎么回事呢。

[attach]44852[/attach]

作者: todaynew    时间: 2011-2-16 20:30
本帖最后由 todaynew 于 2011-2-16 21:11 编辑
简 发表于 2011-2-16 20:00
我复制记录并不等于我采用这个记录的全部内空,有些内容我需要修改。为了安全,就像你所说的,我把主窗体 ...


把主子窗体名称改成一致即可。

[attach]44856[/attach]

[attach]44857[/attach]



作者: 简    时间: 2011-2-16 21:11
todaynew 发表于 2011-2-16 20:30
把主子窗体名称改成一致即可。

能够复制了,没有弹出那个错误提示了,为什么要这样处理呢,为什么要求主子窗体的控件名一样呢。
作者: todaynew    时间: 2011-2-16 21:14
简 发表于 2011-2-16 21:11
能够复制了,没有弹出那个错误提示了,为什么要这样处理呢,为什么要求主子窗体的控件名一样呢。

看红色部分就知道什么意思了。
Me.Parent.Form.Controls(ctl.Name).Value = ctl.Value
另:20楼给你了一个处理这个问题的完整例子。
作者: 简    时间: 2011-2-16 21:22
喔,原来如此,哎,谢谢你了,总算解决了一个问题了,而且你20楼的例子很实用,谢谢,谢谢,不胜感激~~~~
作者: 简    时间: 2011-2-18 17:37
我想再问问,如果把子窗体换成列表框,列表框里选中的记录又如何双击复制呢?
作者: roych    时间: 2011-2-18 18:37
本帖最后由 roych 于 2011-2-18 19:01 编辑

关于列表框的问题,小鱼游游和我都写了相关实例,自己找找看,别太懒了。
实例是修改记录的,但只要修改好SQL语句,同样可以作为追加记录来用。
学习Access,重要的是思考过程,要学会举一反三,否则收效甚微。

作者: 简    时间: 2011-2-18 19:11
roych 发表于 2011-2-18 18:37
关于列表框的问题,小鱼游游和我都写了相关实例,自己找找看,别太懒了。
实例是修改记录的,但只要修改好 ...

关键是论坛上无法搜索指定用户的帖子来,比如我要搜索你的帖子,你的用户名roych ,我只能找到你的空间,却找不出你所发表的所有帖子来。
作者: roych    时间: 2011-2-18 19:15
http://www.office-cn.net/thread-96036-1-1.html
作者: todaynew    时间: 2011-2-18 19:44
本帖最后由 todaynew 于 2011-2-18 19:45 编辑
简 发表于 2011-2-18 17:37
我想再问问,如果把子窗体换成列表框,列表框里选中的记录又如何双击复制呢?


[attach]44862[/attach]


[attach]44863[/attach]

Private Sub 表_AfterUpdate()
Dim i As Long
For i = 0 To Me.表.ColumnCount - 1
    Me.Controls(Me.表.Column(i, 0)).Value = Me.表.Column(i)
Next
End Sub

Private Sub 确定_Click()
Call 编辑(Me.选项.Value)
End Sub

Sub 编辑(num As Long)
Dim rs As New ADODB.Recordset
Dim ssql As String
Dim i As Long
ssql = "select * from tblGSdengji where 编号=" & Nz(Me.编号.Value, 0)
rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If num = 1 Then
    rs.AddNew
End If
For i = 1 To rs.Fields.Count - 1
    rs(i).Value = Me.Controls(rs(i).Name).Value
Next
rs.Update
rs.Close
Set rs = Nothing
Me.表.Requery
End Sub


作者: todaynew    时间: 2011-2-18 19:48
注意:列表框设置时需要选列标题为是,这样才能用Me.表.Column(i, 0)来读取列名称。
作者: roych    时间: 2011-2-19 11:40
回复 todaynew 的帖子

批评老汉一句,这样可不行,不能过于宠着版友,要逐步培养他们独立思考问题的能力。
坛子上有很多东西只需要稍作修改就可以达到目的的实例,可以让他们下载后调试,不对的地方再提出,这样才有助于他们学好Access。
作者: todaynew    时间: 2011-2-19 12:21

作者: tzk    时间: 2011-2-19 16:18
这个例子用到的几个方法,已经收藏了。
作者: 简    时间: 2011-2-19 20:00
roych 发表于 2011-2-19 11:40
回复 todaynew 的帖子

批评老汉一句,这样可不行,不能过于宠着版友,要逐步培养他们独立思考问题的能力。 ...

你口直心快,这性格我喜欢。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3