เรียนอาจารย์สุภาพครับ
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

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