作为新手求单据编号的生成根据单据规则CM{GSEN}{YYYY}-{MM}-{LSH4}”,可能生成“CMHN2008-08-0001”的编号。
规则变量:
{YYYY} -- 4位年
{MM} --月
{DD} -- 日
{JD} --季度
{GSEN} --公司简称(字母)
{BMEN} --部门简称(字母)
{GSCN} --公司简称(中文)
{BMCN} --部门简称(中文)
{LSH2} --2位流水号
{LSH4} --4位流水号等等
的代码
规则变量:
{YYYY} -- 4位年
{MM} --月
{DD} -- 日
{JD} --季度
{GSEN} --公司简称(字母)
{BMEN} --部门简称(字母)
{GSCN} --公司简称(中文)
{BMCN} --部门简称(中文)
{LSH2} --2位流水号
{LSH4} --4位流水号等等
的代码
解决方案 »
- 书上例子 04-18
- 关于界面变化的小问题,指点一下
- native2ascii 转码问题
- 大家进来帮个忙,谢谢了。
- java技术交流站 群号:2303735
- 怎么定位JTextArea中闪烁的光标的位置(相对于屏幕的位置,不是getCaretPosition),也不是鼠标移动的位置?
- 有关jni一问 急 在线等.....
- Forte(tm) for Java(tm),release 2.0,Community Edition (Build 1160)是什么
- 编程题-----较有挑战性
- 哪位用过Forte(tm) for Java,请进!
- JAVA中内部类的特点?
- 刚接触JAVA,求教个关于java数组的问题。
String s=sdf.format(new Date());流水号生成要从数据库中取。。 要不然不知道现在都到几了。
2,如果启用后规则更改,那么流水号是继续还是从 1 开始?
3,是否会同时存在多个规则?
4,一个规则只能用于一种单据,还是多种单据?
5,一个单据是否会使用多种规则?
6,像 {JD} 季度,是几位的?
7,规则中如果使用了公司简称之类的信息,那么这些东西是从哪里得到?
8,规则中是否必须得含有流水号?
9,流水号只有这两种么?
10,流水号是一直流水下去,还是每月都从 1 开始?
11,假如每月都从 1 开始的话,而且规则中没有配置 {YYYY}-{MM} 那该怎么处理?
12,目前流水号仅有 2 位和 4 位的,万一用光了,比如说已经用到 9999 了,那下一个流水号应该是多少?我感觉这里有一堆的问题,难道你没有?
我现在要做的就是写一个编号自动生成的控制类
我的理解是:
1.这个规则是可以在一个页面中配置的,但这个规则还是有规律的,比如说:CM{GSEN}{YYYY}-{MM}-{LSH4}这是一个规则,公司简称+公司部门简称+年份+季度+流水号;季度是两位咯,流水号是4位咯
2.一个规则只有一种类型的编号
3.在数据库中一个合同主表中有个字段code,这个code就是要存储自动生成编号,可以根据传过来的公司简称,部门简称,和获取当前时间,来生成,至于这个流水号可以通过where子句like“%公司简称+部门简称+年份和季度” 再按降序排列,得到第一code值,截取流水号,再在其流水号+1,就可以了,
4.我想我理解是这样的了,
公司简称+公司部门简称+年份+月份+流水号
流水号每月都从 1 开始,这样能保证流水号4位是始终是够用的,不会出现暴掉的情况,如果不按这样的话,很可能不够用而爆掉,请问下您的数据库是什么数据库,这样可以直接调用具体数据库的函数。SQL语句最好不要用like,用等值连接好吧。
对于流水号:
//jdbc取数据
首先从数据库取出最大ID //普通的jdbc操作,代码略
然后int i=ID+1;
//String.valueOf(i).length() 与规则流水号位数 N 比较
比较大小,如果流水号位数小就返回错误信息
//继续进行编码生成,下面0的个数你多输入几个,
String ss="0000000000"+String.valueOf(i);
return ss.substring(ss.length()- N , ss.length())总体感觉你问的问题还是不清楚,编码生成是比较乱的。。
我的感觉就是这个配置一经确定就永远使用这样才不会出问题,而且必须保证其中哪些配置是必须出现的,哪些是选填的,这样才能写好,你这个问题现在不在于编码如何敲,在于业务本身逻辑问题,逻辑搞不清楚,代码没法实现。
我也很想知道这怎么搞 我想做个结帐帐单自动生成
YYYYMMDD00001
这种形式的
每天的第一个都是从00001开始,前面是年月日
现在你又讲每天流水号归1,上面还在说是按月……大家不明的地方就是你这个编码规则是可以配置的,如果配置更改之后如何处理,就给你举个例子,我公司A(以下简称“我”)昨天的配置规则是YYYY-MM-LSH4 生成的编码是:2009-06-0001 ~ 2009-06-0123 我今天突然改变主意了,把规则变为 YYYY-JD-LSH5 那我这个编码怎么生成?生成 2009-02-00124吗? 那我明天又改变主意了,把规则变为 GSEN-BMEN-lsh5 我这个编码怎么生成? 生成 AAAA-dept-00125 还是 AAAA-dept-00001? 如果说选择生成 AAAA-dept-00125 ,那我这个125如何来的? 那我现在一直坚持这个GSEN-BMEN-lsh5 规则不变了,下个月第一个文件的编码是什么?AAAA-dept-00001? AAAA-dept-00126? 所以就是规则一经确定最好不要修改,即使修改规则,那以前的数据也要专人来处理,而且你这个编码规则必须符合逻辑,不会出现重复歧义等等。把这个搞清楚之后再来考虑其他的,比如 并发、断号
其中{YYYY} -- 4位年
{MM} --月
{DD} -- 日
{JD} --季度
{GSEN} --公司简称(字母)
{BMEN} --部门简称(字母)
{GSCN} --公司简称(中文)
{BMCN} --部门简称(中文)
{LSH2} --2位流水号
{LSH4} --4位流水号
这些配置条件必须从以上中选择,配置好了,该规则是存在数据库中编码规则的一表的字段中,现在要做的控制类就是从数据库中读取该编码规则,在分解该编码规则这个数据,如果配置为编码规则为公司简称+部门简称+YYYY-MM-LSH2,那么就按这个配置规则生成编号,现在我不知道获取编码规则这个字符串后怎么转换为多个{}的数组了,呵呵,请哪位朋友把字符串转换为{}数组咯,呵呵
LSH2,LSH4可以直接取后面的这个数字,公司、部门、中、英都可以直接字符判断的。int i=ID+1;
//规则流水号位数 N
String ss="0000"+String.valueOf(i);
return ss.substring(ss.length()- N , ss.length())
你这个有没有并发?注意并发。。
Dim DH_tmp As String = ""
Dim SQL_Str As String
Dim My_CMD As SqlCommand '定义SQL命令串用于提取目前库中最大控制点编码
SQL_Str = "SELECT MAX(" & DBF_ZhiDuanMing & ") FROM " & DBF_Name & " WHERE " & DBF_ZhiDuanMing & " LIKE '" & LX_Biaozhi & "%'"
My_CMD = New SqlCommand(SQL_Str, Myconn)
If Myconn.State = ConnectionState.Closed Then Myconn.Open()
'开始提取最大控制点编码
Try
DH_tmp = My_Class.Execute_Scalar(My_CMD, Myconn)
Catch ex As Exception End Try
'如果返回为空,则产生第一号00001
If DH_tmp.GetType.ToString = "System.DBNull" Then
DH_tmp = LX_Biaozhi & "00001"
Else
DH_tmp = "00000" & Trim((Mid(DH_tmp, 3, 5) * 1 + 1).ToString)
DH_tmp = LX_Biaozhi & Mid(DH_tmp, DH_tmp.Length - 4, 5)
End If
Try
SQL_Str = "INSERT INTO " & DBF_Name & " (" & DBF_ZhiDuanMing & ") VALUES ('" & DH_tmp & "')"
My_CMD = New SqlCommand(SQL_Str, Myconn)
If Myconn.State = ConnectionState.Closed Then Myconn.Open()
My_CMD.ExecuteNonQuery()
'函数返回 最新编码
Return (DH_tmp)
Catch ex As Exception
MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Stop)
'如果失败则返回空串
Return ("")
Finally
If Myconn.State = ConnectionState.Open Then Myconn.Close()
End Try
End Function
如果要改变生成号码的格式,可以修改SQL_Str的赋值,比如以下代码可以生成:XX-01-20080101-0001 的格式
SQL_Str = "SELECT MAX(" & DBF_ZhiDuanMing & ") FROM " & DBF_Name & " WHERE " & DBF_ZhiDuanMing & " LIKE '" & PiaoJu_Biaozhi & "-" & Mid(fmMain.User_bmid, 1, 2) & "-" & Format(Now, "yyyyMMdd") & "-%'"
调用格式: '提取入库单号
Get_PiaoJu_DanHao_insert("RKBT", "RKDH", "RK", conn)注意:fmMain.User_bmid是一个公共变量,代表用户的部门ID, CONN是连接串,上面的"RKDH"表示从RKDT这个表提取,字段是RKDH,RK是标示头,为了防止这个最新的号串被网络上其他用户使用,函数是直接在表中插入一带号串的纪录,如果放弃退出,要记得把这条纪录删除。
cao_cx198642 ,说的话,非常正确!必须要弄明白了才能着手!