กระทู้เก่าบอร์ด อ.Yeadram
1,728 8
URL.หัวข้อ /
URL
เลือกประเภทสินค้าไม่ได้ครับ
สวัสดีครับ ตอนนี้ผมมีปัญหาตรงที่อาจารย์เค้าให้เลือกประเภทสินค้าก่อนครับแล้วจึงเลือกรหัสสินค้าได้แต่จะแสดงสินค้าในประเภทที่เราเลือกไว้เท่านั้นครับ
ตอนนี้ผมกำหนดให้มันเป็น Combobox ทั้งประเภทสินค้าและรหัสสินค้าเลยครับที่ Form Order น่ะครับ โดยให้มัน List มาอย่างนี้ครับ
SELECT product.product_id, product.product_name FROM product WHERE product.product_type=[Forms]![order]![order_detail]![product_type] ORDER BY product.[product_id]; มันทำงานได้ครับแต่ว่ามันจะจำค่าเดียวไว้จนปิดฟอร์มเลย ถ้าเลือก CPU ไว้มันก็จะจำแต่ CPU ต่อให้เลือกอย่างอื่นแล้วก็จะเห็นแต่ CPU ครับ แต่ผมมาใส่ Code เพิ่มที่ product_type แบบ
Private Sub product_type_AfterUpdate()
Me.Refresh
product_id.SetFocus
End Sub
ปรากฎว่าทำงานได้ครั้งเดียวและครั้งต่อไปก็ Runtime Code 3101 น่ะครับ
ช่วยหน่อยนะครับ ต้องส่งงานวันอาทิตย์นี้แล้ว เป็น Project จบด้วยน่ะครับ
ตอนนี้ผมกำหนดให้มันเป็น Combobox ทั้งประเภทสินค้าและรหัสสินค้าเลยครับที่ Form Order น่ะครับ โดยให้มัน List มาอย่างนี้ครับ
SELECT product.product_id, product.product_name FROM product WHERE product.product_type=[Forms]![order]![order_detail]![product_type] ORDER BY product.[product_id]; มันทำงานได้ครับแต่ว่ามันจะจำค่าเดียวไว้จนปิดฟอร์มเลย ถ้าเลือก CPU ไว้มันก็จะจำแต่ CPU ต่อให้เลือกอย่างอื่นแล้วก็จะเห็นแต่ CPU ครับ แต่ผมมาใส่ Code เพิ่มที่ product_type แบบ
Private Sub product_type_AfterUpdate()
Me.Refresh
product_id.SetFocus
End Sub
ปรากฎว่าทำงานได้ครั้งเดียวและครั้งต่อไปก็ Runtime Code 3101 น่ะครับ
ช่วยหน่อยนะครับ ต้องส่งงานวันอาทิตย์นี้แล้ว เป็น Project จบด้วยน่ะครับ
8 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R12439
ถ้าเกษตรกรรายนี้ มีสัตว์ประเภทนี้ แล้ว 2 รายการ ให้......
dim cntX as long
cntX = dCount("ไอดีของรายการ" , "ตารางของฟอร์มย่อย", "ไอดีรายการของฟอร์มหลัก (ซึ่งบ่งบอกแล้วว่า เป็นของเกษตรกรรายใด) = '" & textboxที่แสดงไอดีของรายการ(ในฟอร์มหลัก)")
if cntX = 2 then
msgbox "ครบโควต้าแล้ว"
----- คำสั่งห้ามเติม หรือคำสั่งยกเลิกไม่ให้เติมข้อมูลเพิ่ม
end if
--------------------
หลักคือ การใช้ฟังก์ชั่น dCount แบบมีเงื่อนไขครับ
dim cntX as long
cntX = dCount("ไอดีของรายการ" , "ตารางของฟอร์มย่อย", "ไอดีรายการของฟอร์มหลัก (ซึ่งบ่งบอกแล้วว่า เป็นของเกษตรกรรายใด) = '" & textboxที่แสดงไอดีของรายการ(ในฟอร์มหลัก)")
if cntX = 2 then
msgbox "ครบโควต้าแล้ว"
----- คำสั่งห้ามเติม หรือคำสั่งยกเลิกไม่ให้เติมข้อมูลเพิ่ม
end if
--------------------
หลักคือ การใช้ฟังก์ชั่น dCount แบบมีเงื่อนไขครับ
3 @R12440
ขออนุญาตแจงรายละเอียดใหม่ ดังนี้
1ฟอร์มหลักชื่อ frmOrderDetails มาจากตาราง Customers ประกอบด้วย ฟิลด์ ID ,Name,Adress
ID Name Adress
5 สมรัก รักสัตว์ 123 ม.5 ต.บางนบ อ.หัวไทร
2.ฟอร์มย่อยชื่อ OrderDetail subform มาจากคิวรี qry OrderDetail ซึ่งมาจาก ตาราง tblOrderDetail ซึ่งมีฟิลด์ OrderID, ชนิดสัตว์, ประเภทสัตว์, จำนวนตาย, จำนวนช่วยเหลือ และอื่นอีกหลายฟิลด์ ที่ใช้คำนวณ ค่าชดเชย
OrderID ชนิดสัตว์ ประเภทสัตว์ จำนวนตาย จำนวนช่วยเหลือ
1 โค โคอายุ 1 ปี 2 2
1 โค โคอายุ 2 ปี 1 0
1 โค โคอายุ 3 ปี 1 0
1 โค โคอายุ 4 ปี 1 1
1 สุกร สุกรอายุ 1 ปี 12 10
1 สุกร สุกรอายุ 2 ปี 10 0
1 ไก่พื้นเมือง ไก่พื้นเมือง 3 เดือน 300 300
1 ไก่พื้นเมือง ไก่พื้นเมือง 4 เดือน 100 0
จากตัวอย่าง นายสมรัก รักสัตว์ มีสัตว์เสียหายเนื่องจากภัยพิบัติ ตามเลขที่แจ้ง(OrderID) เลขที่ 1 ระเบียบกำหนดให้ช่วยเหลือสัตว์ที่ตายดังนี้
โค รวมทุกประเภท ไม่เกิน 2 ตัว
สุกร รวมทุกประเภท ไม่เกิน 10 ตัว
ไก่พื้นเมือง รวมทุกประเภท ไม่เกิน 300 ตัว
ไก่ไข่ รวมทุกประเภท ไม่เกิน 1000 ตัว
ไก่เนื้อ รวมทุกประเภท ไม่เกิน 1000 ตัว
เป็ดไข่ รวมทุกประเภท ไม่เกิน 1000 ตัว
เป็ดเนื้อ รวมทุกประเภท ไม่เกิน 1000 ตัว
ห่าน รวมทุกประเภท ไม่เกิน 50 ตัว
การป้อนข้อมูลที่เกษตรกรแต่ละแจ้ง ต้องป้อนทุกรายการ ที่แจ้งตาย ส่วนฟิลด์ จำนวนช่วยเหลือ ให้ป้อนจำนวนที่จะช่วยเหลือ(รวมแล้วต้องไม่เกินที่กำหนด) ถ้าป้อนข้อมูลโดยไม่ได้ตั้งใจ เกินกว่าที่กำหนด (จากตัวอย่าง ถ้า ป้อนจำนวนช่วยเหลือ โคอายุ 4 ปี อีก 1 ตัว [ซึ่งควรจะเป็น 0] รวมเป็นโค 3 ตัว ซึ่งเกิน 2 ตัว ตามที่กำหนด) ต้องการที่จะให้แจ้งเตือนว่า “จำนวนช่วยเหลือ มากกว่าที่กำหนด” ซึ่งตอนนี้ใช้วิธีตรวจสอบย้อนกลับ ว่า สัตว์ชนิดใด ป้อนการช่วยเหลือเกินไปบ้าง โดยใช้คิวรี คำนวณ แล้วตามไปแก้ไข ซึ่งวิธีการของการ Access น่าจะหรูกว่านี้ จึงขอรบกวนอีกครั้ง จะเป็นพระคุณเป็นอย่างยิ่ง
[ฟอร์มหลัก และ ฟอร์มย่อย ดังกล่าว มีฟอร์ย่อยอีกฟอร์มหนึ่งทำหน้าที่เชื่อมโยง]
1ฟอร์มหลักชื่อ frmOrderDetails มาจากตาราง Customers ประกอบด้วย ฟิลด์ ID ,Name,Adress
ID Name Adress
5 สมรัก รักสัตว์ 123 ม.5 ต.บางนบ อ.หัวไทร
2.ฟอร์มย่อยชื่อ OrderDetail subform มาจากคิวรี qry OrderDetail ซึ่งมาจาก ตาราง tblOrderDetail ซึ่งมีฟิลด์ OrderID, ชนิดสัตว์, ประเภทสัตว์, จำนวนตาย, จำนวนช่วยเหลือ และอื่นอีกหลายฟิลด์ ที่ใช้คำนวณ ค่าชดเชย
OrderID ชนิดสัตว์ ประเภทสัตว์ จำนวนตาย จำนวนช่วยเหลือ
1 โค โคอายุ 1 ปี 2 2
1 โค โคอายุ 2 ปี 1 0
1 โค โคอายุ 3 ปี 1 0
1 โค โคอายุ 4 ปี 1 1
1 สุกร สุกรอายุ 1 ปี 12 10
1 สุกร สุกรอายุ 2 ปี 10 0
1 ไก่พื้นเมือง ไก่พื้นเมือง 3 เดือน 300 300
1 ไก่พื้นเมือง ไก่พื้นเมือง 4 เดือน 100 0
จากตัวอย่าง นายสมรัก รักสัตว์ มีสัตว์เสียหายเนื่องจากภัยพิบัติ ตามเลขที่แจ้ง(OrderID) เลขที่ 1 ระเบียบกำหนดให้ช่วยเหลือสัตว์ที่ตายดังนี้
โค รวมทุกประเภท ไม่เกิน 2 ตัว
สุกร รวมทุกประเภท ไม่เกิน 10 ตัว
ไก่พื้นเมือง รวมทุกประเภท ไม่เกิน 300 ตัว
ไก่ไข่ รวมทุกประเภท ไม่เกิน 1000 ตัว
ไก่เนื้อ รวมทุกประเภท ไม่เกิน 1000 ตัว
เป็ดไข่ รวมทุกประเภท ไม่เกิน 1000 ตัว
เป็ดเนื้อ รวมทุกประเภท ไม่เกิน 1000 ตัว
ห่าน รวมทุกประเภท ไม่เกิน 50 ตัว
การป้อนข้อมูลที่เกษตรกรแต่ละแจ้ง ต้องป้อนทุกรายการ ที่แจ้งตาย ส่วนฟิลด์ จำนวนช่วยเหลือ ให้ป้อนจำนวนที่จะช่วยเหลือ(รวมแล้วต้องไม่เกินที่กำหนด) ถ้าป้อนข้อมูลโดยไม่ได้ตั้งใจ เกินกว่าที่กำหนด (จากตัวอย่าง ถ้า ป้อนจำนวนช่วยเหลือ โคอายุ 4 ปี อีก 1 ตัว [ซึ่งควรจะเป็น 0] รวมเป็นโค 3 ตัว ซึ่งเกิน 2 ตัว ตามที่กำหนด) ต้องการที่จะให้แจ้งเตือนว่า “จำนวนช่วยเหลือ มากกว่าที่กำหนด” ซึ่งตอนนี้ใช้วิธีตรวจสอบย้อนกลับ ว่า สัตว์ชนิดใด ป้อนการช่วยเหลือเกินไปบ้าง โดยใช้คิวรี คำนวณ แล้วตามไปแก้ไข ซึ่งวิธีการของการ Access น่าจะหรูกว่านี้ จึงขอรบกวนอีกครั้ง จะเป็นพระคุณเป็นอย่างยิ่ง
[ฟอร์มหลัก และ ฟอร์มย่อย ดังกล่าว มีฟอร์ย่อยอีกฟอร์มหนึ่งทำหน้าที่เชื่อมโยง]
4 @R12442
ข้อที่ 1 "ขออนุญาตแจงรายละเอียดใหม่ ดังนี้"
- ทำไมไม่แจงมาตั้งแต่ทีแรก
ข้อที่ 2 ฟอร์มหลักกับฟอร์มย่อยของคุณ ไม่มีฟิลด์ใดที่สัมพันธ์กันเลย และคุณยังแจ้งอีกว่า "ฟอร์มหลัก และ ฟอร์มย่อย ดังกล่าว มีฟอร์ย่อยอีกฟอร์มหนึ่งทำหน้าที่เชื่อมโยง" ถ้าฟอร์มย่อยดังกล่าว ยังเป็นความลับอยู่ต่อไป ผู้ตอบผู้อ่านคนอื่นๆ ก็ยังมองไม่เห็นความสัมพันธ์กันอยู่ดี จะใช้โค้ด หรือจะให้อะไร ไปเป็นเงื่อนไขในการตรวจสอบโควต้า ก็ทำไม่ได้
ข้อที่ 3 สัตว์แต่ละประเภท มีโควต้าเท่าไหร่ แต่คนตอบไม่รู้ .... ไม่รู้ว่าคุณเก็บจำนวนโควต้าไว้ที่ตารางไหน ฟิลด์อะไร จะให้โค้ดไปเอามาเพื่อใช้ในการตรวจเช็คได้อย่างไร และไม่รู้ว่าในระบบของคุณ แยกสัตว์ไว้กี่ประเภท
ข้อที่ 4
งานอย่างนี้คุณต้องใช้อย่างน้อย 5 ตาราง
- ตารางบุคคล เก็บข้อมูลบุคคล
- ตารางเอกสารสำรวจ เก็บข้อมูลหลักๆ ของเอกสาร เช่น เลขที่ วันที่ บุคคลที่เกี่ยวข้อง จำนวนรวม การอ้างอิง
- ตารางย่อยของเอกสารสำรวจ เก็บเลขที่เอกสาร เก็บรายการของเอกสาร เวลาเอกไปสร้างฟอร์มก็ให้ตารางนี้เป็นแหล่งฟอร์มย่อย ส่วนฟอร์มหลักก็ให้ใช้แหล่งจากตารางเอกสารสำรวจ ดังนั้นฟอร์มหลักและฟอร์มย่อยก็จะผูกกันด้วยฟิลด์ "เลขที่เอกสาร"
- ตารางประเภทสัตว์ มีรหัสและประเภทสัตว์เป็นฟิลด์สำคัญ มีฟิลด์ชนิดสัตว์ เอาไว้ด้วยเพื่อไว้สัมพันธ์กับกับตารางอื่น (ตารางชนิดสัตว์)
- ตารางชนิดสัตว์ เก็บข้อมูล ชนิดสัตว์ และจำนวนโควต้า ว่าสัตว์ชนิดนี้ ให้โควต้าเท่าไร
ข้อที่ 5 ถ้างานคุณด่วน แนะนำว่า หาคนอื่นช่วยแก้ไข โดยการส่งตัวอย่างฐานข้อมูลของคุณ ให้เขาไปช่วยดูช่วยประยุกต์ดีกว่า เพราะว่าคุณออกแบบฐานข้อมูลไม่ดีพอ ซึ่งมันทำให้การจัดการได้ยาก เพียงด้วยการอธิบายสอนผ่านเว็บบอร์ดนั้นมันคงโพสต์กันอีกนานกว่าจะเข้าใจตรงกันและตอบคำถามได้ (ส่งข้อมูลเพียงตัวอย่างเท่านั้น ไม่จำเป็นต้องส่งหมด และรักษาความลับใดๆ ที่พึงมีเอาไว้บ้าง)
แต่ถ้างานคุณไม่ด่วนแนะนำว่า ให้ลองดูว่าพอจะรื้อระบบแล้วออกแบบใหม่ให้เป็นไปตาม หรือใกล้เคียงที่สุดกับ ข้อที่ 4 ถ้าทำได้ตามนั้น คุณอาจจะเข้าใจในคำตอบแรกของผม
- ทำไมไม่แจงมาตั้งแต่ทีแรก
ข้อที่ 2 ฟอร์มหลักกับฟอร์มย่อยของคุณ ไม่มีฟิลด์ใดที่สัมพันธ์กันเลย และคุณยังแจ้งอีกว่า "ฟอร์มหลัก และ ฟอร์มย่อย ดังกล่าว มีฟอร์ย่อยอีกฟอร์มหนึ่งทำหน้าที่เชื่อมโยง" ถ้าฟอร์มย่อยดังกล่าว ยังเป็นความลับอยู่ต่อไป ผู้ตอบผู้อ่านคนอื่นๆ ก็ยังมองไม่เห็นความสัมพันธ์กันอยู่ดี จะใช้โค้ด หรือจะให้อะไร ไปเป็นเงื่อนไขในการตรวจสอบโควต้า ก็ทำไม่ได้
ข้อที่ 3 สัตว์แต่ละประเภท มีโควต้าเท่าไหร่ แต่คนตอบไม่รู้ .... ไม่รู้ว่าคุณเก็บจำนวนโควต้าไว้ที่ตารางไหน ฟิลด์อะไร จะให้โค้ดไปเอามาเพื่อใช้ในการตรวจเช็คได้อย่างไร และไม่รู้ว่าในระบบของคุณ แยกสัตว์ไว้กี่ประเภท
ข้อที่ 4
งานอย่างนี้คุณต้องใช้อย่างน้อย 5 ตาราง
- ตารางบุคคล เก็บข้อมูลบุคคล
- ตารางเอกสารสำรวจ เก็บข้อมูลหลักๆ ของเอกสาร เช่น เลขที่ วันที่ บุคคลที่เกี่ยวข้อง จำนวนรวม การอ้างอิง
- ตารางย่อยของเอกสารสำรวจ เก็บเลขที่เอกสาร เก็บรายการของเอกสาร เวลาเอกไปสร้างฟอร์มก็ให้ตารางนี้เป็นแหล่งฟอร์มย่อย ส่วนฟอร์มหลักก็ให้ใช้แหล่งจากตารางเอกสารสำรวจ ดังนั้นฟอร์มหลักและฟอร์มย่อยก็จะผูกกันด้วยฟิลด์ "เลขที่เอกสาร"
- ตารางประเภทสัตว์ มีรหัสและประเภทสัตว์เป็นฟิลด์สำคัญ มีฟิลด์ชนิดสัตว์ เอาไว้ด้วยเพื่อไว้สัมพันธ์กับกับตารางอื่น (ตารางชนิดสัตว์)
- ตารางชนิดสัตว์ เก็บข้อมูล ชนิดสัตว์ และจำนวนโควต้า ว่าสัตว์ชนิดนี้ ให้โควต้าเท่าไร
ข้อที่ 5 ถ้างานคุณด่วน แนะนำว่า หาคนอื่นช่วยแก้ไข โดยการส่งตัวอย่างฐานข้อมูลของคุณ ให้เขาไปช่วยดูช่วยประยุกต์ดีกว่า เพราะว่าคุณออกแบบฐานข้อมูลไม่ดีพอ ซึ่งมันทำให้การจัดการได้ยาก เพียงด้วยการอธิบายสอนผ่านเว็บบอร์ดนั้นมันคงโพสต์กันอีกนานกว่าจะเข้าใจตรงกันและตอบคำถามได้ (ส่งข้อมูลเพียงตัวอย่างเท่านั้น ไม่จำเป็นต้องส่งหมด และรักษาความลับใดๆ ที่พึงมีเอาไว้บ้าง)
แต่ถ้างานคุณไม่ด่วนแนะนำว่า ให้ลองดูว่าพอจะรื้อระบบแล้วออกแบบใหม่ให้เป็นไปตาม หรือใกล้เคียงที่สุดกับ ข้อที่ 4 ถ้าทำได้ตามนั้น คุณอาจจะเข้าใจในคำตอบแรกของผม
5 @R12453
ต้องขอโทษอาจารย์ด้วยที่ให้ขอมูลไม่หมด เพราะไม่ทราบจริงๆ แต่อยากรู้อยากทำเป็น และไม่ด่วน จึงให้ข้อมูลใหม่ มาทั้งหมด หากมีอะไรแนะนำ หรืยังไม่สมบูรณ์ จะตำหนิก็ขอน้อมรับด้วยความยินดี จึงให้ข้อมูลตามจริงมาทั้งหมด
1 ตารางชนิดสัตว์ ประกอบด้วยฟิลด์ (รหัส, ชื่อสัตว์, ชดเชยไม่เกิน)
รหัส ชื่อสัตว์ ชดเชยไม่เกิน(โควต้า)
A01 โค 2
A02 กระบือ 2
A03 สุกร 10
A04 แพะ 10
A05 แกะ 10
A06 ไก่พื้นเมือง 300
A07 ไก่ไข่ 1000
A08 ไก่เนื้อ 1000
A09 เป็ดไข่ 1000
A10 เป็ดเนื้อ 1000
A11 ห่าน 50
A12 นกกระทา 1000
2 ตารางประเภทสัตว์ ประกอบด้วยฟิลด์ รหัส, รหัสประเภทสัตว์ , ประเภทสัตว์, ราคาต่อตัว รายละเอียดดังนี้
รหัส รหัสประเภทสัตว์ ประเภทสัตว์ ราคาต่อตัว
A01 011 โค 6 เดือน-1ปี 7000
A01 013 โค >1ปี-2ปี 10000
A01 014 โค>2ปี 15000
A02 021 กระบือ 6 เดือน-1ปี 7000
A02 023 กระบือ>1ปี-2ปี 1000
A02 024 กระบือ>2ปี 15000
A03 031 สุกร 1-30วัน 1200
A03 032 สุกร >30วัน 2500
A04 041 แพะ 1400
A05 051 แกะ 1400
A06 061 ไก่พื้นเมือง 1-21วัน 20
A06 062 ไก่พื้นเมือง >21วัน 40
A07 071 ไก่ไข่ 1-21วัน 15
A07 072 ไก่ไข่ >21วัน 60
A08 081 ไก่เนื้อ 1-21วัน 15
A08 082 ไก่เนื้อ>21วัน 35
A09 091 เป็ดไข่ 1-21วัน 15
A09 092 เป็ดไข่ >21วัน 40
A10 101 เป็ดเนื้อ 1-21วัน 15
A10 102 ไก่เนื้อ>21วัน 40
A11 111 ห่าน 50
A12 121 นกกระทา1-21วัน 5
A12 122 นกกระทา>21วัน 10
3 ตารางเก็บข้อมูลเกษตรกร ชื่อ tblFarmers มีฟิลด์ ID ,Name, Address
4 ตารางรับแจ้ง ชื่อ tblOrders มีฟิลด์ OrderID(เลขที่รับ AutoNumber) ID(ของเกษตรกร), EmpID(รหัสผู้รับแจ้ง) ,OrderDate(วันแจ้ง)
5ตารางแจงรายละเอียด ชื่อ tblOrderDetails มีฟิลด์ OrderID(เลขที่รับ), ประเภทสัตว์, จำนวนเสียหาย, จำนวนชดเชย
6 ตารางพนักงานชื่อ tblEmployee มีฟิลด์ EmpID,EmpName
ฟอร์ม ประกอบด้วย
1 ฟอร์มหลักชื่อ frmOrderDetails แหล่งข้อมูล จากตาราง tblFarmers( ID ,Name, Address) เพิ่ม เท็กบ็อก ชื่อ txtOrderID แหล่งข้อมูล(=Form![Orders1 Subform].Form!OrderID)
2 ฟอร์มย่อยที่ 1ชื่อ Orders1 Subform แหล่งข้อมูลมาจาก tblOrders ( OrderID(Autonumber) ID, EmpID
3 ฟอร์มย่อยที่2ชื่อ Orders2 Subform แหล่งข้อมูลมาจาก tblOrders ( OrderID, ID(ของเกษตรกร), EmpID
4 ฟอร์มย่อยที่3ชื่อ OrderDetail subform แหล่งข้อมูลมาจาก tblOrderDetails ( OrderID(เลขที่รับ),ประเภทสัตว์, จำนวนเสียหาย, จำนวนชดเชย
รูปแบบการเชื่อมโยง
1 ฟอร์มหลัก กับฟอร์มย่อยที่ 1มี ID ของฟอร์มหลัก เชื่อมโยงกับ ID ของฟอร์มย่อยที่1
2 ฟอร์มหลักกับฟอร์มย่อยที่ 2 มี txtOrderID ของฟอร์มหลัก เชื่อมโยงกับ OrderID ของฟอร์มย่อยที่ 2
3 ฟอร์มย่อยที่ 2 กับฟอร์มย่อยที่ 3มี OrderID ของฟอร์มย่อยที่2 เชื่อมโยงกับ OrderID ของฟอร์มย่อยที่3
4 ฟอร์มย่อยที่ 1 กับฟอร์มย่อยที่ 2 มี OrderId จากฟอร์มย่อยที่1 เชื่อมโยงกับ OrderID ของฟอร์มย่อยที่ 2
1 ตารางชนิดสัตว์ ประกอบด้วยฟิลด์ (รหัส, ชื่อสัตว์, ชดเชยไม่เกิน)
รหัส ชื่อสัตว์ ชดเชยไม่เกิน(โควต้า)
A01 โค 2
A02 กระบือ 2
A03 สุกร 10
A04 แพะ 10
A05 แกะ 10
A06 ไก่พื้นเมือง 300
A07 ไก่ไข่ 1000
A08 ไก่เนื้อ 1000
A09 เป็ดไข่ 1000
A10 เป็ดเนื้อ 1000
A11 ห่าน 50
A12 นกกระทา 1000
2 ตารางประเภทสัตว์ ประกอบด้วยฟิลด์ รหัส, รหัสประเภทสัตว์ , ประเภทสัตว์, ราคาต่อตัว รายละเอียดดังนี้
รหัส รหัสประเภทสัตว์ ประเภทสัตว์ ราคาต่อตัว
A01 011 โค 6 เดือน-1ปี 7000
A01 013 โค >1ปี-2ปี 10000
A01 014 โค>2ปี 15000
A02 021 กระบือ 6 เดือน-1ปี 7000
A02 023 กระบือ>1ปี-2ปี 1000
A02 024 กระบือ>2ปี 15000
A03 031 สุกร 1-30วัน 1200
A03 032 สุกร >30วัน 2500
A04 041 แพะ 1400
A05 051 แกะ 1400
A06 061 ไก่พื้นเมือง 1-21วัน 20
A06 062 ไก่พื้นเมือง >21วัน 40
A07 071 ไก่ไข่ 1-21วัน 15
A07 072 ไก่ไข่ >21วัน 60
A08 081 ไก่เนื้อ 1-21วัน 15
A08 082 ไก่เนื้อ>21วัน 35
A09 091 เป็ดไข่ 1-21วัน 15
A09 092 เป็ดไข่ >21วัน 40
A10 101 เป็ดเนื้อ 1-21วัน 15
A10 102 ไก่เนื้อ>21วัน 40
A11 111 ห่าน 50
A12 121 นกกระทา1-21วัน 5
A12 122 นกกระทา>21วัน 10
3 ตารางเก็บข้อมูลเกษตรกร ชื่อ tblFarmers มีฟิลด์ ID ,Name, Address
4 ตารางรับแจ้ง ชื่อ tblOrders มีฟิลด์ OrderID(เลขที่รับ AutoNumber) ID(ของเกษตรกร), EmpID(รหัสผู้รับแจ้ง) ,OrderDate(วันแจ้ง)
5ตารางแจงรายละเอียด ชื่อ tblOrderDetails มีฟิลด์ OrderID(เลขที่รับ), ประเภทสัตว์, จำนวนเสียหาย, จำนวนชดเชย
6 ตารางพนักงานชื่อ tblEmployee มีฟิลด์ EmpID,EmpName
ฟอร์ม ประกอบด้วย
1 ฟอร์มหลักชื่อ frmOrderDetails แหล่งข้อมูล จากตาราง tblFarmers( ID ,Name, Address) เพิ่ม เท็กบ็อก ชื่อ txtOrderID แหล่งข้อมูล(=Form![Orders1 Subform].Form!OrderID)
2 ฟอร์มย่อยที่ 1ชื่อ Orders1 Subform แหล่งข้อมูลมาจาก tblOrders ( OrderID(Autonumber) ID, EmpID
3 ฟอร์มย่อยที่2ชื่อ Orders2 Subform แหล่งข้อมูลมาจาก tblOrders ( OrderID, ID(ของเกษตรกร), EmpID
4 ฟอร์มย่อยที่3ชื่อ OrderDetail subform แหล่งข้อมูลมาจาก tblOrderDetails ( OrderID(เลขที่รับ),ประเภทสัตว์, จำนวนเสียหาย, จำนวนชดเชย
รูปแบบการเชื่อมโยง
1 ฟอร์มหลัก กับฟอร์มย่อยที่ 1มี ID ของฟอร์มหลัก เชื่อมโยงกับ ID ของฟอร์มย่อยที่1
2 ฟอร์มหลักกับฟอร์มย่อยที่ 2 มี txtOrderID ของฟอร์มหลัก เชื่อมโยงกับ OrderID ของฟอร์มย่อยที่ 2
3 ฟอร์มย่อยที่ 2 กับฟอร์มย่อยที่ 3มี OrderID ของฟอร์มย่อยที่2 เชื่อมโยงกับ OrderID ของฟอร์มย่อยที่3
4 ฟอร์มย่อยที่ 1 กับฟอร์มย่อยที่ 2 มี OrderId จากฟอร์มย่อยที่1 เชื่อมโยงกับ OrderID ของฟอร์มย่อยที่ 2
6 @R12454
ตารางออกแบบได้ดีแล้วครับ แต่ฟอร์มเอาใหม่ครับ เอาตามนี้
1) ฟอร์มหลัก ดึงข้อมูลมาจาก tblOrders ออกแบบฟอร์มแบบ single
- ช่องที่กรอกข้อมูล เกษตรกร (ผูกกับฟิลด์ ID) ให้ใช้เป็นคอมโบ โดยแหล่งข้อมูลของคอมโบให้ใช้ตาราง tblFarmer (อาจต้อง textbox อีกตัวหนึ่งไว้ข้างๆ เพื่อให้แสดงชื่อเกตรกร เมื่อมีการเลือกข้อมูลในคอมโบ)
- ช่องที่กรอกข้อมูลผู้รับแจ้ง ก็ทำคล้ายๆ กัน ผูกข้อมูลกับฟิลด์ EmpID ใช้แหล่งข้อมูลจาก tblEmployees
2) ฟอร์มย่อย ดึงข้อมูลจาก tblOrderDetails ออกแบบฟอร์มแบบ continuous
- เชื่อมโยงกับฟอร์มหลักโดยใช้ฟิลด์ OrderID
- ช่องที่ใช้กรอกข้อมูล ประเภทสัตว์ ให้ใช้เป็นคอมโบ ผูกกับฟิลด์ [ประเภทสัตว์] และอาจต้องมี textbox ด้านข้างไว้โชว์ชื่อของประเภทสัตว์ การเลือกจำนวนคอลัมน์ในคอมโบตัวนี้ ควรเลือกเอาฟิลด์ [รหัส] มาด้วย แล้วจำไว้ว่าเราวางไว้เป็นคอลัมน์ที่เท่าไหร่ (ไม่จำเป็นต้องเป็นคอลัมน์ที่1) สมมติว่าให้อยู่คอลัมน์ที่ 3 ก็แล้วกันนะครับ
- ในช่อง [จำนวนชดเชย] เราจะฝังโค้ดเอาไว้ให้คำนวนโควต้า แนวคิดคือ
เมื่อมีการกรอกจำนวนชดเชย จะให้โค้ดไปตรวจนับ และเปรียบเทียบเช็คโควต้าในระบบ เมื่อผลการตรวจเช็คออกมาแล้ว... ถ้าไม่เกินโควต้า โปรแกรมของเราจะไม่ขัดขวางอะไร จะปล่อยให้ user ทำงานต่อไป แต่ถ้าเกินโควต้า โปรแกรมของเราจะมีข้อความแจ้งเตือน แล้วบังคับให้ปรับเปลี่ยนตัวเลขที่กรอก หรือ อาจจะล้างตัวเลขที่กรอกมา เพื่อให้กรอกใหม่
วิธีการตรวจเช็ค
1 นับจำนวนโดยมีเงื่อนไข เนื่องจากมันเกี่ยวเนื่องกันตั้ง 4 ตาราง เราไปทำเป็นคิวรี่ไว้รอดีกว่า แล้วค่อยไปดึงข้อมูลมาจากคิวรี่เอา ให้ไปสร้างคิวรี่
2 ไปค้นข้อมูล โควต้า จากตาราง ชนิดสัตว์ ว่าสัตว์ชนิดเดียวกันกับเรคคอร์ดปัจจุบันนี้ มีโควต้าเท่าไหร่ คือการใช้ Dlookup() โดยระบุเงื่อนไข
เราจะหาข้อมูลชนิดสัตว์ของเรคคอร์ดปัจจุบันได้อย่างไร? ก็ไปอ้างอิงเอาจากคอมโบที่กรอกข้อมูลประเภทสัตว์ไงครับ ซึ่งเราได้วาง [รหัส] ไว้ที่คอลัมน์3 เวลาอ้างอิงก็อ้าง combo1.column(2) (จำนวนคอลัมน์ เริ่มนับจาก 0)
พอจะมองเห็นภาพไหมครับ
จะเห็นได้ว่า เราใช้ฟอร์มแค่สองตัวเองครับ ฟอร์มหลักกับฟอร์มย่อยอย่างละ 1 ตัว
ในฟอร์มหลักก็ไม่ต้องเขียนโค้ดอะไรเลย
โค้ดเราก็จะเขียนไว้ในฟอร์มย่อยเท่านั้น
** การให้เลือกคอมโบแล้วโชว์ชื่อใน textbox ทำเป็นไหม? ถ้าไม่เป็นค้นกระทู้เก่าๆ มีเยอะนะครับ
1) ฟอร์มหลัก ดึงข้อมูลมาจาก tblOrders ออกแบบฟอร์มแบบ single
- ช่องที่กรอกข้อมูล เกษตรกร (ผูกกับฟิลด์ ID) ให้ใช้เป็นคอมโบ โดยแหล่งข้อมูลของคอมโบให้ใช้ตาราง tblFarmer (อาจต้อง textbox อีกตัวหนึ่งไว้ข้างๆ เพื่อให้แสดงชื่อเกตรกร เมื่อมีการเลือกข้อมูลในคอมโบ)
- ช่องที่กรอกข้อมูลผู้รับแจ้ง ก็ทำคล้ายๆ กัน ผูกข้อมูลกับฟิลด์ EmpID ใช้แหล่งข้อมูลจาก tblEmployees
2) ฟอร์มย่อย ดึงข้อมูลจาก tblOrderDetails ออกแบบฟอร์มแบบ continuous
- เชื่อมโยงกับฟอร์มหลักโดยใช้ฟิลด์ OrderID
- ช่องที่ใช้กรอกข้อมูล ประเภทสัตว์ ให้ใช้เป็นคอมโบ ผูกกับฟิลด์ [ประเภทสัตว์] และอาจต้องมี textbox ด้านข้างไว้โชว์ชื่อของประเภทสัตว์ การเลือกจำนวนคอลัมน์ในคอมโบตัวนี้ ควรเลือกเอาฟิลด์ [รหัส] มาด้วย แล้วจำไว้ว่าเราวางไว้เป็นคอลัมน์ที่เท่าไหร่ (ไม่จำเป็นต้องเป็นคอลัมน์ที่1) สมมติว่าให้อยู่คอลัมน์ที่ 3 ก็แล้วกันนะครับ
- ในช่อง [จำนวนชดเชย] เราจะฝังโค้ดเอาไว้ให้คำนวนโควต้า แนวคิดคือ
เมื่อมีการกรอกจำนวนชดเชย จะให้โค้ดไปตรวจนับ และเปรียบเทียบเช็คโควต้าในระบบ เมื่อผลการตรวจเช็คออกมาแล้ว... ถ้าไม่เกินโควต้า โปรแกรมของเราจะไม่ขัดขวางอะไร จะปล่อยให้ user ทำงานต่อไป แต่ถ้าเกินโควต้า โปรแกรมของเราจะมีข้อความแจ้งเตือน แล้วบังคับให้ปรับเปลี่ยนตัวเลขที่กรอก หรือ อาจจะล้างตัวเลขที่กรอกมา เพื่อให้กรอกใหม่
วิธีการตรวจเช็ค
1 นับจำนวนโดยมีเงื่อนไข เนื่องจากมันเกี่ยวเนื่องกันตั้ง 4 ตาราง เราไปทำเป็นคิวรี่ไว้รอดีกว่า แล้วค่อยไปดึงข้อมูลมาจากคิวรี่เอา ให้ไปสร้างคิวรี่
SELECT tblOrders.ID, [ตารางชนิดสัตว์].[รหัส], Sum(tblOrderDetails.[จำนวนชดเชย]) AS Total
FROM tblOrders INNER JOIN ([ตารางชนิดสัตว์] INNER JOIN ([ตารางประเภทสัตว์] INNER JOIN tblOrderDetails ON [ตารางประเภทสัตว์].[รหัสประเภทสัตว์] = tblOrderDetails.[ประเภทสัตว์]) ON [ตารางชนิดสัตว์].[รหัส] = [ตารางประเภทสัตว์].[รหัส]) ON tblOrders.ID = tblOrders.OrderID = tblOrderDetails.OrderID
GROUP BY tblOrders.ID,[ตารางชนิดสัตว์].[รหัส];
2 ไปค้นข้อมูล โควต้า จากตาราง ชนิดสัตว์ ว่าสัตว์ชนิดเดียวกันกับเรคคอร์ดปัจจุบันนี้ มีโควต้าเท่าไหร่ คือการใช้ Dlookup() โดยระบุเงื่อนไข
เราจะหาข้อมูลชนิดสัตว์ของเรคคอร์ดปัจจุบันได้อย่างไร? ก็ไปอ้างอิงเอาจากคอมโบที่กรอกข้อมูลประเภทสัตว์ไงครับ ซึ่งเราได้วาง [รหัส] ไว้ที่คอลัมน์3 เวลาอ้างอิงก็อ้าง combo1.column(2) (จำนวนคอลัมน์ เริ่มนับจาก 0)
พอจะมองเห็นภาพไหมครับ
จะเห็นได้ว่า เราใช้ฟอร์มแค่สองตัวเองครับ ฟอร์มหลักกับฟอร์มย่อยอย่างละ 1 ตัว
ในฟอร์มหลักก็ไม่ต้องเขียนโค้ดอะไรเลย
โค้ดเราก็จะเขียนไว้ในฟอร์มย่อยเท่านั้น
** การให้เลือกคอมโบแล้วโชว์ชื่อใน textbox ทำเป็นไหม? ถ้าไม่เป็นค้นกระทู้เก่าๆ มีเยอะนะครับ
7 @R12455
ต่อไป การเขียนโค้ด
การเขียนโค้ดจำเป็นต้องรู้ชื่อ object ต่างๆ บนฟอร์มอย่างมาก เพราะจำเป็นต้องใช้ในการอ้างอิง
ผมสมมติชื่อ เอาเองเฉพาะที่จำเป็นในการเขียนโค้ดก็แล้วกันครับ
ฟอร์มหลัก = fOrder
คอมโบที่ใช้เลื่อก เกษตรกร = cbFarmer
ฟอร์มย่อย = fOrderSub
คอมโบที่ใช้เลือก ประเภทสัตว์ = cbAnimal
textbox ที่ใช้กรอก [จำนวนชดเชย] = tApprove
คิวรี่ที่ผมให้สร้าง = qrApprove
ส่วนที่เหลืออื่นๆ ไม่ว่าจะเป็นชื่อตาราง ชื่อฟิลด์ต่างๆ ในแต่ละตาราง เอาตามที่คุณให้มาทั้งหมดนะครับ
การเขียนโค้ดจำเป็นต้องรู้ชื่อ object ต่างๆ บนฟอร์มอย่างมาก เพราะจำเป็นต้องใช้ในการอ้างอิง
ผมสมมติชื่อ เอาเองเฉพาะที่จำเป็นในการเขียนโค้ดก็แล้วกันครับ
ฟอร์มหลัก = fOrder
คอมโบที่ใช้เลื่อก เกษตรกร = cbFarmer
ฟอร์มย่อย = fOrderSub
คอมโบที่ใช้เลือก ประเภทสัตว์ = cbAnimal
textbox ที่ใช้กรอก [จำนวนชดเชย] = tApprove
คิวรี่ที่ผมให้สร้าง = qrApprove
ส่วนที่เหลืออื่นๆ ไม่ว่าจะเป็นชื่อตาราง ชื่อฟิลด์ต่างๆ ในแต่ละตาราง เอาตามที่คุณให้มาทั้งหมดนะครับ
Private sub tApprove_AfterUpdate()
Dim allApprove as long
Dim xQuota as long
allApprove = Dlookup("[total]","qrApprove","[ID] = " & forms("fOrder").controls("cbFarmer") & " AND [รหัส] Like '" & me.cbAnimal.column(2) & "'")
xQuota = Dlookup("[ชดเชยไม่เกิน]", "[ชนิดสัตว์]", "[รหัส] Like '" & me.cbAnimal.column(2) & "'")
if AllApprove > xQuota then
allApprove = allApprove - me.tApprove
msgbox "จำนวนชดเชยเกินโค้วต้า!" & vbcrlf & _
"ให้ชดเชยได้อีก ไม่เกิน " & xQuota - allApprove & " ตัวเท่านั้น"vbCritical,"เกินโควต้า!!"
me.tApprove.setfocus
me.tApprove=xQuota - allApprove
End if
End sub
8 @R12456
ขอบคุณมากๆ ที่แนะนำ ให้แนวทาง ขอนำไปทดลองสร้าง ได้ผลประการใด จะแจ้งให้ทราบอีกครั้ง
Time: 0.2983s
ผมสร้างฟอร์มป้อนข้อมูล ประกอบด้วย
1 ฟอร์มหลัก แสดงชื่อเกษตรกร
2 ฟอร์มย่อย เพื่อป้อนข้อมูล การช่วยเหลือเนื่องจากภัยพิบัติ โดยมี ฟิลด์ ดังนี้
(1) ประเภทสัตว์ เช่น โค กระบือ สุกร
(2) ขนิดสัตว์(แยกตามอายุ) เช่น โคอายุ 6เดือน-1ปี, โคายุ>1ปี-2ปี และโคอายุ>2ปี สัตว์อืนก็เช่นกัน
(3) จำนวนช่วยเหลือ
ข้อกำหนดให้ช่วยเหลือ ตามประเภทสัตว์เช่น โค ไม่เกินรายละ 2 ตัว ต่อราย ถ้าเลือกชนิดเดียว เช่น โคอายุ 6เดือน-1ปี เพิ่มอีก 1 แถวแล้วป้อน จำนวนช่วยเหลือเข้าไปอีก 1 ตัว จะทำให้การช่วยเหลือเกินจากที่กำหนด และควรจะแจ้งเตือนว่า ."รายนี้ ช่วยเหลือเกิน 2 แล้ว" เพื่อเป็นการตรวจสอบความถูกต้อง จึงอยากขอความช่วยเหลือด้วย จะเป็นพระคุณอย่างสูง คิดนานแล้วแต่ไม่สำเสร็จ VBA รู้บ้างเล็กน้อย มาโคร พอรู้บ้าง
หมายเหตุ ประเภทสัตว์ และ ชนิดสัตว์(แยกตามอายุ) มีตารางเก็บ