D
dadada
Unregistered / Unconfirmed
GUEST, unregistred user!
with ADOQuery1 do<br>begin<br>close;<br>sql.clear;<br>sql.add(' Select a.clbh,a.clname,a.gg, ');<br>//#1计算数量开始<br>sql.add(' (select sum(b.sl) from 入库表 b where b.clbh=a.clbh) As 入库总量, ');<br>sql.add(' (select sum(b.sl) from 销售表 b where b.clbh=a.clbh) As 销售总量, ');<br>sql.add(' (select sum(b.sl) from 报废表 b where b.clbh=a.clbh) As 报废总量, ');<br>//#1计算数量结束<br>//#2计算加权平均入库单价开始<br>sql.add(' (select sum(b.je)/sum(b.sl) from 入库表 b where b.clbh=a.clbh) As 单价, ');<br>//#2计算加权平均入库单价结束 <br>//#3计算金额开始<br>sql.add(' (select sum(b.je) from 入库表 b where b.clbh=a.clbh) As 入库总额, ');<br>sql.add(' (select sum(b.sl) from 销售表 b where b.clbh=a.clbh)* ');<br>sql.add(' (select sum(b.je)/sum(b.sl) from 入库表 b where b.clbh=a.clbh) As 销售成本, <br><br>'); //*注意这句,重复引用,不科学*<br>sql.add(' (select sum(b.sl) from 报废表 b where b.clbh=a.clbh)* ');<br>sql.add(' (select sum(b.je)/sum(b.sl) from 入库表 b where b.clbh=a.clbh) As 报废成本, <br><br>'); //*注意这句,重复引用,不科学*<br>//#3计算金额结束<br>//#4计算库存开始<br>...省略了,加加减减,大家明白就行了,代码太长<br>//#4计算库存结束<br>sql.add(' from 商品档案表 a ');<br>open;<br>end;<br>***************************<br>好了,这是一个计算进销存的SQL语句,我写出来的是一个经过简化的例子,实际应用中,还要加上期间<br><br>判断等等条件,因此代码十分的长,长到showmessage(sql.text)时整个屏幕都显示不完.<br>我遇到的问题是:这段代码如果写在客户端,在有些机子就会出现"系统内存不足运行此查询!"<br>我把它改成存储过程,运行的速度也相当的慢.<br>假设仍使用本语句来计算,有没有改良的方法呢,有,我认为问题就出在后面算"各种出库的成本时",<br><br>每次都要原封原样的引用"算加权单价"那段代码,不但造成整个SQL语句的代码超长,而且肯定就是耗<br><br>费内存的祸首!<br>我要想改的地方,就是那个加权单价的引用方式,因为在实际项目中,我的计算加权平均单价的代码有<br><br>10行那么长的,按照我上面的写法,就会造成:算销售成本时copy它,算报废成本时copy它,等等,中间<br><br>凡是要用到这个单价的地方,都要在SQL语句里copy一次,最后算结存金额时,还要copy一次,于是整条<br><br>SQL语句就变得好长啊!运行起来就出现内存不足.<br>说了这么多,读帖的朋友都应该弄清楚我的问题了吧?<br>请高手支招,帮我改良写法,或者提供更有效率的算法?