สอบถามเรื่อง การแสดงข้อมูล บนตารางอื่น
กระทู้เก่าบอร์ด อ.Yeadram

 2,101   7
URL.หัวข้อ / URL
สอบถามเรื่อง การแสดงข้อมูล บนตารางอื่น

-   ผมมีฟิลด์ ราคา อยู่ 2 ฟิลด์ คือที่ ตารางสินค้า และตารางการขาย
-   โดยราคาที่ตารางสินค้าถูกกำหนดไว้แล้ว แต่ราคาที่ตารางการขายยังไม่มีการ    กรอกข้อมูลใดๆ

* ผมอยากจะทำให้ ราคา จากตารางสินค้า ไปแสดงอยู่บนราคา ที่ตารางการขาย
* โดยที่ตารางการขายนั้นยังสามารถ กรอกตัวค่าตัวเลข ได้อยู่
*   และเมื่อกรอกค่านั้นจะไปบันทึกอยู่ในตารางการขาย ส่วนตารางสินค้าก็คงราคา เดิม

     จึงอยากสอบถามว่าต้องทำยังไง หรือมันทำได้มั้ยครับ


7 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R12404
เขียนคำสั่งฝังในเหตุการณ์ AfterUpdate ของช่องรหัสสินค้า
ใช้คำสั่ง Dlookup ราคามาจากตารางสินค้า เอามาป้อนลงช่อง ราคาสินค้าในฟอร์ม

ดังนั้น เมื่อมีการคีย์รหัสสินค้า ราคาก็จะโดดมาอยู่ที่ฟอร์มโดยอัตโนมัติครับ   ถ้าต้องการเปลี่ยนราคา ก็สามารถปรับเปลี่ยนได้ตามต้องการครับ
2 @R12406
.....คือ ผมใช่การเชิ่อมความสัมพันธ์ แทนการใช้คำสั่ง DlookUp แล้วครับ
เมื่อคีย์รหัสสินค้า ราคา จะกระโดดมาอยู่ช่องฟอร์มโดยอัตโนมัติเหมือนกัน(ซึ่งผมให้ราคา ของสินค้า กระโดดมาช่องการขาย )

.....แต่ปัญหาอยู่ที่หากเปลี่ยนราคา จากช่องราคาตรงการขาย
.....มันจะส่งผลให้ราคา ตรงตารางสินค้าเปลี่ยนไปด้วย
.... รวมทั้งประวัติการขายย้อนหลังทั้งหมด ก็ถูกเปลี่ยนราคาเป็นราคาล่าสุดทั้งหมด ซึ่งมันไม่ควรเป็นอย่างนั้น

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

IIf(IsNull([ราคาจากตารางการขาย]),[ราคาจากตารางสินค้า]*[จำนวน],[ราคาจากตารางการขาย]*[จำนวน])

.....เพื่อให้มันใช้ ราคาล่าสุดจากการเปลี่ยนแปลง และหากไม่เปลี่ยนแปลงก็ใช้ราคาเดิม

.....แต่ในการแสดงผลในฟอร์ม จะให้มันแสดง ราคาขาย 2 ตำแหน่งก็แปลกๆอยู่ เช่น [ราคา:tbProduct] [ราคา:tbSale]

.....เมื่อลบการแสดงผลของ [ราคา:tbProduct] ก็ทำได้อยู่ แต่เมื่อราคาไม่มีการ เปลี่ยน ก็อยากจะให้มันแสดง [ราคา:tbProduct] ด้วย

.....จึงอยากให้มันแสดงช่องกรอกราคาเพียง [ราคา:tbSale] ซึ่งเมื่อกรอกราคาลงไป มันจะได้ไป บันทึกข้อมูลที่ [ราคา:tbSale]

.....ในขณะเดียวกัน เมื่อไม่ได้กรอกราคาลงไป ก็อยากให้มันแสดงราคาจาก [ราคา:tbProduct]

........ นี้เป็นที่มาของคำถามข้างบนครับ ผมไม่เก่งเรื่องคำสั่ง จึงคิดวิธีการง่ายๆนี้ขึ้นมา ถ้ามีวิธีการอื่นที่สามารถทำให้ระบบ รองรับราคาหากมีการเปลี่ยนแปลง ได้ก็แนะนำด้วยนะครับ

***** ขอบคุณ "yeadram" ที่เสนอแนะความคิดเห็นครับ
3 @R12409
ใช้ Dlookup ดีที่สุดครับ
ประวัติการขายของเรคคอร์ดอื่นๆ จะไม่ถูกรบกวนไปด้วย
หลักการคือ ในตารางสินค้า จะมีราคาสินค้า ซึ่งถือว่าเป็นราคาปกติ หรือราคากลาง

ในการตารางการขาย ในแต่ละเรคคอร์ดอาจจะขายราคาแตกต่างกันได้ ตามปกติของงานขายอยู่แล้วครับ กล่าวคือ ราคาที่ปรากฎในตารางการขาย จะสูงหรือต่ำกว่าราคากลางก็ได้ ขึ้นอยู่กับโอกาส, ลูกค้า หรือสถานการณ์ทุนที่ปรับเปลี่ยนขึ้นลงในวันนั้นๆ

วิธีทำครับ
- ไปเอาการเชื่อมโยงของคุณออกก่อนเลย
ในฟอร์มการขาย มีคอนโทรลที่เกี่ยวข้องงานนี้ 2 ตัวหลักๆ
1 txProduct คือ textbox หรือ combo box สำหรับกรอกรหัสสินค้า ผูกไว้กับฟิลด์ Code ของ tbSale
2 txPrice คือ textbox ที่ไว้แสดงผล หรือรับข้อมูล "ราคา" ของการขายในครั้งนี้ ผูกกับฟิลด์ Price ของ tbSale

เขียนโค้ดกำกับให้กับ txProduct ดังนี้
Private Sub txProduct_AfterUpdate()
txPrice = dLookup("Price", "tbProduct", "[tbProduct].[Code] = '" & me.txProduct & "'")
End sub

เมื่อมีการกรอกรหัสสินค้าในช่องนี้แล้ว ราคาจะขึ้นมาอัตโนมัติ ซึ่งเป็นราคากลางเสมอ

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

Private Sub txPrice_Exit()
dim oPrice 'as double
oPrice = dLookup("Price", "tbProduct", "[tbProduct].[Code] = '" & me.txProduct & "'")

if me.txPrice <> oPrice then
dim msg as string
msg= "ราคาที่คุณกำลังบันทึกนี้ แตกต่างจากราคากลาง (" & oPrice & ")"
msg=msg & vbcrlf & "คุณต้องการบันทึกราคาใหม่นี้ ให้เป็นราคากลางหรือไม่?"
if msgbox(msg, vbYesNo) = vbYes then
docmd.setwarnings false
docmd.runsql "Update tbProduct Set Price = " & txPrice & " Where Code = '" & me.txProduct & "';"
End if
End if
End Sub

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

ทั้งหมดนั่นเป็นแนวทางนะครับ ถ้าหากจะนำไปปรับใช้จริงให้ระวังชื่อของ object ต่างๆ นะครับต้องปรับให้เหมือนของคุณก่อน

มันคือระบบจำราคาครั้งล่าสุด
หรือระบบราคากลาง ที่ส่วนใหญ่โปรแกมจำพวกงานขาย ก็มักใช้กันอยู่แล้วครับ
4 @R12411
มัน Error ครับ ดังนี้

Run-time error'2471':
นิพจน์ที่คุณใส่เป็นพารามิเตอร์แบบวอบถามนั้นทำให้เกิดข้อผิดพลาด
'[tbProduct].[ProductID]'


..ผมลองดูชื่อของ objiect แล้ว และลองเปลี่ยนหลายตัวแล้วครับซึ่งไม่ได้ผล ผมพิมพ์คำสั่งไปดังนี้ครับ

Private Sub ProductID_AfterUpdate()
PriceSaleNow = DLookup("ProPriceSale", "tbProduct", "[tbProduct].[ProductID] = '" & Me.ProductID & "'")
End Sub

ProductID        เป็นคีย์หลักของ tbsale ทำให้ซ้ำค่าได้ ซึ่งถูกปรับเป็น Combo box   เพื่อกรอกรหัสสินค้า
PriceSaleNow เป็นฟิลด์ที่มีไว้แสดงผล หรือ รับราคา ซึ่งอยู่ใน tbSale
ProPriceSale   เป็นฟิลด์ราคากลาง อยู่ใน tbProduct

ผมใส่ค่าตัวแปรในสูตรถูกหรือป่าวครับ
และถามในเรื่องการถอนความสัมพันธ์ออก หมายถึงถอนในส่วนของ ความสัมพันธ์หลัก หรือถอนความสัมพันธ์ ในคิวรี่ ครับ หรือถอนทั้งหมด
*** ผมดึงค่าจาก tb โดยการทำคิวรี่ แล้วมาทำเป็น from อีกทีนึงครับ

ขอบคุณ คุณ "yeadram" มากครับผม
5 @R12413
ผมลอง ลบ บางคำสั่งออก ดังนี้

Private Sub ProductID_AfterUpdate()
PriceSaleNow = DLookup("ProPriceSale", "tbProduct", "[ProductID]= '" & Me.ProductID & "'")
End Sub

ผลที่ได้คือ มันขึ้นราคากลางให้ แต่ขึ้นเพียง ราคากลางของสินค้ารหัสแรก เท่าั้นั้น และไม่ว่าเปลี่ยนเป็นรหัสอะไร ก็ขึ้นแค่ราคาของรหัสสินค้า อันแรก

....แสดงว่ารูปแบบคำสั่งที่ผมเขียน มันมีปัญหากับการเชื่อมโยงข้อมูลใช่มั้ยครับ
6 @R12414
....ลองผิดลองถูกไปมา

สรุปได้ว่า เงื่อนไขข้างหลังไม่ส่งผลต่อการแสดงจำนวนราคาเลยครับ

PriceSaleNow = DLookup("ProPriceSale", "tbProduct")

ใส่แค่นี้ก็แสดงผลอยู่ แต่มันแสดงผลแค่ค่าแรกที่พบเหมือนเดิมครับ

ผมพยายามใส่เงื่อนไขหลายๆอย่างแล้ว แต่ยังไม่ดีขึ้นครับผม
7 @R12416
ทำได้แล้วครับ จากคำสั่งดังนี้

Private Sub ProductID_AfterUpdate()
PriceSaleNow = DLookup("ProPriceSale", "tbProduct", "[ProductID]=[ProID]")
End Sub

ขอบคุณ คุณ yeadram อีกครั้งสำหรับคำแนะนำทั้งหมดครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2630s