ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

excel表数据导入SQL,帮忙找错,谢~!

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-29 09:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我的意思是把FItemID,FAmount,FInterID,FEntryID导入数据库表ICStockbillEntry. 把FDate,FInterID,FBillNO,FDCStockID,FBillerID,FTranType导入数据库表ICStockbill. 其中FDate取当前日期,FBillNO和FDCStockID是自定义变量,FBillerID为16394, FInterID和FEntryID是按数据库表顺序排列的,如果表里的最后一组数据为29,那导入的FInterID就为30,FEntry从1.2.3......排列!数据库里面的这两个表还有若干字段不可为空。 现在做的总是提示 “ 多步OLE DE操作产生错误,如果可能,请检查每个OLE DE状态值,没有工作被完成。” 小弟不懂, 请教`!
[此贴子已经被作者于2003-12-29 9:42:10编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-29 13:19 | 显示全部楼层
今天偶尔导入进去了数据。不过出了很多问题,我把FInterID设错了。我觉得还是把这个字段和FBillNO和FDCStockID一样在外面定义方面些。可是导入的FAmount为什么是整数? 改了一下,结果又进不去了。改回原状态也总出错~!郁闷!

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-29 15:30 | 显示全部楼层
Sub Createicstockbill(sSheetName As String) Dim cnZW As New ADODB.Connection Dim rst As New ADODB.Recordset, rst1 As New ADODB.Recordset Dim sFInterID As Integer Dim sFDate As Date Dim sBillNo As Integer, sFDCStockID As Integer Dim sFItemID As String, sFAmount As String Dim sFtranType As Integer cnZW.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;password=" + Range("B3") + ";Initial Catalog=" + Range("B2") + ";Data Source=" + Range("B1") On Error GoTo 0 Set rst = Nothing '开始事务 cnZW.BeginTrans i = 2 rst.Open "select * from icstockbillentry", cnZW, adOpenStatic, adLockOptimistic Do sFItemID = Sheets(sSheetName).Cells(i, 1) sFAmount = Sheets(sSheetName).Cells(i, 4) Sheets("参数").Select sFInterID = Range("B8") With rst .AddNew .Fields("FItemID") = sFItemID .Fields("FAmount") = sFAmount .Fields("FEntryID") = i - 1 .Fields("FInterID") = sFInterID .Fields("FBrNo") = 0 .Fields("FQtyMust") = 0 .Fields("FQty") = 0 .Fields("FPrice") = 0 .Fields("FUnitID") = 0 .Fields("FAuxPrice") = 0 .Fields("FQtyActual") = 0 .Fields("FPlanPrice") = 0 .Fields("FAuxQtyActual") = 0 .Fields("FAuxPlanPrice") = 0 .Fields("FSourceEntryID") = 0 .Fields("FCommitQty") = 0 .Fields("FAuxCommitQty") = 0 .Fields("FKFPeriod") = 0 .Fields("FDCSPID") = 0 .Fields("FOrgBillEntryID") = 0 .Fields("FOperID") = 0 .Update End With i = i + 1 Loop Until Sheets(sSheetName).Cells(i, 1) = "" rst.Close cnZW.CommitTrans rst.Open "select * from icstockbill", cnZW, adOpenStatic, adLockOptimistic Do Sheets("参数").Select sFDate = Range("B4") sFBillNo = Range("B5") sFDCStockID = Range("B6") sFtranType = Range("B7") sFInterID = Range("B8") With rst .AddNew .Fields("FInterID") = sFInterID .Fields("FDCStockID") = sFDCStockID .Fields("FDate") = Date .Fields("FtranType") = sFtranType .Fields("FBillNo") = sFBillNo .Fields("FBrNo") = 0 .Fields("FBillerID") = 16394 .Fields("FHookInterID") = 0 .Fields("FPosted") = 0 .Fields("FCheckSelect") = 0 .Fields("FROB") = 1 .Fields("FStatus") = 0 .Fields("FUpStockWhenSave") = 0 .Fields("FCostOBJID") = 0 .Fields("FCancellation") = 0 .Fields("FOrgBillInterID") = 0 .Fields("FBackFlushed") = 0 .Fields("FWBinterID") = 0 .Fields("FPurposeID") = 0 .Fields("FCPInStockInterID") = 0 .Fields("FPayBillID") = 0 .Fields("FRelationTranType") = 0 .Fields("FRelateInvoiceID") = 0 .Update End With Loop rst.Close cnZW1.CommitTrans MsgBox "已成功生成金额调整单!", vbOKOnly + vbInformation, "提示信息" err: Exit Sub ConnErr: MsgBox "数据源连接错误!" Exit Sub prgerr: MsgBox "用户操作失误,系统出错!" End Sub 运行时错误‘-2147217873 (80040e2f) 违反了PRIMARY KEY约束'PK_ICStockbillEntry'.不能在对象'ICStockbillEntry'中插入重复键。 调试 .update显黄色 请各位帮我看看啊。谢谢了~!
[此贴子已经被作者于2003-12-29 18:59:27编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-29 20:50 | 显示全部楼层
FInterID是单据内码,一张表一个单据内码。就是说我导入的这张表的FInterID的值是一样的。这样我就可以在外部定义一个确定值,直接导入。 把第二个do loop去掉可以吗?我没有用到i,所以就没有设置循环条件。 还有就是sFItemID = Sheets(sSheetName).Cells(i, 1)中的cells是什么意思,里面的 i 和1又是什么意思? 我明天去公司试试,非常感谢版主这么热心回答问题~~!
[此贴子已经被作者于2003-12-29 20:58:04编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-29 20:52 | 显示全部楼层
对了,还有一个问题。你说用到两个rst,我定义了一个rst和rst1,可是我没有用到rst1.

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-30 09:51 | 显示全部楼层
"我设计的sql server表里通常将类似FInterID的键定义为自动的自增1,即只要插入一条记录,则改字段就会自动置为最大的行值,这样使用insert时是不需要考虑对该字段赋值的。" 这个想法非常棒,省去导表的时候还要看一下数据库了。那我应该如何在里面给FInterID定义呢?
[此贴子已经被作者于2003-12-30 9:59:48编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-30 10:10 | 显示全部楼层
860.40导入数据库里面的值为860.39我不想在表里面改数据。在所做的东东里面设置能否做到数据一致?

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-30 11:19 | 显示全部楼层
Set rst = cnZW.Execute("select max(FInterID) from ICStockbillEntry") If rst.EOF Or IsNull(rst(0)) Then sFInterID = 1 Else sFInterID = rst(0) + 1 End If 如果就这样的代码。怎么放在哪里都出错啊??

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-30 14:25 | 显示全部楼层
dBCIBJen.txt (2.7 KB, 下载次数: 15) 版主,我现在做的这个。我试过了可以用了。不过照你说的那样,我想把FInterID导进去的时候自动找到数据表里面最大值+1。导一张金额调整单FInterID是固定值的。我该如何在这里面设定FInterID?我现在用的这个是自己定义的sFInterID = Range("B8"). 导入Famount的时候,我在外面直接四舍五入了。导入的结果就正确了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2003-12-30 14:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以下是引用loadhigh在2003-12-30 13:29:00的发言: 是那一行出错?
运行时,提示:对象打开时,不允许操作! 放在另一个位置上面。提示:当前记录不支持更新,这可能是提供程序的限制,也可能是选定锁定类型的限制。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 17:58 , Processed in 0.036676 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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