กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
328 1
URL.หัวข้อ /
URL
ต้องการแทรก record ทำยังไง
คุณเอกถามไว้ที่
http://freeboard.ptcsweb.com/view_q.php?ruser=accesshotline&wbid=106
คือสมมุติเรามี 5 record ในตาราง ปรากฎว่า ลืมพิมพ์ไป 1 record ต้องการแทรก เข้าไปในตารางช่วง record ที่3
ทำยังไง และให้ record เดิมขยับลงไปข้างล่างเป็น record 4 ไม่ใช่การ paste ทับ
เอก [ วันศุกร์ ที่ 9 สิงหาคม 2545 เวลา 16:47 น. ]
ผมว่าการเรียงลำดับของข้อมูลในตารางไม่น่าจะต้องทำกัน เพราะนิยมที่จะเรียงกันใหม่ได้ใน query หรือแม้กระทั้งใน form หรือ report ได้ภายหลัง
การสลับตำแหน่งของข้อมูลจึงไม่ค่อยจะทำกัน
แต่ถ้าต้องการจะทำอย่างนั้นจริง ก็ให้ดูตัวอย่างที่ เพราะว่าข้อมูลนี้จะต้องอยู่กับ ID นี้จึงจะถูกต้อง ก็ลองดูตัวอย่างโค้ดต่อไปนี้ครับ
จากโค้ด ผมเดาเอาว่าตารางเป้าหมายมี ID เป็นฟีลด์ที่เป็น AutoNumber และต้องการจะสลับข้อมูลที่พิมพ์เข้าไปหลังสุด ไปสลับกับข้อมูลตำแหน่งก่อนหน้านั้น โดยผู้ใช้จะต้องระบุตำแหน่งที่ต้องการสลับด้วย ซึ่งผมได้เพิ่ม Text Box ชื่อ txtRecNo ขึ้นมารับค่าดังกล่าว
Private Sub cmdMove_Click()
Dim rst As Recordset, I As Integer, intNumFields As Integer
Dim aTemp() As Variant, bTemp() As Variant, K As Long
' ถ้ามีการระบุลำดับของข้อมูลที่จะสลับ
If (Me.txtRecNo <> "" Or Not IsNull(Me.txtRecNo)) And IsNumeric(Me.txtRecNo) Then
If Me.txtRecNo <= Me.RecordsetClone.RecordCount - 1 Then
Set rst = Me.RecordsetClone
rst.MoveLast
rst.MoveFirst
intNumFields = rst.Fields.Count
' เก็บค่าของลำดับที่ของข้อมูลที่ต้องการจะสลับด้วย
K = Me.txtRecNo
' ปรับความจุของ Array ทั้ง 2 ใหม่ตามจำนวนของฟีลด์
ReDim aTemp(intNumFields)
ReDim bTemp(intNumFields)
If Not rst.EOF Then
' วิ่งไปยังข้อมูลลำดับที่ผู้ใช้ร้องขอ แล้วเก็บข้อมูลทุกฟีลด์ยกเว้น ID ของข้อมูลตัวสุดท้าย
' โดยเก็บไว้ใน Array ชื่อ aTemp()
rst.MoveFirst
rst.Move K - 1
For I = 1 To intNumFields - 1
aTemp(I) = rst(I)
Next I
' วิ่งไปยังข้อมูลสุดท้ายเพื่อเก็บข้อมูลทุกฟีลด์ยกเว้น ID ของข้อมูลตัวสุดท้าย
' แล้วเก็บไว้ใน Array ชื่อ bTemp()
rst.MoveLast
For I = 1 To intNumFields - 1
bTemp(I) = rst(I)
Next I
' ใส่ข้อมูลของข้อมูลตัวสุดท้ายที่ข้อมูลลำดับที่ต้องการสลับกัน
rst.MoveFirst
rst.Move K - 1
For I = 1 To intNumFields - 1
rst.Edit
rst(I) = bTemp(I)
rst.Update
Next I
' ใส่ข้อมูลของข้อมูลตัวเก่ากลับที่ข้อมูลสุดท้าย
rst.MoveLast
For I = 1 To intNumFields - 1
rst.Edit
rst(I) = aTemp(I)
rst.Update
Next I
End If
' Requery changed text boxes
For I = 1 To intNumFields - 1
' ทุก Text Box จะต้องไม่มีชื่อที่ต่างไปจากฟีลด์ที่มันแสดงอยู่
' จีงจะใช้ Algorithm นี้ได้
Me(rst(I).Name).Requery
Next I
Me.tblCustomer.Requery
' ถ้าตัวเลขใน txtRecNo มากกว่าข้อมูลที่มีอยู่ให้บอกด้วย
Else
MsgBox "จะต้องระบุตัวเลขระหว่าง 1 ถึง " & Me.RecordsetClone.RecordCount - 1, vbOKOnly, ":::โอ๊ะโอ่:::"
Exit Sub
Me.txtRecNo = Me.RecordsetClone.RecordCount - 1
'Me.txtRecNo.SetFocus
DoCmd.GoToControl "txtRecNo"
End If
Else
' ยังไม่ใส่หมายเลขของข้อมูลที่จะสลับกัน
If Not IsNumeric(Me.txtRecNo) Then
MsgBox "จะต้องใส่หมายเลขของข้อมูลในช่องนี้เท่านั้น", vbOKOnly, ":::โอ๊ะโอ่:::"
Else
MsgBox "ยังไม่ได้ใส่หมายเลขลำดับที่ของข้อมูลที่ต้องการสลับกัน", vbOKOnly, ":::โอ๊ะโอ่:::"
End If
Exit Sub
End If
End Sub
Private Sub txtRecNo_AfterUpdate()
' ดูว่ามีการใส่หมายเลขในช่องนี้หรือไม่
If Not IsNumeric(Me.txtRecNo) Then
MsgBox "จะต้องใส่หมายเลขของข้อมูลในช่องนี้เท่านั้น", vbOKOnly, ":::โอ๊ะโอ่:::"
'Me.txtRecNo.SetFocus
DoCmd.GoToControl "txtRecNo"
Exit Sub
End If
Me.RecordsetClone.MoveLast
If Me.txtRecNo > Me.RecordsetClone.RecordCount - 1 Then
MsgBox "จะต้องระบุตัวเลขระหว่าง 1 ถึง " & Me.RecordsetClone.RecordCount - 1, vbOKOnly, ":::โอ๊ะโอ่:::"
Exit Sub
Me.txtRecNo = Me.RecordsetClone.RecordCount - 1
'Me.txtRecNo.SetFocus
DoCmd.GoToControl "txtRecNo"
End If
End Sub
จะเห็นว่าผมใช้ RecordsetClone ของฟอร์มเข้าช่วยในการวิ่งกลับไปกลับมาระหว่างข้อมูลที่ต้องการสลับลำดับการเก็บ
เนื่องจากต้องการเปลี่ยนกันเฉพาะฟีลด์ที่ไม่ได้เป็น Primary Key หรือ ID และใช้ Array(), Algorithm ในการรับและส่งค่าต่างๆ ด้วย
ตัวอย่างจริงอยู่ที่ http://agserver.kku.ac.th//basiceng/MoveThisRecord2PreviousOne.zip ครับ
http://freeboard.ptcsweb.com/view_q.php?ruser=accesshotline&wbid=106
คือสมมุติเรามี 5 record ในตาราง ปรากฎว่า ลืมพิมพ์ไป 1 record ต้องการแทรก เข้าไปในตารางช่วง record ที่3
ทำยังไง และให้ record เดิมขยับลงไปข้างล่างเป็น record 4 ไม่ใช่การ paste ทับ
เอก [ วันศุกร์ ที่ 9 สิงหาคม 2545 เวลา 16:47 น. ]
ผมว่าการเรียงลำดับของข้อมูลในตารางไม่น่าจะต้องทำกัน เพราะนิยมที่จะเรียงกันใหม่ได้ใน query หรือแม้กระทั้งใน form หรือ report ได้ภายหลัง
การสลับตำแหน่งของข้อมูลจึงไม่ค่อยจะทำกัน
แต่ถ้าต้องการจะทำอย่างนั้นจริง ก็ให้ดูตัวอย่างที่ เพราะว่าข้อมูลนี้จะต้องอยู่กับ ID นี้จึงจะถูกต้อง ก็ลองดูตัวอย่างโค้ดต่อไปนี้ครับ
จากโค้ด ผมเดาเอาว่าตารางเป้าหมายมี ID เป็นฟีลด์ที่เป็น AutoNumber และต้องการจะสลับข้อมูลที่พิมพ์เข้าไปหลังสุด ไปสลับกับข้อมูลตำแหน่งก่อนหน้านั้น โดยผู้ใช้จะต้องระบุตำแหน่งที่ต้องการสลับด้วย ซึ่งผมได้เพิ่ม Text Box ชื่อ txtRecNo ขึ้นมารับค่าดังกล่าว
Private Sub cmdMove_Click()
Dim rst As Recordset, I As Integer, intNumFields As Integer
Dim aTemp() As Variant, bTemp() As Variant, K As Long
' ถ้ามีการระบุลำดับของข้อมูลที่จะสลับ
If (Me.txtRecNo <> "" Or Not IsNull(Me.txtRecNo)) And IsNumeric(Me.txtRecNo) Then
If Me.txtRecNo <= Me.RecordsetClone.RecordCount - 1 Then
Set rst = Me.RecordsetClone
rst.MoveLast
rst.MoveFirst
intNumFields = rst.Fields.Count
' เก็บค่าของลำดับที่ของข้อมูลที่ต้องการจะสลับด้วย
K = Me.txtRecNo
' ปรับความจุของ Array ทั้ง 2 ใหม่ตามจำนวนของฟีลด์
ReDim aTemp(intNumFields)
ReDim bTemp(intNumFields)
If Not rst.EOF Then
' วิ่งไปยังข้อมูลลำดับที่ผู้ใช้ร้องขอ แล้วเก็บข้อมูลทุกฟีลด์ยกเว้น ID ของข้อมูลตัวสุดท้าย
' โดยเก็บไว้ใน Array ชื่อ aTemp()
rst.MoveFirst
rst.Move K - 1
For I = 1 To intNumFields - 1
aTemp(I) = rst(I)
Next I
' วิ่งไปยังข้อมูลสุดท้ายเพื่อเก็บข้อมูลทุกฟีลด์ยกเว้น ID ของข้อมูลตัวสุดท้าย
' แล้วเก็บไว้ใน Array ชื่อ bTemp()
rst.MoveLast
For I = 1 To intNumFields - 1
bTemp(I) = rst(I)
Next I
' ใส่ข้อมูลของข้อมูลตัวสุดท้ายที่ข้อมูลลำดับที่ต้องการสลับกัน
rst.MoveFirst
rst.Move K - 1
For I = 1 To intNumFields - 1
rst.Edit
rst(I) = bTemp(I)
rst.Update
Next I
' ใส่ข้อมูลของข้อมูลตัวเก่ากลับที่ข้อมูลสุดท้าย
rst.MoveLast
For I = 1 To intNumFields - 1
rst.Edit
rst(I) = aTemp(I)
rst.Update
Next I
End If
' Requery changed text boxes
For I = 1 To intNumFields - 1
' ทุก Text Box จะต้องไม่มีชื่อที่ต่างไปจากฟีลด์ที่มันแสดงอยู่
' จีงจะใช้ Algorithm นี้ได้
Me(rst(I).Name).Requery
Next I
Me.tblCustomer.Requery
' ถ้าตัวเลขใน txtRecNo มากกว่าข้อมูลที่มีอยู่ให้บอกด้วย
Else
MsgBox "จะต้องระบุตัวเลขระหว่าง 1 ถึง " & Me.RecordsetClone.RecordCount - 1, vbOKOnly, ":::โอ๊ะโอ่:::"
Exit Sub
Me.txtRecNo = Me.RecordsetClone.RecordCount - 1
'Me.txtRecNo.SetFocus
DoCmd.GoToControl "txtRecNo"
End If
Else
' ยังไม่ใส่หมายเลขของข้อมูลที่จะสลับกัน
If Not IsNumeric(Me.txtRecNo) Then
MsgBox "จะต้องใส่หมายเลขของข้อมูลในช่องนี้เท่านั้น", vbOKOnly, ":::โอ๊ะโอ่:::"
Else
MsgBox "ยังไม่ได้ใส่หมายเลขลำดับที่ของข้อมูลที่ต้องการสลับกัน", vbOKOnly, ":::โอ๊ะโอ่:::"
End If
Exit Sub
End If
End Sub
Private Sub txtRecNo_AfterUpdate()
' ดูว่ามีการใส่หมายเลขในช่องนี้หรือไม่
If Not IsNumeric(Me.txtRecNo) Then
MsgBox "จะต้องใส่หมายเลขของข้อมูลในช่องนี้เท่านั้น", vbOKOnly, ":::โอ๊ะโอ่:::"
'Me.txtRecNo.SetFocus
DoCmd.GoToControl "txtRecNo"
Exit Sub
End If
Me.RecordsetClone.MoveLast
If Me.txtRecNo > Me.RecordsetClone.RecordCount - 1 Then
MsgBox "จะต้องระบุตัวเลขระหว่าง 1 ถึง " & Me.RecordsetClone.RecordCount - 1, vbOKOnly, ":::โอ๊ะโอ่:::"
Exit Sub
Me.txtRecNo = Me.RecordsetClone.RecordCount - 1
'Me.txtRecNo.SetFocus
DoCmd.GoToControl "txtRecNo"
End If
End Sub
จะเห็นว่าผมใช้ RecordsetClone ของฟอร์มเข้าช่วยในการวิ่งกลับไปกลับมาระหว่างข้อมูลที่ต้องการสลับลำดับการเก็บ
เนื่องจากต้องการเปลี่ยนกันเฉพาะฟีลด์ที่ไม่ได้เป็น Primary Key หรือ ID และใช้ Array(), Algorithm ในการรับและส่งค่าต่างๆ ด้วย
ตัวอย่างจริงอยู่ที่ http://agserver.kku.ac.th//basiceng/MoveThisRecord2PreviousOne.zip ครับ
1 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00568
ถ้าไม่ได้กำหนด PK ให้เป็น AotuNumber ก็สามารถที่จะเปลี่ยน ID ได้เลย โดยการเปลี่ยน ID ของข้อมูลสุดท้ายให้เป็นอย่างอื่นที่ยังไม่มีในตารางก่อน แล้ว ค่อยเปลี่ยน ID ของข้อมูลที่จะย้ายหนีมาเป็น ID ของข้อมูลตัวสุดท้ายแทน แล้วจึงเปลี่ยนข้อมูลที่ย้าย ID หนีครั้งแรกไปแทน แล้วก็สั่งให้ตารางเรียงลำดับจากมากไปหาน้อยด้วย
คำถามเพิ่มเติมสำหรับผู้ที่ต้องการคิดต่อ
ถ้าต้องการที่จะสลับตำแหน่งของข้อมูลในช่องใดๆ ที่ต้องการ (ซึ่งไม่ใช้ข้อมูลสุดท้ายเหมือนตัวอย่าง) กับอีกข้อมูลหนึ่ง จะต้องแก้ไขโค้ดอย่างไร
Time: 0.1169s