1
ห้อง MS Access / : เรื่องการเขียนคำสั่ง กำหนดส่วนลด ที่แตกต่างกัน ในโปรแกรม Ms Access 2010 หรือ
« เมื่อ: 05 ต.ค. 61 , 22:02:42 »
ถ้ายืนพื้นตามที่คุณได้ออกแบบไว้ ผมสมมุติให้ระบบเราเป็นตามนี้แล้วกันนะครับ (เทเบิลจริงของคุณอาจมีฟิลด์มากกว่านี้ แต่ผมเอาเฉพาะฟิลด์ที่เราสนใจในเรื่องนี้แล้วกัน)
- เทเบิลส่วนลด Disc มีฟิลด์ Member Grade, Catagory Name, Discount
- เทเบิลลูกค้า Cust มีฟิลด์ Customer Code, Member Grade
- เทเบิลสินค้า Prod มีฟิลด์ Product Code, Catagory Name
- [cb Customer Code] เป็นชื่อคอมโบบ็อกซ์เพื่อเลือกลูกค้าที่อยู่บนเมนฟอร์ม เมื่อเลือก จะแสดงชื่อลูกค้าในคอมโบบ็อกซ์ แต่เมื่ออ้างคอมโบบ็อกซ์ก็จะได้รหัสลูกค้าแทน
- [cb Product Code] เป็นชื่อคอมโบบ็อกซ์เพื่อเลือกสินค้าที่อยู่ในซับฟอร์ม เมื่อเลือก จะแสดงชื่อสินค้าในคอมโบบ็อกซ์ แต่เมื่ออ้างคอมโบบ็อกซ์ก็จะได้รหัสสินค้าแทน
ให้ใส่ฟังก์ชั่นชื่อว่า fnGetDiscount( ) ไว้ในส่วนของ Module โดยจะรับค่าของรหัสลูกค้าและรหัสสินค้าเข้าไป และคืนค่าส่วนลดออกมาให้ กรณีที่รหัสลูกค้าหรือรหัสสินค้าไม่มีค่า (เป็น NULL) หรือไม่มีกำหนดส่วนลดไว้ ค่าที่คืนก็จะเป็น NULL ด้วย
ปัญหาคือ ผมไม่รู้ว่าคุณจะเอาส่วนลดไปเก็บไว้ที่ไหน เพราะในเทเบิล Order Details ก็ไม่มีฟิลด์ที่เก็บไว้
- แต่ถ้าสมมุติว่ามี และเท็กซ์บ็อกซ์บนฟอร์มที่ไว้รับ/แสดงส่วนลดชื่อว่า [tx Discount] ดังนั้นเมื่อผู้ใช้เลือกสินค้า เราก็ใส่โค้ดนี้ไว้ใน AfterUpdate event procedure ของ [cb Product Code] เพื่อดึงเอาส่วนลดออกมาแปะในเท็กซ์บ็อกซ์นี้ได้ครับ
- แต่ในกรณีที่***ไม่มี***ที่เก็บ แต่อยากแสดงบนฟอร์มเฉยๆ ก็ให้ใส่ =fnGetDiscount(Parent.[cb Customer Code], Me.[cb Product Code]) เอาไว้ใน Control Source property ของ [tx Discount] ครับ (ต้องมีเครื่องหมาย = ด้วย)
หมายเหตุ : โค้ดนี้ไม่ได้ทดสอบใดๆทั้งสิ้น ถ้ามี Error ก็เอารหัสและข้อความของ Error มาแสดงให้ดูด้วยครับ
- เทเบิลส่วนลด Disc มีฟิลด์ Member Grade, Catagory Name, Discount
- เทเบิลลูกค้า Cust มีฟิลด์ Customer Code, Member Grade
- เทเบิลสินค้า Prod มีฟิลด์ Product Code, Catagory Name
- [cb Customer Code] เป็นชื่อคอมโบบ็อกซ์เพื่อเลือกลูกค้าที่อยู่บนเมนฟอร์ม เมื่อเลือก จะแสดงชื่อลูกค้าในคอมโบบ็อกซ์ แต่เมื่ออ้างคอมโบบ็อกซ์ก็จะได้รหัสลูกค้าแทน
- [cb Product Code] เป็นชื่อคอมโบบ็อกซ์เพื่อเลือกสินค้าที่อยู่ในซับฟอร์ม เมื่อเลือก จะแสดงชื่อสินค้าในคอมโบบ็อกซ์ แต่เมื่ออ้างคอมโบบ็อกซ์ก็จะได้รหัสสินค้าแทน
ให้ใส่ฟังก์ชั่นชื่อว่า fnGetDiscount( ) ไว้ในส่วนของ Module โดยจะรับค่าของรหัสลูกค้าและรหัสสินค้าเข้าไป และคืนค่าส่วนลดออกมาให้ กรณีที่รหัสลูกค้าหรือรหัสสินค้าไม่มีค่า (เป็น NULL) หรือไม่มีกำหนดส่วนลดไว้ ค่าที่คืนก็จะเป็น NULL ด้วย
โค๊ด: [Select]
Public Function fnGetDiscount(aCusCD As Variant, aProdCD As Variant) As Variant
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim SQL As String
If IsNull(aCusCD) or IsNull(aProdCD) Then Exit Sub
SQL = "SELECT D.Discount FROM [Prod] AS P " _
& " INNER JOIN ([Cust] AS C INNER JOIN [Disc] AS D ON C.[Menber Grade] = D.[Menber Grade])" _
& " ON P.[Catagory Name] = D.[Catagory Name] " _
& " WHERE C.[Customer Code] = '" & cStr(aCusCD) & "' AND P.[Product Code] = '" & cStr(aProdCD) & "' "
Set DB = CurrentDb
Set RS = DB.OpenRecordset(SQL)
If Not RS.EOF Then
fnGetDiscount = RS![Discount]
End If
RS.Close: Set RS = Nothing
End Sub
ปัญหาคือ ผมไม่รู้ว่าคุณจะเอาส่วนลดไปเก็บไว้ที่ไหน เพราะในเทเบิล Order Details ก็ไม่มีฟิลด์ที่เก็บไว้
- แต่ถ้าสมมุติว่ามี และเท็กซ์บ็อกซ์บนฟอร์มที่ไว้รับ/แสดงส่วนลดชื่อว่า [tx Discount] ดังนั้นเมื่อผู้ใช้เลือกสินค้า เราก็ใส่โค้ดนี้ไว้ใน AfterUpdate event procedure ของ [cb Product Code] เพื่อดึงเอาส่วนลดออกมาแปะในเท็กซ์บ็อกซ์นี้ได้ครับ
โค๊ด: [Select]
Private Sub cb_Product_Code_AfterUpdate()
Me.[tx Discount] = fnGetDiscount(Parent.[cb Customer Code], Me.[cb Product Code])
End Sub
- แต่ในกรณีที่***ไม่มี***ที่เก็บ แต่อยากแสดงบนฟอร์มเฉยๆ ก็ให้ใส่ =fnGetDiscount(Parent.[cb Customer Code], Me.[cb Product Code]) เอาไว้ใน Control Source property ของ [tx Discount] ครับ (ต้องมีเครื่องหมาย = ด้วย)
หมายเหตุ : โค้ดนี้ไม่ได้ทดสอบใดๆทั้งสิ้น ถ้ามี Error ก็เอารหัสและข้อความของ Error มาแสดงให้ดูด้วยครับ
ส่วนเรื่องงาน ผมขอตอบใน ข้อความส่วนตัวนะครับ (คุณจะเห็นเมนูอยู่ด้านบนของเพจนี้)
โพสต์นี้ได้รับคำขอบคุณจาก: frank