Foxtable(狐表)用户栏目专家坐堂 → 单据关联克隆问题


  共有2933人关注过本帖树形打印复制链接

主题:单据关联克隆问题

帅哥哟,离线,有人找我吗?
peterho75
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:13 积分:211 威望:0 精华:0 注册:2016/10/18 20:43:00
单据关联克隆问题  发帖心情 Post By: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:13 积分:211 威望:0 精华:0 注册:2016/10/18 20:43:00
  发帖心情 Post By:2016/11/22 4:50:00 [只看该作者]


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

 回到顶部
帅哥哟,离线,有人找我吗?
peterho75
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:13 积分:211 威望:0 精华:0 注册:2016/10/18 20:43:00
已经解决  发帖心情 Post By: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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/22 8:51:00 [只看该作者]

是不是bug不能确定。除非有例子测试。

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

 回到顶部