กระทู้เก่าบอร์ด อ.Yeadram
2,140 7
URL.หัวข้อ /
URL
สอบถามเรื่อง การแสดงข้อมูล บนตารางอื่น
- ผมมีฟิลด์ ราคา อยู่ 2 ฟิลด์ คือที่ ตารางสินค้า และตารางการขาย
- โดยราคาที่ตารางสินค้าถูกกำหนดไว้แล้ว แต่ราคาที่ตารางการขายยังไม่มีการ กรอกข้อมูลใดๆ
* ผมอยากจะทำให้ ราคา จากตารางสินค้า ไปแสดงอยู่บนราคา ที่ตารางการขาย
* โดยที่ตารางการขายนั้นยังสามารถ กรอกตัวค่าตัวเลข ได้อยู่
* และเมื่อกรอกค่านั้นจะไปบันทึกอยู่ในตารางการขาย ส่วนตารางสินค้าก็คงราคา เดิม
จึงอยากสอบถามว่าต้องทำยังไง หรือมันทำได้มั้ยครับ
- โดยราคาที่ตารางสินค้าถูกกำหนดไว้แล้ว แต่ราคาที่ตารางการขายยังไม่มีการ กรอกข้อมูลใดๆ
* ผมอยากจะทำให้ ราคา จากตารางสินค้า ไปแสดงอยู่บนราคา ที่ตารางการขาย
* โดยที่ตารางการขายนั้นยังสามารถ กรอกตัวค่าตัวเลข ได้อยู่
* และเมื่อกรอกค่านั้นจะไปบันทึกอยู่ในตารางการขาย ส่วนตารางสินค้าก็คงราคา เดิม
จึงอยากสอบถามว่าต้องทำยังไง หรือมันทำได้มั้ยครับ
7 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R12406
.....คือ ผมใช่การเชิ่อมความสัมพันธ์ แทนการใช้คำสั่ง DlookUp แล้วครับ
เมื่อคีย์รหัสสินค้า ราคา จะกระโดดมาอยู่ช่องฟอร์มโดยอัตโนมัติเหมือนกัน(ซึ่งผมให้ราคา ของสินค้า กระโดดมาช่องการขาย )
.....แต่ปัญหาอยู่ที่หากเปลี่ยนราคา จากช่องราคาตรงการขาย
.....มันจะส่งผลให้ราคา ตรงตารางสินค้าเปลี่ยนไปด้วย
.... รวมทั้งประวัติการขายย้อนหลังทั้งหมด ก็ถูกเปลี่ยนราคาเป็นราคาล่าสุดทั้งหมด ซึ่งมันไม่ควรเป็นอย่างนั้น
.....ดังนั้นผมจึงเพิ่ม ข้อมูลราคาสินค้า ไปไว้ที่ตารางการขายด้วย เพื่อรองรับราคาสินค้าหากเปลี่ยนแปลง และใช้คำสั่ง
IIf(IsNull([ราคาจากตารางการขาย]),[ราคาจากตารางสินค้า]*[จำนวน],[ราคาจากตารางการขาย]*[จำนวน])
.....เพื่อให้มันใช้ ราคาล่าสุดจากการเปลี่ยนแปลง และหากไม่เปลี่ยนแปลงก็ใช้ราคาเดิม
.....แต่ในการแสดงผลในฟอร์ม จะให้มันแสดง ราคาขาย 2 ตำแหน่งก็แปลกๆอยู่ เช่น [ราคา:tbProduct] [ราคา:tbSale]
.....เมื่อลบการแสดงผลของ [ราคา:tbProduct] ก็ทำได้อยู่ แต่เมื่อราคาไม่มีการ เปลี่ยน ก็อยากจะให้มันแสดง [ราคา:tbProduct] ด้วย
.....จึงอยากให้มันแสดงช่องกรอกราคาเพียง [ราคา:tbSale] ซึ่งเมื่อกรอกราคาลงไป มันจะได้ไป บันทึกข้อมูลที่ [ราคา:tbSale]
.....ในขณะเดียวกัน เมื่อไม่ได้กรอกราคาลงไป ก็อยากให้มันแสดงราคาจาก [ราคา:tbProduct]
........ นี้เป็นที่มาของคำถามข้างบนครับ ผมไม่เก่งเรื่องคำสั่ง จึงคิดวิธีการง่ายๆนี้ขึ้นมา ถ้ามีวิธีการอื่นที่สามารถทำให้ระบบ รองรับราคาหากมีการเปลี่ยนแปลง ได้ก็แนะนำด้วยนะครับ
***** ขอบคุณ "yeadram" ที่เสนอแนะความคิดเห็นครับ
เมื่อคีย์รหัสสินค้า ราคา จะกระโดดมาอยู่ช่องฟอร์มโดยอัตโนมัติเหมือนกัน(ซึ่งผมให้ราคา ของสินค้า กระโดดมาช่องการขาย )
.....แต่ปัญหาอยู่ที่หากเปลี่ยนราคา จากช่องราคาตรงการขาย
.....มันจะส่งผลให้ราคา ตรงตารางสินค้าเปลี่ยนไปด้วย
.... รวมทั้งประวัติการขายย้อนหลังทั้งหมด ก็ถูกเปลี่ยนราคาเป็นราคาล่าสุดทั้งหมด ซึ่งมันไม่ควรเป็นอย่างนั้น
.....ดังนั้นผมจึงเพิ่ม ข้อมูลราคาสินค้า ไปไว้ที่ตารางการขายด้วย เพื่อรองรับราคาสินค้าหากเปลี่ยนแปลง และใช้คำสั่ง
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 ต่างๆ นะครับต้องปรับให้เหมือนของคุณก่อน
มันคือระบบจำราคาครั้งล่าสุด
หรือระบบราคากลาง ที่ส่วนใหญ่โปรแกมจำพวกงานขาย ก็มักใช้กันอยู่แล้วครับ
ประวัติการขายของเรคคอร์ดอื่นๆ จะไม่ถูกรบกวนไปด้วย
หลักการคือ ในตารางสินค้า จะมีราคาสินค้า ซึ่งถือว่าเป็นราคาปกติ หรือราคากลาง
ในการตารางการขาย ในแต่ละเรคคอร์ดอาจจะขายราคาแตกต่างกันได้ ตามปกติของงานขายอยู่แล้วครับ กล่าวคือ ราคาที่ปรากฎในตารางการขาย จะสูงหรือต่ำกว่าราคากลางก็ได้ ขึ้นอยู่กับโอกาส, ลูกค้า หรือสถานการณ์ทุนที่ปรับเปลี่ยนขึ้นลงในวันนั้นๆ
วิธีทำครับ
- ไปเอาการเชื่อมโยงของคุณออกก่อนเลย
ในฟอร์มการขาย มีคอนโทรลที่เกี่ยวข้องงานนี้ 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" มากครับผม
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
ผลที่ได้คือ มันขึ้นราคากลางให้ แต่ขึ้นเพียง ราคากลางของสินค้ารหัสแรก เท่าั้นั้น และไม่ว่าเปลี่ยนเป็นรหัสอะไร ก็ขึ้นแค่ราคาของรหัสสินค้า อันแรก
....แสดงว่ารูปแบบคำสั่งที่ผมเขียน มันมีปัญหากับการเชื่อมโยงข้อมูลใช่มั้ยครับ
Private Sub ProductID_AfterUpdate()
PriceSaleNow = DLookup("ProPriceSale", "tbProduct", "[ProductID]= '" & Me.ProductID & "'")
End Sub
ผลที่ได้คือ มันขึ้นราคากลางให้ แต่ขึ้นเพียง ราคากลางของสินค้ารหัสแรก เท่าั้นั้น และไม่ว่าเปลี่ยนเป็นรหัสอะไร ก็ขึ้นแค่ราคาของรหัสสินค้า อันแรก
....แสดงว่ารูปแบบคำสั่งที่ผมเขียน มันมีปัญหากับการเชื่อมโยงข้อมูลใช่มั้ยครับ
6 @R12414
....ลองผิดลองถูกไปมา
สรุปได้ว่า เงื่อนไขข้างหลังไม่ส่งผลต่อการแสดงจำนวนราคาเลยครับ
PriceSaleNow = DLookup("ProPriceSale", "tbProduct")
ใส่แค่นี้ก็แสดงผลอยู่ แต่มันแสดงผลแค่ค่าแรกที่พบเหมือนเดิมครับ
ผมพยายามใส่เงื่อนไขหลายๆอย่างแล้ว แต่ยังไม่ดีขึ้นครับผม
สรุปได้ว่า เงื่อนไขข้างหลังไม่ส่งผลต่อการแสดงจำนวนราคาเลยครับ
PriceSaleNow = DLookup("ProPriceSale", "tbProduct")
ใส่แค่นี้ก็แสดงผลอยู่ แต่มันแสดงผลแค่ค่าแรกที่พบเหมือนเดิมครับ
ผมพยายามใส่เงื่อนไขหลายๆอย่างแล้ว แต่ยังไม่ดีขึ้นครับผม
7 @R12416
ทำได้แล้วครับ จากคำสั่งดังนี้
Private Sub ProductID_AfterUpdate()
PriceSaleNow = DLookup("ProPriceSale", "tbProduct", "[ProductID]=[ProID]")
End Sub
ขอบคุณ คุณ yeadram อีกครั้งสำหรับคำแนะนำทั้งหมดครับ
Private Sub ProductID_AfterUpdate()
PriceSaleNow = DLookup("ProPriceSale", "tbProduct", "[ProductID]=[ProID]")
End Sub
ขอบคุณ คุณ yeadram อีกครั้งสำหรับคำแนะนำทั้งหมดครับ
Time: 0.3232s
ใช้คำสั่ง Dlookup ราคามาจากตารางสินค้า เอามาป้อนลงช่อง ราคาสินค้าในฟอร์ม
ดังนั้น เมื่อมีการคีย์รหัสสินค้า ราคาก็จะโดดมาอยู่ที่ฟอร์มโดยอัตโนมัติครับ ถ้าต้องการเปลี่ยนราคา ก็สามารถปรับเปลี่ยนได้ตามต้องการครับ