กระทู้เก่าบอร์ด อ.Yeadram
        
           6,457   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.0950s
    
      
		
แต่มี วิธี ที่ ใส่Manual เอง
โดย ADD RECORD สุดท้่าย ให้ เป็น เลข 540000
พอเป็น ปี 55 ก็เขียนโปรแกรม Add new record เป็น 550000
ให้เขียนโปรแกรม Addnew record ทุึกปี ครับ