เปิด Access หลายๆคนพร้อมกันไม่ได้
กระทู้เก่าบอร์ด อ.Yeadram

 18,623   16
URL.หัวข้อ / URL
เปิด Access หลายๆคนพร้อมกันไม่ได้

ลองเขียนโปรแกรมแล้วนำไปวางไว้ในเครื่องกลางเ (Server) พื่อให้ทุกคนเข้าถึงจากเครื่องอื่นๆได้
ปัญหาคือถ้ามีคนหนึ่งเข้าไปแล้ว คนที่เหลือจะเข้าถึงไฟล์โดยการ Click ที่ไฟล์นั้นจะมีคำเตือนว่าถึงแม้จะเข้าไปได้แต่ไม่สามารถปรับปรุงเปลี่ยนแปลงข้อมูลได้
แต่ถ้าใช้วิธีเปิดไฟล์ Access เปล่าๆแล้วเลือก menu File Open แล้วก็ Browse ไปหา File ที่ Server จะไม่มีคำเตือนใดๆเกิดขึ้น สามารถบันทึกแก้ไขข้อมูลได้ตามปกติ
ซึ่งวิธีหลังนี้ไม่เป็นที่ชอบใจของผู้ใช้ ช่วยแนะวิ?ีแก้ปัญหาด้วยครับ
FIle นี้ไม่มีเมนู Login และ Set ค่าใน Tool Option ให้เปิดแบบ Share mode คiy[

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

1 @R03374
ลองศึกษา เรื่อง Split Database
ลองศึกษา เรื่อง Front-End, Back-End ดูครับ
รวมทั้งเรื่อง lock

ค้นดูใน help ของ access หรือตามเว็บบอร์ดเก่า อ.สุภาพ หรือในกระทู้เก่าๆ ของเว็บบอร์ดนี้ก็ได้ครับ

การวางไว้ไฟล์เดียวแล้วให้แต่ละ client เข้าแย่งใช้ ไม่ใช่เรื่องที่ถูกต้องแน่ๆ ครับ เป็นการป้องกันตัวของระบบ access เองครับ เพื่อป้องกันการสับสน กรณีมีหลายๆ client สั่งให้มันทำงานที่ขัดแย้งกัน ในเวลาเดียวกัน
2 @R03380
แนวทางในการใช้ฐานข้อมูลร่วมกัน มีขั้นตอนดังนี้ครับ

1. สร้าง Folder ไว้ที่ Server เพื่อใช้สำหรับเก็บฐานข้อมูล สมมุติอยู่ Drive D ชื่อ Folder ว่า Database แล้วทำการ Share (กำหนด Security แบบ Read Only)
2. ภายใน Folder Database สร้าง Folder ไว้สำหรับจัดเก็บฐานข้อมูล สมมติชื่อ Source (กำหนด Security ให้สามารถแก้ไข/เปลี่ยนแปลงได้)
3. Map Network Drive (เหมือนกันทุกเครื่อง) ไปยัง path ของ Folder ที่ทำการ Share สมมุติว่าเป็น Drive I:\\[HostName]\[Share Folder]
4. Split Database เพื่อทำการแยก Table โดยเลือก Network Drive ที่ทำไว้ในข้อ 3 นำไปจัดเก็บไว้ที่ Folder ตามข้อ 2
5. ทำการ Make MDE เพื่อให้ผู้ใช้งานทำการ copy ไปไว้ที่เครื่องตนเองเพื่อเรียกใช้งานฐานข้อมูล
6. ฐานข้อมูลที่มีนามสกุล .MDB ให้จัดเก็บไว้ที่เครื่องของเราเอง เพื่อใช้ในการแก้ไข/ปรับปรุง (เมื่อทำการปรับปรุง/แก้ไขฐานข้อมูลในแต่ละครั้ง ก็ให้ทำการ Make MDE ไปไว้ยัง Server เพื่อให้ผู้ใช้งานทำการ copy ตัวล่าสุดไปใช้งานต่อ)

หมายเหตุ กรณีที่ข้อมูลเรามีปริมาณมาก ก็ให้เปลี่ยนไปใช้ SQL Server แทนการใช้งาน Table ของ Access ครับ
3 @R03382
ขออนุญาตเรียนถามคุณอนุชิตครับ
คำแนะนำในข้อ 4 นั้นวิธีทำอย่างไรครับ ขอคำอธิบายแบบละเอียดด้วยนะครับ ผมสนใจแต่ยังไม่เข้าใจวิธีทำง่ะ
การพิจารณาปริมาณข้อมูลนั้น ขนาดไหนถึงเรียกว่ามากครับ ดูจากขนาดของไฟล์หรือดูจากจำนวนเร็กคอร์ดครับ
4 @R03383
ผมขออธิบายเพิ่มเติมนะครับ
การ Split Database เป็นการแยก Object Table ออกจากฐานข้อมูล และทำการ Link Table กลับมายังฐานข้อมูลครับ โดยมี Access มีเครื่องมือดังกล่าว อยู่ที่เมนู Tools > Database Utilities > Database Spliter... เมื่อเลือกแล้วจะเข้าสู่หน้าต่าง Wizard ในการแยกตารางออกจากฐานข้อมูล

ซึ่งโดยทั่วไปก่อนจะแยกตารางออกจากฐานข้อมูล เราจะต้องทำการ Map Network Drive เสียก่อน (ทุกเครื่องที่ต้องการใช้งานฐานข้อมูลจะต้อง Map Network Drive เช่นเดียวกัน) เพื่อที่จะให้เกิดกระบวนการสร้าง Path ที่จะทำการ Link Table กลับมายังฐานข้อมูลเดิม

การตรวจสอบว่า Path ที่เก็บตารางอยู่ที่ใด ให้เข้าไปที่เมนู Tools > Database Utilities > Linked Table Manager

ลักษณะของการ Split Database เพื่อที่แยก Back end (Table) กับ Front End (ส่วนติดต่อผู้ใช้งาน) ครับ

เพิ่มเติม : การที่จะเปลี่ยนแหล่งที่เก็บข้อมูล จาก Table ใน Access ไปเป็นระบบฐานข้อมูลที่ใหญ่กว่า เช่น SQL Server ให้คำนึงถึงองค์ประกอบดังต่อไปนี้ครับ

1. จำนวน Transection ที่เกิดขึ้นแต่ละวันมีปริมาณมากหรือไม่
2. จำนวนผู้ใช้งาน (user) มีจำนวนมากน้อยแค่ไหน
3. ระดับความปลอดภัยในการรักษาข้อมูลมากน้อยแค่ไหน
4. และที่สำคัญผู้ดูแลฐานข้อมูลมีความรู้พื้นฐานเกี่ยวกับการใช้งาน SQL Server มากน้อยแค่ไหน เพราะถ้าเปลี่ยนไปแล้วงานอื่นๆ จะตามมาอีกมากครับ
5 @R03384
โอเค พอเข้าใจหลักการแล้วครับ จะลองเขัาไปศึกกษา Tools > Database Utilities > Database Spliter... เพื่อให้เข้าใจเพิ่มขึ้น
ขอบคุณมากครับ
และขอขอบคุณเจ้าของกระทู้ที่เปิดประเด็นนี้ครับ
6 @R03393
ผมไม่สามารถทำเป็น .MDE ได้ครับ โปรแกรมจะขึ้นเตือนว่าโปรแกรมมีขนาดใหญ่เกินไป (18MB Compact แล้วนะครับ) การจะ split database ก็ไม่ชำนาญเลยไม่กล้าเสี่ยงครับ จริงๆแล้วผมก็นำไฟล์ไปวางไว้บน Server เหมือนกับอีกไฟล์หนึ่ง แต่ไฟล์นั้นสามารถเรียกใช้ได้ตรงๆหลายๆคนพร้อมกัน ทั้งๆที่ Set ค่าเหมือนกันหมด เคยทดลองสร้างไฟล์เปล่าขึ้นมาแล้วค่อยๆ import table ....Module ก็ยังคงให้ผลแบบเดิมครับ
7 @R03399
เรียน คุณ Nova

ผมว่าไม่น่าจะเกี่ยวกับขนาดไฟล์ฐานข้อมูลของคุณนะครับ เพราะฐานข้อมูลที่ผมใช้งานอยู่บางฐานก็มีขนาด 50MB ครับ ก็สามารถทำการ Make MDE ได้ตามปกติ

ส่วนเรื่องของการ Split Database ไม่ใช่เรื่องยากอะไรเลยครับ หากคุณยังไม่มั่นใจ ให้คุณลองสร้างฐานข้อมูลเล่นๆ ดูครับ แล้วลอง Split Database ดู ก็จะรู้ว่ามันไม่ใช่เรื่องยากอะไรเลย

แล้วอีกอย่าง การนำไฟล์ฐานข้อมูลที่มีนามสกุล .MDB ไปไว้ที่ server แล้วรวม object ทุกอย่างไว้หมดในไฟล์เดียว อาจจะไม่ปลอดภัยนะครับ วันดีคืนดีมีคนเผลอไปลบทิ้ง แล้วเราจะทำอย่างไรต่อไปดีครับ
8 @R03402
เรียนคุณ อนุชิต

ผมก็ไม่ทราบเหมือนกันว่าทำไมถึงทำเป็น MDE ไม่ได้ ไฟล์ที่ผมทำมีขนาด 49 ตาราง 48 Query (ไม่รวม Query ที่เป็น Record source ใน Form และ Report) 228 Forms 58 Reports 40 Macro และอีก 2 Module (8 Functions)

ทุกตารางจะมีการเชื่อมโยงถึงกันตามหลักการ Relation และทำ Normalize ใช้ Wizard ช่วยในการวิเคราะห์ Database แล้ว ก็ไม่มีคำเตือนให้ปรับปรุง ก็เลยงงๆ อ่ะครับ

ส่วสนเร่องการ split นั้นก็เคยลองนะครับโดยทำตามหนังสือ Access นั่นแหละแต่ไม่เข้าใจเอาซะเลย พอจะมีคำแนะนำไหมครับ
9 @R03404
เรียน คุณ Nova

ผมไม่แน่ใจเหมือนกันครับ ว่าทำไมถึง Make MDE ไม่ได้ ซึ่งผมลองวิเคราะห์ดูครับว่าเกิดจากสาเหตุใด ซึ่งอาจจะจริงว่าขนาดฐานข้อมูล (Object) มีมากเกินไปงั้นผมขอถามเพิ่มเติมครับ

1. ฐานข้อมูลที่คุณสร้างขึ้นมา ซึ่งมี Object ต่างๆ มากมาย โดยเฉพาะ Forms กลุ่มผู้ใช้งานสามารถใช้ร่วมกันหมดทุกฟอร์มหรือไม่ หรือ มีการแบ่งตามบทบาทหน้าที่การใช้งาน เช่น ตามกิจกรรม ตามแผนก เป็นต้น

ถ้าไม่ใช่ ผมว่าลองทำ 5ส ฐานข้อมูลดูก็ได้ครับ เผื่อบางทีอาจจะมีบางอย่างที่เราไม่ได้ใช้งานแล้วก็ได้ครับ

ถ้าใช่ ลองดำเนินการ เหมือนที่ผมทำอยู่ก็ได้ครับ

1. แยกฐานข้อมูลตามกิจกรรม หรือตามกลุ่มผู้ใช้ (แต่ใช้ Table ร่วมกัน)
2. สร้างฐานข้อมูลที่เก็บเฉพาะ Table อย่างเดียว วางไว้ที่ Server แล้ว ทำการ Share ให้กลับกลุ่มผู้ใช้งาน
3. ฐานข้อมูลที่เป็น .MDB เราก็สร้างแยกตามกิจกรรม หรือตามกลุ่มผู้ใช้ ขนาดของฐานข้อมูล (หมายถึง Object ต่างๆ ก็จะน้อยลง เพราะกระจายไปแต่ละฐานข้อมูล) ซึ่งฐานข้อมูลทั้งหมดนี้เก็บไว้ที่เครื่องของเราเองครับ
4. ฐานข้อมูลแต่ละในข้อ 3 เราก็ Like Table มาจากข้อ 2 (Link มาเฉพาะที่ใช้)
5. Make MDE ฐานข้อมูล โดย Save ไว้ที่ Server เพื่อให้ผู้ใช้งาน copy ไปใช้ภายในเครื่องของตนเอง (ซึ่งถ้าแยกฐานข้อมูลแบบนี้ ก็น่าจะ Make MDE ได้แล้ว)

ปล. ส่วนเรื่องของการ Split Database เดี๋ยวผมทำเป็นเอกสารไปให้นะครับ ขอเวลาทำก่อนนะครับ ผมก็จะใช้เอกสารนี้ไว้สอนเหมือนกันครับ เสร็จแล้วจะแจ้งกลับไปนะครับ


10 @R03411
เรียนคุณ อนุชิต

ทุกคนสมารถใช้ฟอร์มร่วมกันได้เกือบทั้งหมดครับ มีบางฟอร์มเท่านั้นที่กำจัดสิทธิ์ โดยจะสร้างฟอร์มถาม username และ password ถ้าถูกต้องจึงจะเปิดฟอร์มนั้นๆได้

เรื่อง Username และ Password นี่ก็เป็นอีก 1 เรื่องที่ไม่เข้าใจว่า ถ้าเราจะสร้างฟอร์มให้ login เช็คว่าเป็นผู้มีสิทธิ์เข้าถึง Database แล้วเราจะนำไปเก็ยไว้ที่ไหนเพื่อนำไปใช้เป็นส่วนหนึ่งของการ Query ข้อมูลในฟอร์มต่างๆที่ user คนนี้เปิดขึ้นมา ถามแบบนี้ งงหรือเปล่าครับ ขอยกตัวอย่างก็แล้วกัน
สมมติว่าผมสร้างฟอร์ม Login เพื่อตรวจสอบว่ามี User คนนั้นๆหรือไม่ (ค้นจากตารางที่เก็บชื่อนามสกุล UserID, username, password) หลังจากนั้นผมต้องการนำค่า UserID นี้ไปเป็นส่วนหนึ่งของการ Query ข้อมูลฟอร์มต่างๆที่เขาเปิดขึ้นมาเพื่อให้เขาสามารถบันทึกหรือแก้ไขได้เฉพาะงานที่เขาทำเท่านั้น (เช่น นาย Aและนาย B ร่วมกันทำ Job 1-10 เขาก็จะมีสิทธิ์บันทึกแก้ไขข้อมูลเฉพาะ Job 1-10 เท่านั้น และก็เช่นกันกับผู้อื่นก็จะมีสิทธิ์ของตัวเองในฟอร์มเดียวกันนี้)
นอกจากวิธีนี้แล้วผมก็ไม่ทราบจะมีวิธีอื่นอีกหรือเปล่า Code นั้นพอกล้อมแกล้มเขียนได้ละครับ แต่หลักการนี่ซิจะทำยังไง ช่วยแนะนำด้วยครับ
11 @R03412
-ประกาศตัวแปร Public ไว้ที่โมดูล (เช่น Public SessionUser as string)
-เมื่อเปิดโปรแกรม ให้บังคับล็อกอิน
-เมื่อตรวจสอบ user ได้ถูกต้อง ให้ นำรหัส หรือนำ user ไปใส่ค่าให้กับตัวแปร
dim xVariant as variant
xVariant = dlookup("id","tblogin","[username] like '" & text1 & "' AND [pwd] like '" & text2 & "'")
if not isnull(xVariant) then
SessionUser = xVariant
else
quit
end if


- เมื่อจะคิวรี่
if sessionUser='id ของนาย A' then
sql = "Select * from table1 where rec_id in(1,3,5,4,6)"
else
sql = "Select * from table1 where rec_id in(2,7,15,8,9)"
end if

-คุณได้ statement แล้วครับ

*******************************************************************
ตัวอย่างง่ายๆ คร่าวๆ นะครับ ต้องเอาไป ประยุกต์อีกเยอะครับ
นั่นเป็นการเก็บ ตัวแปรแบบ public ซึ่งมันจะทำงานได้ดีถ้าโปรแกรมเราเขียนเสร็จแล้ว คอมไพล์แล้ว แต่ถ้าเป็นช่วงที่ยังทดสอบโปรแกรม ซึ่งหมายความว่า เรายังมีโอกาสต้อง debug โค้ดส่วนใดส่วนหนึ่งอีก ในจังหวะที่มี error เกิดขึ้นแล้วเราทำการ debug จังหวะนั้นจะทำให้ ค่าของตัวแปร public หายไป

กรณีอีกอย่างก็คือ แทนที่จะเก็บ เป็น public variables เราก็เก็บมันเข้าตารางแทน แม้จะ debug กี่ครั้งๆ ค่าของมันก็ยังไม่หายไป แต่ข้อเสียคือ เราต้องมาเคลียร์ค่าออกทุกครั้งที่ปิดโปรแกรม ซึ่งถ้าไฟดับ โปรแกรมเราก็หยุดทำงานทันที่ นั่นอาจจะทำให้เราไม่สามารถเคลียร์ค่า userlogin ล่าสุดออกได้

ต้องเลือกใช้ล่ะครับ เป็นผมนะ ช่วงที่ยังทดสอบโปรแกรม ผมจะเลือกใช้แบบตาราง พอโปรแกรมนิ่งแล้ว ค่อยเปลี่ยนไปใช้แบบ public var
12 @R03416
เรียน คุณ Nova

ผมขอ share ความรู้เรื่องฐานข้อมูลที่ผมสร้างขึ้นมา โดยการตรวจสอบการเข้าใช้งานฐานข้อมูลทุกครั้ง ด้วยการสร้างระบบ Login ขึ้นมาเอง (ซึ่งก็น่าจะใกล้เคียงที่คุณ Nova ทำอยู่) แต่เวลาที่ระบบทำการตรวจสอบสิทธ์ในการใช้งานฐานข้อมูลเสร็จแล้ว UserID ที่ใช้งานอยู่ในตอนนั้น เราจะเก็บไว้ที่ไหน (ประโยชน์เพื่อใช้ในการตรวจสอบการเข้าถึงแหล่งข้อมูลต่างๆ) ผมทำดังนี้ครับ

- ผมสร้างฟอร์มชื่อว่า Hide แล้วสร้าง Textbox ชื่อว่า UserName จากนั้นทำการย่อให้มีความกว้างและสูงเท่ากับ 0 รวมถึงฟอร์มด้วย

- ที่ฟอร์ม Login หลังจากที่ตรวจสอบสิทธ์เรียบแล้วแล้ว ผมก็ดำเนินการเขียนคำสั่ง (บางส่วน) ดังนี้ครับ
DoCmd.OpenForm "Hide"
[Forms]![Hide].Visible = False
[Forms]![Hide].[UserName] = [UserName]


ตอนนี้เราก็จะทราบแล้วครับ ว่าตอนนี้ UserName ที่ใช้งานอยู่คือใคร แล้วก็ไม่ต้องกังวลด้วยว่าค่าดังกล่าวจะหายไปไหนครับ
13 @R03421
ขอบคุณครับคุณ อนุชิตและคุณ Yeadram ผมจะลองทำดูทั้ง2วิธีได้ผลแล้วจะแจ้งให้ทราบครับ
14 @R14509
เอาไว้ทำความเข้าใจ
15 @R16533
ติดปัญหาเรื่องนี้อยู่พอดีครับ จะขอเอาไปศึกษาด้วยคนนะครับ
16 @R17385
เรียน คุณ อนุชิต
ผมขอเอกสาร Split Database ด้วยได้ไหมครับ.
Suriya.sukc@gmail.com
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2964s