Office中国论坛/Access中国论坛

标题: 一对多数据的修改方法讨论 [打印本页]

作者: 你是坏蛋    时间: 2013-1-26 08:00
标题: 一对多数据的修改方法讨论
对于一对多数据的修改,不知道大家是怎么做的?
比如,订单号为001,对应有01,02,03三个订单明细(产品名称)。
我的思路是,先删除订单号为001的订单,然后在把窗体重新修改好的订单号依然为001的订单AddNew进表。
因为修改的结果有三种:
之前有3个订单明细,修改后可能小于3个,等于3个,或大于3个。
用Update实在不知道怎么用。
不知道,你们是怎么处理这个问题的。
简单地说,就好像windows保存修改过的文件一样,覆盖过程,也应该是细分为:删除旧的-在保存新的,这样两个动作吧!
谁有比较好的思路啊?求教。

作者: admin    时间: 2013-1-26 09:56
正常 有一个 自动ID(订单ID), 订单与订单明细 用订单ID关联, 订单号如何改变,不影响 订单明细
作者: Henry D. Sy    时间: 2013-1-26 10:58
你想修改什么?
作者: zhuyiwen    时间: 2013-1-26 12:06
数据库关系中对一对多关系设置为级联更新和级联删除。
作者: 你是坏蛋    时间: 2013-1-26 12:08
就是整张订单,除了订单号不会改,其他的都可能会改。
比如,001订单,对应A客户,原来只有3个产品,01,02,03
已经在数据库保存了,未发货出库。
现在客户要求在原订单的基础上追加一个品种,或删除一个品种,或修改一个品种。
相应的就要修改订单数据了。

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

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

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


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
作者: 你是坏蛋    时间: 2013-1-26 13:19
我做的保存代码。
可以用,但是,总想找个更好的办法。
拿来给大家探讨一下。



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
作者: LeeTien    时间: 2013-1-27 02:34
数据表子窗体数据保存对于access来说是个世界难题
有人用临时表处理、有人用链接表处理
要是想通过代码完成相当有难度




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