กระทู้เก่าบอร์ด อ.Yeadram
3,557 15
URL.หัวข้อ /
URL
สอบถามการสร้างtableหน่อยครับ
คือผมต้องการสร้างตารางแสดงส่วนประกอบ BOM อ่ะครับ
อย่างเช่น
ผมมี ขนมปังหมูหยอง ส่วนประกอบก็จะมี แป้ง 50 กรัม น้ำตาล 30 กรัม หมูหยอง 20 กรัม แบบนี้อ่ะครับ
คือผมจะทำคล้ายก็กับ การเชื่่่อมตารางการสั่งซื้อมา
สมมุติ ผมสั่ง ขนมปังหมูหยองมา 3 ชิ้น ก็จะให้มันแสดงว่าใช้ ส่วนประกอบนั้นๆ อย่างจะเท่าไหร่อ่ะครับ รบกวนด้วยครับ
อย่างเช่น
ผมมี ขนมปังหมูหยอง ส่วนประกอบก็จะมี แป้ง 50 กรัม น้ำตาล 30 กรัม หมูหยอง 20 กรัม แบบนี้อ่ะครับ
คือผมจะทำคล้ายก็กับ การเชื่่่อมตารางการสั่งซื้อมา
สมมุติ ผมสั่ง ขนมปังหมูหยองมา 3 ชิ้น ก็จะให้มันแสดงว่าใช้ ส่วนประกอบนั้นๆ อย่างจะเท่าไหร่อ่ะครับ รบกวนด้วยครับ
15 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R11937
ระดับเดี่ยวครับ
3 @R11938
ตาราง BOM ก็สร้างง่ายๆให้มีฟิลด์หลักๆเหล่านี้คือ
- FoodCode รหัสอาหารที่เราต้องการทำ รหัสนี้ควรจะถูกสร้างไว้แล้วจากตารางอื่นอีกทีนึง โดยตารางนั้น (Food) ต้องมี รหัสอาหารนี้ (Code) และชื่ออาหาร (Name)
- IngredientCode รหัสส่วนผสมแต่ละชนิด รหัสนี้ควรจะถูกสร้างไว้แล้วจากตารางอื่นอีกทีนึง โดยตารางนั้น (Ingredient) ต้องมี รหัสส่วนผสมนี้ (Code) และชื่อส่วนผสม (Name)
- Qty ปริมาณที่ต้องใช้ในการผลิตอาหาร 1 หน่วย เช่น ต่อ 1 ชิ้น, ต่อ 1 กิโล เป็นต้น และ Data Type ควรเป็นประเภท Decimal
- Unit หน่วยนับที่ใช้ อาจเป็นชื่อของหน่วยนับ เช่น กรัม, มล. ฯ หรือเป็นรหัสของหน่วยนับที่ได้สร้างไว้แล้วจากตารางอื่นอีกทีนึง
ต้องกำหนดให้ Primary Key ประกอบไปด้วย 2 ฟิลด์คือ ProductCode และ IngredientCode
แล้วผมก็สมมุติว่า อาหารที่ต้องผลิตนั้นถูกบันทึกไว้ในตารางชื่อ Order ซึ่งประกอบด้วยฟิลด์รหัสอาหาร (Code) และปริมาณที่ต้องการผลิต (Qty)
ดังนั้นคิวรี่ที่เราต้องการก็คือ
SELECT O.Code, F.Name, O.Qty, B.IngredientCode, I.Name, O.Qty * B.Qty AS ReqQty, B.Unit
FROM (Order AS O INNER JOIN Food AS F ON O.Code = F.Code) INNER JOIN (Ingredient AS I INNER JOIN BOM AS B ON I.Code = B.IngredientCode) ON O.Code = B.FoodCode ORDER BY B.FoodCode, B.IngredientCode
ตีความได้ว่า
แสดง รหัสและชื่ออาหาร, จำนวนที่ต้องการผลิต, รหัสและชื่อส่วนผสม, จำนวนของส่วนผสม, หน่วยนับของส่วนผสม แสดงโดยเรียงตามรหัสอาหารและรหัสส่วนผสม
- FoodCode รหัสอาหารที่เราต้องการทำ รหัสนี้ควรจะถูกสร้างไว้แล้วจากตารางอื่นอีกทีนึง โดยตารางนั้น (Food) ต้องมี รหัสอาหารนี้ (Code) และชื่ออาหาร (Name)
- IngredientCode รหัสส่วนผสมแต่ละชนิด รหัสนี้ควรจะถูกสร้างไว้แล้วจากตารางอื่นอีกทีนึง โดยตารางนั้น (Ingredient) ต้องมี รหัสส่วนผสมนี้ (Code) และชื่อส่วนผสม (Name)
- Qty ปริมาณที่ต้องใช้ในการผลิตอาหาร 1 หน่วย เช่น ต่อ 1 ชิ้น, ต่อ 1 กิโล เป็นต้น และ Data Type ควรเป็นประเภท Decimal
- Unit หน่วยนับที่ใช้ อาจเป็นชื่อของหน่วยนับ เช่น กรัม, มล. ฯ หรือเป็นรหัสของหน่วยนับที่ได้สร้างไว้แล้วจากตารางอื่นอีกทีนึง
ต้องกำหนดให้ Primary Key ประกอบไปด้วย 2 ฟิลด์คือ ProductCode และ IngredientCode
แล้วผมก็สมมุติว่า อาหารที่ต้องผลิตนั้นถูกบันทึกไว้ในตารางชื่อ Order ซึ่งประกอบด้วยฟิลด์รหัสอาหาร (Code) และปริมาณที่ต้องการผลิต (Qty)
ดังนั้นคิวรี่ที่เราต้องการก็คือ
SELECT O.Code, F.Name, O.Qty, B.IngredientCode, I.Name, O.Qty * B.Qty AS ReqQty, B.Unit
FROM (Order AS O INNER JOIN Food AS F ON O.Code = F.Code) INNER JOIN (Ingredient AS I INNER JOIN BOM AS B ON I.Code = B.IngredientCode) ON O.Code = B.FoodCode ORDER BY B.FoodCode, B.IngredientCode
ตีความได้ว่า
แสดง รหัสและชื่ออาหาร, จำนวนที่ต้องการผลิต, รหัสและชื่อส่วนผสม, จำนวนของส่วนผสม, หน่วยนับของส่วนผสม แสดงโดยเรียงตามรหัสอาหารและรหัสส่วนผสม
4 @R11945
แก้ไข :
ต้องกำหนดให้ Primary Key ประกอบไปด้วย 2 ฟิลด์คือ ProductCode และ IngredientCode
เป็น
ต้องกำหนดให้ Primary Key ประกอบไปด้วย 2 ฟิลด์คือ FoodCode และ IngredientCode
และถ้าเปลี่ยนฟิลด์รหัสอาหารจากชื่อ Code ในตาราง Order ไปเป็นชื่อ FoodCode แทน น่าจะทำให้สื่อความหมาย อ่านได้เข้าใจมากยิ่งขึ้นครับ (เปลี่ยนในคิวรี่ด้วย)
ต้องกำหนดให้ Primary Key ประกอบไปด้วย 2 ฟิลด์คือ ProductCode และ IngredientCode
เป็น
ต้องกำหนดให้ Primary Key ประกอบไปด้วย 2 ฟิลด์คือ FoodCode และ IngredientCode
และถ้าเปลี่ยนฟิลด์รหัสอาหารจากชื่อ Code ในตาราง Order ไปเป็นชื่อ FoodCode แทน น่าจะทำให้สื่อความหมาย อ่านได้เข้าใจมากยิ่งขึ้นครับ (เปลี่ยนในคิวรี่ด้วย)
5 @R11956
ขอบคุณครับ
6 @R11967
- IngredientCode รหัสส่วนผสมแต่ละชนิด รหัสนี้ควรจะถูกสร้างไว้แล้วจากตารางอื่นอีกทีนึง โดยตารางนั้น (Ingredient) ต้องมี รหัสส่วนผสมนี้ (Code) และชื่อส่วนผสม (Name)
คือใน ตางรางหนึ่ง มีชื่ออาหาร และชื่อ ส่วนผสม
หมายถึง
1.ขนมปังคุ๊กกี้ 1 แป้ง
2 น้ำตาล
3 นม
แบบนี้หรือปล่าวครับเเล้วจะสร้างtable ยังไงครับ
คือใน ตางรางหนึ่ง มีชื่ออาหาร และชื่อ ส่วนผสม
หมายถึง
1.ขนมปังคุ๊กกี้ 1 แป้ง
2 น้ำตาล
3 นม
แบบนี้หรือปล่าวครับเเล้วจะสร้างtable ยังไงครับ
7 @R11969
สมมุติว่า ขนมปังคุกกี้มีรหัสเป็น ck1, แป้งมีรหัส fr2, น้ำตาลมีรหัสเป็น su3, นมมีรหัส mk4
เทเบิล Food ก็จะมีเรคอร์ด "ck1", "ขนมปังคุกกี้"
เทเบิล Ingredient จะมีเรคอร์ด
"fr2","แป้ง"
"su3","น้ำตาล"
"mk4","นม"
เทเบิล BOM จะมีเรคอร์ด เช่น
"ck1", "fr2", 50, "กรัม"
"ck1", "su3", 30, "กรัม"
"ck1", "mk4", 10, "กรัม"
เทเบิล Food ก็จะมีเรคอร์ด "ck1", "ขนมปังคุกกี้"
เทเบิล Ingredient จะมีเรคอร์ด
"fr2","แป้ง"
"su3","น้ำตาล"
"mk4","นม"
เทเบิล BOM จะมีเรคอร์ด เช่น
"ck1", "fr2", 50, "กรัม"
"ck1", "su3", 30, "กรัม"
"ck1", "mk4", 10, "กรัม"
8 @R12227
จะทำ from เเล้วในกรณี ที่ หนึ่งผลิตภัณฑ์ มี วัตถุ ดิบหลายชิน จะทำอย่างไรให้มันโชวอ่ะครับ
9 @R12228
ง่ายที่สุดก็คือสร้าง Main Form และมี Sub Form อยู่ภายในครับ
บน Main Form ก็มี Combobox ที่มีชื่อของผลิตภัณฑ์ทั้งหมดจากเทเบิล Food แสดงเอาไว้ Main Form ไม่ต้องผูกกับเทเบิลใด อย่างที่เราเรียกกันในทางเทคนิคว่าเป็น Unbound Form
ส่วน Sub Form ก็แสดงข้อมูลของวัตถุดิบต่างๆที่ต้องการ Sub Form ต้องผูกเข้ากับคิวรี่ (Bound Form) ที่เป็นผลจากการทำ inner join ระหว่างเทเบิล BOM กับเทเบิล Ingredient แล้ว Sub Form ก็ใช้ฟิลด์ที่เก็บรหัสวัตถุดิบจากเทเบิล BOM เชื่อมโยงกับชื่อ Combobox บน Main Form ผ่านทาง Link Child Fields และ Link Master Fields ตามลำดับ
เมื่อเราเลือกผลิตภัณฑ์บน Main Form ปั๊ป รายละเอียดของวัตถุดิบของผลิตภัณฑ์นั้นก็จะแสดงโดยอัตโนมัติใน Sub Form
วิธีนี้ การทำงานทั้งหมดไม่ต้องเขียนเป็นโปรแกรมเลย ลองไปหาอ่านวิธีทำ Main Form กับ Sub Form โดยละเอียดดูครับ
บน Main Form ก็มี Combobox ที่มีชื่อของผลิตภัณฑ์ทั้งหมดจากเทเบิล Food แสดงเอาไว้ Main Form ไม่ต้องผูกกับเทเบิลใด อย่างที่เราเรียกกันในทางเทคนิคว่าเป็น Unbound Form
ส่วน Sub Form ก็แสดงข้อมูลของวัตถุดิบต่างๆที่ต้องการ Sub Form ต้องผูกเข้ากับคิวรี่ (Bound Form) ที่เป็นผลจากการทำ inner join ระหว่างเทเบิล BOM กับเทเบิล Ingredient แล้ว Sub Form ก็ใช้ฟิลด์ที่เก็บรหัสวัตถุดิบจากเทเบิล BOM เชื่อมโยงกับชื่อ Combobox บน Main Form ผ่านทาง Link Child Fields และ Link Master Fields ตามลำดับ
เมื่อเราเลือกผลิตภัณฑ์บน Main Form ปั๊ป รายละเอียดของวัตถุดิบของผลิตภัณฑ์นั้นก็จะแสดงโดยอัตโนมัติใน Sub Form
วิธีนี้ การทำงานทั้งหมดไม่ต้องเขียนเป็นโปรแกรมเลย ลองไปหาอ่านวิธีทำ Main Form กับ Sub Form โดยละเอียดดูครับ
10 @R12233
มันโชว์แค่ วัตถุดิบ ตัวเเรก เเค่ตัวเดียวอ่ะครับ
11 @R12234
เลือก Default View property ของ Sub Form ให้เป็น Continuous Form สิครับ
12 @R12249
สมมติว่าผมต้องการสั่งสินค้า เป็น รายชื่อเค้กเเล้วให้เชื่อมโยงไปที่วัตถุดิบ
เเล้วเปลี่ยนจากจำนวนเค้กเป็น จำนวนวัตถุดิบที่ใช้ เเล้วเอาไปหักลบกับจำนวนวัตถุดิบที่มีอยู่
คือผมจะให้มันอัพเดทข้อมูลเวลามีการสั่งของ ก็ให้คลังสินค้า ลดลงไปด้วยอ่ะครับ
เเล้วเปลี่ยนจากจำนวนเค้กเป็น จำนวนวัตถุดิบที่ใช้ เเล้วเอาไปหักลบกับจำนวนวัตถุดิบที่มีอยู่
คือผมจะให้มันอัพเดทข้อมูลเวลามีการสั่งของ ก็ให้คลังสินค้า ลดลงไปด้วยอ่ะครับ
13 @R12250
คุณต้องสั่งอัพเดตลงในเทเบิลที่เก็บคลังสินค้าของวัตถุดิบ (สมมุติว่าเทเบิลชื่อ Inventory, ฟิลด์ที่เก็บรหัสส่วนผสมให้ชื่อว่า IngredientCode, ฟิลด์ที่เก็บยอดคงเหลือให้ชื่อว่า BalQty) วิธีการเขียนก็มีหลายวิธี แต่ที่ผมยกมาให้ดูนี้เป็นการใช้ Update Query
update Inventory as V set V.BalQty = V.BalQty - (select B1.Qty * [จำนวนที่สั่งสินค้า] as ReqQty from BOM as B1 where (B1.FoodCode = [รหัสอาหาร]) and (B1.IngredientCode = V.IngrdientCode)) where V.IngredientCode in (select B2.IngredientCode from BOM as B2 where B2.FoodCode = [รหัสอาหาร])
คุณก็แทน [จำนวนที่สั่งสินค้า] ด้วยตัวเลข และแทน [รหัสอาหาร] ด้วยตัวอักษรที่อยู่ใน double quote เช่น "ck01"
ผมยังไม่ได้ทดสอบคิวรี่นี้ว่ามีที่ผิดตรงไหน ยังไง คุณช่วยเอาไปทดสอบด้วยแล้วกัน
update Inventory as V set V.BalQty = V.BalQty - (select B1.Qty * [จำนวนที่สั่งสินค้า] as ReqQty from BOM as B1 where (B1.FoodCode = [รหัสอาหาร]) and (B1.IngredientCode = V.IngrdientCode)) where V.IngredientCode in (select B2.IngredientCode from BOM as B2 where B2.FoodCode = [รหัสอาหาร])
คุณก็แทน [จำนวนที่สั่งสินค้า] ด้วยตัวเลข และแทน [รหัสอาหาร] ด้วยตัวอักษรที่อยู่ใน double quote เช่น "ck01"
ผมยังไม่ได้ทดสอบคิวรี่นี้ว่ามีที่ผิดตรงไหน ยังไง คุณช่วยเอาไปทดสอบด้วยแล้วกัน
14 @R12298
คือถ้า tblMaterial เป็นตารางเก็บวัตถุดิบ
ฟิลด์ที่เก็บรหัสส่วนผสมให้ชื่อว่า Material_ID
ฟิลด์ที่เก็บยอดคงเหลือให้ชื่อว่า Material_Hold
การสั่งซื้อวัตถุดิบผมรวมมาอยู่ใน qrySumBuyMat โดยชื่อจำนวนที่เก็บชื่อ SumOfMaterial_Qty
และรายการที่ลูกค้าสั่งซื้อรวมมาอยู่ใน qrySuminOrder โดยชื่อจำนวนที่มีการสั่งซื้อว่า SumOfQrder_Qry
และตารางส่วนผสมจะอยู่ใน tblBOM โดยมีฟิลด์ดังนี้
Product_ID รหัสสินค้า
Material_ID รหัสวัตถุดิบ
Material_Used น้ำหนักส่วนประกอบที่ใช้
อันนี้คือชื่อของผมอ่ะครับ
พอผมทำเอง ผมต้องการให้ตารางที่แสดงไม่ว่าตารางใหม่หรือตาราวเดิม
แสดงเป็นรายการเหมือนกับตารางวัตถุดิบ
แต่ที่ผมทำมันแสดงข้อมูลมาซ้ำๆกัน
สูตรที่ต้องการให้มันคำนวนคือ
วัตถุดิบที่มี = วัตถุดิบที่มี - (รายการสินค้าที่สั่งซื้อ x น้ำหนักส่วนประกอบที่ใช้) + การสั่งซื้อวัตถุดิบ อ่ะครับ
ผมต้องการตารางสุดท้ายแค่นี้ แต่ยังติดปัญหาครับ
รบกวนดูภาษา SQL ที่ต้องใช้ด้วยครับ
ฟิลด์ที่เก็บรหัสส่วนผสมให้ชื่อว่า Material_ID
ฟิลด์ที่เก็บยอดคงเหลือให้ชื่อว่า Material_Hold
การสั่งซื้อวัตถุดิบผมรวมมาอยู่ใน qrySumBuyMat โดยชื่อจำนวนที่เก็บชื่อ SumOfMaterial_Qty
และรายการที่ลูกค้าสั่งซื้อรวมมาอยู่ใน qrySuminOrder โดยชื่อจำนวนที่มีการสั่งซื้อว่า SumOfQrder_Qry
และตารางส่วนผสมจะอยู่ใน tblBOM โดยมีฟิลด์ดังนี้
Product_ID รหัสสินค้า
Material_ID รหัสวัตถุดิบ
Material_Used น้ำหนักส่วนประกอบที่ใช้
อันนี้คือชื่อของผมอ่ะครับ
พอผมทำเอง ผมต้องการให้ตารางที่แสดงไม่ว่าตารางใหม่หรือตาราวเดิม
แสดงเป็นรายการเหมือนกับตารางวัตถุดิบ
แต่ที่ผมทำมันแสดงข้อมูลมาซ้ำๆกัน
สูตรที่ต้องการให้มันคำนวนคือ
วัตถุดิบที่มี = วัตถุดิบที่มี - (รายการสินค้าที่สั่งซื้อ x น้ำหนักส่วนประกอบที่ใช้) + การสั่งซื้อวัตถุดิบ อ่ะครับ
ผมต้องการตารางสุดท้ายแค่นี้ แต่ยังติดปัญหาครับ
รบกวนดูภาษา SQL ที่ต้องใช้ด้วยครับ
15 @R12320
update [ยอดคงเหลือ] = [ยอดคงเหลือ] + [จำนวนวัตถุดิบที่กำลังสั่งซื้อ] - [จำนวนถูกใช้ไปเพราะลูกค้าสั่งซื้อสินค้า]
[จำนวนถูกใช้ไปเพราะลูกค้าสั่งซื้อสินค้า] = [ผลรวมของวัตถุดิบเดียวกันที่แต่ละสินค้าที่ลูกค้าสั่งซื้อต้องใช้ร่วมกัน]
update tblMaterial as M
set M.Material_Hold = M.Material_Hold
+
(select QM.SumOfMaterial_Qty from qrySumBuyMat as QM where QM.Material_ID = M.Material_ID)
-
(select sum(B.Material_Used * QO.SumOfQrder_Qry ) as ReqQty from tblBOM as B inner join qrySuminOrder as QO
on B.Product_ID = QO.Product_ID
where B.Material_ID = M.Material_ID)
ใน qrySumBuyMat จะต้องมีฟิลด์ที่ชื่อ Material_ID และใน qrySuminOrder ก็ต้องมีฟิลด์ที่ชื่อ Product_ID ด้วยนะครับ
และเหมือนเดิม ผมไม่ได้ทดสอบว่าทำงานได้ถูกต้องหรือไม่ คุณต้องไปทดสอบเอง
[จำนวนถูกใช้ไปเพราะลูกค้าสั่งซื้อสินค้า] = [ผลรวมของวัตถุดิบเดียวกันที่แต่ละสินค้าที่ลูกค้าสั่งซื้อต้องใช้ร่วมกัน]
update tblMaterial as M
set M.Material_Hold = M.Material_Hold
+
(select QM.SumOfMaterial_Qty from qrySumBuyMat as QM where QM.Material_ID = M.Material_ID)
-
(select sum(B.Material_Used * QO.SumOfQrder_Qry ) as ReqQty from tblBOM as B inner join qrySuminOrder as QO
on B.Product_ID = QO.Product_ID
where B.Material_ID = M.Material_ID)
ใน qrySumBuyMat จะต้องมีฟิลด์ที่ชื่อ Material_ID และใน qrySuminOrder ก็ต้องมีฟิลด์ที่ชื่อ Product_ID ด้วยนะครับ
และเหมือนเดิม ผมไม่ได้ทดสอบว่าทำงานได้ถูกต้องหรือไม่ คุณต้องไปทดสอบเอง
Time: 0.2416s
- ก้อนโดลขนมปัง 80 กรัม
- และก้อนโดลขนมปัง 80 กรัมก็ประกอบไปด้วย
- แป้ง 50 กรัม
- เนย 20 กรัม
- ผงฟู 1 กรัม
- เกลือ 1 กรัม
- น้ำตาล 8 กรัม
- น้ำตาล 30 กรัม
- หมอหยอง 20 กรัม
ถ้าระดับเดียว จะง่ายกว่ามาก