积分获取和消费的存储过程学习示例_MsSql

1.GM_JF客户账户积分表

2. GM_JF_DETAIL客户账户积分消费记录

3. GM_JF_ACTION _RULES积分动作规则表

4.GM_JF_GOODS _RULES积分商品规则表

复制代码 代码如下:

-- ===============测试=======================================================
/*
declare @StatusCode int = 1;
exec sp_GM_JF_AddScore 'admin','AN_JF_001_001',1,5,0,'',@StatusCode output
print @StatusCode
*/
-- ===========================================================================
/*
* 判断是否重复获取积分(首次完善个人资料,首次修改密码等等不能重复获取积分)
* 判断是根据 从GM_JF_DETAIL(详情表)查询周期内的数据条数与GM_JF_ACTION_RULES(动作规则表)内的周期重复次数对比
* 如果大于等于周期重复次数,则为重复获取积分
* 接下来
*     1.详情表的数据入库
*     2.判断总积分表是否存在对应客户的总积分 没有则插入一条新的,有 则读取其数据,并更新
*
*/
ALTER PROCEDURE [dbo].[sp_GM_JF_AddScore]
@ACCOUNT_ID     varchar(30),
@JF_CategoryNumber varchar(15),
@CARD_NUM     int,
@HQ_JF_AMOUNT     int,
@State     varchar(16),
@USE_DESC     varchar(400),

@StatusCode     int output     -- 状态码: 0:失败 1:成功 2: 不能重复获取
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

declare
@repetitionsCycle     float=0,    --周期(天)
@repetitionsCycle_second    int=0,--周期(秒)
@repetitionsFrequency     int=0,    --一个周期内允许最大次数
@realFrequency     int=0,     --实际周期

@USE_DATE     datetime = GETDATE();
--是否重复获取积分
select top(1) @repetitionsCycle=RepetitionsCycle,@repetitionsFrequency=RepetitionsFrequency from GM_JF_ACTION_RULES where AN_CategoryNumber=@JF_CategoryNumber;

if(@repetitionsCycle<1)
BEGIN
set @repetitionsCycle_second = (@repetitionsCycle-1)*24*60*60;
select @realFrequency=COUNT(1) from GM_JF_DETAIL where ACCOUNT_ID=@ACCOUNT_ID and JF_CategoryNumber=@JF_CategoryNumber and USE_DATE <= @USE_DATE and USE_DATE >= CONVERT(varchar(19),DATEADD(SECOND,-@repetitionsCycle_second,@USE_DATE),120)
END
ELSE
BEGIN
select @realFrequency=COUNT(1) from GM_JF_DETAIL where ACCOUNT_ID=@ACCOUNT_ID and JF_CategoryNumber=@JF_CategoryNumber and USE_DATE <= @USE_DATE and USE_DATE >= CONVERT(varchar(10),DATEADD(DAY,-(@repetitionsCycle-1),@USE_DATE),120)
END   

if(@realFrequency>=@repetitionsFrequency)    --实际周期大于周期次数
begin
set @StatusCode = 2;
return 2;
end

declare @count int = 0;     --数据条数
declare @temp_table table    --表变量
(
ACCOUNT_ID varchar(30),
JF_AMOUNT decimal(16,2),
TTL_JF_AMOUNT decimal(16,2),
Last_Update_Time datetime,
[Version] int
);

begin tran;
--插入详情
insert into GM_JF_DETAIL
(ACCOUNT_ID,JF_CategoryNumber,CARD_NUM,HQ_JF_AMOUNT,[State],USE_DESC)
values
(@ACCOUNT_ID,@JF_CategoryNumber,@CARD_NUM,@HQ_JF_AMOUNT,@State,@USE_DESC)

--填充表变量
insert into @temp_table select ACCOUNT_ID,JF_AMOUNT,TTL_JF_AMOUNT,Last_Update_Time,[Version] from GM_JF where ACCOUNT_ID=@ACCOUNT_ID
select @count = count(1) from @temp_table;
--判断并更新总积分(0:添加 其他:修改)
IF(@count=0)
begin
insert into GM_JF(ACCOUNT_ID,JF_AMOUNT,TTL_JF_AMOUNT)
values
(@ACCOUNT_ID,@HQ_JF_AMOUNT,@HQ_JF_AMOUNT)
end
else
begin
declare @JF_AMOUNT int,     --总积分
@TTL_JF_AMOUNT int,    --可用积分
@Version int;     --版本号

select @JF_AMOUNT=JF_AMOUNT,@TTL_JF_AMOUNT=TTL_JF_AMOUNT,@Version=[Version] from @temp_table where ACCOUNT_ID=@ACCOUNT_ID;

update GM_JF set JF_AMOUNT=(@JF_AMOUNT+@HQ_JF_AMOUNT),TTL_JF_AMOUNT=(@TTL_JF_AMOUNT+@HQ_JF_AMOUNT),Last_Update_Time=GETDATE(),[Version]=(@Version+1) where ACCOUNT_ID=@ACCOUNT_ID
end

Commit tran;
set @StatusCode = 1;

IF(@@ERROR<>0)
BEGIN
set @StatusCode = 0;
ROLLBACK tran;
END
END

时间: 2024-10-12 04:59:37

积分获取和消费的存储过程学习示例_MsSql的相关文章

积分获取和消费的存储过程学习示例

  这篇文章主要介绍了积分获取和消费的存储过程学习示例,这个只是学习一下存储过程的使用方法,需要的朋友可以参考下 1.GM_JF客户账户积分表 2. GM_JF_DETAIL客户账户积分消费记录 3. GM_JF_ACTION _RULES积分动作规则表 4.GM_JF_GOODS _RULES积分商品规则表   -- ===============测试======================================================= /* declare @Stat

SQL Server常用存储过程及示例_MsSql

分页: 复制代码 代码如下: /*分页查找数据*/ CREATE PROCEDURE [dbo].[GetRecordSet] @strSql varchar(8000),--查询sql,如select * from [user] @PageIndex int,--查询当页号 @PageSize int--每页显示记录 AS set nocount on declare @p1 int declare @currentPage int set @currentPage = 0 declare @

sql清空表数据后重新添加数据存储过程的示例_MsSql

复制代码 代码如下: ALTER PROCEDURE [dbo].[sp_add_Jurisdiction]@CTableName varchar(20), --当前要删除.新增的表@filedkeyValue varchar(20), --要删除的字段值@filedName varchar(20), --要删除的字段名@filedNameAdd1 varchar(20), --要新增的字段名1@filedNameAdd2 varchar(20), --要新增的字段名2@sql varchar(

Android本地缓存DiskLruCache完整详细学习示例

MainActivity如下: package cc.vv; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import libcore.io.DiskLruCache; import libcore.io.Utils; import android.os.Bundle; import android.os.Handler; import android.os.Message; impo

MySql存储过程学习知识小结_Mysql

什么是存储过程: 存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了. 存储过程的好处: 1.由于数据库执行动作时,是先编译后执行的.然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高. 2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率. 3.通过存储过程能够使没有权限的

Android编程之SurfaceView学习示例详解_Android

本文实例讲述了Android编程之SurfaceView学习示例.分享给大家供大家参考,具体如下: SurfaceView是View的子类,使用的方式与任何View所派生的类都是完全相同的,可以像其他View那样应用动画,并把它们放到布局中. SurfaceView封装的Surface支持使用本章前面所描述的所有标准Canvas方法进行绘图,同时也支持完全的OpenGL ES库. 使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法

Android编程之View简单学习示例_Android

本文实例讲述了Android编程之View简单学习示例.分享给大家供大家参考,具体如下: View,是Android的一个超类,这个类几乎包含了所有的屏幕类型.每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展. 在游戏开发中叶可以自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要.在Android中,任何一个View类都只需重写onDraw 方法来实现界面显示,自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式等. 游戏的核心是不断地绘图和刷新界面,An

Java如何获取Date的“昨天”与“明天”示例代码_java

前言 相信大家在java中用到的最多的时间类莫过于 java.util.Date了,由于Date类中将getYear() , getMonth()等获取年.月.日的方法都废弃了,所以本文的问题要借助于Calendar来实现了,下面来直接看示例代码吧. 使用日历类:Calendar @Test public void dateTest() { Date today = new Date(); for(int i=0;i<10;i++) { today = yesterday(today); Sys

js获取url中指定参数值的示例代码

 这篇文章主要是对js获取url中指定参数值的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 如下所示: 代码如下:  ///获取url中指定参数         // <param name="paras">参数名称</param>         ///         function request(paras) {             var url = location.href;             var paraStr