กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
385 5
URL.หัวข้อ /
URL
how to copy MainForm and Subform .
ผมต้องการ copy Mainform and Subform...
โดยสร้างปุุ่ม command แล้ว copy ข้อมูล ใน Record นั้น ไป Record ใหม่เช่น
copy Record ที่ 10 ซึ่งมี Main และ Subform อยู่ Copy ไป Record ใหม่เลย
ผมมี code ดังนี้
Option Compare Database
Private Sub Command5_Click()
Dim rsMain As Recordset
Dim rsSub As Recordset
Dim MaxValue As Integer
Dim n As Integer
Set rsMain = CurrentDb.OpenRecordset("select * from table1 where ID = " & Me.ID)
Set rsSub = CurrentDb.OpenRecordset("select * from table2 where ID = " & Me.ID)
MaxValue = DMax("ID", "Table1")
' rsSub.MoveLast
' MsgBox rsSub.RecordCount
'===Copy Main Form====
rsMain.AddNew
rsMain!ID = MaxValue + 1
rsMain!CName = Me!CName
rsMain.Update
'===Copy sub form=====
rsSub.MoveNext
n = rsSub.RecordCount
rsSub.MoveFirst
For i = 1 To n
With rsSub
.AddNew
!ID = MaxValue + 1
!Description = Forms!table1!Table2.Form!Description
.Update
.MoveNext
End With
Next i
Me.Requery
DoCmd.GoToRecord , , acLast
End Sub
โดยสร้างปุุ่ม command แล้ว copy ข้อมูล ใน Record นั้น ไป Record ใหม่เช่น
copy Record ที่ 10 ซึ่งมี Main และ Subform อยู่ Copy ไป Record ใหม่เลย
ผมมี code ดังนี้
Option Compare Database
Private Sub Command5_Click()
Dim rsMain As Recordset
Dim rsSub As Recordset
Dim MaxValue As Integer
Dim n As Integer
Set rsMain = CurrentDb.OpenRecordset("select * from table1 where ID = " & Me.ID)
Set rsSub = CurrentDb.OpenRecordset("select * from table2 where ID = " & Me.ID)
MaxValue = DMax("ID", "Table1")
' rsSub.MoveLast
' MsgBox rsSub.RecordCount
'===Copy Main Form====
rsMain.AddNew
rsMain!ID = MaxValue + 1
rsMain!CName = Me!CName
rsMain.Update
'===Copy sub form=====
rsSub.MoveNext
n = rsSub.RecordCount
rsSub.MoveFirst
For i = 1 To n
With rsSub
.AddNew
!ID = MaxValue + 1
!Description = Forms!table1!Table2.Form!Description
.Update
.MoveNext
End With
Next i
Me.Requery
DoCmd.GoToRecord , , acLast
End Sub
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00468
ลองใช้ Append Query ดูก็น่าจะได้นะครับสั้นๆ และเร็วดี ขึ้นอยู่กับว่าฐานข้อมูลที่คุณออกแบบมาสามารถให้มีเรคคอร์ดซ้ำได้หรือไม่
2 @R00472
ขอรายละเอียดเพิ่มเติมด้วยครับ
คุณ BADMan แนะนำดูแลได้ง่ายกว่า ถ้าเงื่อนไขในการ copy ข้อมูลไม่ซับซ้อนหรือมีการปรับปรุงข้อมูลมากนัก
ผมดูโค้ดคร่าวๆ ก็ถูกต้องนี่ครับ ไม่ทราบว่าต้องการทำอะไรเพิ่ม หรือมีปัญหาอะไรเพิ่มเติมอีกครับ
ผมเคยตอบคำถามลักษณะคล้ายนี้เหมือนกัน แต่จะทำกับฟอร์มเดี่ยวๆ ไม่มี SubForm และเป็นการใช้โค้ดง่ายสั้น
ส่วนตัวอย่างในเว็บของ Microsoft ก็มีตัวอย่างให้ด้วยครับ
เดี๋ยวผมจะไปค้นทั้ง 2 ตัว แล้วจะมาแจ้งให้อีกทีนะครับ
3 @R00481
เรียนคุณ สุภาพ
มีปัญหาว่า เวลา copy แล้ว เมื่อ Add เป็น new record มันจะเพิ่มเป็นลักษณะ ซ๊ำกับ Field แรก
เช่น
.....
Subform
Id name Lastname
1 aa bbb
1 aa bbb
จะซ้ำในลักษณะนี้ครับ
4 @R00482
ดูจากโค้ด น่าจะมีการเพิ่มข้อมูลใน Table1 เพียง 1 ข้อมูล ต่อการคลิก 1 ครั้ง
ทั้ง 2 ตารางต้องเชื่อมกันแบบ One -To - Many ด้วยนะครับ แล้วฟีลด์ที่ใช้เชื่อมกันชื่ออะไรครับ เพราะจะต้องใส่เข้าไปในโค้ดด้วย
สมมติว่าเชื่อมกันด้วยฟีลด์ชื่อ ID ฉะนั้นฟีลด์ ID ในตาราง Table2 จะไม่เป็น Primary Key จะต้องมีฟีลด์ใหม่ที่ทำหน้าที่เป็น Primary Key ด้วย เช่นตั้งชื่อเป็น AutoID แล้วกำหนด Type ให้เป็นแบบ AutoNumber แทน จะไม่ต้องมาเขียนโค้ด ให้มันเพิ่มเอง
ส่วนบันทัดนี้
...
Set rsSub = CurrentDb.OpenRecordset("select * from table2 where ID = " & Me.ID)
...
สามารถเปลี่ยนเป็น
...
Set rsSub = CurrentDb.OpenRecordset("select * from table2")
...
เพราะจะเปิดมาเพื่อให้เพิ่มข้อมูลอย่างเดียว
เมื่อเพิ่มฟีลด์เข้าไปหรือปรับเปลี่ยนฟีลด์แล้ว จะได้โค้ดคล้ายๆ นี้ครับ
Private Sub Command5_Click()
Dim rsMain As Recordset
Dim rsSub As Recordset
Dim MaxValue As Integer
Dim n As Integer
Set rsMain = CurrentDb.OpenRecordset("select * from table1 where ID = " & Me.ID)
Set rsSub = CurrentDb.OpenRecordset("select * from table2")
MaxValue = DMax("ID", "Table1")
' rsSub.MoveLast
' MsgBox rsSub.RecordCount
'===Copy Main Form====
rsMain.AddNew
MaxValue =MaxValue + 1
rsMain!ID = MaxValue
rsMain!CName = Me!CName
rsMain.Update
'===Copy sub form=====
rsSub.MoveNext
n = rsSub.RecordCount
rsSub.MoveFirst
For i = 1 To n
With rsSub
.AddNew
!ID = MaxValue
!Description = Forms!table1!Table2.Form!Description
.Update
.MoveNext
End With
Next i
Me.Requery
DoCmd.GoToRecord , , acLast
End Sub
5 @R00491
ผมได้ลองสร้างตัวอย่างตามที่ผมดูจากโค้ดที่ให้มา จะได้โค้ดใหม่ดังนี้ครับ
Private Sub cmdCopy_Click()
Dim rsMain As Recordset
Dim rsSub As Recordset, rs As Recordset
Dim MaxValue As Integer
Dim n As Integer, I As Integer
Set rsMain = CurrentDb.OpenRecordset("select * from table1 where ID = " & Me.ID)
Set rsSub = CurrentDb.OpenRecordset("select * from table2 where ID = " & Me.ID)
Set rs = CurrentDb.OpenRecordset("select * from table2")
MaxValue = DMax("ID", "Table1")
' rsSub.MoveLast
' MsgBox rsSub.RecordCount
'===Copy Main Form====
rsMain.AddNew
MaxValue = MaxValue + 1
rsMain!ID = MaxValue
rsMain!CName = Me!CName
rsMain.Update
'===Copy sub form=====
rsSub.MoveNext
n = rsSub.RecordCount
rsSub.MoveFirst
For I = 1 To n
With rs
.AddNew
!ID = MaxValue
!Description = rsSub!Description
.Update
End With
rsSub.MoveNext
Next I
Me.Requery
DoCmd.GoToRecord , , acLast
End Sub
ไม่ทราบว่าจะตรงกับความต้องการหรือไม่ ตัวอย่างจริงอยู่ที่ http://agserver.kku.ac.th/basiceng/CopyMultiRecords.zip ครับ
ให้ดูฟอร์มชื่อ Table3 นะครับ
ถ้าต้องการแบบเดิม ก็ให้ดูที่ฟอร์มชื่อ Table1
ลองดูครับ
Time: 0.1172s