功夫终于没有白费

       其实这几天一直想把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天了,幸福的时光总是过得那么快!

 

 

题目1 农夫过河问题的求解 一、问题描述 一个农夫带着一只狼、一只羊和一颗白菜,身处河的南岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件东西,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开。请求出农夫将所有东西运过河的方案。 二、解题提示 要模拟农夫过河问题,需要对问题中每个角色的过河状态进行描述。一个方便的办法是用4位二进制数串顺序表示白菜,羊,狼和农夫的位置。用0表示农夫或者某东西在河的南岸,1表示在河的北岸。例如,0110表示农夫和白菜在河的南岸,而狼和羊在北岸。 问题从初始的状态0000(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每个状态都可以从前一状态到达。为避免白费功夫,要求在序列中不出现重复的状态。 实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先搜索;另一种是深度优先搜索。 三、测试效果 步骤1: 农夫把羊带到北岸 步骤2: 农夫独自回南岸 步骤3: 农夫把白菜带到北岸 步骤4: 农夫把羊带回南岸 步骤5: 农夫把狼带到北岸 步骤6: 农夫独自回南岸 步骤7: 农夫把白菜带到北岸 祝贺您! 过河问题求解成功! -------------------------------- Process exited with return value 0 Press any key to continue . .
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值