嘿!大伙儿,谁用过ADO的Shape语句?(200分)

  • 主题发起人 主题发起人 程云
  • 开始时间 开始时间

程云

Unregistered / Unconfirmed
GUEST, unregistred user!
大伙儿,五一节快到了,都准备去哪玩去?
推荐几个好分方如何。
不过,在出去玩前帮在下解决个小问题如何。
ADO的Shape语句有谁用过?好不好用。
我试着用它作了几个主细报表,嘿嘿!怎么感到好差劲。
快来帮帮我。
 
谁来帮帮我。
 
没人用过这个吗?
一、ADO的Shape语句主要有两条:
1、Shape Append 命令
语法
SHAPE {parent-command} [[AS] parent-alias]
APPEND ({child-command} [AS] child-alias
RELATE parent-column TO child-column...) [[AS] chapter-alias] ...
特点:就是为主细SQL语句建立关联。没有出奇的性能。
2、Shape Compute 命令
语法
"SHAPE {child-command} [AS] child-alias
COMPUTE child-alias [ ,aggregate-command-field-list]
[BY grp-field-list]"
特点:是只列出细表的SQL语句,而主表是从细表中求得。有点意思,只是对查询速度无大的帮助。
而有时还会影响查询速度。只有在特殊时候才好使用。
二、测试:
经过测试以下两个语句所用时间都在4分左右,同以传统方法的主细写法没有太大的差别。
而值的一提的是用BDE只要几十秒钟就行了,如果是两层的BDE就更快了只要两秒钟。
语句一:
SHAPE {
Select comdcode,comname,sum(tamt) as JH,
(Select Sum(n.tamt) from t_salelist AS n INNER JOIN t_salelist AS m ON (n.orgcode = m.tcode) AND (n.orgno = m.tno) where m.comdcode=a.comdcode and n.whflag>='2' and n.saleflag>='2' and n.optype in ('批发','零售','退出','调出','盘亏','配出','移出')) as XS,
(Select Sum(n.Stock*n.tprice) from t_salelist n Where n.comdcode=a.comdcode and n.configdate=(Select distinct top 1 configdate from t_salelist Where itemdcode=n.itemdcode and whflag>='2' and saleflag>='2' order by configdate desc)) as KC
from t_salelist a
Where whflag>='2' and saleflag>='2' and optype in ('购入','调入','盘盈','退入','配入','移入')
Group by comdcode,comname
}
APPEND ({
Select comdcode,itemdcode,itemname,Speci,qtyunit,SUM(tamt) as JH,
(Select Sum(n.tamt) from t_salelist AS n INNER JOIN t_salelist AS m ON (n.orgcode = m.tcode) AND (n.orgno = m.tno) where m.comdcode=a.comdcode and m.itemdcode=a.itemdcode and n.optype in ('批发','零售','调出','盘亏','退出','配出','移出') and n.whflag>='2' and n.saleflag>='2') as XS,
(Select Max(stock*tprice) from t_salelist n Where n.comdcode=a.comdcode and n.itemdcode=a.itemdcode and n.configdate=(Select distinct top 1 configdate from t_salelist Where comdcode=n.comdcode and itemdcode=n.itemdcode and whflag>='2' and saleflag>='2' order by configdate desc)) as KC
from t_salelist a
Where whflag>='2' and saleflag>='2' and optype in ('购入','调入','盘盈','退入','配入','移入')
GROUP BY comdcode,itemdcode,itemname,Speci,qtyunit
} AS mx
RELATE comdcode TO comdcode)

语句一:
SHAPE {
Select a.comdcode,b.comname,a.itemdcode,a.itemname,a.speci,a.qtyunit,SUM(a.tamt) as JH,
(Select Sum(n.tamt) from t_salelist AS n INNER JOIN t_salelist AS m ON (n.orgcode = m.tcode) AND (n.orgno = m.tno) where m.comdcode=a.comdcode and m.itemdcode=a.itemdcode and n.optype in ('批发','零售','调出','盘亏','退出','配出','移出') and n.whflag>='2' and n.saleflag>='2') as XS,
(Select Max(stock*tprice) from t_salelist n Where n.comdcode=a.comdcode and n.itemdcode=a.itemdcode and n.configdate=(Select distinct top 1 configdate from t_salelist Where comdcode=n.comdcode and itemdcode=n.itemdcode and whflag>='2' order by configdate desc)) as KC
from t_custombusiness as b INNER JOIN t_salelist as a ON b.comdcode=a.comdcode
Where a.optype in ('购入','调入','盘盈','退入','配入','移入') and a.whflag>='2' and a.saleflag>='2'
GROUP BY a.comdcode,b.comname,a.itemdcode,a.itemname,a.speci,a.qtyunit
} AS mx
COMPUTE SUM(mx.JH),SUM(mx.XS),SUM(mx.KC),mx
by comdcode,comname
四、小结:
这样看看来Shape并不能提高SQL语句的执行效率。只是提供的一种的编程方便。而并不能从ADO内部大幅度的提高其性能。
凡世间万物有利就有弊,在Shape给我们提供了微不足到的帮助的同时,也给我们带来了一些莫明
 
很有趣嘛
这很正常
ADO 本身就不是为效率而设计的,而是为方便
 
可我要的是效率,如何才能提高效率?
 
adminis,CJ 不要光看看,得解决问题才是正事儿。
如何才能提高SQL语句的执行效率。
一个有一千条记录
我用BDE两层用两秒,三层用二十来秒。
而用ADO它给我用四分钟。
当然,SQL语句也有一定的复杂度。
 
不要把我的问题往后搁。
再提前一点。
 
真受不了哦
您老人家把那条SQL PREPARE一把看看?
不成的话
改造一下,搞成STORED PROCEDURE,再PREPARE一把
估计效率会高点的说
还有,要用只读的光标
 
哇!CJ老先生,你的话太深奥了,
什么是"只读的光标"。
我不太明白。
还有查询准备,我走的可是三层ADO,好象不行,
以前二层BDE时用过,就老出问题。记得刚用ADO时发现不行,就不再用了。
不过太早了,可能记不得了,我试试再说。
还有这对你来说可是小问题一个,不要烦啊!
你看人家CAKK多好,同时我还有一个ADO走JET4的问题,你家三下五除二的
就解决。可不要让这小子把你给比下去了。
 
老大啊
您不PREPARE,复杂的SQL要等死人的啊
真!#$#$~
ADO 做三层不能 PREPARE? 太夸张了吧?
我跟CAKK他老人家不能比哦,他是专线,又有空,和和,俺上网自己出钱的哦
分数也无所谓了,要是当年不自杀...哎,好汗不提当年勇!
我今天是在下载东西才来和诸位侃侃的嘛
 
cursorType := ctOpenForwardOnly 可能提高效率
cursorLocation := useServer 可能提高效率
但有的SQL不能用!
ctStatic 可能也会好一点的
不过我还是劝你尽量PREPARE一把!
 
CJ:
先不要笑人家,当时我还是个新手(现在也还不旧)。
用了PREPARE,发现很有问题,就放充了。以后再也没用过,
我也不肯定能不能用,先回去试试再说。
你是不是后悔当年的事,那时我可刚上《大富翁》。就看见你的风度。
今日又有效仿者,是不是感慨万千。
今日可更胜当日,怎么也劝不住。光转牛角尖。
 
我回去试试再说,
不谈了,不然老板又该说我拿大富翁当聊天室了。
明见。
 
我钢材试过,可以PREPARE的
 
J,不好意思,又来找你,我在客户端用的是ClientDataSet;
这东西如何PREPARE;
在服务端用的是ADODataSet,我用它的BeforeOpen事件PREPARE;
但看不出效果。
有条SQL语句,开始时我等了十五分钟没出来,用这之后,我还是等了十五分钟也没出结果。但使用了
cursorType := ctOpenForwardOnly
cursorLocation := useServer
只用了8分钟。快了一倍多。
这可多谢了,只是还不能在要求的1分钟之内完成。

 
你好黑啊,速度提高一倍了,你竟然要倍!
你直接把ADOQUERY的PREPARE设置为TRUE看看,或者在APPSERVER提供个XXX接口
让CLIENT调嘛...
不过我不明白,明白干嘛不用stored procedure?
 
to CJ:
你有好招咋一块说,非一个个的来不可。
还有啥好东西一块儿倒出来吧?
 
to CJ:
我用了"只读游标"后"PREPARE=TRUE"就不见效果。
反之用了"PREPARE=TRUE"后"只读游标"就不见效果。
还有为什么使用只读游标速度会快那么多。
不要嫌烦啊!我实在是不明白。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部