设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2947|回复: 9
打印 上一主题 下一主题

[Access本身] 一对多数据的修改方法讨论

[复制链接]
跳转到指定楼层
1#
发表于 2013-1-26 08:00:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对于一对多数据的修改,不知道大家是怎么做的?
比如,订单号为001,对应有01,02,03三个订单明细(产品名称)。
我的思路是,先删除订单号为001的订单,然后在把窗体重新修改好的订单号依然为001的订单AddNew进表。
因为修改的结果有三种:
之前有3个订单明细,修改后可能小于3个,等于3个,或大于3个。
用Update实在不知道怎么用。
不知道,你们是怎么处理这个问题的。
简单地说,就好像windows保存修改过的文件一样,覆盖过程,也应该是细分为:删除旧的-在保存新的,这样两个动作吧!
谁有比较好的思路啊?求教。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2013-1-26 09:56:01 | 只看该作者
正常 有一个 自动ID(订单ID), 订单与订单明细 用订单ID关联, 订单号如何改变,不影响 订单明细
3#
发表于 2013-1-26 10:58:20 | 只看该作者
你想修改什么?

点击这里给我发消息

4#
发表于 2013-1-26 12:06:51 | 只看该作者
数据库关系中对一对多关系设置为级联更新和级联删除。
5#
 楼主| 发表于 2013-1-26 12:08:44 | 只看该作者
就是整张订单,除了订单号不会改,其他的都可能会改。
比如,001订单,对应A客户,原来只有3个产品,01,02,03
已经在数据库保存了,未发货出库。
现在客户要求在原订单的基础上追加一个品种,或删除一个品种,或修改一个品种。
相应的就要修改订单数据了。

在对应的窗体里(主子窗体,一对多)
1、取出原订单数据,放到主子窗体里。
2、在窗体上,修改原数据
3、保存新数据(关键就是这个保存过程)

另外:主子窗体,我采用的是小宝版主的断开连接模式。
但是所有的控件都不绑定!!!!也就是一定要点击保存按钮,数据才会更新到数据库里。
不知道我这么描述,是否清楚。
没人有这个情况嘛?
6#
 楼主| 发表于 2013-1-26 12:18:54 | 只看该作者
zhuyiwen 发表于 2013-1-26 12:06
数据库关系中对一对多关系设置为级联更新和级联删除。

窗体是非绑定的。
在窗体上修改数据后,一定要点保存,才会更新数据。
7#
发表于 2013-1-26 12:49:04 | 只看该作者
其实这种情况很多,比如:
供货商甲:提供产品1、2、3、4、5、6
供货商乙:提供产品3、7、8、9
那么,先前从甲订的货物因各种原因需要退单,从乙处订货。那么,订单就要删除甲的,在乙的订单上要增加。
我也想要制作一个软件,正在学习。
我想把供货商信息(编号、名称、电话、经营范围、地址等用一个库(表);然后准备把产品订货的明细(有千八种之多)用一个库,还要建立一个对应的计算窗体以及其他相适应的产品入库窗体。不知如何搞。很是郁闷!)
8#
 楼主| 发表于 2013-1-26 12:49:18 | 只看该作者
===============上附件


Option Compare Database


Private Sub Form_Load()
   '锁子窗体
   Me.订单明细子窗体.Locked = True
   
End Sub

Private Sub 保存_Click()
'这个怎么做?
'关键是子记录数可能变动,可能大于原记录数,也可能小于原记录数。


End Sub

Private Sub 查询_Click()
   If IsNull(Me.订单号) Then
      MsgBox "请输入查询订单号", vbOKOnly
      Exit Sub
   End If
   
   Dim sql0 As String, sql1 As String
   
   Dim rs0 As New ADODB.Recordset
   Dim rs1 As New ADODB.Recordset
   sql0 = "select * from 订单 where 订单号='" & Me.订单号 & "'"
   sql1 = "select * from 订单明细 where 订单号='" & Me.订单号 & "'"
   With rs0
      .CursorLocation = adUseClient
      .Open sql0, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
      .ActiveConnection = Nothing
   End With
   Me.客户名称 = rs0.Fields("客户名称")
   
   With rs1
      .CursorLocation = adUseClient
      .Open sql1, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
      .ActiveConnection = Nothing
   End With
   Set Me.订单明细子窗体.Form.Recordset = rs1
   
   Dim ctl As Control
   For Each ctl In Me.订单明细子窗体.Controls
      If ctl.ControlType = acTextBox Then
         ctl.ControlSource = ctl.Name
      End If
   Next
   
   rs0.Close
   rs1.Close
   Set rs0 = Nothing
   Set rs1 = Nothing
     
End Sub

Private Sub 修改_Click()
   Me.订单明细子窗体.Locked = False
   '可修改状态
End Sub

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
9#
 楼主| 发表于 2013-1-26 13:19:14 | 只看该作者
我做的保存代码。
可以用,但是,总想找个更好的办法。
拿来给大家探讨一下。



Private Sub 保存_Click()
'这个怎么做?
'关键是子记录数可能变动,可能大于原记录数,也可能小于原记录数。

Dim rs As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim rsc As New ADODB.Command

'delete old
rsc.ActiveConnection = CurrentProject.Connection
rsc.CommandType = adCmdText
rsc.CommandText = "delete from 订单明细 where 订单号='" & Me.订单号 & "'"
rsc.Execute
'addnew
Set rs = Me.订单明细子窗体.Form.RecordsetClone
rst.Open "select * from 订单明细", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Do While Not rs.EOF
   With rst
     .AddNew
     !订单号 = Me.订单号
     !产品名称 = rs.Fields("产品名称")
     !产品数量 = rs.Fields("产品数量")
     .Update
   End With
   rs.MoveNext
Loop

rs.Close
Set rs = Nothing
rst.Close
Set rst = Nothing

Set rsc = Nothing

MsgBox "保存成功"

End Sub
10#
发表于 2013-1-27 02:34:49 | 只看该作者
数据表子窗体数据保存对于access来说是个世界难题
有人用临时表处理、有人用链接表处理
要是想通过代码完成相当有难度
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-25 22:02 , Processed in 0.083930 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表