ต้องการแทรก record ทำยังไง
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 262   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 ครับ

1 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R00568
ถ้าไม่ได้กำหนด PK ให้เป็น AotuNumber ก็สามารถที่จะเปลี่ยน ID ได้เลย โดยการเปลี่ยน ID ของข้อมูลสุดท้ายให้เป็นอย่างอื่นที่ยังไม่มีในตารางก่อน แล้ว ค่อยเปลี่ยน ID ของข้อมูลที่จะย้ายหนีมาเป็น ID ของข้อมูลตัวสุดท้ายแทน แล้วจึงเปลี่ยนข้อมูลที่ย้าย ID หนีครั้งแรกไปแทน แล้วก็สั่งให้ตารางเรียงลำดับจากมากไปหาน้อยด้วย คำถามเพิ่มเติมสำหรับผู้ที่ต้องการคิดต่อ ถ้าต้องการที่จะสลับตำแหน่งของข้อมูลในช่องใดๆ ที่ต้องการ (ซึ่งไม่ใช้ข้อมูลสุดท้ายเหมือนตัวอย่าง) กับอีกข้อมูลหนึ่ง จะต้องแก้ไขโค้ดอย่างไร
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.0459s