Foxtable(狐表)用户栏目专家坐堂 → [求助]临时表怎么更新后台数据


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

主题:[求助]临时表怎么更新后台数据

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


加好友 发短信
等级:童狐 帖子:266 积分:2150 威望:0 精华:0 注册:2012/3/28 16:49:00
[求助]临时表怎么更新后台数据  发帖心情 Post By:2019/10/23 17:43:00 [显示全部帖子]

老师,您好!
我在窗口中生成一个临时表(与后台数据表结构相同),然后用Excel表数据导入数据到临时表,自动比对临时表与后台对应数据变动的记录(是不是按照列比对?),再更新变动过的数据。
如果全履盖的话,会浪费很多电脑资源。也不合理
我应该怎么做?谢谢老师!

 回到顶部
帅哥哟,离线,有人找我吗?
沪上游客
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:266 积分:2150 威望:0 精华:0 注册:2012/3/28 16:49:00
  发帖心情 Post By:2019/10/25 14:03:00 [显示全部帖子]

老师你好!
后台更新是不是用“SQLReplaceFor”每列分别更新,但我的表中有30多个列,会不会速度会很慢,有没有其他的办法?

比如我不用临时表,而用SQLTable表,默认不加载数据,导入后更新。应该怎么写代码?
谢谢老师!

[此贴子已经被作者于2019/10/25 14:05:02编辑过]

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


加好友 发短信
等级:童狐 帖子:266 积分:2150 威望:0 精华:0 注册:2012/3/28 16:49:00
  发帖心情 Post By:2019/10/25 14:12:00 [显示全部帖子]

老师代码怎么写?应该不能直接保存吧,因为新的记录行主键与相同编号的后台记录行不一样的。
[此贴子已经被作者于2019/10/25 14:13:58编辑过]

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


加好友 发短信
等级:童狐 帖子:266 积分:2150 威望:0 精华:0 注册:2012/3/28 16:49:00
  发帖心情 Post By:2019/10/25 14:58:00 [显示全部帖子]

老师我试过了,直接保存会重复新增行
我的代码是:
With DataTables("导入核算项目科目组合表_金蝶核算项目科目组合表")
    .DataRows.Clear() '清除所有行
End With

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xlsx|Excel文件|*.xls" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    MessageBox.Show("你选择的是:" & dlg.FileName,"提示") '提示用户选择的文件
End If

Dim Book As New XLS.Book(dlg.FileName)
Dim Sheet As XLS.Sheet = Book.Sheets(0)
Tables("导入核算项目科目组合表_金蝶核算项目科目组合表").StopRedraw()
Dim nms() As String = {"科目名称","安全设施费","办公费用","城市维护建设税","待抵扣进项","待认证进项税金","地方教育费附加","分包成本","福利费","工程材料","工程施工","管理费用","计算抵扣进项","简易计税","建造合同成本","建造合同收成本11","建造合同收成本3","建造合同收入","建造合同收入11","建造合同收入3","教育税费附加","进项税金","进项税金转出","临时设施费","内部往来","其他费用","人工费用","施工机械使用费","水电费","所得税","项目附征个税","销项税额抵减","销项税金","已交税金","印花税","应付账款","应交税费","应交增值税","应收账款","营业税","营业税金及附加","预付账款","预交所得税","预征税金","暂收款","招待费用","折旧费用","职工教育经费","主营业务成本","主营业务收入","总部往来"}
For n As Integer = 1 To Sheet.Rows.Count -1
    Dim bh As String = sheet(n,0).Text
    Dim dr As DataRow = DataTables("导入核算项目科目组合表_金蝶核算项目科目组合表").Find("科目名称 = '" & bh & "'")
    If dr Is Nothing Then '如果不存在同编号的订单
        dr =  DataTables("导入核算项目科目组合表_金蝶核算项目科目组合表").AddNew()
    End If
    For m As Integer = 0 To nms.Length - 1
        dr(nms(m)) = Sheet(n,m).Value
    Next
Next
Tables("导入核算项目科目组合表_金蝶核算项目科目组合表").ResumeRedraw()
DataTables("核算项目科目组合表").DataCols("科目名称").RaiseDataColChanged()
Dim dt As DataTable = DataTables("导入核算项目科目组合表_金蝶核算项目科目组合表")
For Each dr As DataRow In dt.DataRows
    If dr.RowState = DataRowState.Modified AndAlso dr.IsNull("更新记录_更新日期") OrElse dr("更新记录_更新日期") < Date.Now Then
        dr("更新记录_更新日期") = Date.Now
        'dr("更新记录_更新时间") = Format(Date.Now,"HH:mm:ss")
        dr("更新记录_更新人") = User.Name
    End If
Next
DataTables("导入核算项目科目组合表_金蝶核算项目科目组合表").Save()
DataTables("导入核算项目科目组合表_金蝶核算项目科目组合表").AllowEdit = False
[此贴子已经被作者于2019/10/25 15:00:19编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
沪上游客
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:266 积分:2150 威望:0 精华:0 注册:2012/3/28 16:49:00
  发帖心情 Post By:2019/10/25 15:09:00 [显示全部帖子]

另外

dr("更新记录_更新时间") = Format(Date.Now,"t")

这段代码在SQLTable 中执行会出错

后来改为

dr("更新记录_更新时间") = Format(Date.Now,"HH:mm:ss")

也同样出错,应该怎么写?

 


 回到顶部
帅哥哟,离线,有人找我吗?
沪上游客
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:266 积分:2150 威望:0 精华:0 注册:2012/3/28 16:49:00
  发帖心情 Post By:2019/10/25 17:53:00 [显示全部帖子]

老师你好!
还是不行,如果用“SQLFind” 就不会导入所有Excel的对应记录。
    Dim dr As DataRow = DataTables("导入核算项目科目组合表_金蝶核算项目科目组合表").SQLFind("科目名称 = '" & bh & "'")
因为我的目的是要导入Excel的所有记录后,更新后台记录中其他多列(不包括“科目名称”列)变化的数值,以上代码是只要后台有科目名称相同的记录,就不导入了。

请问一下老师,在SQLTable表中的主键值,能变为按照对应后台科目名称相同记录的主键值吗?
[此贴子已经被作者于2019/10/25 17:58:59编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
沪上游客
  7楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:266 积分:2150 威望:0 精华:0 注册:2012/3/28 16:49:00
  发帖心情 Post By:2019/10/26 14:16:00 [显示全部帖子]

老师,是部分列有变化的记录更新后台。
我觉得还是要用临时表导入后比对后台(相当于两个表列名相同数值比对)
如果数值不同就更新该记录,相同就不更新。

另外我的EXCEL表的记录经常会增加,而且增加的记录不在后面而是插在中间(与目标表顺序不一样),所以只能先清除后全部导入。
能不能用插入 “InsertNew ”?  代码该怎么写?试了几下都失败了。
下面两段代码是按行号导入的,不先全部清除记录会出错,没有办法覆盖原来的记录
    For m As Integer = 0 To nms.Length - 1
        dr(nms(m)) = Sheet(n,m).Value
如果能从EXCEL合并数据(导入)入手,那就省了好多事了。
谢谢!
[此贴子已经被作者于2019/10/26 16:55:39编辑过]

 回到顶部