当前位置:主页>销售管理软件> 列表

Delphi对Join出来的数据集、及主从表数据集进行更新 找南京速达财务软件

进销存软件版1楼: 如果大家觉得我写的还不算差,可以开贴给分,
我顺便也领些分,也好接着写下去。


Delphi对Join出来的数据集、及主从表数据集进行更新
---经验谈(原创,最后修订日期20060101)
=========================================================

事先说明,本人并不是什么高手,只想将自己的一些经验与大家分享,
都是随想而写,不保证所述正确,如有不对、遗漏,或者有什么建议,
欢迎联系交流,如需转载,请保留文章完整性,
也欢迎大家翻译成英文与Borland交流。


联系方式
----------------------------
作者:WilliamGui
QQ:4980688
个人网站:http://www.e-erpchina.com/
联系请直接说明来意,不限Delphi开发,初学者敬请勿扰。

开发环境
----------------------------
Windows 2000 Prof
ADO 2.7
SQL Server 2000 开发版
Delphi 7 企业版 + Update 1 + DB Update 1


大家知道,对于Join出来的数据集进行一般做法的更新会存在问题。
如销售订单主表SQL:
select m.*, c.CustName ...
from SaleOrderMst m join left Customer c on m.CustCode=...
销售订单从表SQL:
select d.*, i.ItemName ...
from SaleOrderDtl d join left ItemV i on d.ItemNo=...
按照一般的做法,如Post、Delete,
我们对Join出来的字段CustName、ItemName进行更新就会发生错误,
ADO会自作多情对多个表发出SQL命令,
如何解决呢?这是我想与大家交流的问题。


集思广议,不外乎有以下一些看法,

1. 不用ADO,使用BDE,使用BDE的TUpdateSQL控件,
当然,这样需要发布BDE,这是个问题,正如一些同行所言,
当数据表有150个字段会很慢,甚至出错,另外,ADO确实也进行过优化,
至少这些说明ADO比BDE稳定,不知新版的Delphi有没有更新BDE。
有时我想不明白,为什么BDE不能像ADO一样,有连接字符串,
不需要命名,有专门发布BDE的已打包的安装文件,这样,在开发上、
使用上,除了需要安装BDE之外,其它都与使用ADO一样方便。

2. 使用TBetterADO第三方控件,天啊,是免费的吗?
如果你是开发比较大型的软件,等同于把命掌握在别人手里,
那是最核心的代码啊,谁知道会怎么样呢?
况且,同行证实在Batch方式也存在BUG。

3. 而有些同行,建议不用join用Lookup,你觉得在软件中不用join“现实”吗?
就像前面提到的销售订单主表,用一个DataSet装载,再对它Lookup,
为什么我要装载这些无关的数据过来,我只想看看订单,也要这样做吗?
况且,如果是发货单,需要选择销售订单,也需要装载N年的销售订单吗?
开发货单时,我还需要显示销售订单引出来的具体内容,后面的我就不说了。
速度我是无法接受用来开发稍大的软件。

4. 即然如此,又有同行认为,不去更新Join出来的字段,这不可能吧,
像销售订单你总得让用于去选择客户、物料吧,不需要回填相关的
客户名称、物料名称、单位...吗?还是像有些同行说的,
在字段对象的GetText和SetText事件中,再select,
或从另一个数据集Locate出来,填写到普通的Edit中或作为一个计算字段,
无论如何差不多。好,现在我需要打印这张单据,你的客户名称、物料名称,
从哪里来,一个个传进去?如果用的是计算字段,你跟踪一下数据集
计算事件发生的频率,就算这样,如果要看十张销售订单,你需要向数据库服务器
的Customer、ItemV发出多少条SQL语句,设置AutoCalcFields=False有用吗。

5. 有同行提出用视图解决,把上面的两条SQL语句写个两个视图,
再创建Instead of触发器,原理这样好像可以,听一些同行说,如果用TADODataSet来
解释发出SQL语句,触发器实际上没执行,我没试过,近期会试试。

6. 用手工产生SQL语句去更新,在ADO的BeforePost、或CDS的BeforeApply事件中、
或解释Delt数据包、或在BeforeGetRecords事件中传递SQL语句到中间层,
产生带参数的Insert、Update、Delete语句等。虽然,Delphi什么都能写,
不过,主要就是数据库应用、界面,ADO也是COM对象啊,在ADOInt单元就有接口定义,
即然这样,我用VC来写,在某些方面还比用Delphi灵活。有同行,甚至建议
不用DBEdit之类的控件,直接用普通的Edit,天啊,试想想,一个像样的 如进销存
ERP、HR,三百个数据表,这是什么工作量,你的系统基类如何构造?我就不举例了。

7. 以上所述,凡是Join出来的数据集,Delete一定出错,可能会有提示不能删除Join的表,
或者没有提示但删除了Join表的数据记录。是否可以设置原生ADO的[''Unique Table'']属性?
要注意大小写,如果用ADO解释SQL语句,在从表的AfterOpen事件设置是无效的,
最好统一在BeforeDelete事件中设置。原生ADO有103个属性,高版本可能更多,
[''Resync Command'']、[''Update Command'']是否可以在这个问题上有所帮助,我没深究过。

8. 使用TADODataSet + TClientDataSet的方法。当有一定量的数据时,
其实只有一两百条主表数据,有没有发现很慢,为什么会很慢?

好了,今天就写到这里,花了我一个小时只写了三分之一,下次接着写。

2楼: 既然没人感兴趣,我就不写下去了 如南京速达财务软件

3楼: 支持一下!!!!!!!!!

4楼: 贡献精神,强烈表示支持! PS, 记得我吗?

5楼: 当然记得

6楼: 好戏要开场了。。。

进销存软件版7楼: 算了,即然没人听我研究了这么久的经验,我就结贴了