ขอไอเดียป้องกันข้อมูลซ้ำ


0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

20 ก.ค. 61 , 16:23:19
อ่าน 3656 ครั้ง

prajak

ขอไอเดียป้องกันข้อมูลซ้ำ
« เมื่อ: 20 ก.ค. 61 , 16:23:19 »
รบกวนขอไอเดียเรื่องการป้องกันการCopyข้อมูลแล้วไม่editแก้ไขข้อมูลที่copyมาครับ คือผมสร้างฟอร์มOrderสินค้า แล้วสร้างปุ่มcopyเพื่อสะดวกสำหรับผู้ใช้งาน หากมีรายละเอียดของorderเหมือนๆเดิม ก็ให้copyมาเลย แล้วค่อยมาแก้ไขข้อมูลแค่บางอย่าง แต่บังเอิญคนcopy ข้อมูลมา แต่ลืม edit แก้ไข ทำให้ข้อมูลมันซ้ำกันทุกๆฟิวด์ พอจะมีแนวทางหรือเปล่าครับ
ปล. บางฟิวด์จะมีค่าเหมือนกันมากกว่า1Record จึงไม่สามารถเขียนดักว่าห้ามซ้ำได้ แต่ที่ผมคิดได้ตอนนี้คือ สมมติเราcopyมาแล้วแต่ไม่มีแก้ไข จะไม่ยอมให้ save อะไรประมาณนี้ครับ หรือให้โปรแกรมมองว่าห้ามข้อมูลที่เหมือนกันทุกฟิวด์มีมากกว่า1Record เป็นต้น
 
หน้าตาโปรแกรมตามรูปครับ และผมแนบข้อมูลมาให้ช่วยดูครับ
« แก้ไขครั้งสุดท้าย: 20 ก.ค. 61 , 16:44:14 โดย prajak »

 

21 ก.ค. 61 , 13:25:42
ตอบกลับ #1

สันติสุข

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #1 เมื่อ: 21 ก.ค. 61 , 13:25:42 »
ปกติในระบบงาน ทุกเทเบิลจะมีการกำหนดฟิลด์ที่เป็น Primary Key เอาไว้ ระบบฐานข้อมูลจะไม่ยอมให้ค่าในฟิลด์เหล่านี้ซ้ำกัน  Primary Key อาจประกอบไปด้วยหลายฟิลด์ก็ได้  แต่ถ้ามี Primary Key อยู่แล้ว ก็กำหนด Key อื่นๆเพิมเติมก็ได้ และกำหนด Unique property ของ Key นั้นเป็น No หรือ Yes เพื่อให้ค่าในฟิลด์ซ้ำกันหรือไม่ซ้ำกันเหมือนคุณสมบัติของ Primary Key ก็ได้  (Key เหล่านี้รวมๆกันจะอยู่ในหมวดที่ Access เรียกว่า Indexes) 

ในกรณีของออเดอร์สินค้า หมายเลขออเดอร์จะไม่ซ้ำกันอยู่แล้ว ถ้าธุรกิจคุณเป็นแบบออเดอร์เดียวมีแค่รายการเดียว ก็กำหนดฟิลด์หมายเลขออเดอร์เป็น Primary Key ไปได้เลย ดังนั้นเมื่อก็อปปี้มาแล้ว ถ้าไม่แก้ไขค่าฟิลด์ที่เป็น Primary Key ระบบก็จะฟ้องออกมาและไม่ยอมบันทึกลงเทเบิลให้ แต่ถ้าที่ป้อนเป็นแค่รายการหนึ่งในหลายๆรายการในใบออเดอร์ ก็จะต้องหาฟิลด์อื่นๆมารวมกับเลขออเดอร์เพื่อเป็น Primary Key ถ้าระบบไม่ยอมให้ออเดอร์สินค้าตัวเดียวกันปรากฏมากกว่าหนึ่งรายการในออเดอร์หนึ่งๆ ก็เอาฟิลด์เลขอเดอร์และฟิลด์รหัสสินค้ามารวมเป็น Primary Key ได้  แต่ถ้าระบบยอม ก็ต้องหาอย่างอื่นมาเพิ่มเติมเข้าไปอีกเพื่อให้แตกต่างจากรายการอื่นๆในใบนั้นให้ได้ หรือกำหนดฟิลด์หมายเลขบรรทัดรวมกับฟิลด์หมายเลขออเดอร์ก็เป็นวิธีหนึ่งที่ทำๆกันครับ
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, Somsak472

21 ก.ค. 61 , 15:01:33
ตอบกลับ #2

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #2 เมื่อ: 21 ก.ค. 61 , 15:01:33 »
ขอบคุณอาจารย์ที่ให้คำแนะนำครับ ถึงตอนนี้ผมยังนึกไม่ออกเลยครับ ว่าจะหาฟิวด์ไหนเป็น pimary key ร่วม เนื่องจากแต่ละฟิวด์มีโอกาศซ้ำกันมากกว่า1ทั้งหมด ส่วนการกำหนดฟิลด์หมายเลขบรรทัดคือยังไงอะครับ

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

21 ก.ค. 61 , 16:44:39
ตอบกลับ #3

สันติสุข

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #3 เมื่อ: 21 ก.ค. 61 , 16:44:39 »
กรณีออเดอร์ 1 ใบมีได้หลายรายการ  ก็นึกถึงรูปแบบใบสั่งซื้อทั่วๆไปนี่แหล่ะครับ  รายการแรกในใบออเดอร์ก็มีค่าของเลขบรรทัดเป็น 1  รายการที่สองก็เป็น 2  อย่างนี้ไปเรื่อยๆ  ส่วน Primary Key ก็ประกอบด้วยสองฟิลด์ ฟิลด์เลขใบออเดอร์และฟิลด์เลขบรรทัดครับ
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

23 ก.ค. 61 , 10:38:37
ตอบกลับ #4

ปิ่นณรงค์

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #4 เมื่อ: 23 ก.ค. 61 , 10:38:37 »
ข้อมูล ที่ Copy มาแก้ไข ส่วนที่แก้ไขส่วนใหญ่มีตรงไหนบ้างครับ แล้วมี Field ไหนที่ต้องไม่ซ้ำกันบ้างครับ
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

23 ก.ค. 61 , 11:37:39
ตอบกลับ #5

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #5 เมื่อ: 23 ก.ค. 61 , 11:37:39 »
เอาจริงๆแล้ว มีโอกาสแก้ไขทุกส่วนเลยครับ อาจจะcopyมาแล้วเปลี่ยนstyle หรือเปลี่ยน จำนวน หรือ description แล้วแต่สถานการณ์ครับ และก็อีกเช่นกัน ทุกฟิวด์มีโอกาสซ้าได้หมดเลย ยกเว้นแค่ ID ที่เป็น AutoNumber เท่านั้นครับ
ที่ผมคิดได้ตอนนี้คือจะต้องไม่มี reccord ทีมีข้อมูลเหมือนกันทุกฟิวด์ครับ

 

23 ก.ค. 61 , 17:32:24
ตอบกลับ #6

ปิ่นณรงค์

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #6 เมื่อ: 23 ก.ค. 61 , 17:32:24 »
 ผมว่าจะเช็คขากการไม่ซ้ำกันของข้อมูลทั้งหมดคงไม่น่าใช่

ถ้ากำหนดเชคค่า ของ invoice  ETD date Duedate และ paiddate ถ้า4อันนี้เหมือนกัน ทุกField ก็แสดงว่าซ้ำกัน เพราะเลขที่ใบกำกับภาษี น่าจะไม่เหมือนกันนะคับ
:love: :grin:
 

23 ก.ค. 61 , 17:54:33
ตอบกลับ #7

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #7 เมื่อ: 23 ก.ค. 61 , 17:54:33 »
ณ ตอน copy ข้อมูล ช่อง invoice etd duedate paidate จะยังไม่มีข้อมูลเลยครับ คนคีย์จะcopy Order ทีเดียว10 Order อะไรประมาณนี้ครับ

 

23 ก.ค. 61 , 18:09:00
ตอบกลับ #8

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #8 เมื่อ: 23 ก.ค. 61 , 18:09:00 »
เช็ค4ฟิวด์เหมือนกันแสดงว่าซ้ำกันได้ใช่ไหมครับ งั้นผมขอกำหนด4ฟิวด์ดังนี้นะครับ
1 PD#
2 Style
3.Description
4.QTY PCS

รบกวนด้วยนะครับ
หากเห็นตัวอย่างคำสั่ง ผมอาจนำมาปรับใช้ เผื่อ4ฟิวด์นี้ยังแก้ปัญหาไม่ได้

 

24 ก.ค. 61 , 08:53:02
ตอบกลับ #9

ปิ่นณรงค์

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #9 เมื่อ: 24 ก.ค. 61 , 08:53:02 »
เช็ค4ฟิวด์เหมือนกันแสดงว่าซ้ำกันได้ใช่ไหมครับ งั้นผมขอกำหนด4ฟิวด์ดังนี้นะครับ
1 PD#
2 Style
3.Description
4.QTY PCS

รบกวนด้วยนะครับ
หากเห็นตัวอย่างคำสั่ง ผมอาจนำมาปรับใช้ เผื่อ4ฟิวด์นี้ยังแก้ปัญหาไม่ได้

ผมเคยทำโปรแกรมตัวนึงเป็นกรณี Copy ข้อมูลมาแก้ไขแบบของคุณ Prajak นี้ละครับ แต่ผมจะมี Field เพิ่มมาอีก Filed นึงไว้สำหรับเก็บค่าการ แก้ไขข้อมูล โดยกำหนดให้เมื่อ Copy ข้อมูลมา เราจะไม่ดึงค่า จาก Field Edit มาด้วย มันจึงเป็นค่าว่างอยู่โดยค่าว่างนี้จะ อัพเดทข้อมูลก็ต่อเมื่อกดปุ่ม Edit แล้ว โดยปุ่ม Editจะจัดเก็บวันที่ปัจจุบันใน Field Edit เมื่อเราต้องการ Copy ข้อมูลต่อไป หรือทำขั้นตอนต่อไป (กรณี Copy มาแล้วลืม Edit) ก็ให้คำสั่งเช็คค่าว่างของ Field Edit  ตรวจสอบ ถ้าว่างอยู่ก็มีการแจ้งเตือนขึ้นมาทันที ประมาณนี้ครับ ส่วนตัวอย่างเดี่ยวลองทำให้ดูครับ
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

24 ก.ค. 61 , 10:01:52
ตอบกลับ #10

ปิ่นณรงค์

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #10 เมื่อ: 24 ก.ค. 61 , 10:01:52 »

ตัวอย่างนะครับ
ผมได้เพิ่มส่วนตรวจสอบข้อมูลกรณีผู้คีย์ Copy ข้อมูล มา
1.เมื่อ Copy มาแล้วไม่ได้กด ปุ่มแก้ไข(Save Record) แล้ว ไปทำขั้นตอนอื่นๆ เช่น Filter OD หรือ Style หรือ กดเพิ่ม Record ใหม่ หรือ กดปุ่มปิดฟอร์ม จะไม่สามารถทำได้และ มีข้อความแจ้งเตือนขึ้นมาพร้อมระบุ ID ที่มีปัญหา ถ้าไม่ต้องการแก้ไข สามารถลบ Record ทิ้งได้
2.เมื่อกดปุ่มแก้ไข จะมีวันที่แก้ไขแสดงที่ล่างขวาของโปรแกรม และจะสามารถ Copy หรือทำขั้นตอนต่อไปได้
3.ผมเปลี่ยนคำสั่งเป็น Code ทั้งหมด (ผมไม่ถนัด Macro) เพราะต้องเพิ่ม ส่วนที่้ตรวจสอบ
4.ผมปิดปุ่มปิด ของฟอร์มแล้วสร้าง ปุ่มที่้ปิดขึ้นมาแทนเพื่อให้สามารถตรวจสอบก่อนปิดได้

ส่วนการตรวจสอบ 4 Field นั้นเป็นการ Checkว่ามีที่ซ้ำกันที่ ID อะไรบ้างเพื่อไว้ตรวจสอบข้อมูลทั้งหมดภายหลัง
ผมใช้ การสร้าง Query หาค่าซ้ำกัน ของ 4 Field แล้ว ให้แจ้งเลข ไอดีที่มีค่าซ้ำกัน ซึ่งคุณสามารถนำไปประยุกต์ใช้ต่อได้ครับ


โค๊ด: [Select]
Private Sub Duplicate_Click()
    Dim rstObj As DAO.Recordset, msgStr As String
    Set rstObj = CurrentDb.OpenRecordset("FindDuplicate")
    Do While Not rstObj.EOF
        msgStr = msgStr & rstObj.Fields("ID") & vbCrLf
        rstObj.MoveNext
    Loop
    Call MsgBox(msgStr, , "ตรวจสอบพบ ID ที่ข้อมูลซ้ำกัน!!!!")
    Set rstObj = Nothing
End Sub

หมายเหตุ FindDuplicate คือชื่อคิวรี่ 
            ID คือ ส่วนที่เราต้องการให้แสดง ผลออกมา

ตัวอย่างด้านล่างครับ
« แก้ไขครั้งสุดท้าย: 24 ก.ค. 61 , 13:11:15 โดย ปิ่นณรงค์ »
:love: :grin:
 

24 ก.ค. 61 , 11:30:10
ตอบกลับ #11

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #11 เมื่อ: 24 ก.ค. 61 , 11:30:10 »
ขอบคุณมากครับ แต่เจอปัญหาจุดหนึ่งครับ กรณี copy มาแล้วไม่มีการแก้ไข แล้วเราต้องการลบทิ้ง ปรากฏว่าหลังจากลบแล้วกดออกจากโปรแกรมไม่ได้ มันจะบังคับให้กดบันทึกก่อนครับ
พอกดบันทึก กลายเป็นไปเพิ่ม record ว่างเปล่ามาอีก1record ครับ

ปล. ตรงวันที่ที่มีการแก้ไข ต้องการให้แสดงเวลาด้วยได้หรือเปล่าครับ ผมไปปรับformat เวลาแล้วยังไม่ได้ครับ

 

24 ก.ค. 61 , 11:35:37
ตอบกลับ #12

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #12 เมื่อ: 24 ก.ค. 61 , 11:35:37 »
ส่วนของวันที่และเวลา ทำได้แล้วครับ

 

24 ก.ค. 61 , 11:54:01
ตอบกลับ #13

ปิ่นณรงค์

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #13 เมื่อ: 24 ก.ค. 61 , 11:54:01 »
ปกติ เมื่อเราลบข้อมูลจาก Form แล้ว สั่งให้โปรแกรมไปยัง Record ท้ายสุดก็ได้คับ
พอดีคุณสร้าง Macro มาผมเลยเพิ่มส่วนที่ต้องใส่เพิ่มดังนี้ครับ


เพิ่มเติมถ้าคุณต้องการให้แสดงวันที่และเวลาตรงปุ่ม Save แก้จาก Date เป็น now ดังนี้
โค๊ด: [Select]
Private Sub save_Click()
Me.EDTDATE = now
DoCmd.RunCommand acCmdSave
End Sub
« แก้ไขครั้งสุดท้าย: 24 ก.ค. 61 , 13:10:56 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

24 ก.ค. 61 , 21:29:14
ตอบกลับ #14

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #14 เมื่อ: 24 ก.ค. 61 , 21:29:14 »
นั่นหมายถึงว่า ถ้าเราcopyมาแล้วเผลอกดsave เลย(ถึงแม้โอกาสเกิดขึ้นน้อยมากก็ตาม) ก็ยังมีโอกาสซ้ำอีกได้ใช่ไหมครับ เดี๋ยวผมว่าจะลองเพิ่มคำสั่งให้ตอนกดsaveอีกชั้นหนึ่ง ให้เช็คฟิวด์PD#ว่ามีซ้ำหรือเปล่า(เพราะช่องPD#ข้อมูลมีโอกาสซ้ำน้อยที่สุดแต่ก็ยังมีอยู่)โดยที่พอกดsave ก็จะมีคำถามว่ามีPD#นี้อยู่แล้ว ต้องการบันทึกหรือไม่ กดyes ก็ยอมให้PD#ซ้ำได้ ถ้าno ก็ ยกเลิก ประมาณนี้ครับ อย่างน้อยก็เป็นการช่วยเตือนอีกชั้นหนึ่งครับ คุณปิ่นณรงค์เห็นว่ายังไงบ้างครับ

 

24 ก.ค. 61 , 21:51:12
ตอบกลับ #15

ปิ่นณรงค์

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #15 เมื่อ: 24 ก.ค. 61 , 21:51:12 »
โค๊ด: [Select]
Private Sub save_Click()
 Dim rstObj As DAO.Recordset, msgStr As String
 Me.Dirty = False
    Set rstObj = CurrentDb.OpenRecordset("FindDuplicate")
    Do While Not rstObj.EOF
        msgStr = msgStr & rstObj.Fields("ID") & vbCrLf
        rstObj.MoveNext
    Loop
    If IsNull(msgStr) Or msgStr = "" Then
    Me.EDTDATE = Now
    DoCmd.RunCommand acCmdSave
    Else
    Call MsgBox(msgStr, , "ตรวจพบ ID ซ้ำกัน !!!!")
    End If
     Set rstObj = Nothing
End Sub
ที่ปุ่ม Save แก้เป็นแบบนี้ครับ
คือถ้าเจอ ID ไหนซ้ำกันก็จะแจ้งเดือน ปกติ ถ้าเพิ่ง Copy มาแล้ว Save แล้วมันจะแจ้งว่า ID ไหน ซ้ำกับ ID ไหน พอเราแก้ไขกดเซฟไปก็จะสามารถเซฟได้แล้วครับ
« แก้ไขครั้งสุดท้าย: 24 ก.ค. 61 , 22:18:13 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

25 ก.ค. 61 , 08:25:16
ตอบกลับ #16

prajak

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #16 เมื่อ: 25 ก.ค. 61 , 08:25:16 »
โค๊ด: [Select]
Private Sub save_Click()
 Dim rstObj As DAO.Recordset, msgStr As String
 Me.Dirty = False
    Set rstObj = CurrentDb.OpenRecordset("FindDuplicate")
    Do While Not rstObj.EOF
        msgStr = msgStr & rstObj.Fields("ID") & vbCrLf
        rstObj.MoveNext
    Loop
    If IsNull(msgStr) Or msgStr = "" Then
    Me.EDTDATE = Now
    DoCmd.RunCommand acCmdSave
    Else
    Call MsgBox(msgStr, , "ตรวจพบ ID ซ้ำกัน !!!!")
    End If
     Set rstObj = Nothing
End Sub
ที่ปุ่ม Save แก้เป็นแบบนี้ครับ
คือถ้าเจอ ID ไหนซ้ำกันก็จะแจ้งเดือน ปกติ ถ้าเพิ่ง Copy มาแล้ว Save แล้วมันจะแจ้งว่า ID ไหน ซ้ำกับ ID ไหน พอเราแก้ไขกดเซฟไปก็จะสามารถเซฟได้แล้วครับ
ลองเอาcodeไปวางไว้ในคำสั่งsaveแล้วได้ผลครับ แต่จะรบกวนคุณปิ่นณรงค์ช่วยอธิบายcodeนี้ให้หน่อยครับ ว่ามันเช็คที่ฟิวด์อะไรบ้างถึงแจ้งว่าซ้ำกันอะครับ พอดีผมดูไม่ออกครับ

 

25 ก.ค. 61 , 08:29:54
ตอบกลับ #17

ปิ่นณรงค์

: ขอไอเดียป้องกันข้อมูลซ้ำ
« ตอบกลับ #17 เมื่อ: 25 ก.ค. 61 , 08:29:54 »
คำสั่งนี้ไป ดึง Record จากคิวรี่ชื่อ FindDuplicate มาครับ โดยที่คิวรี่นี้ ได้ทำให้ตรวจสอบ Field 4 Field ที่เราจะหาค่าซ้ำกัน
ถ้าที่คิวรี่มีข้อมูลแสดงขึ้นมา(มีค่าซ้ำกัน) โค้ดนี้จะไป ดึงเอา ID มาแสดงข้อความบนฟอร์ม และใช้ในการตรวจสอบการซ้ำกันคือ ถ้าคิวรี่นี้ไม่มีข้อมูล(คือไม่ซ้ำกัน) ก็สามารถเซฟได้ครับ

ถ้าจะดูวิธีการตั้งค่าหาค่าซ้ำกันดูได้ที่คิวรี่ FindDuplicate  เลยครับ

[PD #],[STYLE],[DESCRIPTION],[PIECES]

4 Field ที่ผมดึงมาหาค่าซ้ำครับถ้าอยากได้ Field เพิ่มท่านใส่เพิ่มเอาได้เลย
« แก้ไขครั้งสุดท้าย: 25 ก.ค. 61 , 08:40:55 โดย ปิ่นณรงค์ »
:love: :grin:
 


บอร์ดเรียนรู้ Access สำหรับคนไทย


 

Sitemap 1 2 3 4 5