how to copy MainForm and Subform .
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 308   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 
 

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