Access : จุดเริ่มต้นที่ง่ายที่สุดสำหรับการเรียนรู้ ระบบฐานข้อมูล
Access : จุดเริ่มต้นที่ง่ายที่สุดสำหรับการเรียนรู้ การเขียนโปรแกรม
Access : เป็นได้ทั้งตัวเก็บฐานข้อมูล และตัวจัดการฐานข้อมูล
Thai Access : บอร์ดเสริมการเรียนรู้ Access ด้วยภาษาไทย

น้อมรำลึกในพระมหากรุณาธิคุณอันหาที่สุดมิได้ พระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดชฯ พระผู้เสด็จสู่สวรรคาลัย

Back to Board : Thai Access Webboard New Topic    Reply
จำกัดข้อมูลซ้ำและการดึงข้อมูลก่อนหน้า

Topic by Message Posted : on : 18/7/2560 16:24:00
มือ ใหม่ ค่ะ   มี 2 เรื่องด้วยกันที่จะสออบถามอาจารย์ทุก ท่านค่ะ

สร้าง ตาราง 1 ตาราง มี ฟิลด์ Date (Date/time)/ Machine(number) /DataOld (text) / DataNew(text)

เรื่องที่ 1 การบันทึกข้อมูลซ้ำ
โดยที่จะบันทึกข้อมูลใส่ ทั้ง 2 ฟิลด์ดังนี้

Date                    machine
17/7/2560               1
17/7/2560               2

แต่ถ้าคีย์ซ้ำวันที่ 17 ไปอีกรอบ ไม่ว่าเครื่องใดก็ตามให้แสดงว่าบันทึกข้อมูลซ้ำ ไม่สามารถให้บันทึกได้

เรื่องที่ 2 การดึงข้อมูลก่อนหน้ามาแสดง ในฟอร์มการบันทึก เมื่อคีย์ข้อมูลลงไปแล้ว ให้ดึงฟิลด์ข้อมูล DataNew ของข้อมูลที่บันทึกไปล่าสุด มาแสดงในTextbox ของ Dataold เพื่อที่จะบันทึกในฟิลด์ Dataold ข้อมูลใหม่ในครั้งนั้นๆ ประมานนี้ค่ะ

หาอธิบายไม่เข้าใจ ต้องขออภัยด้วยน่ะค่ะ มือใหม่ค่ะ

ขอบคุณค่ะ

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

Reply by Message on : 18/7/2560 21:03:27
pizza_p
(R23829)
1. ตารางที่ว่า ให้ตั้งค่าที่ฟิลด์ Date ให้มีดัชนีเป็น Yes (No Duplicates) เวลาจะบันทึกวันที่ซ้ำ โปรแกรมจะไม่ยอมให้บันทึกและแจ้ง error ว่าไม่สามารถบันทึกได้

2. ที่ AfterUpdate event หลังจากคีย์ Machine แล้ว ใส่ code ประมาณนี้

Private Sub Machine_AfterUpdate()
Dim dLast As Variant, stData As String

dLast = DMax("[Date]", "ชื่อตาราง", "[Machine] = " & Me.Machine)
If IsNull(dLast) Then
    stData = ""
Else
    stData = DLookup("[DataNew]", "ชื่อตาราง", "[Date] = " & CDbl(dLast))
End If

Me.DataOld = stData

End Sub
Back to Top
Reply by Message on : 19/7/2560 9:27:50
มือ ใหม่ ค่ะ
(R23831)
1. ตั้งค่าตรงฟิลด์ Date แล้วค่ะ แต่ที่นี้ ทุกครั้งที่บันทึก วันที่มันจะซ้ำได้ 2 ครั้ง แต่ ทาง Machine จะไม่ซ้ำ

จะกำหนด ได้มั้ยค่ะ


Back to Top
Reply by Message on : 19/7/2560 9:30:42
มือ ใหม่ ค่ะ
(R23832)
เช่น บันทึก ได้

Date                    machine
17/7/2560               1
17/7/2560               2
18/7/2560               1
18/7/2560               2

ต้องการให้บันทึกแค่นี้ ถ้าหาก มีการบันทึก 17/7/2560 หรือ 18/7/2560 เข้าไปอีก เปนครั้งที่ 3 ให้ไม่สามารถบันทึก ได้ ประมานนี้ค่ะ

แต่ที่ตั้งค่า ดัชนีเป็น Yes (No Duplicates) นั้น มันจะบันทึกได้แค่ 17/7/2560 ครั้งเดียวเท่านั้น
Back to Top
Reply by Message on : 19/7/2560 13:49:14
pizza_p
(R23833)
1. ที่ฟิลด์ Date กับ Machine ให้ใส่ BeforeUpdate event ดังนี้

Private Sub Date_BeforeUpdate(Cancel As Integer)
If FindDub() = True Then
        Me.Undo
        Cancel = True
End If
End Sub

Private Sub Machine_BeforeUpdate(Cancel As Integer)
If FindDub() = True Then
        Me.Undo
        Cancel = True
End If
End Sub

2. สร้าง Function หาค่าซ้ำประมาณนี้
2.1 กรณีที่ตารางนี้มี Primary Key สมมติชื่อ K_ID ชนิด Long

Private Function FindDub() As Boolean
Dim KeyID As Variant

If IsNull(Me.K_ID) Then    'เช็คกรณีถ้าเป็น new record และเป็นคีย์แบบ Autonumber
    KeyID = 0
Else
    KeyID = Me.K_ID
End If

If IsNull(DLookup("K_ID", "ชื่อตาราง", "[Date]=" & CDbl(Me.Date) & " AND [Machine]=" & Me.Machine & " AND [K_ID]<>" & KeyID)) Then
        FindDub = False
    Else
        MsgBox "พบรายการซ้ำ...", vbCritical, "รายการซ้ำ"
        FindDub = True
    End If

End Function

2.2 กรณีที่ตารางไม่มี Primary Key

Private Function FindDup() As Boolean
Dim MyFRS As Recordset, stCriteria As String, vBookmark1 As Variant, vBookmark2 As Variant

stCriteria = "[Date]=" & CDbl(Me.Date) & " AND [Machine]=" & Me.Machine
Set MyFRS = Me.RecordsetClone
MyFRS.FindFirst stCriteria
If MyFRS.NoMatch = False Then
    vBookmark1 = MyFRS.Bookmark
    vBookmark2 = Me.Bookmark
    If vBookmark1 = vBookmark2 And (Not Me.NewRecord) Then
        MyFRS.FindNext stCriteria
        If MyFRS.NoMatch = False Then
            FindDup = True
        Else
            FindDup = False
        End If
    Else
        FindDup = True
    End If
Else
    FindDup = False
End If
MyFRS.Close
Set MyFRS = Nothing

If FindDup = True Then
    MsgBox "พบรายการซ้ำ...", vbCritical, "รายการซ้ำ"
End If

End Function

Back to Top
Reply by Message on : 20/7/2560 10:14:03
มือ ใหม่ ค่ะ
(R23835)
ขอบคุรนะคะ่
แต่ทำ ไม่ได้อ่ะค่ะ ไม่รุว่าทำผิดวิธีรึป่าว มันแจ้งเตือนว่าCompile Error : sub or function not defined อ่ะค่ะ


Back to Top
Reply by Message on : 20/7/2560 11:07:43
สมชาย
(R23836)
เพิ่มฟิวด์แรกอีก 1 ฟิวด์เป็น AutoNumber โดยกำหนดเป็น PrimaryKey แทนฟิวด์วันที่ เพื่อให้ตารางนี้ทำหน้าที่เป็น Many
Back to Top
Reply by Message on : 20/7/2560 13:46:59
pizza_p
(R23838)
แต่ทำ ไม่ได้อ่ะค่ะ ไม่รุว่าทำผิดวิธีรึป่าว มันแจ้งเตือนว่าCompile Error : sub or function not defined อ่ะค่ะ

มันไปค้างที่บรรทัดไหน เอารูปมาให้ดูได้ไหมครับ ลองดูพวก field และ control ต่างๆว่าได้ตั้งชื่อตรงกับ code ที่ผมให้ไปหรือไม่ ให้แก้ code ตามชื่อที่ใช้จริงครับ
Back to Top
Reply by Message on : 25/7/2560 10:03:22
มือ ใหม่ ค่ะ
(R23847)
[/IMG]

Back to Top
Reply by Message on : 25/7/2560 11:59:48
pizza_p
(R23849)
Function FindDub() ในข้อ 2. ไม่ได้ใส่ไว้หรือครับ
Back to Top
Reply by Message on : 26/7/2560 10:07:31
มือ ใหม่ ค่ะ
(R23851)
ใส่ไว้ใน module 1 ค่ะ ใส่ถูกมั้ยค่ะ หรือต้องใส่หน้าฟอร์ม
Back to Top
Page:   1 2 Next >>

Reply

 *Indicates required fields
Format:
Bold Under Line Italic Add Hyperlink Add Email Link Italic List Indent Add Image Emoticons Insert code Mode:
Message:*
Your Name*:
Normal word*: Please input : ไทยแอ็คเซส
+++ webboard source: ASPThai.Net Webboard 6.0 webbord +++++++ admin : yeadram +++