แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Nick_1234

หน้า: [1]
1
โค้ดแบบสั้นๆ ง่ายๆ ตามไฟล์แนบครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

2
ผมคิดออกแต่วิธีทื่อๆตรงๆนะครับ ไม่เทคนิคอะไร ผมคิดว่าต้องทำการป้อนผ่านฟอร์มเท่านั้นเพราะจะต้องเขียนโค้ดใน Form_BeforeUpdate event เพื่อควบคุมและค้นหาเลขตัวต่อไปของ Autonumber ซึ่event นี้จะเกิดก่อนที่จะบันทึกเรคอร์ด สิ่งที่ต้องทำก็คือ

1. เปลี่ยนประเภทข้อมูลของฟิลด์ Autonumber (สมมุติว่าชื่อฟิลด์คือ A แล้วกัน) ให้เป็น Long Integer เพื่อโปรแกรมจะได้ควบคุมค่านี้เอง เราจะไม่ปล่อยให้ Access หาค่ามาใส่ให้อย่างแต่ก่อนอีกแล้ว และต้องกำหนด A ให้คุณสมบัติ Unique Index เป็น True ด้วย ถ้า A เป็น PrimaryKey อยู่แล้ว ก็จะเป็น Unique Index โดยอัตโนมัติ

2. เพิ่มฟิลด์อีกฟิลด์เพื่อบอกให้เรารู้ว่า นี่เป็นเรคอร์ดของกลุ่มเดียวกันใน 26 เรคอร์ด เรียกชื่อว่าฟิลด์ DT สำหรับใส่ TimeStamp ก็แล้วกัน  DT มีประเภทข้อมูลเป็น Date/Time  โปรแกรมจะใส่วันเวลาปัจจุบันลงไปใน DT ให้เรคอร์ดแรกของกลุ่ม  (#2.1) ส่วนเรคอร์ดอื่นๆ โปรแกรมจะก็อปปี้ค่า DT จากเรคอร์ดชุดสุดท้ายมาใส่ให้แทน (#2.2)  หมายเหตุ : ฟิลด์ DT ไม่จำเป็นต้องใส่ในฟอร์ม

3. ในฟอร์ม ถ้ามันเป็นเรคอร์ดแรกในชุดของ 26 เรคอร์ดชุดใหม่ โปรแกรมจะใช้ค่าในฟิลด์ A ที่คุณต้องป้อนในฟอร์ม (#3.1) นำมาเป็นค่าเริ่มต้น แต่ถ้าไม่ใช่เรคอร์ดแรก โปรแกรมจะไม่สนใจค่าที่คุณป้อน แต่จะหาค่าล่าสุดของ A ในกลุ่ม 26 เรคอร์ดสุดท้าย บวกด้วย 1 แล้วเอามาใส่ที่ฟิลด์ A แทน (#3.2)

4. ถ้าเกิดกรณีที่ป้อนค่า A ซ้ำ โปรแกรมจะให้ป้อนใหม่  (#4.1) ถ้ากรณีบวก 1 แล้วเจอค่าซ้ำกับเรคอร์ดเก่า  โปรแกรมจะบวก 1 เพิ่มเติมต่อไปเรื่อยๆจนกว่าจะไม่ซ้ำ (#4.2)

ไปเปลี่ยนชื่อฟิลด์ของเทเบิลและบนฟอร์มให้ตรงกับที่คุณมีด้วยครับ
โค๊ด: [Select]
Private Sub Form_BeforeUpdate(Cancel As Integer)

Const MaxRec = 26
Dim DB          As DAO.Database
Dim RS          As DAO.Recordset
Dim MaxDTStr    As String   ' วันเวลาล่าสุดของกลุ่มเรคอร์ด (แต่เป็น string เพื่อลดความยาวของโค้ด)
Dim MaxA        As Long     ' ค่าสูงสุดของ A ในกลุ่มเรคอร์ดล่าสุด
Dim NeedA       As Boolean  ' TRUE = ระบบต้องการค่า A บนฟอร์ม

    NeedA = False
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("select max(DT) as MaxDT from TB")
    If IsNull(RS!MaxDT) Then
        NeedA = True
    Else
        ' #2.2
        MaxDTStr = Format$(RS!MaxDT, "dd/mmm/yyyy hh:nn:ss")
        Set RS = DB.OpenRecordset("select count(*) as N from TB where DT = #" & MaxDTStr & "#")
        If RS!N = 0 Or RS!N >= MaxRec Then NeedA = True
    End If
   
    If NeedA Then
        ' #3.1
        If Nz(Me.A, 0) = 0 Then
            MsgBox "ป้อน A ด้วย"
            Me.A.SetFocus
            Cancel = True: Exit Sub
        End If
       
        If Not DB.OpenRecordset("select A from TB where A = " & CStr(Me.A)).EOF Then  ' #4.1
            MsgBox "A ซ้ำของเดิม"
            Me.A.SetFocus
            Cancel = True: Exit Sub
        End If
       
        Me.DT = Now()   ' #2.1
    Else
        ' #3.2
        Me.A = DB.OpenRecordset("select max(A) as MaxA from TB where DT = #" & MaxDTStr & "#")!MaxA
        Do
            Me.A = Me.A + 1
        Loop Until DB.OpenRecordset("select A from TB where A = " & CStr(Me.A)).EOF   ' #4.2
       
        Me.DT = CDate(MaxDTStr) ' #2.2
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

3
เริ่มระแวงกระทู้ซ้ำ
ระแวงว่ามีคนตอบไปแล้ว

ถ้าตอบกระทู้ซ้ำก็นำไปรวมกับอันเดิมได้เลยครับ

วิธีการนี้ไม่ต้องเขียน Code อะไรหรอกครับ แค่เทคนิคนิดหน่อยก็ได้แล้ว


ดูวิธีการจากไฟล์ตัวอย่างนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

4
ถ้าคำนวนข้ามวันอย่างนี้คงต้องใส่วันที่เข้าไปด้วยนะครับ


ปล.ผมทำในคิวรี่ ทำไมสั่งคำนวนในเทเบิ้ลไม่ได้ครับนี่
โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

5
อธิบาย ที่มาของ Field 2 3 4 ว่าคืออะไร แล้ว Field 1 คืออะไรก่อนครับ

ผมสมมุติเป็น ตารางเก็บข้อมูลการขายสินค้า
Field1 ของคุณคือ รหัสสินค้า

เมื่อกรอกรหัสสินค้าก็จะแสดง ชื่อสินค้า  / จำนวนชิ้นต่อแพ็ค / ราคา  เป็นต้น

ถ้าเป็นแบบของคุณข้อมูล ที่คุณกรอกใน Field 1 คือรหัส ครับ แล้วสร้างตาราง เก็บรายละเอียดของรหัสนี้ครับ

ผมมีตัวอย่าง การสร้างตารางเก็บรหัสและรายละเอียด ตั้งชื่อว่า Table2
และมีฟอร์มที่สามารถนำรหัสนั้นมาระบุที่ Field1 ของฟอร์ม โดยใช้ Dlookup
ส่วน Field ที่ 3 กับ 4 ไม่แน่ใจว่าเป็นการ แยกส่วนออกมาหรือเปล่าจากตัวอย่าง MOU-SOU
แยกเป็น MOU SOU ลองดูตัวอย่างนะครับ



โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

6
เมื่อเราใส่ข้อมูลที่ Field 1 คือ BB111 แล้ว Field 2 3 4 อ้างอิงมาจากไหนครับ พวก MOU-SOU

ที่ต้องการคือเมื่อเพิ่มข้อมูลที่ Field1 ในแถวถัดไป ให้แสดง Field 2 3 4 จากข้อมูลที่ระบุใน Record ก่อนหน้าหรือเปล่า
โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

7
กำหนด Relation Ship ID ของ สองตารางนี้ครับ
แล้วทำการกำหนด RecordSource  โดย ดึงฟิลล์ Fuel On จาก Table2 มาด้วยคับ
โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

8
ตัวอย่างครับ ดูที่การ BoundControl และ การกำหนดโค้ด
โพสต์นี้ได้รับคำขอบคุณจาก: Nick_1234

หน้า: [1]