Winform通用模块之流水号生成
打算接下来的时间里把自己觉得用起来还比较好用的通用模块,在这里向大家介绍一下,如果你有更好的想法时,也希望你不吝指点。
1、数据库表及存储过程
在介绍这个通用流水号生成的模块前,我们先来看一下其相关的表结构:

从上图中我们可以看到,该模块用到的数据表有两个,其实用一个表也可以实现这个功能,我想很多人用到的也只是一个表,但我为什么要分为两个表,请容许我先在这儿买一个关子,接下来我再向你说明一下我要这么做的原因。
至于表的各字段是做什么用的我就不一 一解释了,如果对其中某些字段的用意不明白的话,待会看一下下面的系统界面截图,我相信你也大概就明白了。
ALTER PROCEDURE [dbo].[SysBillNoRule_GetNewNo]
@RuleID NVARCHAR(50)
AS
BEGIN DECLARE @NowDatePart AS NVARCHAR(20) BEGIN --取得日期部分
SELECT @NowDatePart = DateFormatString
FROM SysBillNoRule
WHERE RuleID = @RuleID IF @NowDatePart = 'yyMM'
SET @NowDatePart=LEFT(CONVERT(VARCHAR(6), Getdate(), 12), 4)
ELSE IF @NowDatePart = 'yyyyMM'
SET @NowDatePart=CONVERT(VARCHAR(6), Getdate(), 112)
ELSE IF @NowDatePart = 'yyMMDD'
SET @NowDatePart=RIGHT(CONVERT(VARCHAR(100), Getdate(), 112), 6)
ELSE IF @NowDatePart = 'yyyyMMDD'
SET @NowDatePart=CONVERT(VARCHAR(100), Getdate(), 112)
ELSE IF @NowDatePart = 'yyyy'
SET @NowDatePart=CONVERT(VARCHAR(4), Getdate(), 112)
ELSE IF @NowDatePart = 'yy'
SET @NowDatePart=RIGHT(CONVERT(VARCHAR(4), Getdate(), 112), 2)
ELSE
SET @NowDatePart=''
END DECLARE @maxNum AS INT BEGIN TRAN BEGIN try
--在同一个事务中,执行了update语句之后就会启动锁
UPDATE SysBillNoRule SET RuleID = RuleID WHERE RuleID = @RuleID SELECT @maxNum = maxnum
FROM SysBillNoRuleRecord
WHERE RuleID = @RuleID AND [DateFormat] = @NowDatePart IF @maxNum IS NULL
BEGIN
INSERT INTO SysBillNoRuleRecord
(RuleID,
[DateFormat],
MaxNum)
VALUES (@RuleID,
@NowDatePart,
1)
END
ELSE
BEGIN
UPDATE SysBillNoRuleRecord
SET MaxNum = MaxNum + 1
WHERE RuleID = @RuleID AND [DateFormat] = @NowDatePart
END COMMIT TRAN SELECT LTRIM(Prefix)+@NowDatePart+RIGHT(REPLICATE('', NoDigits)+LTRIM(ISNULL(@maxNum, 0) + 1),NoDigits)
FROM SysBillNoRule
where RuleID= @RuleID END try BEGIN catch
ROLLBACK TRAN
END catch
END
上面这是生成流水号的存储过程,注明一下这个存储过程的实现原理是我在网上看到的,我用多线程测试过它是不会生成重复的号。
这个存储过程之前写的是要传两个参数的,除了现在的RuleID这个参数外,还有NowDatePart这个参数,之所以先前要用两个参数,是因为我觉得这样就显得很灵活了,以后使用时就不需要再修改存储过程了(主要是针对取日期部分的修改);而之所以后来把NowDatePart参数去掉,是因为调用这存储过程有点麻烦,加之日期部分一般情况下就那么几种,所以觉得没必要因为未来可能根本就不会碰到的情况,而使现在使用起来更麻烦,简单地说就是不要过度设计。
2、系统界面
下面是该系统模块的主、子界面及单据编号记录的截图。



个人觉得实现系统功能不是最让人费脑的,最让人费脑的是怎么去设计实现功能的界面。所以在这里就不讲具体代码了,再说这功能实现也就是一些普通的增删改查,没有什么值得一提的。
接下来我就先说一下开篇说的为什么要设计成两个数据表的原因吧。从上图中我们可以看到“单据编号记录”这个界面的截图,通过这里我们可以清楚地看到每个月的单据有多少条。这是我从一个ERP系统(具体名字不记得了)借鉴过来的,虽然这不是一个必要的功能,但我自己觉得有这么一个功能就显得更加完整了。
3、结束语
其实在网上有很多的权限管理系统,但我还是觉得自己写的好,这好并不是说我用的技术比别人好,而是仅仅是在功能上自己觉得更灵活、功能更完整;当然,这些功能的构想我也只是站在别人的基础上按自己的想法来优化,更甚至只是集“万”家之所长而已。
现在把它们分享在这里,一来是把别人的玫瑰传递给更多的人,二来也是希望有更好想法的人能提一些意见,好让自己把它完善得更好。
Winform通用模块之流水号生成的更多相关文章
- 循序渐进开发WinForm项目(4)--Winform界面模块的集成使用
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- webpack 通用模块(每个页面都用到的js)编译
1.项目目录 2.配置文件:webpack.config.js var htmlWebpackPlugin = require('html-webpack-plugin'); var webpack ...
- python web自动化测试框架搭建(功能&接口)——通用模块
1.通用模块: config.conf: 公共配置文件,配置报告.日志.截图路径,以及邮件相关配置 [report] reportpath = E:\workspace\WebAutomation\s ...
- CMD规范(通用模块定义规范)(翻译)
最近在使用sea.js.大家知道sea.js遵循CMD规范.该规范的英文说明很简洁,我试着翻译了一下,旨在交流. Common Module Definition 通用模块定义规范 This spec ...
- VB 核心编程及通用模块开发 笔记1
前言:学习任何编程语言.编程工具的目的不外乎解决生活问题,能够快速.高效解决问题的方式就是不错的方式,至于选择什么“工具”,众位看官看着办,本人虽然有过3年vb开发经验,但是一直没有深入学习,现已购买 ...
- SQLSERVER之高灵活的业务单据流水号生成
SQLSERVER之高灵活的业务单据流水号生成 最近的工作中要用到流水号,而且业务单据流水号生成的规则分好几种,并非以前那种千篇一律的前缀+日期+流水号的简单形式,经过对业务的分析,以及参考网上程序员 ...
- Python基础系列讲解——random模块随机数的生成
随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...
- 在html中使用thymeleaf编写通用模块
在编写页面时,常常会需要用到通用模块,比如header部分.footer部分等. 项目前端使用的是themeleaf模板引擎,下面简单介绍下使用themeleaf写header通用模块: 1. 通用部 ...
- WinForm通用自动更新器AutoUpdater项目实战
一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件, ...
随机推荐
- Qt 智能指针学习
原地址:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include & ...
- myeclispe启动后报错 Subclipse talks to Subversion via a Java API that requires access to native libraries.
myeclispe 中SVN插件常遇到的异常: Subclipse talks to Subversion via a Java API that requires access to native ...
- 14.10.4 Defragmenting a Table 整理表
14.10.4 Defragmenting a Table 整理表: 随机插入或者删除从一个secondary index 可以导致index变的fragmented Fragmentation意味着 ...
- Jsp中使用数据库连接池.
原文 Jsp中使用数据库连接池. 1. 在tomcat服务器目录下面的conf中找到一个叫Context.xml的配置文件,在其中加入以下代码 <Resource name="jdbc ...
- 临界段CCriticalSection的使用
类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区.临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用.比如,在链 ...
- 【deep learning学习笔记】注释yusugomori的LR代码 --- 模型测试
测试部分代码: void test_lr() { srand(0); double learning_rate = 0.1; double n_epochs = 500; int train_N = ...
- 与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任务)
原文:与众不同 windows phone (12) - Background Task(后台任务)之 PeriodicTask(周期任务)和 ResourceIntensiveTask(资源密集型任 ...
- BZOJ 2096([Poi2010]Pilots-单调队列-差值)
2096: [Poi2010]Pilots Time Limit: 30 Sec Memory Limit: 162 MB Submit: 190 Solved: 97 [ Submit][ ...
- 与众不同 windows phone (19) - Device(设备)之陀螺仪传感器, Motion API
原文:与众不同 windows phone (19) - Device(设备)之陀螺仪传感器, Motion API [索引页][源码下载] 与众不同 windows phone (19) - Dev ...
- html中的table在android端显示
转载请注明出处:http://blog.csdn.net/u012338845/article/details/46773245 開始都是用Html.fromHtml(source).来显示html的 ...