Office中国论坛/Access中国论坛

标题: 请教在SQL查询分析器里可以顺利执行并获得结果,但在ACCESS项目里无法返回结果,如 [打印本页]

作者: chm11    时间: 2005-6-8 22:34
标题: 请教在SQL查询分析器里可以顺利执行并获得结果,但在ACCESS项目里无法返回结果,如
在SQL查询分析器里可以执行,

但在ACCESS项目中不能作为视图或函数(有临时表)运行,

作为存储过程可以执行但没有返回结果。请问是什么原因?

具体如下:
作者: chm11    时间: 2005-6-8 22:34
先进先出的数据冲销处理 --示例数据:

create table 销售订单(单号 varchar(10),日期 datetime,货品编码 varchar(10),数量 int)

insert 销售订单

select 'A1','2005-5-1','ABCD',100 union all

select 'A2','2005-5-3','ABCD',200 union all

select 'A3','2005-5-4','ABCD',300 union all

select 'A4','2005-5-8','ABCD',500create table 销售发货单(单号 varchar(10),日期 datetime,货品编码 varchar(10),数量 int)

insert 销售发货单

select 'B1','2005-5-05','ABCD',250 union all

select 'B2','2005-5-07','ABCD',100 union all

select 'B3','2005-5-10','ABCD',150'

GO


作者: chm11    时间: 2005-6-8 22:35
问题描述:

    对于示例数据中的销售订单和销售发货单,由于客户在做销售发货时无法指定本次是要发那一张订单的东西。所以销售订单无法与销售发货单关联。客户要求以先进先出的方式统计销售订单的执行情况。对于示例数据,要求结果如下:

单号        日期             货品编码    订单数量    发货数量     待执行数量      

---------- ----------------- ------------- -------------- --------------- ------------------

A1         2005-05-01   ABCD       100            100              0

A2         2005-05-03   ABCD       200            200             0

A3         2005-05-04   ABCD       300            200            100

A4         2005-05-08   ABCD       500            0                 500

                                      合计          1100         500             600


作者: chm11    时间: 2005-6-8 22:35
--查询处理的过程

select

    a.单号,a.日期,a.货品编码,

    订单数量=a.数量,

    发货数量=isnull(case when a.s数量<b.数量 then a.数量 else b.数量-a.p数量 end,0),

    待执行数量=case when a.s数量<b.数量 then 0 else a.s数量-isnull(b.数量,a.p数量) end

into # from(

    select 单号,日期=convert(char(10),日期,120),货品编码,

        数量=sum(数量),

        p数量=isnull((select sum(数量) from 销售订单

    where 货品编码=a.货品编码

        and(datediff(day,日期,min(a.日期))>0

        or datediff(day,日期,min(a.日期))=0 and 单号<a.单号)),0),

        s数量=isnull((select sum(数量) from 销售订单

            where 货品编码=a.货品编码

                and(datediff(day,日期,min(a.日期))>0

                or datediff(day,日期,min(a.日期))=0 and 单号<=a.单号)),0)

    from 销售订单 a

    group by 单号,convert(char(10),日期,120),货品编码

)a

    left join(

        select 货品编码,数量=sum(数量)

        from 销售发货单

        group by 货品编码

    )b on a.货品编码=b.货品编码

        and a.p数量<b.数量

order by a.单号,a.日期,a.货品编码select * from #

union all

select '','','合计',sum(订单数量),sum(发货数量),sum(待执行数量) from #

drop table #
作者: 徐阿鹏    时间: 2005-6-9 22:42
我有个先进先出的东东
作者: 徐阿鹏    时间: 2005-6-9 22:43
begin transactionCREATE TABLE #销售明细转库存临时表(  

id INT PRIMARY KEY,

仓库 nvarchar(50),

销售订单号 nvarchar(50),

品名规格 nvarchar(50),

数量 real

)INSERT INTO #销售明细转库存临时表

      (销售订单号, 品名规格, 数量, 仓库,id)

SELECT 销售订单号, 品名规格, 数量, @仓库 AS Expr1, id

FROM dbo.销售_订单明细表 where 销售订单号=@销售订单号

while EXISTS(SELECT * FROM #销售明细转库存临时表)

begindeclare @id int

declare @销售数 real

declare @库存数 realdeclare @品名规格 nvarchar(50)

declare @库存id int

declare @余数 real

declare @err int

declare @错误文字 nvarchar(50)set @id=(select min(id) as 最小id from #销售明细转库存临时表)

set @销售数=(select 数量 from #销售明细转库存临时表 where id=@id )

set @品名规格=(select 品名规格 from  #销售明细转库存临时表 where id=@id )--------------检查是否可以出库----------------------------------------------------------------------

if not EXISTS(select 品名规格 from dbo.核算_库存成本表 WHERE  (仓库 = @仓库)  AND (品名规格 = @品名规格))-- and (结余数量 <> 0))

   begin

    select @错误='仓库里面没有 '+@品名规格+' 这个品种!无法销售!'

         rollback transaction

           return -100

   enddeclare @总库存数 real

set @总库存数=(select sum(结余数量) from dbo.核算_库存成本表 WHERE (仓库 = @仓库) AND (品名规格 = @品名规格))--(结余数量 <> 0) AND

if @销售数>@总库存数

   begin

        select @错误=@品名规格+' 库存只有: '+cast(@总库存数 as nvarchar(20))+' 吨,数量不足!无法销售!'

         rollback transaction

     return -100

   end

-------------------------------------------------------------------------------------------生成销售订单号-------------------------------------------------------------

declare @订单号 nvarchar(50)

declare @销售单位 nvarchar(50)

declare @代码 nvarchar(50)

set @销售单位=(select 销售单位 from dbo.销售_订单记录表 where 销售订单号=@销售订单号)if exists(SELECT * FROM dbo.销售_记录表 WHERE (销售日期 = CONVERT(nvarchar(10), GETDATE(), 112)) AND  (销售单位 = @销售单位))

begin

set @订单号=(SELECT LEFT(MAX(销售订单号), 10) + cast(RIGHT(MAX(销售订单号), 4) + 1 as nvarchar) AS Expr1  FROM dbo.销售_记录表  WHERE (销售日期 = CONVERT(nvarchar(10), GETDATE(), 112)) AND  (销售单位 = @销售单位))

endelse

begin

set @代码=(select 代码 from dbo.基础_公司设置表 where(公司设置=@销售单位))

set @订单号=@代码+'XS'+convert(nvarchar(10),getdate(),12)+'1001'

End

-------------------------------------------------------------------------------------------------------先进先出分配库存------------------------------------------------------------------------------------

-----------如果是库存是负数的,则全部滚到下批次的库存成本中---------------------------------------------------------------set @库存数=(SELECT TOP 1 结余数量 FROM dbo.核算_库存成本表 WHERE (结余数量 <> 0) AND (仓库 = @仓库) AND (品名规格 = @品名规格))

set @库存id=(SELECT TOP 1 id FROM dbo.核算_库存成本表 WHERE (结余数量 <> 0) AND (仓库 = @仓库) AND (品名规格 = @品名规格))

declare @库存订单号 nvarchar(50)

set @库存订单号=(select top 1 对应单号 from dbo.核算_库存成本表 WHERE (结余数量 <> 0) AND (仓库 = @仓库) AND (品名规格 = @品名规格))   if  @销售数>@库存数

     begin

      UPDATE dbo.核算_库存成本表 SET 销售数量 = 销售数量+@库存数 WHERE (id = @库存id)

            if (select 结余数量 from dbo.核算_库存成本表 where id=@库存id)<0   

              begin

                 rollback transaction

                 select @错误='程序出现错误!无法销售出库,请重试!'

                 return -100

              end

         insert into dbo.核算_销售成本先进先出表(销售单号,对应采购单号,品名,数量) values(@订单号,@库存订单号,@品名规格,@库存数)

      UPDATE #销售明细转库存临时表 set 数量=数量-@库存数 WHERE (id = @id)

     end

    else

     begin

         update dbo.核算_库存成本表 SET 销售数量 = 销售数量+@销售数 WHERE (id = @库存id)

             if (select 结余数量 from dbo.核算_
作者: chm11    时间: 2005-6-9 23:06
谢谢!研究中..... :)
作者: chm11    时间: 2005-6-9 23:20
增加两个声明后

declare @仓库 nvarchar(50)

declare @销售订单号 nvarchar(50)

还是返回‘在此上下文中不能使用带有返回值的 RETURN 语句。’
作者: 徐阿鹏    时间: 2005-6-10 16:48
有没有开始事务?有没有回滚事务?


作者: chm11    时间: 2005-6-10 22:50
不明白,

能不能详细解释下,

谢谢!:)
作者: 徐阿鹏    时间: 2005-6-15 17:02
先进先出的原理1、先创建一个局部临时表2、将要出货的记录导入到这个表中3、查看库存是否有足够分配的货物4、开始循环    1、提取临时表中的第一条数据和库存的第一条数据比较    2、如果临时表中的数据大于库存的第一条数据  则表明该库存第一条数据已经全部分配。更新该库存的可用库存         为0,并同时更新临时表的数据为减去库存的部分        如果临时表中的数据小于库存的第一条数据 则表明该库存第一条数据有剩余库存,更新该库存的可用库存        为余额。并删除临时表的第一条数据。3、如此循环,直到临时表没有数据为止。表的结构1、库存表   品名   数量    销售数量     可用余额(公式=数量-销售数量)更新库存时只需更新销售数量即可。  
作者: chm11    时间: 2005-6-16 17:15
谢谢!

正是我目前想学的东西!

:)
作者: chm11    时间: 2005-6-16 18:01
和我工作接触情况比较类似,

不过还没有和库存联系起来,

我们有很多仓库,产品管理不严格,

同一种产品的入箱数可能不同,规格很多,太复杂,

但今后应该将库存和发货联系起来,否则实际作用要小很多。现在主要是出库及开发票,销售额、毛利、回收额的统计,

目前实际的工作是在ACCESS中完成,

SQL项目在准备中,还不是很熟,一项项的功能在SQL中实现。对于数量用real觉的有点奇怪,

我们在开增殖税发票时单价可能要精确到小数点后6位,

所以为保险起见用双精度浮点数,可能有浪费,不过比不够用要强。

用两个不确定的值运算,不确定的因素是不是会翻倍,不知道这样理解对不对。

:)
作者: chm11    时间: 2005-6-16 21:23
能不能把这个文件上传一下?

:)



[此贴子已经被作者于2005-6-16 13:49:16编辑过]


作者: 徐阿鹏    时间: 2005-6-17 02:20
对!real是有问题,在判断是否可以出库的条件时也有问题,把real改成了numeric数值,。我也是刚刚学习项目adp,正在帮公司做个进销存的软件,有分公司,分仓库,有几十个品种,做的有点晕,不过已经出来一些东西了。没有办法传给你!有msn吗?可以在上面交流一下~我的msn是xuapeng1976@hotmail.com
作者: chm11    时间: 2005-6-17 21:08
已经加了MSN了,

有空交流一下:)







[此贴子已经被作者于2005-6-17 13:11:19编辑过]


作者: 徐阿鹏    时间: 2005-6-18 03:37
没见你的msn,你的msn是多少?
作者: chm11    时间: 2005-6-20 20:19
不好意思!

刚回来!

你好:)



2005/6/20

12:16

[此贴子已经被作者于2005-7-28 13:38:29编辑过]


作者: julycy    时间: 2005-9-2 15:57
各位大侠,可否提供一个进销存月报表的存储过程,要求有期初库存,本期入库,本期出库,期末库存。我已经有一个联合查询,格式如(期间(200501,int),料号,品名,期初库存(初始),入库,出库,期初+入库-出库=期末库存),有什么好的方法生成月报表。思路又是怎么样的。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3