กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
447 8
URL.หัวข้อ /
URL
เรียนอาจารย์สุภาพครับ
ขอบคุณอาจารย์มากครับที่ยังคงติดตามปัญหาอยู่
ผมไม่ได้แก้ไขโค้ดหรอกครับ บังเอิญผมมีฐานข้อมูลของผมอยู่ ซึ่งมีลักษณะคล้ายๆกัน ผมเลยใช้ฐานข้อมูลที่ดาวน์โหลดมาเป็นต้นแบบ ซึ่งก็ไม่มีปัญหาแต่อย่างใดครับ แต่ปัญหาเกิดขึ้นกับฐานข้อมูลของผมเองซึ่งก็พยายามเขียนโค้ดทุกอย่าง เหมือนกับฐานข้อมูลที่ดาวน์โหลดมา แต่ก็ยังไม่สำเร็จยิ่งทำให้ผมมีข้อสงสัยเป็นอย่างมากเลยว่าผิดตรงไหน
ผมไม่ได้แก้ไขโค้ดหรอกครับ บังเอิญผมมีฐานข้อมูลของผมอยู่ ซึ่งมีลักษณะคล้ายๆกัน ผมเลยใช้ฐานข้อมูลที่ดาวน์โหลดมาเป็นต้นแบบ ซึ่งก็ไม่มีปัญหาแต่อย่างใดครับ แต่ปัญหาเกิดขึ้นกับฐานข้อมูลของผมเองซึ่งก็พยายามเขียนโค้ดทุกอย่าง เหมือนกับฐานข้อมูลที่ดาวน์โหลดมา แต่ก็ยังไม่สำเร็จยิ่งทำให้ผมมีข้อสงสัยเป็นอย่างมากเลยว่าผิดตรงไหน
8 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00420
ผมสังเกตุเห็นข้อแตกต่าง ตรง Private Sub Form_Load() ที่มีจุดแตกต่างจากฐานข้อมูลที่ดาวน์โหลดมา ที่ Post ตรงนี้คือจากฐานข้อมูลที่ผมเขียนขึ้นเอง ซึ่งถ้าหากเขียนเหมือนฐานข้อมูลที่ดาวน์โหลดมา เครื่องผมจะฟ้อง error ืทันที
Private Sub Form_Load()
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Order")
rs1.Index = "Order_Id"
Set rs2 = db.OpenRecordset("Customer")
rs2.Index = "Cust_Id"
Set rs3 = db.OpenRecordset("Product")
rs3.Index = "Product_Id"
Set rs4 = db.OpenRecordset("OrderDetail")
rs4.Index = "Product_Id"
Set rs4 = db.OpenRecordset("OrderDetail")
rs4.Index = "Order_Id"
2 @R00421
Error ตรงบันทัดไหนครับ มันฟ้องว่าอย่างไร ช่วยจด แล้วโพสต์ให้ดูด้วยครับ
ที่บอกว่า มันไม่ตรวจว่า มีการคีย์รายการซ้ำในแต่ละการสั่งซื้อ ใช่มั๊ยครับ ไม่ทราบว่ามีบันทัดนี้อยู่หรือเปล่า
rs4.Seek "=", txtOrderID.Value, cboProductID.Value
ซึ่งจะตรวจหาทั้ง OrderId และ ProductID ด้วย
ฉะนั้นถ้าใน 1 รหัสการสั่งซื้อ มีการเลือกรายการสินค้าซ้ำ มันจะต้องฟ้อง
ลองดูครับ ถ้ายังไม่ได้ให้ส่งไฟล์มาให้ผมดูให้ก็ได้ครับ โดยต้องมีขนาดไม่ใหญ่เกินไป เพราะ hotmail ของผมจะรับไม่ได้ครับ
ให้ทำการ Zip แล้วส่งมานะครับ *** Edited by Supap Chaiya *** 12/7/2546 20:01:40
ที่บอกว่า มันไม่ตรวจว่า มีการคีย์รายการซ้ำในแต่ละการสั่งซื้อ ใช่มั๊ยครับ ไม่ทราบว่ามีบันทัดนี้อยู่หรือเปล่า
rs4.Seek "=", txtOrderID.Value, cboProductID.Value
ซึ่งจะตรวจหาทั้ง OrderId และ ProductID ด้วย
ฉะนั้นถ้าใน 1 รหัสการสั่งซื้อ มีการเลือกรายการสินค้าซ้ำ มันจะต้องฟ้อง
ลองดูครับ ถ้ายังไม่ได้ให้ส่งไฟล์มาให้ผมดูให้ก็ได้ครับ โดยต้องมีขนาดไม่ใหญ่เกินไป เพราะ hotmail ของผมจะรับไม่ได้ครับ
ให้ทำการ Zip แล้วส่งมานะครับ *** Edited by Supap Chaiya *** 12/7/2546 20:01:40
3 @R00422
ส่งไฟล์ไปแล้วครับ
4 @R00423
ผมได้แก้โค้ดให้แล้วนะครับ
If IsNull(cmbCustID) Or IsNull(cmbProductId) Or IsNull(txtQuantity) Or IsNull(txtDiscount) Then
MsgBox "คุณป้อนข้อมูลยังไม่ครบกรุณาตรวจสอบ", vbOKOnly + vbInformation, "คำเตือน"
Else
rs1.Seek "=", txtOrderId.Value
If rs1.NoMatch Then
rs1.AddNew
rs1.Fields("Order_Id").Value = txtOrderId.Value
rs1.Fields("Order_date").Value = txtdate.Value
rs1.Fields("Cust_Id").Value = cmbCustID.Value
rs1.Fields("Discount").Value = txtDiscount.Value
rs1.Update
End If
rs4.Seek "=", txtOrderId.Value, cmbProductId.Value
If rs4.NoMatch Then
rs4.AddNew
rs4.Fields("Product_Id").Value = cmbProductId.Value
rs4.Fields("Order_Id").Value = txtOrderId.Value
rs4.Fields("Quantity").Value = txtQuantity.Value
rs4.Update
MsgBox "บันทึกข้อมูลเรียบร้อย"
Else
MsgBox "คุณป้อนรหัสสินค้าซ้ำ"
End If
End If
cmbProductId.Value = Null
txtProductName.Value = Null
txtQuantity.Value = Null
txtUnitPrice.Value = Null
If IsNull(cmbProductId) Then
cmbProductId.SetFocus
End If
Me.QueryDetail.Requery
End Sub
และตรงส่วน
Private Sub Form_Load()
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Order")
rs1.Index = "Order_Id"
Set rs2 = db.OpenRecordset("Customer")
rs2.Index = "Cust_Id"
Set rs3 = db.OpenRecordset("Product")
rs3.Index = "Product_Id"
Set rs4 = db.OpenRecordset("OrderDetail")
rs4.Index = "PrimaryKey"
rs1.MoveLast
txtOrderId.Value = Trim(Str(Val(rs1.Fields("Order_Id").Value) + 1))
rs1.MoveFirst
End Sub
ซึ่งให้ Indexed property ของฟีลด์ Order_ID และ Product_ID ในตาราง OrderDetail ให้เป็น no
และผมใช้โค้ดข้างล่างในการหาว่ามีการตั้ง Index ไว้ที่ฟีลด์ไหนบ้างในตารางที่ต้องการ
Sub ChectIndex()
Dim dbs As Database, tdf As TableDef, inx As Index
Set dbs = CurrentDb
Set tdf = dbs.TableDefs("OrderDetail")
For Each inx In tdf.Indexes
Debug.Print inx.Name & " " & inx.Fields
Next
dbs.Close
Set tdf = Nothing
Set dbs = Nothing
End Sub
เมื่อลอง Run ดูจะได้ผลลัพธ์ดังนี้
OrderOrderDetail +Order_Id
PrimaryKey +Order_Id;+Product_Id
ProductOrderDetail +Product_Id
ซึ่งจะเห็นว่า เมื่อเราตั้งให้มี PrimaryKey กับ 2 ฟีลด์ข้างต้น มันจะเป็น Indexed ด้วย
ผมจึงเปลี่ยนตรง
...
Set rs4 = db.OpenRecordset("OrderDetail")
rs4.Index = "PrimaryKey"
...
ด้วยครับ
ตัวที่ผมแก้ไขให้ผมจะส่งให้ทาง Email นะครับ
5 @R00424
ผมได้ลบ Email ของคุณชิโณ ทิ้งครับ เพราะมันฟ้องใน Hotmail ว่าเต็มแล้ว ถ้าต้องการไฟล์ที่ผมแก้ไขให้ ก็รบกวนให้ส่ง email มาหาผมอีกที แล้วผมจะส่งกลับไปให้ครับ
และผมได้แก้ไขส่วนนี้เพิ่มเติมให้อีกครับ เพื่อแก้ปัญหาตอนที่ยังไม่มีข้อมูลใดๆ เลย
Private Sub Form_Load()
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Order")
rs1.Index = "Order_Id"
Set rs2 = db.OpenRecordset("Customer")
rs2.Index = "Cust_Id"
Set rs3 = db.OpenRecordset("Product")
rs3.Index = "Product_Id"
Set rs4 = db.OpenRecordset("OrderDetail")
rs4.Index = "PrimaryKey"
If Not rs1.EOF Then
rs1.MoveLast
txtOrderId.Value = Trim(Str(Val(rs1.Fields("Order_Id").Value) + 1))
rs1.MoveFirst
Else
txtOrderId.Value = 10001
End If
End Sub
6 @R00431
ผมได้รับไฟล์แก้ไขจากอาจารย์เรียบร้อยแล้วครับ
ขอบคุณครับ
7 @R00432
ขอรบกวนอาจารย์สุภาพช่วยอธิบาย Method Nomatch ผมเกรงว่าสิ่งที่ผมเข้าใจจะเป็นการเข้าใจผิด ตัวอย่างเช่น
If not rs4. Nomatch then หมายถึงอะไรครับ
If rs4. Nomatch then หมายถึงอะไรครับ
และ EOF คือ (End Of File) หมายถึง จุดสิ้นสุดของ RecordSet ใช่ไหมครับ
ขอบคุณครับ
8 @R00433
หมายความว่า ถ้า Nomach หมายถึง ค้นหาไม่พบ นั่นก็หมายความว่า ยังไม่มีข้อมูลตามที่ใส่ลงไปใหม่ ก็ให้เพิ่มข้อมูลใหม่ลงไปได้
แต่ถ้าเจอ ก็ให้ฟ้องข้อความ ว่ามีข้อมูลนั้นแล้ว
นี่คือสิ่งที่คุณชิโณต้องการนั้นแหล่ะครับ ว่าไม่ให้มีการคีย์รายการที่ซ้ำกัน
ส่วน EOF คือ End Of File นั่นหมายความว่า ถ้าไม่มีข้อมูลอยู่ก่อนเลย ให้ทำอย่างไร แต่ถ้ามีข้อมูลแล้ว คือ Not rs.EFO ก็ให้ทำอีกเงื่อนไขหนึ่งครับ คุณชิโณเข้าใจถูกต้องแล้วครับ
Time: 0.1621s