กระทู้เก่าบอร์ด อ.Yeadram
6,023 15
URL.หัวข้อ /
URL
Autonumber รูปแบบ "ปี" ตัวเลข เช่น 540001
ผมอยากตั้งรหัสลูกค้าให้เป็นแบบ Auto Number โดยที่ 2 หลักแรกอยากให้มันรันตามปีเดียวกับคอมพิวเตอร์ ส่วนใน 4 หลักสุดท้ายให้รันเป็น AutoNumber เช่น 540001, 540002 ,550001 เป็นตั้น
อย่างนี้ทำได้มั้ยครับ
อย่างนี้ทำได้มั้ยครับ
15 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R11233
แล้วโปรแกรม Add new record ทำยังไงครับ ผมมือใหม่ต้องจอโทษด้วยนะครับ
3 @R11235
ทำไมต้องตั้งรหัสเป็นแบบนี้ครับ?
ทำเพื่อตอบสนองใคร?
มีเหตุผลหนักแน่นพอหรือไม่?
ทำเพื่อตอบสนองใคร?
มีเหตุผลหนักแน่นพอหรือไม่?
4 @R11239
ขอบคุณ คุณPichaiTC สำหรีบคำถามมากเลยนะครับ พอได้ตอบคำถามแล้วก็คิดได้
เหตุผลแรกที่ตั้งรหัสแบบนี้ เพราะอาจจะรู้ว่าลูกค้ามาใช้บริการของเราเมื่อปีไหน มีลูกค้าเก่า ใหม่มีอัตราส่วนมากต่อกันแค่ไหน เพื่อแค่อยากรู้เฉยๆครับ ผมคิดว่าถ้ามันทำได้ไม่ยากก็จะทำ แต่ถ้ามันยากไปก็ไม่จำเป็นขนาดนั้นหรอกครับ
เหตุผลแรกที่ตั้งรหัสแบบนี้ เพราะอาจจะรู้ว่าลูกค้ามาใช้บริการของเราเมื่อปีไหน มีลูกค้าเก่า ใหม่มีอัตราส่วนมากต่อกันแค่ไหน เพื่อแค่อยากรู้เฉยๆครับ ผมคิดว่าถ้ามันทำได้ไม่ยากก็จะทำ แต่ถ้ามันยากไปก็ไม่จำเป็นขนาดนั้นหรอกครับ
5 @R11241
กรณีนี้ให้ รหัสลุกค้า เป็น autonumber ธรรมดา
แต่เพิ่มเก็บวันที่บันทึกครั้งแรก หรือวันที่ติดต่อลูกค้าครั้งแรก หรือจะเก็บแค่ปีก็ได้
เวลาอยากรู้ก็ sum ตามปีเอา
แต่เพิ่มเก็บวันที่บันทึกครั้งแรก หรือวันที่ติดต่อลูกค้าครั้งแรก หรือจะเก็บแค่ปีก็ได้
เวลาอยากรู้ก็ sum ตามปีเอา
6 @R11244
ใช่ ครับ วิธี ของ คุณ PichaiTC ง่ายกว่า วิธี ของผมเยอะ ครับ
7 @R11245
ขอบคุณมากครับบ คิดไม่ถึง
8 @R11250
ผมใช้แบบนี้ ครับ
Private Sub Form_Open(Cancel As Integer)
'ตรวจสอบหมายเลย Lab Request สุดท้ายของเดือน
If DCount("LabNo", "T_TPT_LabNo", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") > 0 Then
tLabNo = DMax("LabNo", "T_TPT_LabNo", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") + 1
'เริ่มนับหนึ่ง เมื่อเริ่มเดือนใหม่
Else
tLabNo = 1
End If
'ตรวจสอบหมายเลย HN สุดท้ายของเดือน
If DCount("HN", "T_TPT_HN", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") > 0 Then
tHN = DMax("HN", "T_TPT_HN", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") + 1
Else
'ตรวจสอบหมายเลข HN สุดท้ายของปี เมื่อเริ่ม พ.ศ. ใหม่ + 1
If Left(DMax("HN", "T_TPT_HN"), 2) = Right(Year(Now) + 543, 2) Then
tHN = DMax("HN", "T_TPT_HN") + 1
Else
tHN = (Right(Year(Now) + 543, 2)) * 1000000 + 1
End If
End If
End sub
Private Sub Form_Open(Cancel As Integer)
'ตรวจสอบหมายเลย Lab Request สุดท้ายของเดือน
If DCount("LabNo", "T_TPT_LabNo", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") > 0 Then
tLabNo = DMax("LabNo", "T_TPT_LabNo", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") + 1
'เริ่มนับหนึ่ง เมื่อเริ่มเดือนใหม่
Else
tLabNo = 1
End If
'ตรวจสอบหมายเลย HN สุดท้ายของเดือน
If DCount("HN", "T_TPT_HN", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") > 0 Then
tHN = DMax("HN", "T_TPT_HN", "Year(Date)=" & Year(Now()) & " And Month(Date)=" & Month(Now()) & "") + 1
Else
'ตรวจสอบหมายเลข HN สุดท้ายของปี เมื่อเริ่ม พ.ศ. ใหม่ + 1
If Left(DMax("HN", "T_TPT_HN"), 2) = Right(Year(Now) + 543, 2) Then
tHN = DMax("HN", "T_TPT_HN") + 1
Else
tHN = (Right(Year(Now) + 543, 2)) * 1000000 + 1
End If
End If
End sub
9 @R11251
เมื่อจะ save เขียนเพิ่มนิดหน่อย
Private Sub CMD_SaveRecord_Click()
คำสั่งที่คุณเขียน save
ตามด้วย2บรรทัดข้างล่าง เพื่อให้หมายยเลข autorun
tLabNo = DMax("LabNo", "T_TPT_LabNo") + 1
tHN = DMax("HN", "T_TPT_HN") + 1
End sub
หรือไม่ก็ใช้ Update Query เพื่อเก็บหมายเลขแค่หมายเลขปัจจุบัน
Private Sub CMD_SaveRecord_Click()
คำสั่งที่คุณเขียน save
ตามด้วย2บรรทัดข้างล่าง เพื่อให้หมายยเลข autorun
tLabNo = DMax("LabNo", "T_TPT_LabNo") + 1
tHN = DMax("HN", "T_TPT_HN") + 1
End sub
หรือไม่ก็ใช้ Update Query เพื่อเก็บหมายเลขแค่หมายเลขปัจจุบัน
10 @R11258
ขอแสดงความคิด ความเห็น ความรู้สึก ความน่าจะเป็น ด้วยคนนะครับ ...
วิธีของคุณ Rexxy เกือบจะดีแล้วครับ แต่ถ้าปรับอีกนิดจะเ้พิ่มประสิทธิภาพได้มากขึ้นอีก ดังนี้
- เมื่อ โหลด/เปิด ฟอร์ม ก็ให้อ่านค่าปีปัจจุบัน เช่น 54-xxxxx มาเก็บไว้ในตัวแปร
- แล้วนับค่าจำนวนเรคคอร์ดที่มีอยู่ทั้งหมด ด้วยวิธีที่ถนัด มาเก็บไว้ในตัวแปร เช่น
(1) rst.MoveLast
myVar1 = rst.RecordCount หรือ
(2) rst.moveLast
myVar2 =rst.AbsolutePosition + 1
ทั้ง (1) และ (2) จะได้ค่าจำนวนของเรคคอร์ด ทั้งนี้ผมหลีกเลี่ยงการใช้ฟังก์ชั่น D...., D...., D...., ทั้งหลาย เนื่องจากฟังก์ชันเหล่านี้ทำงานช้า
เมื่อจะบันทึกข้อมูล ก็ใช้วิธีคล้าย ๆ กับคุณ Rexxy
แต่เราจะไม่ใช้ ฟังก์ชัน D...., D.... ทำงานอีก เพราะจะยิ่งช้าเป็น n เท่า (เพราะเรียกใช้เป็นครั้งที่ n)
เราจะใช้การเก็บค่้าไว้ในตัวแปรแบบ global ในคลาสแทน จากนั้นค่อยอัพเดทค่าตัวแปรเหล่านี้ เช่น
private tLabNo as Integer
private tHN as Integer
private sub cmdSave _Click()
...
...
tLabNo = tLabNo + 1
tHN = tHN + 1
end sub
วิธีของคุณ Rexxy เกือบจะดีแล้วครับ แต่ถ้าปรับอีกนิดจะเ้พิ่มประสิทธิภาพได้มากขึ้นอีก ดังนี้
- เมื่อ โหลด/เปิด ฟอร์ม ก็ให้อ่านค่าปีปัจจุบัน เช่น 54-xxxxx มาเก็บไว้ในตัวแปร
- แล้วนับค่าจำนวนเรคคอร์ดที่มีอยู่ทั้งหมด ด้วยวิธีที่ถนัด มาเก็บไว้ในตัวแปร เช่น
(1) rst.MoveLast
myVar1 = rst.RecordCount หรือ
(2) rst.moveLast
myVar2 =rst.AbsolutePosition + 1
ทั้ง (1) และ (2) จะได้ค่าจำนวนของเรคคอร์ด ทั้งนี้ผมหลีกเลี่ยงการใช้ฟังก์ชั่น D...., D...., D...., ทั้งหลาย เนื่องจากฟังก์ชันเหล่านี้ทำงานช้า
เมื่อจะบันทึกข้อมูล ก็ใช้วิธีคล้าย ๆ กับคุณ Rexxy
แต่เราจะไม่ใช้ ฟังก์ชัน D...., D.... ทำงานอีก เพราะจะยิ่งช้าเป็น n เท่า (เพราะเรียกใช้เป็นครั้งที่ n)
เราจะใช้การเก็บค่้าไว้ในตัวแปรแบบ global ในคลาสแทน จากนั้นค่อยอัพเดทค่าตัวแปรเหล่านี้ เช่น
private tLabNo as Integer
private tHN as Integer
private sub cmdSave _Click()
...
...
tLabNo = tLabNo + 1
tHN = tHN + 1
end sub
11 @R11263
ผมอาจไม่ลึกซึ้งนัก เพราะเพิ่งหัดเหมือนกัน
เรียนถามคุณ U&ME กรณี insert into หาก statement มันยาวมากเราตัด statement เพื่อเริ่มบรรทัดใหม่ต้องเชื่อมแบบไหนครับ ผมติดตรงนี้นานมาก
เช่น "INSERT INTO T_Amphoe (1,2,3,4,5,.......,10)" & _
" values ('" & Forms!F_A.t1 & "',...,'" & Forms!F_A.t1 & "')"
โดยที่ ครง value statement มันยาวครับ
เรียนถามคุณ U&ME กรณี insert into หาก statement มันยาวมากเราตัด statement เพื่อเริ่มบรรทัดใหม่ต้องเชื่อมแบบไหนครับ ผมติดตรงนี้นานมาก
เช่น "INSERT INTO T_Amphoe (1,2,3,4,5,.......,10)" & _
" values ('" & Forms!F_A.t1 & "',...,'" & Forms!F_A.t1 & "')"
โดยที่ ครง value statement มันยาวครับ
12 @R11264
ตัวอย่าง
13 @R11265
ตัวอย่าง
Set qdfEmployees = dbsNorthwind.CreateQueryDef( _
"NewQueryDef", "SELECT FirstName, LastName, " & _
"BirthDate FROM Employees")
ลองเปรียบเทียบชุดคำสั่งเดิม โดยไม่มีการตัดขึ้นบรรทัดใหม่
(ดูที่เครื่องหมาย _ )
หากเราลบเครื่องหมาย _ ออกไป ก็เท่ากับว่าเราทำการเชื่อม String ธรรมดานั่นเอง(โดยการใช้ "...." & "....")
Set qdfEmployees = dbsNorthwind.CreateQueryDef( "NewQueryDef", "SELECT FirstName, LastName, " & "BirthDate FROM Employees")
เพราะฉะนั้นเราจึงใช้ & _ เพื่อเชื่อมสตริงในบรรทัดปัจจุบันกับบรรทัดใหม่
และใช้ _ เพื่อเชื่อมโค้ดคำสั่งทั่วไป
Set qdfEmployees = dbsNorthwind.CreateQueryDef( _
"NewQueryDef", "SELECT FirstName, LastName, " & _
"BirthDate FROM Employees")
ลองเปรียบเทียบชุดคำสั่งเดิม โดยไม่มีการตัดขึ้นบรรทัดใหม่
(ดูที่เครื่องหมาย _ )
หากเราลบเครื่องหมาย _ ออกไป ก็เท่ากับว่าเราทำการเชื่อม String ธรรมดานั่นเอง(โดยการใช้ "...." & "....")
Set qdfEmployees = dbsNorthwind.CreateQueryDef( "NewQueryDef", "SELECT FirstName, LastName, " & "BirthDate FROM Employees")
เพราะฉะนั้นเราจึงใช้ & _ เพื่อเชื่อมสตริงในบรรทัดปัจจุบันกับบรรทัดใหม่
และใช้ _ เพื่อเชื่อมโค้ดคำสั่งทั่วไป
14 @R11266
นอกเรื่องนิดหน่อย.
ผมพึ่งสังเกตว่าถ้าข้อความที่ผมตอบกระทู้มีเครื่องหมายอย่างในรูป จะไม่สามารถตอบกระทู้ได้ ไม่ทราบว่าท่านอื่นเป็นด้วยหรือไม่ (ทดสอบดูนะครับ)
ผมพึ่งสังเกตว่าถ้าข้อความที่ผมตอบกระทู้มีเครื่องหมายอย่างในรูป จะไม่สามารถตอบกระทู้ได้ ไม่ทราบว่าท่านอื่นเป็นด้วยหรือไม่ (ทดสอบดูนะครับ)
15 @R11275
ครับ ขอบคุณครับ
Time: 0.3429s
แต่มี วิธี ที่ ใส่Manual เอง
โดย ADD RECORD สุดท้่าย ให้ เป็น เลข 540000
พอเป็น ปี 55 ก็เขียนโปรแกรม Add new record เป็น 550000
ให้เขียนโปรแกรม Addnew record ทุึกปี ครับ