打算接下来的时间里把自己觉得用起来还比较好用的通用模块,在这里向大家介绍一下,如果你有更好的想法时,也希望你不吝指点。

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通用模块之流水号生成的更多相关文章

  1. 循序渐进开发WinForm项目(4)--Winform界面模块的集成使用

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  2. webpack 通用模块(每个页面都用到的js)编译

    1.项目目录 2.配置文件:webpack.config.js var htmlWebpackPlugin = require('html-webpack-plugin'); var webpack ...

  3. python web自动化测试框架搭建(功能&接口)——通用模块

    1.通用模块: config.conf: 公共配置文件,配置报告.日志.截图路径,以及邮件相关配置 [report] reportpath = E:\workspace\WebAutomation\s ...

  4. CMD规范(通用模块定义规范)(翻译)

    最近在使用sea.js.大家知道sea.js遵循CMD规范.该规范的英文说明很简洁,我试着翻译了一下,旨在交流. Common Module Definition 通用模块定义规范 This spec ...

  5. VB 核心编程及通用模块开发 笔记1

    前言:学习任何编程语言.编程工具的目的不外乎解决生活问题,能够快速.高效解决问题的方式就是不错的方式,至于选择什么“工具”,众位看官看着办,本人虽然有过3年vb开发经验,但是一直没有深入学习,现已购买 ...

  6. SQLSERVER之高灵活的业务单据流水号生成

    SQLSERVER之高灵活的业务单据流水号生成 最近的工作中要用到流水号,而且业务单据流水号生成的规则分好几种,并非以前那种千篇一律的前缀+日期+流水号的简单形式,经过对业务的分析,以及参考网上程序员 ...

  7. Python基础系列讲解——random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  8. 在html中使用thymeleaf编写通用模块

    在编写页面时,常常会需要用到通用模块,比如header部分.footer部分等. 项目前端使用的是themeleaf模板引擎,下面简单介绍下使用themeleaf写header通用模块: 1. 通用部 ...

  9. WinForm通用自动更新器AutoUpdater项目实战

    一.项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能.因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件, ...

随机推荐

  1. golang各版本的变化

    https://golang.org/doc/https://golang.org/doc/go1.6https://golang.org/doc/go1.5https://golang.org/do ...

  2. PHP学习之-1.1 PHP 可以做什么?

    PHP 可以做什么? 为什么要学习PHP,"我可以用javascript来实现程序的编写."但是javascript的能力是有限的,javascript通常运行在浏览器(客户端), ...

  3. jQuery中对 input 控件的操作

    jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关 1.获取值 jquery取radio单选按钮的值 $(" ...

  4. IOS 应用的架构解析

    首先新建一个IOS 的应用工程,主要讲解一下的文件组成: main.m XXXXDelegete.h\.m MainWindow.xib info.plist 文件 IOS 应用程序由UIKit 封装 ...

  5. hdu4707 Pet

    Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  6. oracle切割字符串后以单列多行展示

    原始的sql: select substr(field1, instr(field1, '|', 1, rownum) + 1, instr(field1, '|', 1, rownum + 1) - ...

  7. struts2由<s:tree>要么dtree小工具 建立树

    一个 .<s:tree>方法: 1.引入新的标签: <%@ taglib prefix="sd" uri="/struts-dojo-tags" ...

  8. jdom dom4j解析xml不对dtd doctype进行验证(转)

    一.写在所有之前:因为dom4j和jdom在这个问题上处理的方法是一模一样的,只是一个是SAXBuilder 一个SAXReader,这里以jdom距离,至于dom4j只需要同理替换一下就可以了.二. ...

  9. Win32环境下的程序崩溃异常定位

    1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...

  10. Delphi回调函数及其使用

    Delphi回调函数及其使用 1 回调函数的概述 回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的 ...