สอนโค้ด VB2010 หน่อยค่ะ คือต้องการสร้าง CreditID ให้เป็นแบบนี้ "CR56010001" CR=ย่อมาจากคำว่าCredit, 56=พ.ศ., 01=รหัสเดือน, 0001 คือรหัสที่รันต่อท้าย
Code (VB.NET)
MessageBox.Show("CR" & Microsoft.VisualBasic.Right(Now.Year + 543, 2) & Microsoft.VisualBasic.Right("0" & Now.Month, 2) & "0001")
Date :
2013-05-16 13:24:25
By :
thep
ก็ qurey ข้อมูลออกมาก่อน ตัด string นำค่ามา + แล้วค่อยกำหนดใส่ txtCreID.Text
Date :
2013-05-17 09:03:55
By :
zero1150kfc
Code (VB.NET)
Dim sql As String = "Select isnull(max(convert(int,right(Credit_ID,len(Credit_ID)-6))),0)+1 from Credit"
Dim com As New OleDbCommand(sql, conn)
Dim max As String = com.ExecuteScalar
txtCreID.Text = ("CR" & Microsoft.VisualBasic.Right(Now.Year + 543, 2) & Microsoft.VisualBasic.Right("0" & Now.Month, 2) & Microsoft.VisualBasic.Right("000" & max, 4))
Date :
2013-05-17 10:25:49
By :
thep
อย่าบอกนะว่า query max id มาบวก 1
แล้วต่อ string ทำเป็น code เพื่อ insert
ได้โปรดอย่าทำแบบนั้นเลย
Date :
2013-05-17 12:23:47
By :
ห้ามตอบเกินวันละ 2 กระทู้
ตอบความคิดเห็นที่ : 9 เขียนโดย : ห้ามตอบเกินวันละ 2 กระทู้ เมื่อวันที่ 2013-05-17 13:53:54
รายละเอียดของการตอบ ::
ผมว่ามันแล้วแต่กรณี
ที่คุณให้ผมดู มันเป็น auto run Number มันก็คงต้องทำอย่างนั้น โอเค
แต่ถ้ากรณีที่ไม่ได้ใช้ auto run Number และเรากำหนดให้ Column นั้นๆ เป็น Primary Key ด้วย มันก็คงต้อง ใช้ max + 1
Code (SQL)
CREATE TABLE [MyTable](
[Code] [nvarchar](50) Primary Key,
[Name] [nvarchar](50) NULL
)
insert into MyTable(code,name)
select 'CR'+convert(varchar,right(year(getdate())+543,2))+right('0'+convert(varchar,month(getdate())),2)+right('000'+
convert(varchar,(select isnull(max(convert(int,right(code,len(code)-6))),0)+1 from MyTable)),4),'thaicreate'
OR
Code (SQL)
insert into MyTable(id,name)
select (select isnull(max(id),0) +1 from MyTable),'name'
Date :
2013-05-17 15:26:54
By :
thep
ผมก็พอมีบ้างครับ แต่มันก็ยังไม่สมบูรณ์สักที (2505 - ปัจจุบัน)
(ผมไม่เคยกลับทางเดิม)
ผมก็อยากทราบเหมือนกันว่า มันมีวิธีอื่นฯ ที่ดีกว่าอีกหรือไม่?
Date :
2013-05-17 15:54:47
By :
ผ่านมา
วิธีที่หนึ่ง
----- ผมจ้างโปรแกรมเมอร์เพื่อทำเอกสารโดยเฉพาะ อุปกรณ์ที่ใช้มีไม่กี่อย่าง เช่น
----- สมุดบริจาค + ดินสอ (หัก) เขียนลงไป
วิธีที่สอง
----- xxx
----- xxx
----- xxx
[x] ผมมีเวลามีไม่พอ (ต้องไปเก็บค่าเช่าบ้าน)
Date :
2013-05-17 15:57:51
By :
ผ่านมา
ต้องไปเก็บค่าเช่าบ้าน javascript:void(0);
หลบก่อน (หนี หนี หนี) +55555
(ผมไม่ได้จ่ายมา > 3 เดือนแล้วครับ) +55555
Date :
2013-05-17 16:02:00
By :
ผ่านมา
อ่า ผมพอจะเข้าใจ Concept บ้างละ IDENT_CURRENT
คือโดยปกติแล้วเราต้องการแค่ ให้ PK หรือส่วนที่เราต้องการเรียงออกมาสวยงาม
แต่การใช้งาน IDENT_CURRENT หากเราลบข้อมูลออกไป ถึงจะเป็น Row แรก แต่ค่าที่ได้ตัว ถัดไปก็ยังเป็น 2 อยู่ดี
แต่ว่า หากเรามีการลบออก 1 ตัว โดยที่ไม่ใช้ตัวที่ท้ายสุด สุดท้ายตรงนั้นก็เป้นช่องว่างอยู่ดี และพอจะทราบข้อเสียของการเอา MAX() มาค้นหาเพื่อใช้ในการเรียงแล้วครับ ซึ่งถ้าผมเข้าใจไม่ผิด มันจะไปมีปัญหาในช่วงที่ server กำลัง qurey ข้อมูลอยู่
แต่หากมีการใช้งานไม่ได้มากเท่าไหร่(หมายถึง เครื่อง server เลยนะครับ) เรื่องการใช้ MAX คาดว่าคงไม่พบปัญหาแน่นอน แต่สุดท้ายแล้ว การใช้ IDENT_CURRENT เป็นสิ่งที่สมควรใช้งานมากกว่าครับ
ลองดูที่นี้ครับ
http://iknowkungfoo.com/blog/index.cfm/2008/6/1/Please-stop-using-SELECT-MAX-id
ประวัติการแก้ไข 2013-05-17 16:05:20 2013-05-17 16:07:22
Date :
2013-05-17 16:03:42
By :
zero1150kfc
ถ้าคนเรา รู้ เท่าทันกัน นั่นคือปัญหา ?
อันนี้คือ ตรรกะ บนดาว สีแสวงเหาะ
ถ้าผมถามคุณกลับว่า (Send *)
ว่า
Computer มีกี่ภาษา?
คำตอบที่ถูกต้อง : มีภาษาเดียว
นั่นหมายถึงว่าผมเจอแล้ว บนเวปไชต์แห่งหนึ่ง และเป็นที่ที่ผมควรจะอยู่
[x]
Date :
2013-05-17 16:46:40
By :
ผ่านมา
ผมเจอแล้วกับคำตอบที่ว่า คำตอบที่ถูกต้อง : มีภาษาเดียว
ผมไม่มั่นใจว่า คนเราต้องจบ ดร. ตายไปแล้วเกิดใหม่อีกกี่ชาติ แล้วจะมีคำตอบให้ผม (ตัวเอง) ได้นั่นคือ
คอมพิวเตอร์มีกี่ภาษา?
คำตอบที่ถูกต้อง (และที่ผมต้องการ) : มันมีอยู่ภาษาเดียว
และผมเจอคำตอบนี้แล้ว บนเวปแห่งหนึ่ง
นี่คือสิ่งที่ผมต้องการ
Date :
2013-05-17 16:54:01
By :
ผ่านมา
แสดงว่า record ประจำเดือนๆนึง ไม่ถึง 9999
ถ้าให้เครื่องเดียว
แนะนำว่า ใช้ max+1
ถ้าหลายเครื่อง
0001-9999
น้อยไป มีโอกาสซ้ำแน่นอน
แต่ก็ยังพอมีวิธีอื่นๆอีก
Date :
2013-05-17 17:38:52
By :
amj
ขอบคุณทุกๆคำตอบนะคะ.....ขอบคุณอย่างยิ่งค่ะตอนนี้กระจ่างในคำตอบขึ้ันมากๆ แล้วนะคะ ขอบคุณทุกคนค่ะที่สละเวลามาตอบคำถาม
Date :
2013-05-18 11:00:12
By :
borobirt
ถ้าใช้หลาย ๆ เครื่องพร้อมกัน ระวังจะรันมาได้เลขเดียวกันน่ะครับ
Date :
2013-05-18 12:58:32
By :
fonfire
แล้วถ้าทำเป็น auto number เวลาเรียก join กันหลายตารางอะครับ เหมือนจะงงๆเวลาเรียกข้อมูล
Date :
2013-05-18 15:56:21
By :
ไก่
มันมีหลายวิธี อยู่ที่ว่าเราจะเลือกใช้?
ทุกฯวิธีมันมีข้อดี - ข้อเสีย ในตัวของมันเองเสมอครับ
ส่วนใหญ่แล้วผมมักจะใช้ แบบนี้ครับ (ดี แต่ไม่เสมอไปครับ)
RDBMS
----- Table Document Control
--------- sysCode, sysDescription, NextID
--------- GL GL 1234
--------- PO PO 4321
--------- SO SO xxx
...
...
[x] Code (VB.NET)
SyncLock getDocumentCtrl
----------- For Each x As y
---------------...
------------Next
End SyncLock
Date :
2013-05-18 17:26:32
By :
ผ่านมา
Code (SQL)
CREATE TABLE [MyTable](
[ID] [int] IDENTITY(1,1) Primary Key Clustered,
[MyCode] [nvarchar](50) NULL,
[MyName] [nvarchar](50) NULL
)
Code (SQL)
INSERT INTO MyTable
(MyCode, MyName)
VALUES ('CR' + SUBSTRING(CONVERT(NVARCHAR(4), YEAR(GETDATE()) + 543), 3, 2) + SUBSTRING(REPLACE(CONVERT(NVARCHAR(8), GETDATE(), 103), '/', ''), 3, 2)
+ REPLICATE('0', 6 - LEN(IDENT_CURRENT('MyTable'))) + CONVERT(NVARCHAR(6), IDENT_CURRENT('MyTable')), 'Thaicreate')
รันแล้วจะได้แบบนี้
// --> CR5605000001
Date :
2013-05-20 08:42:48
By :
ห้ามตอบเกินวันละ 2 กระทู้
ถ้าเป็น VB หรือ C# มันมี GUID เอามาใช่ได้ป่ะคับ มีข้อดีข้อเสียอย่างไรครับผม
Date :
2013-05-20 10:03:30
By :
ผู้อยากรู้ช่วยตอบทีขอบพระคุณครับ
ปกติผมทำแบบนี้ครับ
สร้างตารางสำหรับเก็บเลขที่สุดท้ายขึ้นมา
เป็นแบบนี้
Prefix LastID
CR1301 100
CR1302 200
เวลาใช้ก็เช็คเลขสุดท้าย
ถ้าไม่มีก็เพิ่มข้อมูลในตาราง
ถ้ามีก็เอามาบวก 1
เราก็จะได้เลขที่มาแล้วครับ
แต่เวลาบันทึกข้อมูลก็ต้องเช็คจากข้อมูลจริง อีกที เพื่อความชัวร์ ^___^"
Date :
2013-05-20 11:36:25
By :
fonfire
ตอบความคิดเห็นที่ : 7 เขียนโดย : ห้ามตอบเกินวันละ 2 กระทู้ เมื่อวันที่ 2013-05-17 12:23:47
รายละเอียดของการตอบ ::
Dim sql As String = "Select is isnull(max(convert(int,right(Credit_ID,len(Credit_ID)-6)),0)+1) from Credit"
Dim com As New OleDbCommand(sql, conn)
Dim max As String = com.ExecuteScalar ***เมื่อรันแล้วติดตรงนี้อะค่ะ ฟ้อง error แบบนี้ Syntax error (missing operator) in query expression 'is isnull(max(convert(int,right(Credit_ID,len(Credit_ID)-6)),0)+1)'.
txtCreID.Text = ("CR" & Microsoft.VisualBasic.Right(Now.Year + 543, 2) & Microsoft.VisualBasic.Right("0" & Now.Month, 2) & Microsoft.VisualBasic.Right("000" & max, 4))
Date :
2013-05-21 16:55:01
By :
borobirt
Load balance : Server 00