保存时间太长啊?

dragoner 2004-07-19 07:17:27
我做了一个ERP系统,,在输入入库单明细时, 由于明细项太多时, 速度太慢啊。
好长时间长弹出“保存成功啊”
...全文
133 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
old_brother 2004-08-10
  • 打赏
  • 举报
回复
只从楼主的代码来看,为什么不在服务器端做做看,不允许为空的字段,直接建表结构时,设置为不允许NULL,是不是就节省几行语句来判断空。
做程序的时候,客户端的机器未必很好。服务器应该提供最基本的协助。不要只是负责存储数据。不管怎么样,根据实际情况而定。
只是我本人观点,有不脱之处,高人指点。
sun1976 2004-08-10
  • 打赏
  • 举报
回复
如果数据量很大,用dw_1.object.columnname[row]代替
dw_1.getitemstring()速度快得多

另外,有些检测可以放到itemchanged,都放在提交前不好

检查你的数据窗口的sql,where 语句有没有使用完整的索引
muzikuhai 2004-08-10
  • 打赏
  • 举报
回复
我觉得 yeqiufeng(叶秋枫) ( ) 分析的很有道理,我的程序基本上和他说的差不多,速度也很快的
菜菜 2004-08-10
  • 打赏
  • 举报
回复
这个问题也一直困扰着我,不知道你的主键怎么设的,可以在主键中多设几个字段,这样可以提高数据库搜索的速度。
我觉得存储速度慢可能是在存储数据库要对数据进行有效性校验,造成速度很慢。
dragoner 2004-07-20
  • 打赏
  • 举报
回复
for... next 没有什么问题啊。
sbks 2004-07-20
  • 打赏
  • 举报
回复
我觉得问题是出在for...next...这段检查中,你也可以在各个代码段记录一下工作时间,先找出哪段代码是运行得最久的,然后再来研究
sbks 2004-07-20
  • 打赏
  • 举报
回复
明细多时,在代码里用循环来做检查是会慢一些
把代码里的检查都去掉,看看是不是快一些。
dragoner 2004-07-20
  • 打赏
  • 举报
回复
怎么样计算表的页面大小泥
Hanson_bati_zhu 2004-07-20
  • 打赏
  • 举报
回复
试试看
一、先去掉IPX/SPX协议,暂时先别GAME了,把问题解决了再说
二、MSS的数据库页面大小为8192个字节,你自己计算一下你现在这个表的宽度是否超过这个大小
「已注销」 2004-07-20
  • 打赏
  • 举报
回复
另外 我十分怀疑你去掉那两个settransobject 会提高速度

我们一般只是在窗口open的时候加上这两句啊

另外 你别见怪 我很怀疑你的保存语句是抄的帮助……没切成小块就下锅了……

@_@
「已注销」 2004-07-20
  • 打赏
  • 举报
回复
楼主的写作风格我很赞同

我一直都是这么处理的 速度超快

我个人认为决不是for next的问题 因为这项检查的检查内容不多 不过我认为还可以再优化一些:

//定义变量保存单号
string ls_bill;
//定义变量保存总行数 不应该每次循环都读取总行数
long ll_rowcount;
ll_rowcount=dw_2.rowcount();
for i=1 to ll_rowcount
//这里一项内容读取了两次 我认为如果定义变量可能会快一点
ls_bill=dw_2.getitemstring(i,"bill");
if isnull(ls_bill) or ls_bill<>bill then //用not会增加运算
messagebox("提示","出入库单号不能为空或已经修单号!")
return
end if
if isnull(dw_2.getitemstring(i,"item_code")) then //其实你这里应该判断是否等于"" 自己权衡吧
messagebox("提示","产品编码不能为空!")
//这里应该返回吧
return;
end if

if isnull(dw_2.getitemnumber(i,"qty")) then//其实你这里应该判断是否等于 0 ……自己权衡吧
messagebox("提示","出入库数量不能为空!")
return
end if
next

下面的语句我不明白了 你为什么要再setTransObject一次呢

dw_1.SetTransObject(SQLCA)//为什么
dw_2.SetTransObject(SQLCA)//为什么

//下面这段语句我认为你写得相当繁琐
rtncode = dw_1.Update(TRUE, FALSE)
IF rtncode = 1 THEN
rtncode = dw_2.Update(TRUE, FALSE)
IF rtncode = 1 THEN
dw_1.ResetUpdate() // Both updates are OK
dw_2.ResetUpdate()// Clear update flags
COMMIT USING SQLCA; // Commit them
messagebox("提示","保存成功!")

pb_1.enabled=true
ELSE
ROLLBACK USING SQLCA; // 2nd update failed
messagebox("提示","保存失败")
END IF
END IF

我建议改为以下的书写方式,这样看起来简洁明了 要知道多一个if 程序就执行慢一些:

if dw_1.Update(TRUE, FALSE)=1 and dw_2.Update(TRUE, FALSE)=1 then
dw_1.ResetUpdate() // Both updates are OK
dw_2.ResetUpdate()// Clear update flags
commit;
messagebox("提示","保存成功!")
pb_1.enabled=true
else
ROLLBACK;
messagebox("提示","保存失败")
end if

//剩下的问题 就只有你的数据库问题了

你试着优化一下你的数据库配置 测试一下你的数据库性能

比如写一个小程序 进行压力测试 看写入5000条数据的速度是多少 100条的速度是多少

如果你的测试程序保存数据没问题 那么你可再回过头确定 是你的程序有问题

到时候你可发布一个demo 让大家帮你调试一下

@_@
suzh1133 2004-07-20
  • 打赏
  • 举报
回复
单步调试一下,看看 是for next影响速度还是 update时影响了速度,在考虑解决办法
dragoner 2004-07-19
  • 打赏
  • 举报
回复
1。明细数据是比较多。
2.我不知道是否超多了数据库在的页面大小。 我用的SQL SERVER 2K。
3。没有触发器。
4。一个组合主键。
5。网络连接情况好、网速比较快。
6。装了IPX/SPX协议。
Hanson_bati_zhu 2004-07-19
  • 打赏
  • 举报
回复
回复完了才看到你的新回复
上面的问题中的七、八两项可以不用看了
Hanson_bati_zhu 2004-07-19
  • 打赏
  • 举报
回复
试试看是不是下面的几个问题影响了效率
一、这个数据库表中的数据太多
二、这张表宽度超过数据库页面大小
三、这张数据库表中有触发器,而且触发器中的处理比较复杂
四、这张表的索引太多了
五、网络连接情况不好、网速太慢或网络流量很大
六、你用的这台机器是不是装了IPX/SPX协议
七、你的程序在执行UPDATE前是否进行了大量的正确性校验工作
八、你是否用的是SetTrans而不是SetTransObject

dragoner 2004-07-19
  • 打赏
  • 举报
回复
有什么办法能提高以上的保存速度啊啊
dragoner 2004-07-19
  • 打赏
  • 举报
回复
保存速度太慢啊。
dw_1.accepttext()
dw_2.accepttext()

ll=dw_1.getrow()
bill=dw_1.getitemstring(dw_1.getrow(),"bill")


//select count(*) into :row from inv_trans_head_stock where bill=:bill;
//
//if row>1 then
// messagebox("提示","此单据已经在数据库中存在!")
//end if

if isnull(dw_1.getitemstring(ll,"dept_no")) then
messagebox("提示","经办部门不能为空!")
return
end if


if isnull(dw_1.getitemstring(ll,"duty_man")) then
messagebox("提示","经办人不能为空!")
return
end if


if dw_2.rowcount()=0 then
messagebox("提示","产品明细数据不能为空!")
return
end if

for i=1 to dw_2.rowcount()
if isnull(dw_2.getitemstring(i,"bill")) or (not dw_2.getitemstring(i,"bill")=bill) then
messagebox("提示","出入库单号不能为空或已经修单号!")
return
end if
if isnull(dw_2.getitemstring(i,"item_code")) then messagebox("提示","产品编码不能为空!")
if isnull(dw_2.getitemnumber(i,"qty")) then
messagebox("提示","出入库数量不能为空!")
return
end if

next


dw_1.SetTransObject(SQLCA)
dw_2.SetTransObject(SQLCA)
rtncode = dw_1.Update(TRUE, FALSE)
IF rtncode = 1 THEN
rtncode = dw_2.Update(TRUE, FALSE)
IF rtncode = 1 THEN
dw_1.ResetUpdate() // Both updates are OK
dw_2.ResetUpdate()// Clear update flags
COMMIT USING SQLCA; // Commit them
messagebox("提示","保存成功!")

pb_1.enabled=true
ELSE
ROLLBACK USING SQLCA; // 2nd update failed
messagebox("提示","保存失败")
END IF
END IF

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧