รบกวนดูโค้ด auto number หน่อยครับ
กระทู้เก่าบอร์ด อ.Yeadram

 2,909   22
URL.หัวข้อ / URL
รบกวนดูโค้ด auto number หน่อยครับ

รบกวนสอบถามผู้รู้ และอาจารย์สันติสุขครับ

Option Compare Database
Option Explicit


Private Sub Form_Load()

End Sub

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord , , acNewRec
End Sub

Private Sub Text3_AfterUpdate()
Dim strdate As String
Dim intNum As Integer, intMax As Integer


strdate = Format(Date, "yyyy-mm")

If DCount("[p_number]", "query1") = 0 Then
               [p_number] = 1
               Me.P_ID = strdate & "-" & Format([p_number], "000")
Else

               [p_number] = DMax("[p_number]", "query1") + 1
               Me.P_ID = strdate & "-" & Format([p_number], "000")
              
End If

            SendKeys "{f9}", True
    [¿ÍÃìÁÂèÍ tbl_PostData].Requery
    
End Sub
'Private p_number As String

Private Sub Command17_Click()
On Error GoTo Err_Command17_Click


    DoCmd.GoToRecord , , acNewRec
    
    Dim strdate As String
Dim intNum As Integer, intMax As Integer


strdate = Format(Date, "yyyy-mm")

If DCount("[p_number]", "query1") = 0 Then
               [p_number] = 1
               Me.P_ID = strdate & "-" & Format([p_number], "000")
Else
       
            
               [p_number] = DMax("[p_number]", "query1") + 1
               Me.P_ID = strdate & "-" & Format([p_number], "000")
              
End If

              If Me.p_number >= 5 Then
               Me.p_number = 1
            End If

            SendKeys "{f9}", True
    [¿ÍÃìÁÂèÍ tbl_PostData].Requery

DoCmd.GoToControl "P_Name"



Exit_Command17_Click:
    Exit Sub

Err_Command17_Click:
    MsgBox Err.Description
    Resume Exit_Command17_Click
    
End Sub

ผลลัพท์ที่ได้คือ ...

P_Date                         P_ID
31/10/2016     2016-10-001
31/10/2016     2016-10-002
31/10/2016     2016-10-003
31/10/2016     2016-10-004
31/10/2016     2016-10-005
31/10/2016     2016-10-005
31/10/2016     2016-10-005
31/10/2016     2016-10-005
31/10/2016     2016-10-005
31/10/2016     2016-10-005
31/10/2016     2016-10-005
31/10/2016     2016-10-005
31/10/2016     2016-10-005

รบกวนสอบถามครับ คำถามคือ ผมจะรันเลขท้ายโดยเมื่อถึงเลข 150 ให้นับ 1 ใหม่ ดังตัวอย่างด้านล่างนี้ครับ

P_Date                         P_ID
31/10/2016     2016-10-149
31/10/2016     2016-10-150
31/10/2016     2016-10-001
31/10/2016     2016-10-002


ต้องแก้ไขโค้ดตรงไหน อย่างไรบ้างครับ รบกวนด้วยนะครับทำมาเป็นอาทิตย์และคับไม่ได้สักทีอ่าคับ ขอบพระคุณมากครับผม

22 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R22654
ปัญหาคือ พอถึง 150 แล้ว เลขต่อไปก็ยังคงเดือน 10 เอาไว้หรือ ? ถ้าอย่างนี้จะใช้ DMAX( ) หาก็ไม่มีประโยฃน์นะ เพราะคุณจะได้ผลของ DMAX( ) ของ P_ID = 2016-10-150 เสมอ และเลขต่อไปก็จะถูกสร้างเป็น 2016-10-001 ไปเรื่อยๆเสมอ จริงไหมครับ !

แล้วทำไมต้องมีทั้ง Text3_AfterUpdate และ Command17 ด้วย ?
2 @R22656
ถามเพิ่มเติม

1. ทำไมถึงต้องออกแบบให้วิ่งตัวเลขถึงแค่ 150 จะวิ่งต่อไปเรื่อยๆไม่ได้หรือ ? จุดประสงค์ของ P_ID คืออะไร ?

2. ถ้า P_Date เริ่มวันใหม่ P_ID จะเริ่มจาก 001 ใหม่หรือไม่ ?

3. เดือน/ปีใน P_Date จะเท่ากับ ปี-เดือนใน P_ID เสมอหรือไม่ ?
3 @R22657
เรียน อาจารย์สันติสุขที่เคารพครับ

จากโค้ดดังกล่าว ผม Copy มาจากเว็บนอกแล้วนำมาดัดแปลงครับ ซึ่งโค้ดดังกล่าว คือ การจัดเก็บเอกสารสำคัญลงกล่อง โดยกำหนดให้ใน 1 กล่อง เก็บเอกสารได้จำนวน 150 ชิ้น ครับผม ส่วนคำถามผมจะตอบในข้อความสีแดงครับผม

ถามเพิ่มเติม

1. ทำไมถึงต้องออกแบบให้วิ่งตัวเลขถึงแค่ 150 จะวิ่งต่อไปเรื่อยๆไม่ได้หรือ ? จุดประสงค์ของ P_ID คืออะไร ?

ผมเก็บเอกสารสำคัญไว้ในกล่อง โดยให้แต่ละกล่องมีจำนวนเอกสารต่อกล่อง 150 ชิ้น ครับ อาจารย์เลยต้องกำหนดไว้แค่เลข 150 ครับผม พอถึงเลข 150 ก็ให้รันเลข 1 ใหม่ครับ ส่วนเลข 10 คือเลขที่กล่องครับ เช่น 2016-10-150 คือ ปี 2016 กล่องที่ 10 ลำดับที่ 10 ครับผม จริงๆ แล้วผม อยากให้พอถึง เลข 150 แล้ว นับ 1 ใหม่ โดยให้ขึ้นกล่องใหม่ เช่น
2016-10-150
2016-11-001
2016-11-002 ครับ แต่ผมรันแบบนั้นไม่เป็นครับอาจารย์


2. ถ้า P_Date เริ่มวันใหม่ P_ID จะเริ่มจาก 001 ใหม่หรือไม่ ?

ส่วน P_Date คือ วันที่บันทึกข้อมูลในระบบครับผม ซึ่งตรงนี้ผมให้ผู้ใช้งานคีย์ข้อมูลวันที่เองครับ ส่วน P_ID จะเริ่มจะ 001 ไปเรื่อยๆจนถึง 150 ครับผม พอถึง 150 ก็ให้นับ 001 ใหม่ครับ เนื่องจากใน 1 กล่องผมกำหนดให้บรรจุเอกสาร 150 ชิ้น ต่อกล่องเท่านั้นครับผม


3. เดือน/ปีใน P_Date จะเท่ากับ ปี-เดือนใน P_ID เสมอหรือไม่ ?
ใช่ครับอาจารย์

โค้ดทั้งหมดที่ได้สอบถามมาผมไม่ค่อยจะเข้าใจสักเท่าไหร่ครับ เพราะผมเพิ่งหัดใช้ Access ครับ จึงเรียนสอบถามอาจาย์ดังที่กล่าวมาข้างต้น หากตรงไหนต้องแก้ไข ลบ หรือเพิ่มเติม รบกวนอาจาย์แนะนำด้วยครับผม

ด้วยความเคารพอย่างสูงครับ
4 @R22658
ขอแก้ไขข้อนี้ครับ พิมผิดไปนิดนึงครับผม

1. ทำไมถึงต้องออกแบบให้วิ่งตัวเลขถึงแค่ 150 จะวิ่งต่อไปเรื่อยๆไม่ได้หรือ ? จุดประสงค์ของ P_ID คืออะไร ?

ผมเก็บเอกสารสำคัญไว้ในกล่อง โดยให้แต่ละกล่องมีจำนวนเอกสารต่อกล่อง 150 ชิ้น ครับ อาจารย์เลยต้องกำหนดไว้แค่เลข 150 ครับผม พอถึงเลข 150 ก็ให้รันเลข 1 ใหม่ครับ ส่วนเลข 10 คือเลขที่กล่องครับ เช่น
2016-10-150
หมายความว่า ปี 2016 กล่องที่ 10 ลำดับที่ 150 ครับผม
จริงๆ แล้วผม อยากให้พอถึง เลข 150 แล้ว นับ 1 ใหม่ โดยให้ขึ้นกล่องใหม่ เช่น

2016-10-149
2016-10-150
2016-11-001
2016-11-002 ครับ

แต่ผมรันแบบนั้นไม่เป็นครับอาจารย์
5 @R22659
ผมอยู่ข้างนอก ไม่สะดวกเขียนโค้ดบนมือถือ ไว้ค่ำๆจะเขียนให้ดู ถามอีกหน่อยครับ ถ้าเขียนให้สร้าง PID ขึ้นกับเดือน/ปีปัจจุบัน แต่ถ้าเกิน 150 จะใช้เลขลำดับถัดไปของเดือน/ปีถัดไปแทนตามที่คุณบอก อย่างนี้โอเคไหมครับ

และจะให้สร้างเลขนี้ตอนไหนครับ เป็นตอนที่คลิก command17 ดีไหม ?
6 @R22660
เรียน อาจารย์สันติสุขที่เคารพครับ

ถ้าเขียนให้สร้าง PID ขึ้นกับเดือน/ปีปัจจุบัน แต่ถ้าเกิน 150 จะใช้เลขลำดับถัดไปของเดือน/ปีถัดไปแทนตามที่คุณบอก อย่างนี้โอเคไหมครับ

ตอบครับ ถ้าเขียนให้สร้าง PID ขึ้นกับเดือน/ปีปัจจุบัน - ได้ครับอาจาย์สันติสุข ทั้งนี้โค้ดข้างต้นที่เรียนมาผมก๊อปแล้วมาดัดแปลงครับ หากอาจาย์เห็นว่ามีวิธีอื่นหรือโค้ดตัวอื่นที่ดีกว่าหรือง่ายกว่าก็ได้ครับ ส่วนการรันลำดับอยากให้เริ่มที่ 001 ไปเรื่อยๆ โดยถ้าเกิน 150 จะให้นับ เลข 001 ใหม่ ทั้งนี้เมื่อนับเลขใหม่ ก็ให้กล่อง ขึ้นลำดับใหม่ด้วยครับ เช่น

ปี        กล่องที่    ลำดับที่
2016-        10-          149
2016-        10-          150
2016-        11-          001
2016-        11-          002
2016-        11-          003

และจะให้สร้างเลขนี้ตอนไหนครับ เป็นตอนที่คลิก command17 ดีไหม ?
ตอบครับ ได้ครับอาจารย์สันติสุข

ขอบพระคุณมากครับอาจาย์สันติสุข

ด้วยความเคารพอย่างสูงครับ
7 @R22661
ลองพิจารณาดูน่าจะเป็นว่าเลขกล่องไม่ได้ขึ้นกับเดือนเลย แต่ขึ้นกับปีเท่านั้น เช่นเดือน 12 แต่กล่องจะวิ่งไปถึง 40 กล่องก็ได้ โค้ดที่ผมให้ไปก็จะเป็นอย่างนี้

(ตรงส่วนที่เป็น ?? ให้คุณไปเปลี่ยนเป็นชื่อฟอร์มของคุณเองนะครับ และส่วนที่อ่านจาก query1 ผมก็เปลี่ยนให้อ่านจากเทเบิลโดยตรง ดังนั้นตรง "ชื่อเทเบิล" ก็เปลี่ยนให้ถูกต้องด้วยครับ)

Private Sub Command17_Click()
Dim CurrYear    As String
Dim Where       As String

Dim LastDocID   As String
Dim NewDocID    As String

Dim CurrBoxNo   As String
Dim NextBoxNo   As String
Dim NextRunNo   As String

On Error GoTo Err_Command17_Click

    DoCmd.GoToRecord , , acNewRec

    CurrYear = Year(Date)

    Where = "P_ID like '" + CurrYear + "*'"
    LastDocID = Nz(DMax("P_ID", "ชื่อเทเบิล", Where), "")
    
    ' ถ้าในปีนั้นยังไม่ได้มีการรันเลขอะไรเลย ก็จะเป็นใบแรกของกล่องแรกของปี
    If LastDocID = "" Then
        NewDocID = CurrYear + "-01-001"
    
    ' ถ้าเป็นเลข 150 ของกล่อง ก็ให้เปลี่ยนเป็นใบแรกของกล่องเลขถัดไป
    ElseIf Right$(LastDocID, 3) >= "150" Then
        NextBoxNo = Format$(Val(Mid$(LastDocID, 6, 2)) + 1, "00")
        NewDocID = CurrYear + "-" + NextBoxNo + "-001"
    
    ' ถ้ากล่องเดิมยังไม่เต็ม ก็เปลี่ยนเฉพาะเลขรันเอกสารเป็นเลขถัดไปเท่านั้น
    Else
        CurrBoxNo = Mid$(LastDocID, 6, 2)
        NextRunNo = Format$(Val(Right$(LastDocID, 3)) + 1, "000")
        NewDocID = CurrYear + "-" + CurrBoxNo + "-" + NextRunNo
    End If
    
    Me.P_ID = NewDocID
    SendKeys "{f9}", True
    [??].Requery
    
    DoCmd.GoToControl "P_Name"

Exit_Command17_Click:
    Exit Sub

Err_Command17_Click:
    MsgBox Err.Description
    Resume Exit_Command17_Click
End Sub

8 @R22662
ขอบพระคุณมากครับอาจารย์สันติสุขที่ช่วยชีวิตผมไว้ครับ
9 @R22663
เรียน อาจารย์สันติสุขที่เคารพครับ

อาจารย์สันติสุขครับ พอรันถึงเลข 150 แล้ว ระบบก็รันต่อไป 151,152,153 และทุกครั้งที่กดปุ่มขึ้น error แบบนี้ครับ
microsoft access can't find the field 'l1' referred to in your expression
รบกวนอาจารย์อีกครั้งครับผม ขอบคุณมากครับ
10 @R22664
ก่อนจะทำค่าด้านล่าง ต้องทำเป็น string ก่อนหรือเปล่าครับอาจารย์ครับ

   ' ถ้าเป็นเลข 150 ของกล่อง ก็ให้เปลี่ยนเป็นใบแรกของกล่องเลขถัดไป
    ElseIf Right$(LastDocID, 3) >= "150" Then
11 @R22665
เอาโค้ดที่คุณแก้ไขจากที่ผมบอกแล้ว เอามาแปะให้ดูหน่อยครับ
12 @R22666
เรียน อาจารย์สันติสุขที่เคารพครับ

โค้ดทั้งหมดครับ

Option Compare Database
Option Explicit

Private Sub Command17_Click()
Dim CurrYear    As String
Dim Where       As String

Dim LastDocID   As String
Dim NewDocID    As String

Dim CurrBoxNo   As String
Dim NextBoxNo   As String
Dim NextRunNo   As String

On Error GoTo Err_Command17_Click

    DoCmd.GoToRecord , , acNewRec

    CurrYear = Year(Date)

    Where = "P_ID like '" + CurrYear + "*'"
    LastDocID = Nz(DMax("P_ID", "tbl_PostData", Where), "")
     
    ' ถ้าในปีนั้นยังไม่ได้มีการรันเลขอะไรเลย ก็จะเป็นใบแรกของกล่องแรกของปี
    If LastDocID = "" Then
        NewDocID = CurrYear + "-01-001"
       
    ' ถ้าเป็นเลข 150 ของกล่อง ก็ให้เปลี่ยนเป็นใบแรกของกล่องเลขถัดไป
    ElseIf Right$(LastDocID, 3) >= "5" Then
        NextBoxNo = Format$(Val(Mid$(LastDocID, 6, 2)) + 1, "00")
        NewDocID = CurrYear + "-" + NextBoxNo + "-001"
     
    ' ถ้ากล่องเดิมยังไม่เต็ม ก็เปลี่ยนเฉพาะเลขรันเอกสารเป็นเลขถัดไปเท่านั้น
    Else
        CurrBoxNo = Mid$(LastDocID, 6, 2)
        NextRunNo = Format$(Val(Right$(LastDocID, 3)) + 1, "000")
        NewDocID = CurrYear + "-" + CurrBoxNo + "-" + NextRunNo
    End If
     
    Me.P_ID = NewDocID
    SendKeys "{f9}", True
    [frm_TestAutonumber].Requery
     
    DoCmd.GoToControl "P_Name"

Exit_Command17_Click:
    Exit Sub

Err_Command17_Click:
    MsgBox Err.Description
    Resume Exit_Command17_Click
End Sub


โดยตารางเทเบิล tbl_PostData รายละเอียดดังนี้ครับ

Field Name                 Data Type

P_Date                      Date/Time
P_ID                             Text
P_Name                        Text
P_Addres                      Text
P_Phone                      Text
p_number                     Number

ซึ่งพอรันถึงเลข 150 แล้ว ระบบก็รันต่อไป 151,152,153 และทุกครั้งที่กดปุ่มขึ้น error แบบนี้ครับ
microsoft access can't find the field 'l1' referred to in your expression

รบกวนอาจารย์ตรวจสอบดูให้หน่อยครับผม ขอบพระคุณมากครับอาจารย์

ด้วยความเคารพอย่างสูง
13 @R22667
ElseIf Right$(LastDocID, 3) >= "5"
ทำไมของคุณเป็น 5 หล่ะ ต้อง 150 สิครับ
14 @R22668
อ่อ ขอบคุณครับอาจารย์ พิมพ์ตกไปตัวนึงครับ แต่ก็ยังรันเหมือนเดิมนะครับอาจาย์
15 @R22669
ได้และครับ อาจารย์ ขอบพระคุณมากๆครับผม ติดอย่างเดียวเวลากดปุ่มมันขึ้น microsoft access can't find the field 'l1' referred to in your expression เป็นเพราะอะไรหรอครับผม
16 @R22672
โค้ดนี้ได้ดัก error เอาไว้แล้ว ถ้าเกิด error เมื่อไหร่ก็จะกระโดดมาที่บรรทัด MsgBox Err.Description และจะออกจากโค้ดนี้ไป ส่วนอื่นๆในโค้ดนี้จะไม่ถูกทำงาน เลขก็จะสร้างออกมาไม่ได้ น่าจะผิดที่ส่วนอื่นของโปรแกรมคุณมากกว่า
17 @R22673
ลองแก้ที่บรทัด [frm_TestAutonumber].Requery ให้เป็น Forms("frm_TestAutonumber").Requery แทนครับ

แล้วก็เท็กซ์บ็อกซ์ที่ชื่อ P_Name มีอยู่บนฟอร์มจริงหรือไม่ คุณอาจจะผูกเท็กซ์บ็อกซ์กับฟิลด์ P_Name ก็จริง แต่ตัวเท็กซ์บ็อกซ์อาจจใช้ชื่ออื่น ถ้าเป็นชื่ออื่นก็ให้แก้ที่บรรทัด DoCmd.GoToControl "P_Name" ให้ถูกต้องด้วย
18 @R22674
ขอบพระคุณมากครับอาจาย์สันติสุขครับผม
19 @R22675
เวลากดปุ่มมันขึ้น microsoft access can't find the field 'l1' referred to in your expression หาไป๊ (l) ไม่เจออะครับอาจารย์ - -*
20 @R22676
หากระทู้เก่าๆเรื่องการทำดีบักนะครับ จะได้หาว่ามีปัญหาที่บรรทัดไหน
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3411s