หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 5 3 5 8 7 3

7 ธันวาคม พ.ศ.2549
122 Users On-Line.
Visitors - Page views
 8 8 8 5 6 6 1
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

เรียนรู้ Visual Basic 6.0 กับ ฐานข้อมูล MS Access ภาค 2

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 9/11/2549 13:49:00
(อ่าน : 36917) 

 

เอ๊ะ เอะ ... ขึ้นมาภาค 2 เลย แล้วภาค 1 มันไปไหนล่ะครับพี่น้อง ...


อันที่จริงแล้วกระผมก็อยากจะเขียนบทความเกี่ยวกับเรื่องนี้มานานแสนนานแล้วล่ะ แต่ยังไม่มีโอกาสสักกะที อีกอย่างในสิ่งที่เราคิด แล้วแปลงมันให้มาอยู่ในรูปแบบของตัวอักษร หรือ ถ้อยกระทงความเนี่ย มันช่างเป็นเรื่องที่ยากเย็นซ่ะเหลือเกิน (เหมือนกับเวลารับงาน ก็ต้องบังคับให้ลูกค้าเขียนความต้องการมาให้เป็นข้อๆ ... แทนที่จะพูดๆๆๆๆๆๆ อย่างเดียว ... อิอิอิ ... รู้มั้ยว่ามันก็ยากน่ะ) สำหรับภาค 1 นั้น ผมจะกล่าวถึงที่มาที่ไปของการออกแบบฐานข้อมูลก่อนล่ะครับ แต่ผมไม่นิยมอ้างถึงการทำ Normalization หรอก เพราะหลักการและแนวทางของผมมี 2 ข้อหลักๆ ดังนี้คือ
  • ข้อมูลจากฟิลด์ใดๆในตารางหากซ้ำกัน ให้จับแยกออกมา
  • ฟิลด์ที่จับแยกออกมานั้น ให้นำมารวมกันใหม่ในลักษณะของ Master - Detail นั่้นก็คือจะมีตารางหลัก และ ตารางย่อย เชื่อมต่อเข้าหากัน โดยอาศัยความสัมพันธ์ ????? ... อย่าพึ่งงงครับพี่น้อง
เอาไว้ภาค 1 ค่อยคลอดตามหลังภาค 2 แล้วกันครับผม ภาคนี้ก็เล่นแบบรวบยอดไปก่อนเลยเหอะ อิอิอิ ...

 

 


Original DataBase - 1NF

เริ่มจากการออกแบบฐานข้อมูล ในตารางด้านบน เป็นข้อมูลลูกค้า (Customer) ปรากฏว่าจังหวัดที่อยู่ของลูกค้านั้น มันซ้ำๆกันตลอด ดังนั้นจึงใช้กฏ (ของผม) ข้อที่ 1 เมื่อมันซ้ำกันก็จับแยกออกมาซ่ะดีๆ (แยกไปอยู่ตาราง tblProvince) แล้วเมื่อจับมันแยกออกไปแล้ว ก็ต้องเอามารวมกันใหม่ โดยใช้ "คีย์รอง - Foreign Key" เป็นตัวต่อเชื่อม (หรือเราเรียกจะมันว่าเป็นการสร้าง "ความสัมพันธ์" นั่นเอง)


    เรื่องของเหตุผล
  • เกิด Human Error ของผู้ใช้งานในการคีย์ข้อมูลซ้ำๆกัน เช่น ชื่อจังหวัดมักจะพิมพ์ผิด ดังนี้ ขอนแก่ ขอนแก่นน ขอแก่น
  • เพื่ออำนวยความสะดวก แก่ผู้ใช้งาน (Friendly use)
  • เป็นการ Optimized ระบบฐานข้อมูล รวมไปถึงตัวโปรแกรมให้ง่ายต่อการจัดการ (แต่ต้องเขียนโค้ดที่ยากขึ้นมาอีก ... อิอิอิ)
  • เป็น "พื้นฐาน" ที่จะนำไป "ต่อยอด" กับโครงสร้างข้อมูลที่สลับซับซ้อนมากขึ้น
  • อื่นๆอีก ... แต่ตอนนี้ผมยังนึกไม่ออก อิอิ ...
ดังกรณีศึกษา (Case Study) นี้
โดยผมขอยกตัวอย่างของ การเชื่อมต่อฐานข้อมูลระหว่าง ตารางลูกค้า (tblCustomer) เข้ากับตารางจังหวัด (tblProvince) แต่ปัญหาที่จะรออยู่เบื้องหน้าเหล่าชาวจอมยุทธ VB มือใหม่ ก็คือ ถึงแม้ว่าเราจะเชื่อมโยงตารางเข้าหากันได้แล้วก็ตามทีเหอะ แต่ตอนที่จะเขียนโค้ดเข้าไปควบคุมนั้น แล้วมันจะทำฉันใดล่ะ ????? ซึ่งผมจะมีคำตอบในตอนต่อไป เพียงแต่ตอนนี้เราต้องมาทำกระบวนการขั้นตอนแรกให้สำเร็จเสร็จสิ้นไปเสียก่อน ... ใจเย็นๆครับพี่น้อง

ในตัวอย่าง (ง่ายๆ) นี้ โปรดสังเกตว่า คีย์รอง (Foreign Key) ของ ProvinceID ผมเลือกที่จะใช้ชนิดข้อมูลเป็นแบบ Byte ถามว่าทำไม ???
ก่อนที่คุณจะเข้ามาถึงจุดนี้ จำเป็นต้องทราบเกี่ยวกับเรื่อง ชนิดของข้อมูล (Data type) เช่น Byte, Integer, Boolean หรือ Character เป็นต้น ให้กระจ่างมาก่อนแล้วล่วงหน้าน่ะครับ ในกรณีสำหรับชื่อจังหวัดนั้น ในปัจจุบันนี้เรามี 76 จังหวัด ซึ่งในอนาคตอีกสัก 20 ปีข้างหน้า (โปรแกรมของเรา จะมีอายุนานขนาดนั้นหรือ ???) ก็คงจะไ่ม่เกิน 200 จังหวัดล่ะมั้ง ดังนั้นผมถึงเลือกให้ ProvinceID มีชนิดของข้อมูลเป็นเลขจำนวนเต็ม แบบไบต์ (Byte) แทน
    เลขจำนวนเต็มชนิด Byte
  • มีขนาด 8 บิต
  • เป็นแบบไม่คิดเครื่องหมาย (คือไม่มีเลขลบ จะมีแต่เลขบวก และ เลขศูนย์)
  • ดังนั้นมันจึงแสดงค่าได้ตั้งแต่ 0 - 255 ในฐานสิบ (รวมแล้วก็มีทั้งหมด 256 ค่า)
  • ค่าต่ำสุดของ Bianry คือ 0 0 0 0 0 0 0 0 = 0
  • ค่าสูงสุดของ Binary คือ 1 1 1 1 1 1 1 1 หรือ คิดตามน้ำหนักประจำหลัก ก็คือ 128+64+32+16+8+4+2+1 = 255 (ฐาน 10) ครับผม
  • พิจารณาข้อมูลเพิ่มเติม ... ที่นี่
    (เรื่องของ "ชนิดข้อมูล" เป็นเรื่องที่จัดได้ว่ามีความสำคัญต่อการพัฒนาโปรแกรมเป็นอย่างยิ่ง ก็ลองค้นหาข้อมูลเพิ่มเติมด้วยแล้วกันครับ ...)
จากในกรณีนี้ก็เพียงพอต่อความต้องการอยู่แล้วครับพี่น้อง ไม่ใช่ แหม !!! เล่นมันซ่ะเป็นแบบ Long Integer (4 Bytes) ไปหมดซ่ะนี่ คุณอย่าลืมตระหนักในเรื่องนี้ด้วยน่ะครับ เพราะเมื่อเวลาคุณพัฒนาโปรแกรมที่ความสลับซับซ้อน (ซ่อนเงื่อน ... ของตัวเอง อิอิอิ) ไปเรื่อยๆ ตัวแปรต่างๆในโปรแกรม รวมเข้ากับ ตัวฐานข้อมูล มันก็จะโตเ้อ้า โตเอา หากเป็นมือใหม่ ก็ควรจะฝึกทักษะเล็กๆน้อยๆเหล่านี้ ให้ติดเป็นนิสัยด้วย เชื่อผมเหอะ ...

อีกจุดหนึ่งสำหรับใน MS Access นั้น ในกรณีของ คีย์หลัก หรือ คีย์รอง ก็แล้วแต่ ผมจะไม่นิยมใช้เป็น Autonumber น่ะขอรับ แน่นอนที่สุดกระผมเองย่อมมีเหตุผลนั่นแหละ เดี๋ยวเอาไว้กล่าวในภาคต่อไปครับพี่น้อง

 

ต่อไปเราก็ต้องลองมาทำการ "ทดสอบ" ตารางที่เราออกแบบไว้ดูซิ โดยการเลือก (สร้าง) จากแบบสอบถาม (Query) ดังภาพด้านล่างนี้


จากนั้นกดดับเบิ้ลคลิ๊ก หรือ กดปุ่ม "เพิ่ม" เข้ามาทีละตารางครับ จะสังเกตได้ว่า เมื่อเราออกแบบฟิลด์ชนิดของข้อมูลในตาราง tblCustomer และ tblProvince ให้ตรงกัน (ในที่นี้คือ ProvinceID) ใน MS Access จะสร้างความสัมพันธ์ของตารางให้เชื่อมเข้าหากันโดยอัตโนมัติเลยครับพี่น้อง


ขั้นตอนต่อไปก็ให้เลือกฟิลด์ทั้งหมดในตารางหลัก tblCustomer โดยการนำเมาส์ไปคลิ๊กที่เครื่องหมายดอกจัน (*) (เพราะเราต้องการให้มันแสดงผลทั้งหมด) ของตาราง tblCustomer แล้วลากมาใส่เข้าไปในช่องแรกตรงเขตข้อมูล แล้วก็ตามด้วย ProvinceName ในตารางของ tblProvince มาใส่ลงไปในช่องต่อไป



เลือกให้แสดงผลด้วย "มุมมองแผ่นข้อมูล"



ผลของการเชื่อมโยงตาราง 2 ตารางเข้าหากัน
จากตาราง tblProvince
ProvinceID = 2 คือ กรุงเทพมหานคร
ProvinceID = 6 คือ ขอนแก่น



เปรียบเทียบจากตาราง (จริง) ของ tblCustomer และ tblProvince
โปรดสังเกตว่าผมจะกำหนดคีย์หลัก = 0 ในตาราง tblProvince ด้วย (มีเหตุผลครับ)

ขั้นตอนสุดท้ายแล้วล่ะครับพี่น้อง เราจะต้องนำไปใช้งานใน Visual Basic นั่นก็คือ SQL Statement ไงล่ะพี่น้อง ... แน่นอนครับ เราจะไปเสียเวล่ำเวลาในการจดจำ (คำสั่งต่างๆ) เช่น การ INNER JOIN ของตารางไปทำไมล่ะ ... พี่น้อง ในเมื่อเราเข้ามาทดสอบใน MS Access แล้ว ก็คัดลอก Statement ไปใช้งานได้เลย ดังนี้ครับ


เลือกมาจากปุ่ม "มุมมอง SQL"

 

มาถึงตรงนี้ คงจะพอมองเห็นอะไรลางๆ เล็กๆบ้างแล้วกระมังครับ ... พี่น้อง


จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560