ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: exc-led

[求助] 对外部数据源进行复制、新增、删除

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-12 10:54 | 显示全部楼层
魂断蓝桥 发表于 2018-9-12 10:47
采购订单创建日期应该是唯一的。

其实也不是,您看图片中的日期,就有不是唯一的,但是这两行是不同的产品。能否是几个字段组合作为唯一ID?关键这种唯一ID应该怎么“捆绑”备注列?恕我愚钝,我是第一次知道这样的知识点。
1.jpg

TA的精华主题

TA的得分主题

发表于 2018-9-12 11:11 | 显示全部楼层
exc-led 发表于 2018-9-12 10:14
理是这个理,但是怎么找唯一ID?如何让备注列与唯一ID进行“捆绑”?

这个id 可以是第一个字段,如果不行,可以是第一个字段连接上第二个字段,

主要是你的意思理解不了。

我再重新说一下,

第一次刷新的时候。

erp数据

id  内容
1   a
2   a
因为是第一次肯定不会有重复的id所以你的xls表格直接负责erp数据就好了

xls内容

id 内容 备注
1   a       1
2    a      

当你第二次刷新的时候,
(1) erp数据与xls数据没有重复的。是不是直接把新增的内容添加到表格中。
erp数据
id  内容
4   a
5   a

xls内容

id 内容 备注
1   a       1
2    a      

4    a
5    a

(2) erp数据与xls数据有重复的?
erp数据
id  内容
1   a
5   a

xls数据如何返回?
???????

(3) erp数据与xls数据有重复的也有不重复的?
erp数据
id  内容
1   a
7   a



xls数据如何返回?
???????





TA的精华主题

TA的得分主题

发表于 2018-9-12 11:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
exc-led 发表于 2018-9-12 10:54
其实也不是,您看图片中的日期,就有不是唯一的,但是这两行是不同的产品。能否是几个字段组合作为唯一ID ...

单号呢?

日期+单号 够不够唯一

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-12 11:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
魂断蓝桥 发表于 2018-9-12 11:11
这个id 可以是第一个字段,如果不行,可以是第一个字段连接上第二个字段,

主要是你的意思理解不了。
...

没有重复的内容,总有不一样的,只是字段太多,看起来感觉前面的“字段”内容都一样,但ERP和xls数据没有重复的数据。xls没有返回数据,xls相当于承接了ERP数据而已,下次刷新ERP的数据(很可能出现ERP中某数据删掉了),相当于重新覆盖掉了上次存放在xls中的数据

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-12 11:21 | 显示全部楼层
魂断蓝桥 发表于 2018-9-12 11:12
单号呢?

日期+单号 够不够唯一

日期+单号+品号,三个才能构成唯一性

TA的精华主题

TA的得分主题

发表于 2018-9-12 13:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
exc-led 发表于 2018-9-12 11:21
日期+单号+品号,三个才能构成唯一性

用 日期+单号+品号来确定唯一性,这个没有问题。
你没有回答,

如果erp中 日期+单号+品号 与xls中 日期+单号+品号如果是一样的,
xls如何返回数据?你的备注字段需不需要返回?



TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-12 13:34 | 显示全部楼层
本帖最后由 exc-led 于 2018-9-12 13:37 编辑
魂断蓝桥 发表于 2018-9-12 13:25
用 日期+单号+品号来确定唯一性,这个没有问题。
你没有回答,

能返回给SQL数据库吗?你的意思是说回写给数据库?能返回给数据库那是最好的。但我不知道怎么做(附件是SQL的代码)
1.jpg

数据库代码.rar

1.91 KB, 下载次数: 1

TA的精华主题

TA的得分主题

发表于 2018-9-12 16:38 | 显示全部楼层
exc-led 发表于 2018-9-12 13:34
能返回给SQL数据库吗?你的意思是说回写给数据库?能返回给数据库那是最好的。但我不知道怎么做(附件是S ...


外部数据复制.rar (26.98 KB, 下载次数: 6)
RegisterRC5inPlace.rar (411 Bytes, 下载次数: 4)
vb_cairo_sqlite.rar (1.08 MB, 下载次数: 4)
vbRichClient5.rar (1 MB, 下载次数: 4)

操作sqlite例,需要vb_cairo_sqlite.dll(不用注册)与vbRichClient5.dll(需注册)放在一个目录

返回数据给数据库,你需要很高的权限,并不赞成你这种做法
数据库一旦有变化,是永久性的,一般不可逆。
如果你图中的sql是自己写的,我觉得那这个问题你自己就能解决了。

写个代码你参考一下吧。

我这里没有sql server数据,只能用sqlite 模拟一下了。


Sub a()
Dim cnn As New cConnection, sql$, s$, bt$
Dim rs As New cRecordset, i%, j%
If [A2] = "" Then Call b '第一次运行直接copy 数据
Dim arr
arr = [A1].CurrentRegion
For i = 1 To UBound(arr, 2)
    s = s & "[" & arr(1, i) & "],"
Next
s = s & " primary key([采购单创建日期],[请购/委外单号],[单号])"
sql = "CREATE TABLE T1(" & s & ")" '
cnn.CreateNewDB ":memory:" '建立内存数据库,这样速度快一些,也不会占用你的磁盘空间。
cnn.Execute sql '建立表,字段就是你第二张表的内容
cnn.BeginTrans '开启事物
s = ""
For i = 2 To UBound(arr) ' 插入第二张表的数据,带备注栏的。
    For j = 1 To UBound(arr, 2)
        s = s & MYV(arr(i, j)) & ","
    Next
        s = Left(s, Len(s) - 1)
        sql = "INSERT INTO T1 VALUES(" & s & ")"
        cnn.Execute sql
        s = ""
Next
arr = Sheet1.[A1].CurrentRegion
For j = 1 To UBound(arr, 2)
    bt = bt & "[" & arr(1, j) & "],"
Next
bt = Left(bt, Len(bt) - 1)
s = ""
For i = 2 To UBound(arr) 对第一张表的数据循环
    sql = "SELECT * FROM  T1 WHERE [采购单创建日期]=" & MYV(arr(i, 1)) _
            & " AND [请购/委外单号]=" & MYV(arr(i, 2)) _
            & " AND [单号]=" & MYV(arr(i, 3))
    rs.OpenRecordset sql, cnn
    If rs.RecordCount = 0 Then '如果数据库中没有主键的数据,就是增加的操作
        s = ""
            For j = 1 To UBound(arr, 2)
                s = s & MYV(arr(i, j)) & ","
            Next
            s = Left(s, Len(s) - 1)
            sql = "REPLACE INTO T1(" & bt & ") VALUES(" & s & ")" '在数据库中新增此条数据
            cnn.Execute sql
            s = ""
    Else '如果有,就是修改的操作,只修改第一张表中的字段,你的备注栏内容会保留下来的。
        s = ""
        For j = 4 To UBound(arr, 2)
                s = s & "[" & arr(1, j) & "]=" & MYV(arr(i, j)) & ","
        Next
            s = Left(s, Len(s) - 1)
            sql = ""
            sql = "UPDATE T1 SET " & s '更新数据
            cnn.Execute sql
    End If
Next
cnn.CommitTrans '提交事务
[A2:Y9999] = ""
sql = "SELECT * FROM T1"
rs.OpenRecordset sql, cnn
[A2].CopyFromRecordset rs.DataSource '返回数据带备注栏
Set rs = Nothing
Set cnn = Nothing
End Sub

Sub b()
Dim r
r = Sheet1.[a99999].End(3).Row
Sheet1.Range("a2:v" & r).Copy [A2]
End Sub

Public Function MYV(myt)
If Trim(Len(myt)) = 0 Then
    MYV = "''"
ElseIf TypeName(myt) = "String" Then
    MYV = "'" & myt & "'"
ElseIf IsDate(myt) Then
    MYV = "'" & Format(myt, "YYYY-MM-DD") & "'"
Else
    MYV = myt
End If
End Function





评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-9-12 16:39 | 显示全部楼层
exc-led 发表于 2018-9-12 13:34
能返回给SQL数据库吗?你的意思是说回写给数据库?能返回给数据库那是最好的。但我不知道怎么做(附件是S ...

vba 代码需要先引用vbRichClient5.dll

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-12 16:43 | 显示全部楼层
魂断蓝桥 发表于 2018-9-12 16:39
vba 代码需要先引用vbRichClient5.dll

引用出来,然后怎么让xsl中的数据来回写到SQL中的数据库中呢?版主大大能否帮助实现一下?我还是无法知道怎么来编写代码,无从下手 0.0
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-16 03:52 , Processed in 0.026390 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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