功夫终于没有白费
2007-02-09 13:51
323 查看
其实这几天一直想把VBA程序里的那段代码优化一下,因为那段代码是写在程序里面执行的,效率很低,改进的话就写成一个储存过程算了。不过,由于是多条件查询,所以,想来想去,今天最终还是在储存过程中执行动态sql语句,这样做的好处就是可以传递一段条件语句,也就是传一个参数就行了,不用一个一个参数的传,还得加好多判断。第一次写这样的储存过程,还真的有点不习惯,还花了不少时间去调试。不过,还好,总算调试通过了。下面我把储存过程的代码和调用实例放上来,如果大家觉得还有什么好的建议的话,我们可以一起讨论一下。
/*
先创建有两个输入参数,一个输出参数的储存过程
*/
create procedure 总部送货单数量求和
@条件 nvarchar(1000),
@销售方式 nvarchar(100),
@总数 int output
as
declare @sql nvarchar(4000)
IF (isnull(@条件,'s')) <>'s'
begin
set @sql="SELECT sum(isnull(总部送货单明细.数量,0)) FROM 总部送货单明细 INNER JOIN 总店送货单 ON 总店送货单.送货单号 = 总部送货单明细.送货单号 INNER JOIN 产品资料表 ON 产品资料表.产品编号 = 总部送货单明细.产品名称 INNER JOIN hjg销售方式 ON hjg销售方式.销售方式编号 = 总部送货单明细.销售方式 LEFT OUTER JOIN 回桶明细表 ON 总部送货单明细.送货单号 = 回桶明细表.送货单号 AND 总部送货单明细.产品名称 = 回桶明细表.产品名称 LEFT OUTER JOIN 回库明细表 ON 回库明细表.送货单号 = 总部送货单明细.送货单号 AND 回库明细表.产品名称 = 总部送货单明细.产品名称 WHERE 总店送货单.落单日期 > (SELECT MAX(盘点日期) FROM dbo.盘点主表) "+ @条件 +" and hjg销售方式.销售方式 ='"+@销售方式 +"'"
EXEC @总数=sp_executesql @sql OUTPUT --执行,获得返回值
end
/*
先写一个函数,方便多次调用。
*/
Function 查询总数(sql_wh As String, fs As String) As String
Dim comm As New ADODB.Command
Set comm = New ADODB.Command
Dim rs As New ADODB.Recordset
Set rs = New ADODB.Recordset
Dim prmByRoyalty, prmByRoyalty2, prmByRoyalty3 As ADODB.Parameter
comm.CommandText = "总部送货单数量求和"
comm.CommandType = adCmdStoredProc
comm.ActiveConnection = CurrentProject.Connection
Set prmByRoyalty = comm.CreateParameter("条件", adVarChar, adParamInput, 400)
Set prmByRoyalty2 = comm.CreateParameter("销售方式", adVarChar, adParamInput, 400)
Set prmByRoyalty3 = comm.CreateParameter("总数", adInteger, adParamReturnValue, 4)
comm.Parameters.Append prmByRoyalty
comm.Parameters.Append prmByRoyalty2
comm.Parameters.Append prmByRoyalty3
prmByRoyalty.Value = sql_wh
prmByRoyalty2.Value = fs
Set comm.ActiveConnection = CurrentProject.Connection
Screen.MousePointer = 11
rs.Open comm, , 1, 1
Screen.MousePointer = 1
查询总数 = Nz(rs.Fields.Item(0).Value, 0) '返回值
End Function
/*
在程序中调用函数
*/
sql_wh=.... /*略*/
Me.调出 = 查询总数(sql_wh, "调出")
PS:
记录一下今天的日子,2007年2月9号,想不到这么快就有30天了,幸福的时光总是过得那么快!
/*
先创建有两个输入参数,一个输出参数的储存过程
*/
create procedure 总部送货单数量求和
@条件 nvarchar(1000),
@销售方式 nvarchar(100),
@总数 int output
as
declare @sql nvarchar(4000)
IF (isnull(@条件,'s')) <>'s'
begin
set @sql="SELECT sum(isnull(总部送货单明细.数量,0)) FROM 总部送货单明细 INNER JOIN 总店送货单 ON 总店送货单.送货单号 = 总部送货单明细.送货单号 INNER JOIN 产品资料表 ON 产品资料表.产品编号 = 总部送货单明细.产品名称 INNER JOIN hjg销售方式 ON hjg销售方式.销售方式编号 = 总部送货单明细.销售方式 LEFT OUTER JOIN 回桶明细表 ON 总部送货单明细.送货单号 = 回桶明细表.送货单号 AND 总部送货单明细.产品名称 = 回桶明细表.产品名称 LEFT OUTER JOIN 回库明细表 ON 回库明细表.送货单号 = 总部送货单明细.送货单号 AND 回库明细表.产品名称 = 总部送货单明细.产品名称 WHERE 总店送货单.落单日期 > (SELECT MAX(盘点日期) FROM dbo.盘点主表) "+ @条件 +" and hjg销售方式.销售方式 ='"+@销售方式 +"'"
EXEC @总数=sp_executesql @sql OUTPUT --执行,获得返回值
end
/*
先写一个函数,方便多次调用。
*/
Function 查询总数(sql_wh As String, fs As String) As String
Dim comm As New ADODB.Command
Set comm = New ADODB.Command
Dim rs As New ADODB.Recordset
Set rs = New ADODB.Recordset
Dim prmByRoyalty, prmByRoyalty2, prmByRoyalty3 As ADODB.Parameter
comm.CommandText = "总部送货单数量求和"
comm.CommandType = adCmdStoredProc
comm.ActiveConnection = CurrentProject.Connection
Set prmByRoyalty = comm.CreateParameter("条件", adVarChar, adParamInput, 400)
Set prmByRoyalty2 = comm.CreateParameter("销售方式", adVarChar, adParamInput, 400)
Set prmByRoyalty3 = comm.CreateParameter("总数", adInteger, adParamReturnValue, 4)
comm.Parameters.Append prmByRoyalty
comm.Parameters.Append prmByRoyalty2
comm.Parameters.Append prmByRoyalty3
prmByRoyalty.Value = sql_wh
prmByRoyalty2.Value = fs
Set comm.ActiveConnection = CurrentProject.Connection
Screen.MousePointer = 11
rs.Open comm, , 1, 1
Screen.MousePointer = 1
查询总数 = Nz(rs.Fields.Item(0).Value, 0) '返回值
End Function
/*
在程序中调用函数
*/
sql_wh=.... /*略*/
Me.调出 = 查询总数(sql_wh, "调出")
PS:
记录一下今天的日子,2007年2月9号,想不到这么快就有30天了,幸福的时光总是过得那么快!
相关文章推荐
- 装了三次终于把MSDN给装上了 没有白费功负啊
- 平台管理系统,没有白费功夫
- 很多天都没有解决的问题,今天终于搞定了!
- 十盼了三十盼初一,终于没有年终奖。真是悲哀呀。。。。
- 终于要毕业了,没有什么好说的
- 终于没有完成任务
- 没有白费的三天 推荐
- 以前没有研究过脚本的使用,所以昨天那个小问题可是让我费了好一番功夫,贴出代码给自己留个纪念!
- 终于找到I18N了,居然改名字叫ICU了(或许好久没有用到忘记了)
- 终于实现了网页在线截屏,没有插件,支持长网页和多种格式
- sql2005安装后没有客户端 这个问题困扰好多开发人员!我通过自己的摸索和总结 终于搞明白了!!!
- ubuntu好长时间没有无线了,终于下定决心安装无线网卡
- 从没有白费的努力,也没有碰巧的成功
- 失去亲人的感觉是多么的心痛啊!我终于没有控制住自己。
- 惊悚啊!我终于发现为毛有时margin:auto;设置无效了 因为没有设置宽度和高度!!!!
- 油脂溅了他一身,也没有引起他的反应。_终于吃完烤肉之后,芒特
- 终于懂了:Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了,跟Windows消息虽然尽量保持一致,但其实相互没有特别大的关系。有了这个,就有了主动,带不带句柄完全看需要。
- 终于告别了两个月没有网络的日子
- 零的突破,努力没有白费
- 项目终于结束了,终于可以休息一下了,没有想到这个项目的周期这么长......