เรื่องการเขียนคำสั่ง กำหนดส่วนลด ที่แตกต่างกัน ในโปรแกรม Ms Access 2010 หรือ



0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

03 ต.ค. 61 , 02:06:34
อ่าน 548 ครั้ง

frank

  • สมาชิกไท.Access
  • กระทู้: 3

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

คือ ปัญหา มีอยู่ว่า เรามีลูกค้า ที่ มีความสำคัญ หลายระดับ เรียก ว่า เกรด A เกรด B หรือ เกรด C ...ทำให้ เราสามารถ สร้าง ส่วนลดให้ ลูกค้า ในแต่ละ ระดับความสำคัญได้.... แต่ ปัญหา ก็ เกิดตามมา คือ สินค้าที่เรามีขายอยู่นั้น  มีกำไร ที่แตกต่างกัน บางชนิดกำไรเยอะ  บางชนิดกำไรน้อย..เป็นเหตุให้ เราไม่สามารถ สร้าง ส่วนลดให้ กับ ลูกค้า ได้ เพราะ สินค้า บางตัว ส่วนลด ได้ไม่เกิน 10 % แต่บางตัว สามารถ ลดได้ ถึง 20%  ดังนั้น เราจึงต้องสร้างกลุ่มของสินค้า ขึ้นมา สร้าง ตารางส่วนลด ในสินค้าแต่ละประเภท...เมื่อ เราคีย์ ชื่อ นาย สมบัติ ซึ่งเป็นลูกค้าเกรด A  และซื้อสินค้า กลุ่ม เสื้อผ้า ได้ส่วนลด ถึง 20 % แต่ในเวลาเดียวกัน นายสมบัติก็ ซื้อ ผ้าเช็ดตัว ซึ่งเป็นสินค้า กลุ่ม ผ้า ทำได้ส่วนลด กลุ่มนี้ เพียง 15 %  ...อย่างนี้เป็นต้น จึง อยากรบกวน สอบถาม และ ขอคำแนะนำ ให้ด้วย ครับ ขอบคุณมากๆ ครับ

 

03 ต.ค. 61 , 14:57:30
ตอบกลับ #1

สันติสุข

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

« แก้ไขครั้งสุดท้าย: 04 ต.ค. 61 , 02:11:23 โดย สันติสุข »
ช่วยพกถุงผ้า/ถุงพลาสติกไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: frank

04 ต.ค. 61 , 00:05:34
ตอบกลับ #2

frank

  • สมาชิกไท.Access
  • กระทู้: 3

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

ขอบคุณ อ.สันติสุข ที่ให้คำแนะนำนะครับ ...ประเด็น คือ ตอนเข้ามาที่ form Order เพื่อที่จะ คีย์บิลขายสินค้า เมื่อถึงช่อง ชื่อลูกค้า ...เราต้องการ ให้ ชื่อลูกค้า หลังจากที่เราคีย์แล้ว ใน order form นี้จะรู้ว่า เป็น ลูกค้าเกรดไหน ซึ่ง ก็ ทำผ่านไปแล้ว แต่ พอมาถึง ตรง form ย่อย ของ  Formย่อย Order details ...เราก็จะมาที่คีย์ ชื่อสินค้า ...พอคีย์ ชื่่อสินค้า เข้าไปแล้ว ส่วนลด สินค้านั้นๆ ก็ จะประมวลผลว่า ได้ส่วนลดกี่่เปอร์เซ็นตามที่เรากำหนด ตรงนี้แหละ ที่ผม ไม่สามารถ ผ่านไปได้ เพราะในสินค้าแต่ละตัว มี%กำไร ที่ไม่เท่ากัน ...สินค้าตัวที่ 1 สำหรับลูกค้าเกรด เอ สามารถ ให้ส่วนลดได้ ถึง 20 %  แต่ พอมาคีย์ สินค้าที่2 สำหรับลูกค้าเกรดเอ เช่นเดียวกัน แต่ สินค้านี้ สามารถให้ส่วนลดได้เพียง แค่ 15 %เท่านั้น นี่แหละครับทำให้ผม แก้ไม่ตก สำหรับ กรณีอย่างนี้ รบกวนช่วยแนะนำให้หน่อยครับ ....

 

04 ต.ค. 61 , 02:05:14
ตอบกลับ #3

สันติสุข

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

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

แก้ไข : ในคำตอบก่อนหน้าที่ผมเขียนว่า "ราคาขาย" ขอแก้เป็น "ส่วนลด" ครับ
« แก้ไขครั้งสุดท้าย: 04 ต.ค. 61 , 02:09:44 โดย สันติสุข »
ช่วยพกถุงผ้า/ถุงพลาสติกไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: frank

05 ต.ค. 61 , 00:30:51
ตอบกลับ #4

frank

  • สมาชิกไท.Access
  • กระทู้: 3

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

ขอบคุณครับ อ.สันติสุข
ผมอยากส่ง File Program ไปให้อาจารย์ มากๆ เลยครับ เพราะใกล้ เสร็จแล้ว เหลือ แต่ การปรัปแต่งที่ส่วนลดที่สอบถามมาเท่านั้น ...แต่ ไม่สามารถส่งรูป ไปให้ได้ อัพโหลดภาพไปแล้ว ไม่รู้ว่าอาจารย์ จะได้ เห็นที่ผมอัพโหลดหรือ เปล่า ไม่แน่ใจ ....งั้นตอบคำถาม อ. ผ่าน ทาง chat  นี้่ก่อนละกัน ....
1.Table ที่เก็บส่วน ลด ออกแบบไว้ แล้ว โดย กำหนด เป็น ฟิลด์  ID Type Discount , Member gade, Category name และ Discout ครับ
2.ส่วนลดให้กับ ลูกค้า นั้น ยกตัวอย่างเช่น ลูกค้าเกรด A จะได้ ส่วนลด สำหรับ Cate อลูมิเนียม 14 % , สำหรับ Cate สแตนเลส 15%, อะไหล่อลูมิเนียม 12%, อะไหล่สแตนเลส 13% แต่ ถ้า เป็นลูกค้า เกรด B ก็จะได้ ส่วนลด สำหรับ Cate อลูมิเนียม 9 % , สำหรับ Cate สแตนเลส 10%, อะไหล่อลูมิเนียม 7%, อะไหล่สแตนเลส 8%...แบบนี้เป็นต้น เพียง แต่ เมือมีการคีย์ ชื่อลูกค้า และ คีย์ สินค้า โปรแกรม ก็จะ ต้อง ไปเลือก ให้ว่า ลูกค้ารายนี้ จะได้ส่วนลดเท่าไหร่ จากค่า ที่เราตั้งไว้ สำหรับ รายชื่อลูกค้าใครบ้าง ที่กำหนดให้เป็น เกรด A B C หรือ D จากนั้น โปรแกรม ก็ ต้อง ไป ค้นหา ส่วนลด ของ แต่ ละประเภทสินค้า ที่เรากำหนด ส่วนลดไว้ แล้ว นะครับ ....ไม่ทราบว่า  งง ไม๊ครับ
3.ในเทเบิล ของ Order Details นั้น มีไม่กี่ ฟิลด์ ครับ คือ ผมกำหนดให้ แค่ OrderID ProductID และ Quantity เท่านั้น โดย ผม จับ OrderID กับ ProductID เป็น Primary Key ทั้ง คู่ ครับ
4. ผมอัฟโหลด รูปภาพ ในช่องอัฟโหลด ไม่ทราบว่า อ.จะได้เห็นหรือเปล่า ครับ ...ต้องขอโทษ ที่รบกวนเวลา อ.นะครับ ...ถ้าไม่ ว่าอะไร ผมยัง อยาก ปรึกษา ผ่าน มือถือ หรือ จ้าง เป็นที่ปรึกษา ได้ไหมครับ เพราะ ผม อายุ 57 ปีแล้ว เขียนโปรแกรม ACCESS  มานาน ใช้งานมากว่า 19 ปี ตั้งแต่ access 97 ในปี 96 นะครับ... ตอนนี้ ต้องมา รื้อฟื้นใหม่ เพื่อ ธุรกิจ ของผม เพราะ ไม่มีคอม ไหน ใช้ งาน access97  ได้แล้ว ครับ นอกจากคอมเก่าๆ ...เบอร์ ติดต่อ ผม คือ 0864491561 ครับ ผม ชื่อ สุทัศน์ นะครับ

 

05 ต.ค. 61 , 21:46:24
ตอบกลับ #5

nonc31

น่าจะคิดจาก (ราคาขาย-ราคาทุน) x เกรดลูกค้า เช่น A=0.2 B=0.15 C=0.1 ได้มั๊ยครับ เพราะทำสูตรนี้ ก็ไม่น่าจะต้องห่วงเรื่องกำไร สินค้าแต่ละตัวที่มีความต่างกัน  :cool: :cool: :cool:

 

05 ต.ค. 61 , 22:02:42
ตอบกลับ #6

สันติสุข

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

- เทเบิลส่วนลด 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 มาแสดงให้ดูด้วยครับ

ส่วนเรื่องงาน ผมขอตอบใน ข้อความส่วนตัวนะครับ (คุณจะเห็นเมนูอยู่ด้านบนของเพจนี้)
ช่วยพกถุงผ้า/ถุงพลาสติกไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: frank


บอร์ดเรียนรู้ Access สำหรับคนไทย