订单的问题,请问存取过程如何生成订单号并保存订单和明细单

ljupin 2012-08-03 09:22:29
现在有4个表

店铺表
ID 店铺名称

商品表
ID 店铺ID 商品名称 商品价格


订单表(订单号需要按日期+随机数生成)
订单号(nvarchar) 店铺ID 总金额

订单明细表
ID 订单号 价格 数量

现在通过页面下单,传递N个商品ID,然后调用存取过程,来记录订单和明细单

存取过程需要实现
1.如果商品不属于同一个店铺,就分别为每个店铺生成已个订单
2.每个订单需要随机按日期时间+随机数生成订单号,然后才保存该店铺的订单
3.保存订单明细


请高手帮忙看看,这个过程该怎么写?

...全文
343 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
--将页面传进来的商品ID和数量放到一张表里,如商品ID表
商品ID表([商品ID],[订购数量])

DECLARE @orderNO varchar(50)
set @orderNO=convert(varchar,getdate())+ceiling(rand()*1000000)


insert into [订单明细表]([ID],[订单号],[价格],[数量])
select a.[ID],@orderNO, a.[商品价格],b.[订购数量]from [商品表] a
inner join [商品ID表] b
on a.[ID]=b.[商品ID]

insert into [订单表]([订单号], [店铺ID], [总金额])
select [订单号],b.[店铺ID],sum(b.[店铺ID]* a.[数量]) from [订单明细表] a
inner join [商品表] b
on a.[ID]=b.[ID]
where [订单号]=@orderNO
group by [订单号],b.[店铺ID]
筱筱澄 2012-08-03
  • 打赏
  • 举报
回复
给你说个生成定代号的思路吧,
保存订单明细 只要插入数据就可以了


一个存当前编号的表,和一个取编号的存储过程即可,使用这套机制生成id的业务,只需要在第一次使用之前,先在编号表中初始化一条记录(name不重复),然后后面调用获取编号的存储过程即可


-- 编号表
CREATE TABLE dbo.tb_id(
name varchar(50) -- 业务名称,比如是用于某个表的id 生成的表名
PRIMARY KEY,
id int, -- 当前编号
seed int -- 编号增长值
);
GO

-- 取下一个编号的公共存储过程
CREATE PROC dbo.p_GetID
@name varchar(50),
@id int OUTPUT
AS
SET NOCOUNT ON;
UPDATE dbo.tb_id
SET
@id = id + seed,
id = @id
WHERE name = @name
;
GO

-- 使用之前,先初始化一条数据
INSERT dbo.tb(
name, id, seed
)
VALUES
('test', 0, 1)
;

-- 需要新的id 时,调用公用的存储过程进行获取
DECLARE
@id int
;
EXEC dbo.p_GetID
@name = N'test',
@id = @id OUTPUT
;
SELECT
当前编号 = @id,
需要格式化的话 = 'XS' + RIGHT(1000000 + id, 6)
;
ljupin 2012-08-03
  • 打赏
  • 举报
回复
各位帮帮忙,或提供其他思路也行,分可以再加
筱筱澄 2012-08-03
  • 打赏
  • 举报
回复
要写这么多啊
Net攻城狮 2012-08-03
  • 打赏
  • 举报
回复
declare @MaxId varchar(20),@ocodeno varchar(10),@id varchar(20),@no varchar(20)
set @ocodeno='009'
select top 1 @MaxId = transid from ec_billhead
where transid like '%'+@ocodeno+SUBSTRING(CONVERT(varchar(100),getdate(),112),3,6)+'%' order by transid desc
if @MaxId is null
begin
set @id =@ocodeno+SUBSTRING(CONVERT(varchar(100),getdate(),112),3,6)+'00001'
set @no = SUBSTRING(CONVERT(varchar(100),getdate(),112),3,6)+'00001'
end
else
begin
set @no =Convert(varchar(100),(CONVERT(bigint,SUBSTRING(@MaxId,4,11))+1))
set @id =@ocodeno+@no
end
print(@no)
print(@id)


这是以前写的生成最大编号,懒得改了。。
Net攻城狮 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

我做进销存的时候 数据量比较大,所以在存储过程生成订单号, 然后把要插入数据库的SQL 把单号用特殊字符(用不到的符号)替代 用 replace 把特殊字符替换为你生成的最大编号 然后 存值的话我是用下面这个小例子存的 数据量比较大 所以用 varchar(max)




declare @count varchar(2000)
set @count='111⒛2222⑨111⒛……
[/Quote]


这个小例子是把字符拼接成表 像 表中插入一个表数据是多条
Net攻城狮 2012-08-03
  • 打赏
  • 举报
回复
我做进销存的时候 数据量比较大,所以在存储过程生成订单号, 然后把要插入数据库的SQL 把单号用特殊字符(用不到的符号)替代 用 replace 把特殊字符替换为你生成的最大编号 然后 存值的话我是用下面这个小例子存的 数据量比较大 所以用 varchar(max)




declare @count varchar(2000)
set @count='111⒛2222⑨111⒛2222'
select
substring (value,0,charindex('⒛',value)) as actid,
substring (value,charindex('⒛',value)+1,len(value)) as sales
from
dbo.SplitToTable(@count, '⑨')

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧