自动生成流水编号!!!挺难的!!!

u010703853 2013-08-27 01:43:41
大家帮我个忙呗!!!自动生成流水编号!这个问题我很头疼!不好实现!!求代码》》》
问题是:
当选择类别A中的1, 类别B中的01时,自动生成的编号为101001 当下次再同样选择类别A 和B时,自动生成101002, 101003,101004...
当选择类别A中的1,类别B中的02时,自动生成的编号为102001 当下次再同样选择类别A 和B时,自动生成102002, 102003,102004...
当选择类别A中的2,类别B中的01时,自动生成的编号为201001 当下次再同样选择类别A 和B时,自动生成201002, 201003,201004...
当选择类别A中的2,类别B中的02时,自动生成的编号为202001 当下次再同样选择类别A 和B时,自动生成202002, 202003,202004...
...全文
1323 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
极地_雪狼 2013-08-29
  • 打赏
  • 举报
回复
既然有1000多个,干嘛不多加一位顺序号呢。弄个6位。不就解决了。
SEMichael 2013-08-29
  • 打赏
  • 举报
回复
如果要解决后续尾号数值问题 如:101999的时候,再添加的话会是102000 将流水编号另存一个字段吧 A类Code +B类Code +流水尾号 1 01 999 【流水编号生成方式】 A类Code+B类Code+(max(流水尾号) +1) 101999=>1011000
SEMichael 2013-08-29
  • 打赏
  • 举报
回复
补充一下 将A类的Code+B类的Code值+max(流水号) 这样子就可以生成了。 此处如果设置了默认值的话就不用这样子了,只须 以max(流水号)+1即可(如果max(流水号不存在,就要设定初始的值的形式如 1010001))
SEMichael 2013-08-29
  • 打赏
  • 举报
回复
为何要放到一起呢 分开存不好吗 A Code 1 2 3 B Code 01 02 03 将这两个类的值保存到流水号的表, 生成流水号时 where A类Code值=1 and B类Code值=01 取到Max(流水号) 将A类的Code+B类的Code值+max(流水号) 这样子就可以生成了。
  • 打赏
  • 举报
回复
怎么形式啊?我的流水编号设置的是101001 101002 。。。。。。101999 可是现在数据太多,我想重新设置成1010001 1010002 ....... 1010999 1011000 该怎么修改呢? 该不会一个个的修改吧。 my gard!!!!!!!!!!!
cswjh 2013-08-28
  • 打赏
  • 举报
回复
string t1 ="101"; string strsql = "select * from test where 流水编号 like '%" + t1 + "%' "; dv = Das.CreateDataView(strsql); int tt = dv.Table.Rows.Count; int temp = 0; if (tt > 1) { for (int i = 0; i < tt; i++) { if (i == 0) { string tt1 = Convert.ToString(dv.Table.Rows[i][0]); tt1 = tt1.Substring(3, 4); temp = Convert.ToInt32(tt1); } else { string tt1 = Convert.ToString(dv.Table.Rows[i][0]); tt1 = tt1.Substring(3, 4); int temp1 = Convert.ToInt32(tt1); if (temp1 > temp) { temp = temp1; } } } string stemp = Convert.ToString(temp + 1).Trim(); int st = stemp.Length; if (st == 1) { stemp = "000" + stemp; } else if (st == 2) { stemp = "00" + stemp; } else if (st == 3) { stemp = "0" + stemp; } else if (st == 4) { stemp = stemp; } this.Label3.Text = t1 + Convert.ToString(stemp).Trim(); } else if (tt == 1) { for (int i = 0; i < tt; i++) { string tt1 = Convert.ToString(dv.Table.Rows[i][0]); tt1 = tt1.Substring(3, 4); temp = Convert.ToInt32(tt1) + 1; } string stemp = Convert.ToString(temp).Trim(); int st = stemp.Length; if (st == 1) { stemp = "000" + stemp; } else if (st == 2) { stemp = "00" + stemp; } else if (st == 3) { stemp = "0" + stemp; } else if (st == 4) { stemp = stemp; } 流水编号 = t1 + Convert.ToString(stemp).Trim(); } else { 流水编号 = t1 + "0001"; }
卧_槽 2013-08-28
  • 打赏
  • 举报
回复
引用 18 楼 u010703853 的回复:
可是又出来一个问题: 比如当我添加到101999的时候,再添加的话会是102000,可是我想得到1011000.怎么办呢!我定义的101和102不是同一个结构! 求解,该怎么设置呢???? 大家给个建议呗!!!
莫伸手,伸手必被抓。
  • 打赏
  • 举报
回复
可是又出来一个问题: 比如当我添加到101999的时候,再添加的话会是102000,可是我想得到1011000.怎么办呢!我定义的101和102不是同一个结构! 求解,该怎么设置呢???? 大家给个建议呗!!!
  • 打赏
  • 举报
回复
我做出来了! 给大家分享下: 我的思路是 先查询项目1,项目2 (拼接起来)的最大值 在赋值给料号的文本框 改变项目1和项目2的文本框内容时候: protected void TextBox项目1_TextChanged(object sender, EventArgs e) {string NO1 = ""; string NO2 = ""; string NO3 = "%"; string NO = ""; NO1 = TextBox4.Text.ToString(); NO2 = TextBox5.Text.ToString(); NO = NO1.ToString() + NO2.ToString()+NO3.ToString(); // SqlConnection conn = new SqlConnection("server=.;database=custom;"); conn.Open(); SqlCommand comm = new SqlCommand("select max(Cust_No)+1 NewNo from custom where Cust_No LIKE '"+NO+"'", conn); SqlDataReader sdr = comm.ExecuteReader(); while (sdr.Read()) { T_kehuNO.Text = sdr["NewNo"].ToString(); } sdr.Close(); conn.Close(); }
  • 打赏
  • 举报
回复
icdbow(13楼的) ,您给的思路也很对,可是具体怎么操作呢?我是真的不会! 还有就是我最讨厌用sql中的存储过程了,可以不用存储过程嘛? 亲爱的大家,快来帮我这个可爱的小羔羊吧!!!
Code従業員 2013-08-27
  • 打赏
  • 举报
回复
很像会计科目设计经常使用的方法
建立下表

层次id 已编号 名称 位数 父级id
1 1 第一层 1 null
2 1 第二层 2 1
3 1 第三层 3 2

再哪一层增加项目,就查找哪层的已编号数,位数不够的前边补0

如再第二层增加科目,就取父级条目(第一层)已编号 + 第二层已编号加一,作为流水号
推荐使用递归,这样可以做无限级

代码自填
  • 打赏
  • 举报
回复
下班回家喽 慢慢研究吧

create table 流水表(编号 nvarchar(10))
insert into 流水表 values ('102001')


IF EXISTS(SELECT * FROM	sys.objects o WHERE	o.object_id = OBJECT_ID('dbo.abc'))
	DROP FUNCTION dbo.abc
GO
CREATE FUNCTION dbo.abc
(
	@TYPEA	NVARCHAR(10),
	@TYPEB	NVARCHAR(10)
)
RETURNS VARCHAR(15)
BEGIN
	DECLARE @ID	VARCHAR(15)
	
	IF	EXISTS(
		SELECT	*
		FROM	流水表 m
		WHERE	
			@TYPEA+@TYPEB = SUBSTRING(m.编号,1,3)	
	)	
		BEGIN
			SET	@ID = (SELECT MAX(m.编号) FROM 流水表 m WHERE @TYPEA+@TYPEB = SUBSTRING(m.编号,1,3))
			SET	@ID = RIGHT(@ID, 3) + 1
			SET	@ID = 1000 + @ID
			SET	@ID = RIGHT(@ID, 3)
			SET	@ID = @TYPEA+@TYPEB + CAST(@ID AS CHAR(3))
		END
	ELSE
		SET @ID = @TYPEA+@TYPEB + '001'
	RETURN @ID
END

DECLARE @ID	VARCHAR(15)
set @ID=dbo.abc('1','02')
select @ID

/*
102002
*/
CqCoder 2013-08-27
  • 打赏
  • 举报
回复
假设 数据库 存在表 TB_SerialNum 结构: 主键 类型 流水号 2 typeA 101002 3 typeB 102002 c# : string 流水号=DBHelperSQL.ExecuteScalar("select Max(流水号) FROM TB_SerialNum WHERE 类型='typeA'").ToString(); if(string.isnullOrempty(流水号)) { 流水号="101001"; } string 新流水号=(int.Parse(流水号)+1).ToString(); DBHelperSQL.ExecuteSql("INSERT INTO TB_SerialNum VALUES('typeA','"+新流水号+"' )");//插入 新流水号到 TB_SerialNum
  • 打赏
  • 举报
回复
9楼 您教训的是,可是,我是真不会,一头雾水。。。。我现在还是一个菜鸟。。。。。 还有就是4楼说的string.Format,怎么使用,我组织不好语言啊!!!
clark_kidd 2013-08-27
  • 打赏
  • 举报
回复
懒人,技术一路没有捷径,伸手党必将灭亡
  • 打赏
  • 举报
回复
引用 3 楼 CXJ0062008 的回复: 這個不是很簡單嗎?自己寫個取得編號的方法 1.你可以直接根據條件去取他的最大MAX(NO) 2.你也可以在每次保存的時候把NO保存在一個表中,下次直接加一就是了 類別字段,序號, Bill_Type,Number A1B01 101001 A1B02 102001 ..... 下次你只要在此直基礎上加1,再更新此表 .......................................... 怎么去写那个语句呢?还有代码???? 方法不错,就是写不出啦! 好人做到底呗,哥哥
  • 打赏
  • 举报
回复
这不就是直接拼一下么。。。 int.parse("1"+"02"+"00") 不就是10200
一枚小菜 2013-08-27
  • 打赏
  • 举报
回复
引用 3 楼 CXJ0062008 的回复:
這個不是很簡單嗎?自己寫個取得編號的方法 1.你可以直接根據條件去取他的最大MAX(NO) 2.你也可以在每次保存的時候把NO保存在一個表中,下次直接加一就是了 類別字段,序號, Bill_Type,Number A1B01 101001 A1B02 102001 ..... 下次你只要在此直基礎上加1,再更新此表
同意!
我是小数位 2013-08-27
  • 打赏
  • 举报
回复
我本人就是用的第二種,編號方法比較靈活,參數也有好幾個,這個是按具體需求而定!也加了定制制號的相關單據 如果送貨單,按月統計按天生成,SA201308270001後面四位流水號,下個月又從這個開始,也可以按年統計,按月生成,SA13080001,流水號長度都是參數控制,所以怎麼樣的需求就怎麼寫
threenewbee 2013-08-27
  • 打赏
  • 举报
回复
不难,用string.Format自己拼接就可以。
加载更多回复(3)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧