作为新手求单据编号的生成根据单据规则CM{GSEN}{YYYY}-{MM}-{LSH4}”,可能生成“CMHN2008-08-0001”的编号。
   规则变量:
{YYYY} -- 4位年
{MM}   --月
{DD}    -- 日
{JD}    --季度
{GSEN}  --公司简称(字母)
{BMEN}  --部门简称(字母)
{GSCN}  --公司简称(中文)
{BMCN}  --部门简称(中文)
{LSH2}  --2位流水号
{LSH4}  --4位流水号等等
的代码

解决方案 »

  1.   

    这个LSH2 LSH4的流水号是随机的号还是连续的号?是不是年月日就是生成的日期,就是说我今天录入,那年月日就是今天?你不说明白这些代码没办法写的。
      

  2.   

    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM");
    String s=sdf.format(new Date());流水号生成要从数据库中取。。 要不然不知道现在都到几了。
      

  3.   

    你的问题真的是看不懂呢,一点都没有描述清楚。像这种问题,我认为至少要写 300 个字才能描述清楚!比如说:1,这个规则启用后一直使用这个,还是会更改规则?
    2,如果启用后规则更改,那么流水号是继续还是从 1 开始?
    3,是否会同时存在多个规则?
    4,一个规则只能用于一种单据,还是多种单据?
    5,一个单据是否会使用多种规则?
    6,像 {JD} 季度,是几位的?
    7,规则中如果使用了公司简称之类的信息,那么这些东西是从哪里得到?
    8,规则中是否必须得含有流水号?
    9,流水号只有这两种么?
    10,流水号是一直流水下去,还是每月都从 1 开始?
    11,假如每月都从 1 开始的话,而且规则中没有配置 {YYYY}-{MM} 那该怎么处理?
    12,目前流水号仅有 2 位和 4 位的,万一用光了,比如说已经用到 9999 了,那下一个流水号应该是多少?我感觉这里有一堆的问题,难道你没有?
      

  4.   

    这个问题主要是流水号的问题咯,因为前面的公司编号+公司部门+时间都是固定的咯,在一个表中合同编号字段来存储编号了,主要是通过查询该字段code like "%公司编号+公司部门+时间" 在按code 的降序排列,取第一个值,在加一咯,这段代码不知道怎么控制了,我不怎么知道写了,
      

  5.   

    以前碰到过一种这样的情况,就是每个月流水号都从0001开始算,所以流水号4位是用不完的,也就是说 上个月编码就是 2009-05-0001 **** 2009-05-0801 然后这个月的编码就是2009-06-0001 **** 2009-06-0901 ,还是不太清楚LZ的流水号生成策略,所以讲清楚比较好,如果是我说的这种策略的话 你sql语句可以用当前月份来做等值连接比你用like快的多。。
      

  6.   

    设计人员给我就是这样的了,
    我现在要做的就是写一个编号自动生成的控制类
    我的理解是:
      1.这个规则是可以在一个页面中配置的,但这个规则还是有规律的,比如说:CM{GSEN}{YYYY}-{MM}-{LSH4}这是一个规则,公司简称+公司部门简称+年份+季度+流水号;季度是两位咯,流水号是4位咯
    2.一个规则只有一种类型的编号
    3.在数据库中一个合同主表中有个字段code,这个code就是要存储自动生成编号,可以根据传过来的公司简称,部门简称,和获取当前时间,来生成,至于这个流水号可以通过where子句like“%公司简称+部门简称+年份和季度” 再按降序排列,得到第一code值,截取流水号,再在其流水号+1,就可以了,
    4.我想我理解是这样的了,
      

  7.   


    公司简称+公司部门简称+年份+月份+流水号 
    流水号每月都从 1 开始,这样能保证流水号4位是始终是够用的,不会出现暴掉的情况,如果不按这样的话,很可能不够用而爆掉,请问下您的数据库是什么数据库,这样可以直接调用具体数据库的函数。SQL语句最好不要用like,用等值连接好吧。
      

  8.   

    哦,我又仔细看了下你的问题,你的意思是 一个页面中 他们可能会配置一个 CM{GSEN}{YYYY}-{MM}-{LSH4} 也可能会配置一个 CM{GSEN}{YYYY}-{JD}-{LSH2} 这样的规则 对吧,然后你应该按他们配置的规则生成编号是吧?如果是这样的话那这里确实会存在问题,我表中已经根据原来的第一个规则生成了编码,后来他们又配置了一个规则,这个时候那编码如何生成?
      

  9.   

    你这个规则还是不清楚好吧,比如我现在已经有编码2009-06-0101了,这个时候他们又重新配置了一个编码生成策略CM{GSEN}{YYYY}-{JD}-{LSH2} , 那我现在的编码应该如何生成?是生成2009-02-01?还是生成2009-02-02?不管哪一个都是不对的好吧,流水号是2位的话肯定会出现暴掉的情况,这种情况如何处理?我感觉你自己理解的都是不太清楚,你再问清楚好吧,如果是按一种生成策略后以后永远不变的话这个类是一种写法,如果生成策略会变化那又是一种写法。
      

  10.   

    我的代码是只有一种固定格式的,你的需求是变化的,如果公司简称+公司部门简称+年份是固定的话你自己也好写,我也不多说,总体我感觉你这个是有很大问题的。这个也不多说了吧,我只说实现吧,
    对于流水号:
    //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())总体感觉你问的问题还是不清楚,编码生成是比较乱的。。
      

  11.   

    这么说吧,你可以配置,关键问题是你配置完后你怎么判断以前的数据?你现在的编码如何生成?就好像我前面举的一个例子:我原来按年份+月份+LSH4 生成的编码为 2009-06-0101 那么我现在配置改成按年份+季度+LSH2 那么我这个编码该如何生成?是按现在的配置 直接生成 2009-02- 这个是几?即使从数据库中读我该怎么办?还有问题就是,我前面是按年份来的,假如我不配置年份,那我sql语句该怎么写?10楼问的问题你能不能全部解答?
    我的感觉就是这个配置一经确定就永远使用这样才不会出问题,而且必须保证其中哪些配置是必须出现的,哪些是选填的,这样才能写好,你这个问题现在不在于编码如何敲,在于业务本身逻辑问题,逻辑搞不清楚,代码没法实现。
      

  12.   

    关注中......
     
    我也很想知道这怎么搞 我想做个结帐帐单自动生成
    YYYYMMDD00001
    这种形式的
    每天的第一个都是从00001开始,前面是年月日
      

  13.   

    那位朋友知道分解字符串咯,比如格式为{GSEN}{BMEN}{YYYY}{MM}{LSH4},我怎么活动单独{BMEN}这个字符串咯,
      

  14.   


    现在你又讲每天流水号归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? 所以就是规则一经确定最好不要修改,即使修改规则,那以前的数据也要专人来处理,而且你这个编码规则必须符合逻辑,不会出现重复歧义等等。把这个搞清楚之后再来考虑其他的,比如 并发、断号
      

  15.   

    嗯,对的,现在确定好了,这个规则是配置的,但有规律的,必须要按规则说明进行配置,比如说公司+部门+时间+流水号,这个流水号只能是两位或4位,组成形式为{}{}{}{}{}
    其中{YYYY} -- 4位年
    {MM}   --月
    {DD}    -- 日
    {JD}    --季度
    {GSEN}  --公司简称(字母)
    {BMEN}  --部门简称(字母)
    {GSCN}  --公司简称(中文)
    {BMCN}  --部门简称(中文)
    {LSH2}  --2位流水号
    {LSH4}  --4位流水号
    这些配置条件必须从以上中选择,配置好了,该规则是存在数据库中编码规则的一表的字段中,现在要做的控制类就是从数据库中读取该编码规则,在分解该编码规则这个数据,如果配置为编码规则为公司简称+部门简称+YYYY-MM-LSH2,那么就按这个配置规则生成编号,现在我不知道获取编码规则这个字符串后怎么转换为多个{}的数组了,呵呵,请哪位朋友把字符串转换为{}数组咯,呵呵
      

  16.   

    公司简称+部门简称+YYYY-MM-LSH2是不是必须是5个{}? 为什么要用正则表达式?String.split("}{")直接成数组然后判断就OK了
    LSH2,LSH4可以直接取后面的这个数字,公司、部门、中、英都可以直接字符判断的。int i=ID+1;
    //规则流水号位数 N 
    String ss="0000"+String.valueOf(i);
    return ss.substring(ss.length()- N , ss.length())
    你这个有没有并发?注意并发。。
      

  17.   

    以下是我系统中自动生成最大票据号码的函数,你参考以下 Public Shared Function Get_KZDBM_insert(ByVal DBF_Name As String, ByVal DBF_ZhiDuanMing As String, ByVal LX_Biaozhi As String, ByVal Myconn As SqlConnection) As String        '提取最大控制点编码        '定义过渡变量
            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是标示头,为了防止这个最新的号串被网络上其他用户使用,函数是直接在表中插入一带号串的纪录,如果放弃退出,要记得把这条纪录删除。
      

  18.   

    这个LSH2 LSH4的流水号是随机的号还是连续的号?是不是年月日就是生成的日期,就是说我今天录入,那年月日就是今天?你不说明白这些代码没办法写的。
      

  19.   

    这中东西,写个存储过程,用java调用一下返回。是比较简单的解决方案,关键是要定好生成规则。
    cao_cx198642 ,说的话,非常正确!必须要弄明白了才能着手!
      

  20.   

    谁给个代码啊  [email protected]