กระทู้เก่าบอร์ด อ.Yeadram
2,488 4
URL.หัวข้อ /
URL
Lock
วันนี้ว่างๆ อยากเขียนอะไรเล่นๆ
เผื่อมีคนสนใจอ่าน อิอิ
ว่าด้วยเรื่อง ล็อค ครับ หลายๆ คนที่เป็นมือใหม่ ไม่เข้าใจว่า ทำไม input ข้อมูล หรือ update ข้อมูลพร้อมกันจากหลายแหล่งไม่ได้ เช่น มีฐานข้อมูลเดียว แต่มีผู้ใช้สองคน ในบางเวลาโปรแกรมมันฟ้องประมาณว่า "มีคนอื่นใช้ข้อมูลอยู่ ไม่สามารถดำเนินการตามคำสั่งของคุณได้" บ้างก็เข้าใจถี่ถ้วนบ้างก็มึนตึบเลย มีคนบอกมีคนอธิบาย หรืออ่านหนังสือ อ่าน help แล้วแต่ยังไม่ค่อยกระจ่างนัก โพสต์นี้ ผมจะยกตัวอย่าง แบบชาวบ้านๆ ให้มือใหม่ทั้งหลายได้เข้าใจเพิ่มขึ้นกันอีกนิดหนึ่ง
ผมสมมติว่า "บ้าน" คือฐานข้อมูล
ห้องครัว คือ 1ตาราง
ห้องนอน คือ 1ตาราง
มีด คือ 1เรคคอร์ด
กระจกส่องหน้า (บนโต๊ะเครื่องแป้ง) คือ 1 เรคคอร์ด
การล็อกบ้าน คือการใส่พาสเวิร์ดฐานข้อมูล บุคคลหลายคนสามารถเข้าบ้านในเวลาเดียวกันได้ ถ้าทุกๆคนเหล่านั้น มีกุญแจ ดังนั้น การเข้าถึงฐานข้อมูล ก็ไม่ติดปัญหา
การล็อกห้องครัว อาจเกิดจาก
- แม่บ้านกำลังทำกับข้าว ไม่อยากให้คนเข้ามากวน จึงล็อกจากด้านในห้อง (อาจจะใส่กลอนหรือเอาโต๊ะมาวางบังประตู) ดังนั้น การล็อกแบบนี้ไม่เกี่ยวกับ พาสเวิร์ดเลยครับ คือแม้คนภายนอกจะมีพาสเวิร์ด ก็ไร้ความหมาย
ส่วนระดับเรคคอร์ด ยกตัวอย่างมีดที่อยู่ในห้องครัว
บางกรณี แม่บ้าน ไม่ล็อกห้องครัว แต่แม่บ้าน กำลังใช้มีดหั่นผักอยู่ครับ พ่อบ้านจะใช้มีดเล่มเดียวกันเอาไปฟันกระดูกหมู ย่อมเป็นไปไม่ได้ ต้องรอจนกว่า แม่บ้านใช้มีดจนเสร็จแล้ว วางมีดเก็บไว้ที่เดิมก่อน พ่อบ้านถึงจะเอาไปใช้ได้ เหตุการณ์ตอนที่แม่บ้านกำลังใช้มีดหั่นผัก นั่นเองครับ มีดจึงถูกล็อก ทำให้บุคคลอื่น ใช้มีดด้ามนั้นพร้อมๆ กับแม่บ้านไม่ได้ อย่างนี้เรียกว่า lock ระดับ เรคคอร์ด คือล็อกเฉพาะเรคคอร์ดเดียว
ในห้องครัว มีทัพพี มีกระทะ ถ้าพ่อบ้านจะใช้อย่างอื่น ก็ไม่มีปัญหา แต่ห้ามใช้มีดในขณะนั้น แม้พ่อบ้านจะเข้ามาในห้องครัวได้แล้ว (เปิด table ขึ้นมาได้แล้ว)
กระจกส่องหน้า ขณะที่แม่บ้านใช้ แม่บ้านแค่นั่งห่างๆ กระจก ไม่ได้หยิบจับกระจก ไม่ได้บังกระจกจนหมดบาน ดังนั้นหากจะมีคนอื่นมายืนข้างๆ แม่บ้าง เพื่อขอสักมุม ส่องดูบ้าง ในเวลาเดียวกันก็สามารถทำได้ อย่างนี้เรียกว่า ไม่ล็อกกระจก และไม่ล็อกห้องนอน (no reccord lock and no table lock)
แต่..... แม้ในกรณีกระจกซึ่งอยู่ในห้องนอน ไม่ได้ถูกล็อก แต่ถ้าประตูห้องนอนล็อคอยู่ คนอื่นที่อยู่นอกห้องนอนก็จะเข้ามาใช้กระจกไม่ได้ อย่างนี้เรียกว่า ล็อก table ดังนั้น เมื่อมีการล็อก table ก็ไม่ต้องไปตามสืบการล็อคระดับเรคคอร์ดอีกเลย
ถ้าเปรียบให้เห็นชัดถึงกระบวนงานของ access เอง ให้ลองเข้าไปดูตามนี้ครับ
- ลองสร้างฟอร์มมา 1 ฟอร์ม โดยดึงข้อมูลทุกๆ ฟิลด์ จากตารางเดียว มาแสดงผล
- ทีนี้เปิดฟอร์มในมุมมองออกแบบ เข้าดู property ของฟอร์ม
- ไปที่แท็บ data เห็นตัวเลือกที่หัวข้อ ล็อคระเบียน มั้ยครับ มันจะมีสามตัวเลือก คือ
ไม่ล็อค, ล็อกเฉพาะเรคคอร์ดที่กำลังทำงาน, และสุดท้ายคือ ล็อคทั้งหมด คือทั้ง table นะครับ ไม่ใช่ทั้งฐานข้อมูล เพราะฟอร์มดึงข้อมูลมาจาก table ไม่ใช่ดึงข้อมูลมาจากฐานข้อมูลดังนั้น คำว่า All ของเค้า ก็คือ all table ไม่ใช่ All database
ทีนี้มาว่ากันถึงคำสั่งที่เกี่ยวข้องกับเหตุการณ์ตัวอย่าง
การส่องกระจกพร้อมกัน ก็เช่น คำสั่งในกลุ่ม Domain agregrate (ผมสะกดถูกมั้ยเนี่ย อิอิ) เช่น
Dlookup(), Dmax() เป็นต้น พวกนี้สามารถเข้าดูพร้อมกันได้ครับ
การใช้มีด ก็เช่น การรันคิวรี่ การรันฟอร์ม การรันรายงาน หรือแม้กระทั่ง การเปิด recordset
ดังนั้นการวางมีด ก็คือ การปิดคิวรี่ การปิดฟอร์ม การปิดรายงาน และรวมไปถึงการปิด recodeset
rs.close
set rs =nothing (เนี่ยล้างมีดให้สะอาดด้วยนะ)
อืมม แล้วไงต่อดี คงแค่นี้ละมั้งเน๊าะ ผิดถูกฉันท์ใด ช่วยวิเคราะห์วิจารณ์ด้วยนะคร้าบ อิอิ
พอดีว่าง ก็ลุกขึ้นมานั่งเขียนๆ ไปงั้นแหละครับ พอจะมีประโยชน์กับใครบ้างไหมหนอ...
เผื่อมีคนสนใจอ่าน อิอิ
ว่าด้วยเรื่อง ล็อค ครับ หลายๆ คนที่เป็นมือใหม่ ไม่เข้าใจว่า ทำไม input ข้อมูล หรือ update ข้อมูลพร้อมกันจากหลายแหล่งไม่ได้ เช่น มีฐานข้อมูลเดียว แต่มีผู้ใช้สองคน ในบางเวลาโปรแกรมมันฟ้องประมาณว่า "มีคนอื่นใช้ข้อมูลอยู่ ไม่สามารถดำเนินการตามคำสั่งของคุณได้" บ้างก็เข้าใจถี่ถ้วนบ้างก็มึนตึบเลย มีคนบอกมีคนอธิบาย หรืออ่านหนังสือ อ่าน help แล้วแต่ยังไม่ค่อยกระจ่างนัก โพสต์นี้ ผมจะยกตัวอย่าง แบบชาวบ้านๆ ให้มือใหม่ทั้งหลายได้เข้าใจเพิ่มขึ้นกันอีกนิดหนึ่ง
ผมสมมติว่า "บ้าน" คือฐานข้อมูล
ห้องครัว คือ 1ตาราง
ห้องนอน คือ 1ตาราง
มีด คือ 1เรคคอร์ด
กระจกส่องหน้า (บนโต๊ะเครื่องแป้ง) คือ 1 เรคคอร์ด
การล็อกบ้าน คือการใส่พาสเวิร์ดฐานข้อมูล บุคคลหลายคนสามารถเข้าบ้านในเวลาเดียวกันได้ ถ้าทุกๆคนเหล่านั้น มีกุญแจ ดังนั้น การเข้าถึงฐานข้อมูล ก็ไม่ติดปัญหา
การล็อกห้องครัว อาจเกิดจาก
- แม่บ้านกำลังทำกับข้าว ไม่อยากให้คนเข้ามากวน จึงล็อกจากด้านในห้อง (อาจจะใส่กลอนหรือเอาโต๊ะมาวางบังประตู) ดังนั้น การล็อกแบบนี้ไม่เกี่ยวกับ พาสเวิร์ดเลยครับ คือแม้คนภายนอกจะมีพาสเวิร์ด ก็ไร้ความหมาย
ส่วนระดับเรคคอร์ด ยกตัวอย่างมีดที่อยู่ในห้องครัว
บางกรณี แม่บ้าน ไม่ล็อกห้องครัว แต่แม่บ้าน กำลังใช้มีดหั่นผักอยู่ครับ พ่อบ้านจะใช้มีดเล่มเดียวกันเอาไปฟันกระดูกหมู ย่อมเป็นไปไม่ได้ ต้องรอจนกว่า แม่บ้านใช้มีดจนเสร็จแล้ว วางมีดเก็บไว้ที่เดิมก่อน พ่อบ้านถึงจะเอาไปใช้ได้ เหตุการณ์ตอนที่แม่บ้านกำลังใช้มีดหั่นผัก นั่นเองครับ มีดจึงถูกล็อก ทำให้บุคคลอื่น ใช้มีดด้ามนั้นพร้อมๆ กับแม่บ้านไม่ได้ อย่างนี้เรียกว่า lock ระดับ เรคคอร์ด คือล็อกเฉพาะเรคคอร์ดเดียว
ในห้องครัว มีทัพพี มีกระทะ ถ้าพ่อบ้านจะใช้อย่างอื่น ก็ไม่มีปัญหา แต่ห้ามใช้มีดในขณะนั้น แม้พ่อบ้านจะเข้ามาในห้องครัวได้แล้ว (เปิด table ขึ้นมาได้แล้ว)
กระจกส่องหน้า ขณะที่แม่บ้านใช้ แม่บ้านแค่นั่งห่างๆ กระจก ไม่ได้หยิบจับกระจก ไม่ได้บังกระจกจนหมดบาน ดังนั้นหากจะมีคนอื่นมายืนข้างๆ แม่บ้าง เพื่อขอสักมุม ส่องดูบ้าง ในเวลาเดียวกันก็สามารถทำได้ อย่างนี้เรียกว่า ไม่ล็อกกระจก และไม่ล็อกห้องนอน (no reccord lock and no table lock)
แต่..... แม้ในกรณีกระจกซึ่งอยู่ในห้องนอน ไม่ได้ถูกล็อก แต่ถ้าประตูห้องนอนล็อคอยู่ คนอื่นที่อยู่นอกห้องนอนก็จะเข้ามาใช้กระจกไม่ได้ อย่างนี้เรียกว่า ล็อก table ดังนั้น เมื่อมีการล็อก table ก็ไม่ต้องไปตามสืบการล็อคระดับเรคคอร์ดอีกเลย
ถ้าเปรียบให้เห็นชัดถึงกระบวนงานของ access เอง ให้ลองเข้าไปดูตามนี้ครับ
- ลองสร้างฟอร์มมา 1 ฟอร์ม โดยดึงข้อมูลทุกๆ ฟิลด์ จากตารางเดียว มาแสดงผล
- ทีนี้เปิดฟอร์มในมุมมองออกแบบ เข้าดู property ของฟอร์ม
- ไปที่แท็บ data เห็นตัวเลือกที่หัวข้อ ล็อคระเบียน มั้ยครับ มันจะมีสามตัวเลือก คือ
ไม่ล็อค, ล็อกเฉพาะเรคคอร์ดที่กำลังทำงาน, และสุดท้ายคือ ล็อคทั้งหมด คือทั้ง table นะครับ ไม่ใช่ทั้งฐานข้อมูล เพราะฟอร์มดึงข้อมูลมาจาก table ไม่ใช่ดึงข้อมูลมาจากฐานข้อมูลดังนั้น คำว่า All ของเค้า ก็คือ all table ไม่ใช่ All database
ทีนี้มาว่ากันถึงคำสั่งที่เกี่ยวข้องกับเหตุการณ์ตัวอย่าง
การส่องกระจกพร้อมกัน ก็เช่น คำสั่งในกลุ่ม Domain agregrate (ผมสะกดถูกมั้ยเนี่ย อิอิ) เช่น
Dlookup(), Dmax() เป็นต้น พวกนี้สามารถเข้าดูพร้อมกันได้ครับ
การใช้มีด ก็เช่น การรันคิวรี่ การรันฟอร์ม การรันรายงาน หรือแม้กระทั่ง การเปิด recordset
ดังนั้นการวางมีด ก็คือ การปิดคิวรี่ การปิดฟอร์ม การปิดรายงาน และรวมไปถึงการปิด recodeset
rs.close
set rs =nothing (เนี่ยล้างมีดให้สะอาดด้วยนะ)
อืมม แล้วไงต่อดี คงแค่นี้ละมั้งเน๊าะ ผิดถูกฉันท์ใด ช่วยวิเคราะห์วิจารณ์ด้วยนะคร้าบ อิอิ
พอดีว่าง ก็ลุกขึ้นมานั่งเขียนๆ ไปงั้นแหละครับ พอจะมีประโยชน์กับใครบ้างไหมหนอ...
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R02968
ผมอยากทราบวิธีการ ทำให้ข้อมูลที่เราเลือกสามารถแก้ไขหรือเพิ่มเติมข้อูลได้บางตัว บางตัวจะล็อกไว้เลย(ข้อมูลหลัก) โดยที่เราไม่ต้องกรอกข้อมูลหลักอีก กรอกเฉพาะส่วนที่ไม่ใช่ข้อมูลหลักเท่านั้น ไม่ทราบว่ามีใครพอจะรู้เรื่องนี้บ้างครับ บอกหน่อย พี่ที่ทำงานเขาอยากให้ทำอย่างนี้นะครับ รบกวนหน่อย
3 @R02969
ผมลืมบอกไปว่าใช้ ACCESS นะครับ
4 @R02971
"ข้อมูลบางตัว" ไม่ชัดเจนครับ คำว่าบางตัว คือ บางฟิลด์ หรือบางเรคคอร์ด หรือบาง textbox
พิมพ์ยาวๆ ได้ครับ เอาให้ ผู้ตอบจินตนาการออก ว่าอะไรวางอยู่ตรงไหน ลำดับงานทำอะไรก่อนหลัง ผู้ตอบจะสามารถเข้าใจและช่วยหาทางได้ครับ
พิมพ์ยาวๆ ได้ครับ เอาให้ ผู้ตอบจินตนาการออก ว่าอะไรวางอยู่ตรงไหน ลำดับงานทำอะไรก่อนหลัง ผู้ตอบจะสามารถเข้าใจและช่วยหาทางได้ครับ
Time: 0.3772s
ผมติดตามการตอบปัญหา และเคยความช่วยเหลือจากท่าน yeadram ตั้งแต่เว็ปของท่านอาจารย์สุภาพ
มาแล้วหล่ะครับ หากมีโอกาสจะขออนุญาตนำตัวอย่างที่ได้จากเว็ปอาจารย์มาช่วยอัพไว้ที่ Folder ที่ให้
ไว้ เผื่อจะมีประโยชน์กับหลาย ๆ ท่าน
ขอบคุณอีกครั้ง สำหรับการทำให้มีที่ค้นคว้าและมีตัวอย่าง Access ดี ๆ ครับ