触发器求助

现有 物品编码  规格   数量 字段 想根据 物品编码+规格+日期+数量 用触发器生成一个新的编码  填报的时候  填写 物品编码  规格  数量  价格  数量有多少 就生成多少条编码 数量 就是流水号 流水号 是4位 物品编码 是8位  规格是6位 日期6位   规则就是

这个物品今天入库了多少数量 就生成多少条 数据   只能在入库表里写触发器 

入库明细表

CREATE TABLE [dbo].[自动编号入库] (

[入库单号] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[物品编码] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[规格] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[价格] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[入库人员] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[自动编码] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[数量] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[状态] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[ID] int NOT NULL IDENTITY(1,1) ,

[出库单号] nvarchar(MAX) COLLATE Albanian_BIN NULL ,

CONSTRAINT [PK__自动编号入库__3214EC2735BCFE0A] PRIMARY KEY ([ID])

)

ON [PRIMARY]

TEXTIMAGE_ON [PRIMARY]

GO

入库单 表结构

CREATE TABLE [dbo].[入库单] (

[入库单号] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[物品编码] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[规格] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[价格] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[人员] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[数量] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL ,

[ID] int NOT NULL IDENTITY(1,1) ,

[物品名称] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS_KS_WS NULL ,

[状态] nvarchar(MAX) COLLATE Chinese_PRC_CI_AS NULL DEFAULT NULL ,

CONSTRAINT [PK__入库单__3214EC27398D8EEE] PRIMARY KEY ([ID])

)

ON [PRIMARY]

TEXTIMAGE_ON [PRIMARY]

GO

image.png

image.png

FineReport 王丹 发布于 2020-5-19 08:36 (编辑于 2020-5-20 08:37)
1min目标场景问卷 立即参与
回答问题
悬赏:13 F币 6人赏过 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共6回答
最佳回答
3
L大大Lv7高级互助
发布于2020-5-20 07:59(编辑于 2020-5-21 02:35)

1.png

--create创建完成后,将create改为alter

alter trigger tri_productLog

on 入库单

after insert

as 

declare @dh varchar(20)

declare @rq varchar(10)

declare @bm varchar(20)

declare @gg varchar(20)

declare @jg varchar(20)

declare @name varchar(20)

declare @wp varchar(10)

declare @type varchar(20)

declare @num int

declare @num2 int

declare @i int

set nocount on ;  

  select @dh=入库单号,@bm=物品编码,@gg=规格,@jg=价格,@name=人员,@wp=物品名称 from inserted;

set @rq=convert(varchar(10),getdate(),112);

select @num2=sum(cast(数量 as int)) from 自动编号入库 where 物品编码=@bm and 规格=@gg;

select @num=sum(cast(数量 as int)) from 入库单 where 物品编码=@bm and 规格=@gg;

begin

if @num2 is null

set @i=1

while @i<=@num

begin

INSERT INTO [dbo].[自动编号入库]([入库单号], [物品编码], [规格], [价格], [入库人员],[自动编码],[数量],[状态]) VALUES (@dh,@bm,@gg,@jg,@name,@bm+@gg+@rq+right('0000'+cast(@i as varchar),4), 1,'1');

set @i=@i+1

end

if @num2<=@num

select @i=max(cast(right(自动编码,4) as int))+1 from 自动编号入库 where 物品编码=@bm and 规格=@gg;

while @i<=@num

begin

INSERT INTO [dbo].[自动编号入库]([入库单号], [物品编码], [规格], [价格], [入库人员],[自动编码],[数量],[状态]) VALUES (@dh,@bm,@gg,@jg,@name,@bm+@gg+@rq+right('0000'+cast(@i as varchar),4), 1,'1');

set @i=@i+1

end

end

go




--测试语句


 INSERT INTO [dbo].[入库单]([入库单号], [物品编码], [规格], [价格], [人员], [数量],[物品名称]) VALUES ('RK20200519082553006','H1430007', '20X300', 15,'张三',6, '物品名称');

 INSERT INTO [dbo].[入库单]([入库单号], [物品编码], [规格], [价格], [人员], [数量],[物品名称]) VALUES ('RK20200519082553006','H1430007', '20X400', 18,'张三',3, '物品名称');

 INSERT INTO [dbo].[入库单]([入库单号], [物品编码], [规格], [价格], [人员], [数量],[物品名称]) VALUES ('RK20200519082553006','H1430007', '20X300', 35,'张三',4, '物品名称');

-- 

SELECT *FROM 入库单

select *from [自动编号入库]

-- 

 delete from 入库单

 delete from 自动编号入库


  • 王丹 王丹(提问者) 源数据 就是上面的 就是少了一个物品名称 流水号 是四位的 就是代表一天 同一个物品编码 同个规格的物品 只能入库9999 这个其实是要做先进先出的 生成这样的条码后 然后出库的时候 就根据 物品编码 和规格 然后出这个物品 日期最先进来的 最小编号 的东西 这个日期的出完了 再出下一个日期的 也是根据数量 来确定出多少 的
    2020-05-20 08:43 
  • L大大 L大大 回复 王丹(提问者) 可以了,自己检查下吧
    2020-05-21 02:35 
  • 王丹 王丹(提问者) 回复 L大大 要不你远程帮我看看??
    2020-05-21 09:07 
  • L大大 L大大 回复 王丹(提问者) 行吧 你加我594669832
    2020-05-21 09:09 
最佳回答
0
豆豆小可爱Lv5中级互助
发布于2020-5-19 09:37

你直接在后面加一个单元格,就等于 物品编码+规格+日期+数量 的拼接,然后这个单元格隐藏起来不就好了?

  • 孤陌 孤陌 你考虑过多人使用吗? 还有人家是 数量多少 就生成多少条 数量 是后面的流水号
    2020-05-19 09:49 
  • 王丹 王丹(提问者) 这个无法这样做 你看了 我发的图了吗 我要实现那样的效果
    2020-05-19 10:16 
最佳回答
0
孤陌Lv6资深互助
发布于2020-5-19 10:38

看起来 你要加钱才有人给你回答

最佳回答
0
cd_cwLv6初级互助
发布于2020-5-19 11:12

js 动态添加 或者自定义提交 自己写java代码 

  • 王丹 王丹(提问者) 我只想用触发器 上图里 是我用FR做的填报,后面 是触发器 插入另外个表的生成的数据 我 要的效果图
    2020-05-19 11:20 
最佳回答
0
luojian0323Lv7资深互助
发布于2020-5-19 12:02(编辑于 2020-5-19 14:21)

这个简单。

image.png

image.png

image.png


image.png

  • 王丹 王丹(提问者) 上什么模板? 我求触发器的SQL啊 和FR没有关系
    2020-05-19 12:10 
  • luojian0323 luojian0323 回复 王丹(提问者) 触发器不能查询,修改,添加,删除本表内容。你要将数据生成在另外一个表。用插入后触发。
    2020-05-19 12:26 
  • 王丹 王丹(提问者) 回复 luojian0323 是啊我做2个表 一个表存FR填报数据 另外一个表就存触发器里的
    2020-05-19 12:40 
  • luojian0323 luojian0323 回复 王丹(提问者) 搞定了
    2020-05-19 13:20 
  • 王丹 王丹(提问者) 回复 luojian0323 不对 不是那么简单的 能不能认真看一下我的效果图,物品编码 加规格 日期相同的情况下 编号是0001 0002 物品编码相同 规格不同 需要编码从0001重新开始编码
    2020-05-19 13:28 
最佳回答
0
追心Lv6初级互助
发布于2020-5-20 10:03

sql server 数据库触发器如下:

create trigger tgr_in_details_data

on dbo.入库单

after insert

as

    declare @in_id nvarchar(100);

    declare @item_code nvarchar(100);

    declare @item_style nvarchar(100);

    declare @item_price nvarchar(100);

    declare @in_creator nvarchar(100);

    declare @in_count int;

    declare @in_status nvarchar(100);

    declare @in_auto_id nvarchar(100);

    declare @i int ;

    select

     @in_id = s.入库单号,

     @item_code = s.物品编码,

     @item_style = s.规格,

     @item_price = s.价格,

     @in_creator = s.人员,

     @in_count = CAST (s.数量 as int),

     @in_status = s.状态

     from inserted s;


    declare @i int

    set @i=1;

    while @i<= @in_count

    begin

        set @in_auto_id = @item_code + @item_style + CONVERT(varchar(10), GETDATE(), 112)+ right('0000'+cast(@i as varchar) ,5);

        insert into dbo.自动编号入库

        (入库单号,物品编码,规格,价格,人员,数量,状态,自动编码)

        values (@in_id,@item_code,@item_style,@item_price,@in_creator,1,@in_status,@in_auto_id);

        set @i=@i +1

    end

go


建议表和字段用字母命名,数据类型长度为固定长度。

若编译不通过,留下联系方式,我远程协助调试一下。


  • 7关注人数
  • 1000浏览人数
  • 最后回答于:2020-5-21 02:35
    请选择关闭问题的原因
    确定 取消
    返回顶部