กำลังหัดสร้างโปรแกรม ติดปัญหานิดหน่อย ช่วยทีครับ



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

01 มิ.ย. 61 , 15:09:44
อ่าน 1063 ครั้ง

Tae Songvut

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

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



ผมต้องการใส่รหัสสินค้าที่ textbox1   ในหน้า ฟอร์ม ชื่อ "input"
ให้มันค้นหาในตราราง "product" ถ้าค้นหาเจอ ให้นำชื่อสินค้ามาแสดงที่ textbox2
แต่ถ้าค้นหาแล้วยังไม่มีรหัสนั้น ให้พิมพ์ชื่อสินค้าเอง
และเมื่อทำรายการเสร็จ รหัส และชื่อสินค้า ใหม่ จะถูกบันทึกในตราราง "Product"

โดยปกติข้อมูลหน้าฟอร์ม input นี้ จะบันทึกไปที่ ตราราง "billdetail"
แต่ถ้าสินค้าเป็นรายการที่ยังไม่มีในตราราง "Product"
จะให้มันบันทึก รหัสสินค้า ชื่อสินค้า ลงในตราราง "Product" ด้วยครับ

ตราราง Product มีแค่2ฟิล
productcode
productname

 

01 มิ.ย. 61 , 23:26:46
ตอบกลับ #1

ปิ่นณรงค์

สวัสดีครับ เราสามารถใช้ Function Dlookup เพื่อค้นหาข้อมูลจากตารางเป้าหมายได้ครับ
ผมยกตัวอย่าง
โค๊ด: [Select]
Me.textbox2 = DLookup("ProductName", "Product", "ProductCode='" & Forms!Form1!textbox1 & "'")

ส่วนใน Function กำหนดดังนี้ DLookup("Fieldที่ต้องการแสดงผลลัพท์", "ตารางที่เราต้องการ", "เงือนไขคือ Field ProductCode ในตาราง = ='" & Forms!Form1!textbox1 & "'")   
Forms!Form1!textbox1 คือการกำหนดไปที่ textbox1 ที่เราจะกรอกค้นห้าข้อมูล


ในคำสั่งนี้คือ ถ้าเรากำหนด รหัสของสินค้า และสั่งค้นหา ถ้ารหัสที่เราระบุใน textbox1 ตรงกับ Field ProductCode ในตาราง Product
ก็จะแสดงชื่อของ ProductName ออกมา

สมมุติข้อมูลในตาราง Product เป็นแบบนี้นะครับ


เมื่อเราต้องการค้นหา รหัสเลข 3 เราก็กรอกเลข 3 ใน textbox1 แล้วกดค้นหาจะได้ ProductName ดังรูป


แต่ถ้ากรณีรหัสที่เรากรอกลงไปยังไม่มีการลงทะเบียนไว้นั้นจะมีแจ้งเตือนให้เราทราบเพื่อจะได้ลงทะเบียนใหม่ดังรูป


และเมื่อลงทะเบียนใหม่เสร็จแล้วคำสั่งที่จะ Add new รหัสและชื่อใหม่ ในตาราง Product ใส่คำสั่งที่ปุ่ม บันทึก ดังนี้




โค๊ด: [Select]
Sub AddNewToProductTable()
On Error GoTo Err_Err
    Dim DB As Database
    Dim rs As Recordset
    Set DB = CurrentDb()
    Set rs = DB.OpenRecordset("Product", dbOpenDynaset)
    rs.AddNew
    rs![ProductCode] = Me.textbox1
    rs![ProductName] = Me.textbox2
    rs.Update
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
        MsgBox "Error, ( Add NewProduct)!", vbExclamation, "แจ้ง"
        Resume Exit_err
End Sub
ที่ปุ่ม Save Event onclick
ใส่ไปว่า Call AddNewToProductTable()

ผมได้เพิ่มส่วนที่ดักจับข้อผิดพลาดไว้ด้วยนะครับลองศึกษาจากโปรแกรมตัวอย่างดูนะครับสงสัยตรงไหนสอบถามได้
ตัวอย่างด้านล่างนะครับ
« แก้ไขครั้งสุดท้าย: 02 มิ.ย. 61 , 09:36:12 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tae Songvut

03 มิ.ย. 61 , 10:04:40
ตอบกลับ #2

Tae Songvut

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

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

ขอบคุณมากครับ

แต่ยัง error อยู่ครับ
คือโปรแกรมผม มันเป็น form ซ้อน form อยู่อ่ะครับ
 ผมลองใส่ code ในตัว subform แล้วรันเฉพาะ subform
ใช้ได้ ไม่ error

แต่พอรัน form ชื่อ input มัน error
ทำไงดีคับ

 

03 มิ.ย. 61 , 11:28:44
ตอบกลับ #3

ปิ่นณรงค์

ขอบคุณมากครับ

แต่ยัง error อยู่ครับ
คือโปรแกรมผม มันเป็น form ซ้อน form อยู่อ่ะครับ
 ผมลองใส่ code ในตัว subform แล้วรันเฉพาะ subform
ใช้ได้ ไม่ error

แต่พอรัน form ชื่อ input มัน error
ทำไงดีคับ
อ่อเปน Sub Form เดี่ยวแก้ให้ครับ
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, Tae Songvut

03 มิ.ย. 61 , 13:12:08
ตอบกลับ #4

ปิ่นณรงค์

สวัสดีครับ การอ้างอิง ตัว Control textbox ถ้าเป็นฟอร์มหลักก็สามารถอ้างอิง me.textbox1 หรือ ใน Dlookup  Forms!ฟอร์มหลัก!textbox1 ได้เลย
แต่เมื่อเป็น SubForm ต้องอ้างอิงเริ่มจาก ฟอร์มหลักไปหาฟอร์มรอง แบบนี้ครับ Forms!ฟอร์มหลัก.ฟอร์มรอง!textbox1
จากตัวอย่างเดิมถ้าท่านจะอ้างอิง Function Dlookup ต้องใส่แบบนี้ครับ
โค๊ด: [Select]
Me.textbox2 = DLookup("ProductName", "Product", "ProductCode='" & Forms!MainForm.SubForm!textbox1 & "'")
แต่ผมได้ออกแบบใหม่ให้ท่านลองพิจารณาดูคือ เมื่อเรากรอกรหัสใหม่ที่ไม่มีใน ตาราง Product ก็ให้แจ้งเตือน
และเมื่อใส่รหัสและกำหนดชื่อใหม่เรียบร้อยแล้ว เมื่อกด Enter หรือ กด Tab ไปที่ textbox ตัวต่อไปจะมีข้อความสอบถาม ถ้ากดใช่ ก็จะสั่งให้มันบันทึกเก็บไปในตาราง Product ให้เราเลย

เมื่อกด YES


ตัวอย่างด้านล่างครับ
« แก้ไขครั้งสุดท้าย: 03 มิ.ย. 61 , 15:10:51 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tae Songvut

04 มิ.ย. 61 , 19:33:11
ตอบกลับ #5

Tae Songvut

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

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

สวดยอดดดดดด    ใช้ได้แล้วครับบบบบ

ขอบคุณมากครับบบบ


เด๋วเจอปัญหาจะมารบกวนใหม่  :miao:

 

07 มิ.ย. 61 , 19:45:08
ตอบกลับ #6

Tae Songvut

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

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

ถ้าต้องการผลรวม ทำได้ไหมครับ

ตามรูปในโพสแรก ต้องการให้มี ช่องผลรวมของทุกรายการ ต่อท้าย
ช่องนี้ไม่ต้องบันทึกในตารางก็ได้ แค่โชว์ผลรวมในหน้า form เฉยๆ

 

07 มิ.ย. 61 , 20:23:48
ตอบกลับ #7

ปิ่นณรงค์



จากตัวอย่างคุณ ชิ้น/แพ็ก น่าจะไม่ได้นำไปคำนวน น่าจะคำนวน ที่ จำนวน x ราคา และแสดงผลรวม
แต่ผมคิดว่า ตรงชิ้น/แพ็ก และราคานั้น น่าจะต้องไปกำหนดที่ตาราง Product ไว้เลยนะครับ เพราะมันเป็น Detail ของตัวสิ้นค้านั้นๆอยู่แล้ว
เราแค่ใส่รหัสสินค้า และ กำหนดจำนวน แค่นั้นครับ ส่วน textbox อื่นเราก็ปิดไม่ให้มีการกรอกหรือห้ามแก้ไขไปเลยจะดีกว่า

ซึ่งผมได้ทำตัวอย่างโดยแก้ไขให้ใหม่โดยมีส่วนที่เพิ่มเข้ามาดังนี้
1.ที่ตาราง Product นั้นเพิ่ม Field Price และ Quality ไว้เลย ในกรณีที่เป็นสินค้าใหม่ จะมีแจ้งเตือนให้ใส่ข้อมูลจำนวนต่อ/แพ็ก 
และราคาในครั้งแรก เมื่อใส่รหัสสินค้าครั้งต่อไปจะแสดงให้อัตโนมัติ
2.กรณีที่เป็นรหัสสินค้าเก่าที่ลงทะเบียนไว้แล้วจะแสดง (ชื่อสินค้า)  (จำนวน/แพ็ก)  (ราคา) มาให้และจะไม่ได้สามารถกดเข้าไปแก้ไขได้
(ป้องกันข้อผิดพลาด) และสะดวกกับเราด้วยเพราะเราแค่ใส่จำนวนเข้าไปเท่านั้น
3.ให้แสดงผลรวมทั้งหมดไว้ด้านล่างสุด (ไม่ได้เก็บลงในตาราง) แต่ ส่วนท้ายของรายการสินค้าจะเก็บไว้ในตาราง BillDetail ชื่อ Total
คำสั่งมีการเพิ่มเติ่มบางส่วนถ้าไม่เข้าใจตรงไหนสอบถามได้นะครับ

ส่วนจากที่ถามมาผมได้ใช้ฟังชั่น Nz เข้ามาด้วยเพื่อให้ textbox ที่ว่าง อยู่ให้ค่าเท่ากับ 0
ในตัวอย่างเพิ่มคำสั่ง โดยผมรวมกลุ่มไว้เป็น Sub ไว้เพื่อสะดวกในการใช้งาน

คำสั่งที่ textbox ชื่อ Price
โค๊ด: [Select]
Private Sub Price_AfterUpdate()
Call CalTotal
End Sub

คำสั่งที่ textbox ชื่อ Amount
โค๊ด: [Select]
Private Sub Amount_AfterUpdate()
Call CalTotal
End Sub

อันนี้คือ คำสั่งที่รวมไว้อันเดี่ยวแล้ว คือให้ จำนวน(Amount) x ด้วย ราคา(Price)
แล้ว ใช้ Call...ชื่อ Sub 

โค๊ด: [Select]
Sub CalTotal()
Me.Total = Nz(Me.Amount, 0) * Nz(Me.Price, 0)
End Sub

ตัวอย่างด้านล่าง
« แก้ไขครั้งสุดท้าย: 07 มิ.ย. 61 , 23:44:21 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, Tae Songvut

08 มิ.ย. 61 , 15:00:44
ตอบกลับ #8

Tae Songvut

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

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

ขอบคุณมากครับ  :grin:

 

08 มิ.ย. 61 , 19:36:18
ตอบกลับ #9

Tae Songvut

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

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

รบกวนอีกครับ

Sub CalTotal()
Me.Total = CDbl(Nz(Me.Amount, 0)) * CDbl(Nz(Me.Price, 0))
Me.Text37.Requery
End Sub

ช่่วยอธิบาย
CDbl(Nz  คืออะไร
.Requery คืออะไร


ขอบคุณครับ

 

08 มิ.ย. 61 , 21:24:03
ตอบกลับ #10

ปิ่นณรงค์

รบกวนอีกครับ

Sub CalTotal()
Me.Total = CDbl(Nz(Me.Amount, 0)) * CDbl(Nz(Me.Price, 0))
Me.Text37.Requery
End Sub

ช่่วยอธิบาย
CDbl(Nz  คืออะไร
.Requery คืออะไร


ขอบคุณครับ

CDbl คือ การแปลงเป็น double ใช้กรณี ที่ข้อมูลเป็น text หรือจำนวนเต็ม หรืออื่นๆ เมื่อกำหนด double ก็จะได้ค่าเป็นจำนวน มีทศนิยมด้วย


.Requery คือ การสั่ง แสดงผลใหม่เพื่อแสดงค่าล่าสุดที่เปลี่ยนแปลงไป ใช้ใน control หรือ Form หรืออื่นๆแล้วแต่กรณี
« แก้ไขครั้งสุดท้าย: 08 มิ.ย. 61 , 21:40:53 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, Tae Songvut, สุรเกตุ แซ่เอี้ย

09 มิ.ย. 61 , 12:10:54
ตอบกลับ #11

Tae Songvut

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

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

Nz  คืออะไรครับ
Me.Amount, 0   <<<<  ทำไมต้องมี ,0

 

09 มิ.ย. 61 , 13:19:28
ตอบกลับ #12

UnKnown

Nz คือฟังก์ชั่นในการกำหนดว่าเมื่อค่าในตัวแปลที่1 มีค่าเท่ากับ Null หรือก็คือว่างไม่มีค่าอะไรเลยให้มีค่าเท่ากับตัวแปลที่2

ดังนั้น Nz(Me.Amount, 0) จึงเป็นการกำหนดว่าเมื่อ Me.Amount ว่างให้มีค่าเท่ากับ 0

หมายเหตุ ทุกการคำนวนของโปรแกรมต้องมีค่า จะมา 1+2+Null+4 ไม่ดี,ไม่ควร(หรือจะใช้ไม่ได้ด้วยซ้ำไปครับ) :dizzy: 
            เมื่อใช้ Nz มาช่วยจะกลายเป็น 1+2+0+4 โปรแกรมจึงจะหาผลลัพธ์(=7)ให้ครับ
            หรือจะเอาไปประยุกต์ใช้อย่างอื่นนอกเหนือจากแนวคำนวนก็ได้นะ https://www.techonthenet.com/access/functions/advanced/nz.php link

 
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์, Tae Songvut, สุรเกตุ แซ่เอี้ย

09 มิ.ย. 61 , 15:36:19
ตอบกลับ #13

Tae Songvut

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

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

ได้แล้วครับ  แสดงผลเฉยๆพอ  :cool:



 


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