以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  单据关联克隆问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=93158)

--  作者:peterho75
--  发布时间:2016/11/22 4:49:00
--  单据关联克隆问题
关联关系: 工艺卡 关联 工艺工序  关字字段 卡片编号 约束是同步更新同步删除
              工艺工序 关联 工步  关联字段   卡片编号 ADN 工序
工艺卡 的卡片编号是自动自成的编号 写在表的datachanged中 号码唯一

写了一个克隆按钮 ,自动复制 主表及关联表,克隆是成功了
但是由于卡片编号是自动生成的编号,克隆成功后, 将原表的关联表的卡片编号也更改了,全变成新的编号,造成原工艺单关联单据信息全无,而新克隆出的单据关联表全是DOUBLE信息量. 
我的需求是克隆出的单据号使用新编号包括联联表也是. 

我写的代码如下.另窗口中卡片编号的控件名称为:texbox1

Tables("工艺卡").Current.Clone()
Dim drs As List(Of DataRow)
drs = Tables("工艺卡").Current.DataRow.GetChildRows("工艺工序")\'克隆工序\'
For Each dr As DataRow In drs
   dr.Clone
Next
Dim drs1 As List(Of DataRow)
drs1 = Tables("工艺卡").Current.DataRow.GetChildRows("工步")\'克隆作业步骤
For Each dr1 As DataRow In drs1
    dr1.Clone
Next


我试过另外一种代码思路是取tesbox1值 .克隆也可以成功,但是此种方法一量将表的datachanged事件(卡片单号自动生成),就无法克隆关联表,应该是卡片号是新号找不到记录.但是不加这个事件是可以的.

我将代码也复制下来,望高手指点
Tables("工艺卡").Current.Clone()
Dim drs As List(Of DataRow)
drs = Tables("工艺卡").Current.DataRow.GetChildRows("工艺工序")\'克隆工序\'
For Each dr As DataRow In drs
 Dim cname As String = "卡片编号"
Dim kpbh As WinForm.TextBox = e.Form.Controls("TextBox1")
    Dim bh As String =kpbh.Value \'取得卡片编号新值?这样写是取的原来的值还是新值
Dim r As Row = Tables("工艺工序").current
Dim nr As Row = r.Table.AddNew
For Each c As Col In r.Table.cols
    If c.name <> cname Then\'判断是否是卡片编号列
        nr(c.name) = r(c.name)\'克隆记录
     Else         nr("卡片编号")=bh  \'赋新值
    End If
 Next 
Next
Dim drs1 As List(Of DataRow)
drs1 = Tables("工艺卡").Current.DataRow.GetChildRows("工步")\'克隆作业步骤
For Each dr1 As DataRow In drs1
    dr1.Clone 
Next

卡片编号代码:
If e.DataCol.Name = "制单日期" Then
    If e.DataRow.IsNull("制单日期") Then
        e.DataRow("卡片编号") = Nothing
    Else
        Dim bh As String = Format(e.DataRow("制单日期"),"yyyyMMdd") \'取得单据号的8位前缀
        If e.DataRow("卡片编号").StartsWith(bh) = False \'如果单据号的前8位不符
            Dim  max As String
            Dim  idx As  Integer
            max = e.DataTable.Compute("Max(卡片编号)","制单日期 = #" & e.DataRow("制单日期") & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该天的最大单据号
            If  max > "" Then \'如果存在最大单据号
                idx = CInt(max.Substring(12,3)) + 1  \'获得最大单据号的后三位顺序号,并加1
            Else
                idx = 1 \'否则顺序号等于1
            End  If
            e.DataRow("卡片编号") ="RK-" &  bh & "-" & Format(idx,"000")
         End If
    End  If
 End  If



--  作者:peterho75
--  发布时间:2016/11/22 4:50:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:工艺卡.jpg
图片点击可在新窗口打开查看

--  作者:peterho75
--  发布时间:2016/11/22 5:41:00
--  已经解决
我前面代码主要问题在于主表复制也不能全表复制,要用代码,但是我发现一个系统BUG,有的时候编号重复,我的编号代码没有问题
新代码附上
Dim r As Row = Tables("工艺卡").Current
Dim dnew As Row = Tables("工艺卡").AddNew
Dim bh As WinForm.TextBox = e.Form.Controls("TextBox1")\'取得新编号控件
Dim name As String
    name=bh.Value\'取得新值
For Each c As Col In Tables("工艺卡").Cols
    If c.Name = "卡片编号" Then
        dnew(c.Name) = name
    ElseIf c.Name <> "_Identify" Then
        dnew(c.Name) = r(c.Name)
    End If
Next

Dim drs As List(Of DataRow)
drs = r.DataRow.GetChildRows("工艺工序")
Dim rc As DataRow
For Each dr As DataRow In drs
    rc = dr.Clone
    rc("卡片编号") = name
Next
Dim drs1 As List(Of DataRow)
drs1 = r.DataRow.GetChildRows("工步")
Dim rc1 As DataRow
For Each dr As DataRow In drs1
    rc1 = dr.Clone
    rc1("卡片编号") = name
Next

--  作者:有点蓝
--  发布时间:2016/11/22 8:51:00
--  
是不是bug不能确定。除非有例子测试。

但是上面的代码看不出编号的变化,赋值的都是同一个