三层结构中,如何给应用服务器端的主细表结构的SQL语句传参数?(100分)

程云

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ADO作的应用服务器。
在服务器端用两个ADOQuery通过DataSource关联建立主细结构。
在客户端使用DCOMConnection和两个ClientDataSet(分别对应主细ADOQuery)。
主表我可以通过如下语句给其参数付值:
ClientDataSet.Params.ParamByName('date1').AsString:=DateToStr(dtpStrarDate.date);
但细表我如何给他付值?
 
一般master-detail型的query, detail不需要手工给sql参数赋值的, delphi会
自动将master表中的相关数值作为参数填入detail的sql中.
 
呵呵, 是呀, 细表是根据主细关系自动更新的, 不用你操心:)
 
我试过不行的。
因为我要动态地给sql语句指定一些参数,所以不得不给主细表都船参数。
可见下面的小例子。
主表中:
Select a.unitcode,b.unitname,
(select sum(tamt) from t_salelist where unitcode=a.unitcode and
optype='购入' and tdate>=:date1 and tdate<=:date2) as zje
from t_salelist a,t_dept b
where b.unitcode=a.unitcode and a.optype='购入'
and tdate>=:date1 and tdate<=:date2
细表中:
select
tdate,itemcode,itemname,speci,qtyunit,qty,tamt
from t_salelist
where unitcode=:unitcode and tdate>=:date1 and tdate<=:date2
细表中的 unitcode=:unitcode 是用来从主表中接受关联的。
这个参数可由主表的字段自动传给。
可是问题就出在date1和date2两个参数上,细表根本无法从主表接收这两个
参数.
我从客户端用
ClientDataSet.Params.ParamByName('date1').AsString:=DateToStr(dtpStrarDate.date);
改变了主表的日期范围,可细表所显示的明细就远超出了这个范围。
而我的其它sql语句可比这还复杂的多。
而有客户端我是用ClientDataSet的DateSetField属性从主表获得细表,所以也
根本无法用对待主表的方法给细表参数符值。
Chxn这小子给我出个主意让我给细表加过滤条件,这法可以一用,但是个治标
不治本的鬼点子,还得想个别的好方法。
望各位能多多帮助一下。
先谢过了。
 
没有人来帮帮吗?
我发现自已可太可怜了。
"苍山依旧在,月影荡孤魂"
嗨!。。。。。。
 
真是一个值得大哭一场的日子,
。。。。
怎么我会被小天这小毛丫头传染。
 
主表的tdate和细表的tdate是一样的吗? 如果是, 加入主细表条件中就可以了:
select a.unitcode,b.unitname, tdate,
(select sum(tamt) from t_salelist where unitcode=a.unitcode and
optype='购入' and tdate>=:date1 and tdate<=:date2) as zje
from t_salelist a,t_dept b
where b.unitcode=a.unitcode and a.optype='购入'
and tdate>=:date1 and tdate<=:date2
select
tdate,itemcode,itemname,speci,qtyunit,qty,tamt
from t_salelist
where unitcode=:unitcode and tdate=:tdate
另外, 小天是girl??? 真的吗?
 
两个clientdataset不能分别用params赋值?
masterclientdateset.parambyname('date1').as.... := ....
detailclientdateset.parambyname('date1').as... := ....
这样做不行吗?
 
to cytown:
你的方法我试一下再说。
不过我用的是Delphi5中的ADO作的三层结构,不知你这方法是否可行。
>另外, 小天是girl??? 真的吗?
你现在才听说?
最开始我也不太清楚,后来是Chxn说的,但我也是半信半疑。
不是前不久有cAkk的"见过CJ请进来"的问题中大家对小天的身份大大争论一翻,
结果根据种种迹象认定小天是个小毛丫头。
嘿嘿!并不止我一个人这样看(半开玩笑)。你认为呢?
 
to Another_eYes
clientdataset没有parambyname()的属性值啊。
我试过,只能通过params的parambyname()的属性来付值。
你有什么别的好办法。
to cytown
cAkk的那个问题应是这个:
<a href="DispQ.asp?LID=145381">见过CJ的大虾进来...</a></td>
 
是啊是啊:
masterclientdateset.params.parambyname('date1').as.... := ....
detailclientdateset.params.parambyname('date1').as... := ....
这样不行吗?
 
to Another_eYes
我是用的
masterclientdateset.params.parambyname('date1').as.... := ....
给主表付值的,但细表就无法用它了。用为我是在服务器端建立的主细关系。
在客户端上只能用clientdateset的DataSetField从主表(masterclientdateset)
来获得细表的内容。
这样detailclientdateset就不能使用Fetch params(在弹出菜单中)来从服务
获得参数设置,也就不能使用:
detailclientdateset.params.parambyname('date1').as... := ....
在这儿还请你多帮帮忙。
 
嗨一个小问题吗!
 
看看着别人的问题一个个被解决了,可我,咳。。。。
 
在服务器端再加一个函数,在客户端通过调用此函数给细表赋值。
 
啊, 我的解答还是有问题吗? 不可能呀???
 
to Fencer
>在服务器端再加一个函数,在客户端通过调用此函数给细表赋值。
你的方法,应是最佳的法子。只是这个函数该如何使用,还请给个小例子如何?
to cytown
你原方法,我没试出来,可能是我用ADOQuery。还请你别外想个办法,
可不能见死不救啊?
别外因办此题较难,我另加100分赠于解答正确的大侠,而原来的100分,可根据
贴子的多少,平均分于大家(灌水的不算)。
还请各位高手多多帮忙。
 
to 程云
我一直是用CBuilder编程,我想实现的方法应很简单。在服务器的Type Library
增加一个函数形如:
HRESULT _stdcall SetDetailParm([in] DATE Data1, [in] DATE Data2 );
在此函数中将Data1和Data2的值赋给细表中的参数。

在客户端给主表赋值以后,调用
DCOMConnection1->AppServer.Exec(Function("SetDetailParm")
<<参数1<<参数2);
以上是在CBuilder中的实现。在Delphi中想来差不多,我没试过不敢乱说。
如果还是不行我可以给你一个Delphi的例子。不过我只有Delphi5。(正在装,
我用Delphi编的程序不多,我总感觉pascal的语法不如C灵活。嘻嘻又要得罪
人了吧!)
本人初次来大富翁论坛你各位大侠多多指教。
 
to 程云
我刚装上Delphi没想到在Delphi中调用服务器的函数更为简单,只需
DCOMConnection1.AppServer.SetDetailParm(参数1,参数2);即可真
另我对Delphi刮目相看。这个工具其实还真不错,光是速度就另所有的
C编译工具汉颜了。
 
to Fencer
感谢你的答案,我接受了,回去试一下。
虽然我未这样用过,但想一定差不多。
现决定如下给分:
按每人的贴子的数目。
Another_eYes 3个 30
cytown 3个 30
Fencer 3个 40
Fencer另有100分相赠,以谢解答。
同时感谢Another_eYes、cytown的大力帮助。还请日后多多指点在下。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部