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

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...
...全文
1423 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)

111,128

社区成员

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

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

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