กระทู้เก่าบอร์ด อ.Yeadram
1,054 3
URL.หัวข้อ /
URL
ทราบถามการใช้คำสั่งซ้ำกันแต่คนละคอนโทรลครับ
ผมทำการสร้าง ฟอร์ม 2 ฟอร์ม และใช้คำสั่งบันทึกข้อมูลแยกแต่ละฟอร์ม โดยใช้คอนโทรลคนละตัว ผมใช้คำสั่งทั้ง 2 คอนโทรลตามนี้นะครับ
ตารางที่ 1 รายละเอียดลูกค้า
Private Sub CmdSaveCustbl_Click()
Dim rsSe As Recordset
Set rsSe = CurrentDb.OpenRecordset("WH_Customerstbl")
With rsSe
.AddNew
!CdCus = [tbCdCus] รหัสลูกค้า
!NameCus = [tbNameCus] ชื่อลูกค้า
!AddCus = [tbAddcus] ที่อยู่
!TelCus = [tbTelCus] เบอร์ติดต่อ
.Update
End With
End Sub
ตารางที่ 2 การสั่งสินค้า
Private Sub CmdSaveOdertbl_Click()
Dim rsSe As Recordset
Set rsSe = CurrentDb.OpenRecordset("WH_Odertbl")
With rsSe
.AddNew
!CdPrddoc = [tbCdPrddoc] รหัสใบสั่งสินค้า
!DaPrd = [tbDaPrd] วันที่
!CdPrdType = [tbCdPrdType] รหัสชนิดสินค้า
!CdCusOder = [tbCdCusOder] รหัสลูกค้า
!CdTruck = [tbCdTruck] ทะเบียนรถ
.Update
End With
End Sub
ปัญหาที่พบคือ ครั้งแรกที่ลองรันโปรแกรมจากตารางที่ 1 เพียงตารางเดียว สามารถรันได้ตามปกติ ข้อมูลจาก ฟอร์มถูกดึงเข้ามาเก็บไว้ที่ตารางที่ 1 ได้
แต่เมื่อผมสร้างคำสั่งให้กับคอนโทรลของตารางที่ 2 โดยใช้คำสั่งแบบเดียวกับตารางที่ 1 ปรากฎว่าเมื่อพิมพ์ข้อมูลลงฟอร์มที่ 2 และกดปุ่มคอนโทรลแล้วนั้น ข้อมูลที่พิมพ์ไม่ไปปรากฎในตารางที่ 2 และไม่มีการเตือนว่า Error ที่ใด
หลังจากนั้นผมลองกลับไปพิมพ์ข้อมูลลงฟอร์มที่ 1 อีกครั้ง ปรากฎว่าข้อมูลไม่ถูกดึงเข้าสู่ตารางที่ 1 เหมือนครั้งแรก
งง!!! มากเลยครับ รบกวนช่วยผมด้วยนะครับ
ตารางที่ 1 รายละเอียดลูกค้า
Private Sub CmdSaveCustbl_Click()
Dim rsSe As Recordset
Set rsSe = CurrentDb.OpenRecordset("WH_Customerstbl")
With rsSe
.AddNew
!CdCus = [tbCdCus] รหัสลูกค้า
!NameCus = [tbNameCus] ชื่อลูกค้า
!AddCus = [tbAddcus] ที่อยู่
!TelCus = [tbTelCus] เบอร์ติดต่อ
.Update
End With
End Sub
ตารางที่ 2 การสั่งสินค้า
Private Sub CmdSaveOdertbl_Click()
Dim rsSe As Recordset
Set rsSe = CurrentDb.OpenRecordset("WH_Odertbl")
With rsSe
.AddNew
!CdPrddoc = [tbCdPrddoc] รหัสใบสั่งสินค้า
!DaPrd = [tbDaPrd] วันที่
!CdPrdType = [tbCdPrdType] รหัสชนิดสินค้า
!CdCusOder = [tbCdCusOder] รหัสลูกค้า
!CdTruck = [tbCdTruck] ทะเบียนรถ
.Update
End With
End Sub
ปัญหาที่พบคือ ครั้งแรกที่ลองรันโปรแกรมจากตารางที่ 1 เพียงตารางเดียว สามารถรันได้ตามปกติ ข้อมูลจาก ฟอร์มถูกดึงเข้ามาเก็บไว้ที่ตารางที่ 1 ได้
แต่เมื่อผมสร้างคำสั่งให้กับคอนโทรลของตารางที่ 2 โดยใช้คำสั่งแบบเดียวกับตารางที่ 1 ปรากฎว่าเมื่อพิมพ์ข้อมูลลงฟอร์มที่ 2 และกดปุ่มคอนโทรลแล้วนั้น ข้อมูลที่พิมพ์ไม่ไปปรากฎในตารางที่ 2 และไม่มีการเตือนว่า Error ที่ใด
หลังจากนั้นผมลองกลับไปพิมพ์ข้อมูลลงฟอร์มที่ 1 อีกครั้ง ปรากฎว่าข้อมูลไม่ถูกดึงเข้าสู่ตารางที่ 1 เหมือนครั้งแรก
งง!!! มากเลยครับ รบกวนช่วยผมด้วยนะครับ
3 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R15681
ขอบคุณมากครับ คุณ Akung แต่ผมลองทำตามแล้วครับ แต่ก็ยังไม่ได้โดยผมทำหลายวิธีเลยครับ
1.เพิ่มคำสั่ง rsSe.Close ให้กับทั้งสองคอนโทรล
2.เพิ่มคำสั่ง rsSe.Close ให้กับคอนโทรลในตารางที่ 1 แต่ไม่เพิ่ม ให้กับ ตารางที่ 2
3.ลบคำสั่งออกจากคอนโทรลในตารางที่ 2
ทั้ง 3 วิธีเมื่อทำแล้ว ข้อมูลที่พิมพ์ไม่ไปปรากฎในตารางที่ 2 และไม่มีการเตือนว่า Error ที่ใด หลังจากนั้นผมลองกลับไปพิมพ์ข้อมูลลงฟอร์มที่ 1 อีกครั้ง ปรากฎว่าข้อมูลไม่ถูกดึงเข้าสู่ตารางที่ 1
1.เพิ่มคำสั่ง rsSe.Close ให้กับทั้งสองคอนโทรล
2.เพิ่มคำสั่ง rsSe.Close ให้กับคอนโทรลในตารางที่ 1 แต่ไม่เพิ่ม ให้กับ ตารางที่ 2
3.ลบคำสั่งออกจากคอนโทรลในตารางที่ 2
ทั้ง 3 วิธีเมื่อทำแล้ว ข้อมูลที่พิมพ์ไม่ไปปรากฎในตารางที่ 2 และไม่มีการเตือนว่า Error ที่ใด หลังจากนั้นผมลองกลับไปพิมพ์ข้อมูลลงฟอร์มที่ 1 อีกครั้ง ปรากฎว่าข้อมูลไม่ถูกดึงเข้าสู่ตารางที่ 1
3 @R15740
โค้ดมันเก่ามากนะครับ DAO
มันน่าจะเกี่ยวกับ permission ของการ เชื่อมต่อ
หรือน่าจะเกี่ยวกับ การ Lock Record
หรือน่าจะเกี่ยวกับ การตั้งค่า cursor ของ object
ซึ่งในโค้ดนี้ไม่ได้ระบุอย่างชัดเจน ว่าคุณสมบัติเหล่านี้ให้ตั้งค่าอย่างไร ดังนั้น ระบบน่าจะนำค่า Default มาใช้ทั้งหมด ซึ่งผมไม่รู้ว่าค่าเป็นอย่างไรบ้าง จึงไม่แน่ใจนักว่าปัญหาเกิดจาก อย่างที่ผมสันนิษฐานหรือเปล่า แต่ก็ขอร่วมเดาหาสาเหตุครับ
ถ้ามันเป็นอย่างที่ผมเดาจริงๆ เราควรระบุ ค่าคุณสมบัติเหล่านี้ให้ชัดเจนไปเลยดีกว่า แล้วดักเช็ค Error ด้วยครับ
เช่น
Set rsSe = CurrentDb.OpenRecordset("WH_Odertbl" ตรงนี้น่าจะสามารถระบุออบชั่นอะไรได้อีก ถ้าผมเดาไม่ผิดนะ บอกตรงๆ ไม่เคยเปิด คอนเนคชั่นแบบนี้
อ้อ อีกอย่าง ไม่ควรอ้างถึง Class โดยตรงในโค้ด ควรกำหนดตัวแปร มาเป็นตัวแทน Class แล้วค่อยเรียกใช้ เช่น
Dim db as DAO.database
set db = currentdb
set rsSe = db.Open...
อะไรประมาณนี้ ครับ
ส่วนการดักเช็ค error ก็ อาทิเช่น
on error resume next
rsSe.Addnew
...
....
rsSe.Update
if Err<>0 then
Debug.print err.number & vbtab & err.description
err.clear
on error goto 0
end if
มันน่าจะเกี่ยวกับ permission ของการ เชื่อมต่อ
หรือน่าจะเกี่ยวกับ การ Lock Record
หรือน่าจะเกี่ยวกับ การตั้งค่า cursor ของ object
ซึ่งในโค้ดนี้ไม่ได้ระบุอย่างชัดเจน ว่าคุณสมบัติเหล่านี้ให้ตั้งค่าอย่างไร ดังนั้น ระบบน่าจะนำค่า Default มาใช้ทั้งหมด ซึ่งผมไม่รู้ว่าค่าเป็นอย่างไรบ้าง จึงไม่แน่ใจนักว่าปัญหาเกิดจาก อย่างที่ผมสันนิษฐานหรือเปล่า แต่ก็ขอร่วมเดาหาสาเหตุครับ
ถ้ามันเป็นอย่างที่ผมเดาจริงๆ เราควรระบุ ค่าคุณสมบัติเหล่านี้ให้ชัดเจนไปเลยดีกว่า แล้วดักเช็ค Error ด้วยครับ
เช่น
Set rsSe = CurrentDb.OpenRecordset("WH_Odertbl" ตรงนี้น่าจะสามารถระบุออบชั่นอะไรได้อีก ถ้าผมเดาไม่ผิดนะ บอกตรงๆ ไม่เคยเปิด คอนเนคชั่นแบบนี้
อ้อ อีกอย่าง ไม่ควรอ้างถึง Class โดยตรงในโค้ด ควรกำหนดตัวแปร มาเป็นตัวแทน Class แล้วค่อยเรียกใช้ เช่น
Dim db as DAO.database
set db = currentdb
set rsSe = db.Open...
อะไรประมาณนี้ ครับ
ส่วนการดักเช็ค error ก็ อาทิเช่น
on error resume next
rsSe.Addnew
...
....
rsSe.Update
if Err<>0 then
Debug.print err.number & vbtab & err.description
err.clear
on error goto 0
end if
Time: 0.2473s
rsSe.Close บรรทัดต่อจาก .Update
ลองดูครับ