แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - frank

หน้า: [1]
1
ถ้ายืนพื้นตามที่คุณได้ออกแบบไว้ ผมสมมุติให้ระบบเราเป็นตามนี้แล้วกันนะครับ (เทเบิลจริงของคุณอาจมีฟิลด์มากกว่านี้ แต่ผมเอาเฉพาะฟิลด์ที่เราสนใจในเรื่องนี้แล้วกัน)

- เทเบิลส่วนลด 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

2
1. เทเบิลที่เก็บส่วนลด ออกแบบไว้หรือยัง มีฟิลด์อะไรบ้าง
2. ส่วนลดขึ้นกับเกรดลูกค้า และ ประเภทสินค้า หรือว่าขึ้นกับเฉพาะอย่างใดอย่างหนึ่งเท่านั้น และอย่างนั้นคืออะไร
3. เทเบิลของ Order Details มีฟิลด์ต่อไปนี้หรือไม่ ถ้ามี มีอะไรบ้าง และบนฟอร์มมีด้วยหรือไม่ ถ้ามี เปิดให้ผู้ใช้ป้อนได้ด้วยหรือไม่
  - ราคาต่อหน่วย
  - % ส่วนลด
  - มูลค่าส่วนลด (เป็นบาท)
  - ราคาก่อนหักส่วนลด
  - ราคารวมหลังหักส่วนลด
4. เอารูปภาพของหน้าฟอร์มที่เห็นซับฟอร์มมาแสดงให้ดูด้วย

ช่วยตอบทุกคำถามและอย่าข้ามนะครับ

แก้ไข : ในคำตอบก่อนหน้าที่ผมเขียนว่า "ราคาขาย" ขอแก้เป็น "ส่วนลด" ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: frank

3
ไม่รู้ว่าคำถามคืออะไรนะครับ   ถ้าเกรดลูกค้าและประเภทสินค้ามีผลต่อส่วนลด ในเทเบิลส่วนลดก็ต้องกำหนดทั้งเกรดและประเภทสินค้าเป็นส่วนหนึงของ Primary Key  อาจมีกำหนดวันที่เริ่มมีผลบังคับใช้เป็นส่วนหนึ่งของ Primary Key เพิ่มเติมด้วยก็ได้ เพราะในทางปฏิบัติแล้ว ถ้าไม่กำหนดวันที่เริ่มมีผลบังคับ เราจะต้องมานั่งป้อนทุกส่วนลดที่เปลี่ยนแปลงในคืนก่อนวันเปลี่ยนแปลงส่วนลด ซึ่งไม่สะดวกเลย

โพสต์นี้ได้รับคำขอบคุณจาก: frank

หน้า: [1]