PDA

View Full Version : phát sinh mã số tự động



minhhlang
03-03-2009, 12:27
các anh cho hỏi 1 vấn đề:
- tôi có 1 bảng csdl khachhang gồm: makh, tenkhachhang, diachi
- cột makh là số từ 1,2,3....
- khi nhập vào khách hàng chỉ nhập tenkhachahng và diachi, khi lưu vào csdl thì makh sẽ lấy max makh công thêm 1.
- lần sao khi mở form khachhang lên để nhập khách hàng mới thì textbox makh sẽ tự động load lên makh để mình khỏi nhập vô.
anh nao biết chỉ giùm. tôi làm trên c#2005, csdl là sql2000

muhiepsy
03-03-2009, 15:10
nguy hiểm. nếu app của bạn là thuộc dạng multi-user application bạn có nghĩ đến trường hợp xấu nhất ko

người A mở form -> max = 6 (ví dụ vậy)

ngươi B mở form -> max = 6 (như thằng A)

khi lưu thi sao nhỉ, nếu bạn đem cái mã khách đó mà insert vào db thì sẽ bị báo primary key duplicate

trường hợp bạn dùng identity cho cột mãkh thì khi insert vô bạn ko cần chỉ định id. Nhưng khi form load thì bên A và B ID đều = 7, khi lưu xong thì 1 thằng 7 , 1 thàng id=8. Sẽ làm khách hàng thắc mắc đấy

Tốt nhât là khi form load khoan display id, Sau khi nó insert hãy select @@identity để trả lại mãkh vừa nhập vào

serivn
03-03-2009, 17:44
Nếu mà mã khách hàng của bạn là kiểu nguyên thì tốt nhất bạn lên để Identity cho nó cũng được, và đã Identity rồi thì mình không cần load nó vô Textbox nữa, xong theo mình, mã khách hàng không nên để kiểu nguyên, mà bạn có thể để trường Identity đó như là một trường khóa chính, còn mã khách hàng thì kiểu nvarchar chẳng hạn, khi mà nhập vào thì nó sẽ kiểm tra xem đã tồn tại cái mã kh đó hay chưa, nếu okie thì sẽ insert vô Database, nếu sai thì chịu khó sửa đi....lol

joga7785
04-03-2009, 16:21
Makh thì có thể cho tự nhập và nên dùng trường chữ.ví dụ như CongTy001,CongTy002.
Muốn làm như thế thì bạn :chạy vào database kiểm tra cái đuôi left(makh,3) để tìm ra số lớn nhất.rồi + cho nó 1 đơn vị.tiếp theo là nối chuỗi đó vào thành CongTy003.
Public Function TaoPhieu(ByVal TenPhieu As String, ByVal TenTruong As String, ByVal TenBang As String) As String
Dim db = New Connect
Dim text As String = ""
Dim sql As String = ((("select isnull( Max(convert(int,Right(" & TenTruong & ",len(") + TenTruong & ")-3))),0) as SoLonNhat From ") + TenBang & " Where Upper(left(") + TenTruong & ",3))='" + TenPhieu & "'"

Dim ojb As SqlDataReader = Nothing

db.MyCheck(ojb, sql)
If ojb.Read() Then
'chuyen SoLonNhat tu ojb sang int, roi +1
Dim sotang As Integer = Convert.ToInt32(ojb("SoLonNhat"))
sotang = sotang + 1
text = Convert.ToString(sotang)
Dim dai As Integer = text.Length
Dim so As Integer = 3 - dai
For i As Integer = 1 To so
text = "0" & text
Next
text = TenPhieu + text
ojb.Close()
End If
Return text
End Function

minhhlang
04-03-2009, 22:28
cám ơn các bạn đã đóng góp, tôi học học được rất nhiều, anh em nào có ý kiến xin đóng góp để mọi người cùng học hỏi

vokhanhthuy
05-03-2009, 00:15
mấy bác nhiệt tình quá

dq_ninh
05-03-2009, 01:22
Bạn có thể dùng AUTO_INCREAMENT cho cái cột makh của bạn như sau:

CREATE TABLE
(
makh INT NOT NULL AUTO_INCREASEMENT,
...
)

thì cột makh sẽ tự động tăng lên một mỗi khi bạn tạo một record mới.

Nhưng đây cũng là một con dao hai lưỡi, nếu bạn dùng makh làm khóa để kết hợp (link) với một bảng khác.

Tại sao là một con dao hai lưỡi? Hãy suy nghĩ đến khi bạn phải sửa chữa một bảng có AUTO_INCREASEMENT. Thành thử ra, hãy vô cùng cẩn thận trong việc dùng AUTO_INCREASEMENT.



các anh cho hỏi 1 vấn đề:
- tôi có 1 bảng csdl khachhang gồm: makh, tenkhachhang, diachi
- cột makh là số từ 1,2,3....
- khi nhập vào khách hàng chỉ nhập tenkhachahng và diachi, khi lưu vào csdl thì makh sẽ lấy max makh công thêm 1.
- lần sao khi mở form khachhang lên để nhập khách hàng mới thì textbox makh sẽ tự động load lên makh để mình khỏi nhập vô.
anh nao biết chỉ giùm. tôi làm trên c#2005, csdl là sql2000