สอบถามเรื่องเติมเต็มให้ฐานข้อมูล
กระทู้เก่าบอร์ด อ.Yeadram

 1,970   14
URL.หัวข้อ / URL
สอบถามเรื่องเติมเต็มให้ฐานข้อมูล

คือผมมีข้อมูลที่ Export ออกจากระบบหลักของบริษัท ออกมาน่าตาแบบนี้ครับ

รหัสลูกค้า    ชื่อลูกค้า    สินค้า    จำนวนเงิน
12345        นาย ก.        A                 100
                                    B                 200
                                    C                 300
                                    D                 400

สิ่งที่อยากได้

รหัสลูกค้า    ชื่อลูกค้า    สินค้า    จำนวนเงิน
12345        นาย ก.        A                 100
12345        นาย ก.        B                 200
12345        นาย ก.        C                 300
12345        นาย ก.        D                 400

Acces สามารถทำไ้ด้หรือเปล่าครับ หรือจะเป็น Excel ก็ได้ครับ ฐานข้อมูลลูกค้ามีทั้งหมด 2,000 กว่าคนครับ Copy ไม่ไหวครับ ขอบคุณมากครับ

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

1 @R14940
อื่ม... ก่อนอื่นคุณต้องดูก่อนว่ามีหลักการในการใส่รหัสและชื่ออย่างไร เรคคอร์ดที่ว่าง เรคคอร์ดไหนเป็นของ นาย ก. มีฟิลด์ไหนบอกหรือไม่ หากมีเราสามารถใช้คำสั่ง SQL โดยการใส่เงื่อนไข Where จะทำได้ง่ายและเร็วกว่า

แต่หากฟิลด์มีเท่านี้จริง และหลักการใส่คือเรคคอร์ดที่อยู่ล่างเรคคอร์ดที่มี รหัสและชื่อ หากเป็นค่าว่าง ก็ให้ใส่เป็น รหัสและชื่อเหมือนเรคคอร์ดก่อนหน้า ไม่รู้เข้าใจถูกหรือไม่ ตัวอย่างเช่น

รหัสลูกค้า     ชื่อลูกค้า     สินค้า     จำนวนเงิน
12345     นาย ก.     A     100
          B     200
          C     300
          D     400
12346     นาย ข.     A     100
          B     200
          C     300
12347     นาย ค.     A     100
          C     300
          D     400

และอยากให้เป็นอย่างนี้
รหัสลูกค้า     ชื่อลูกค้า     สินค้า     จำนวนเงิน
12345     นาย ก.     A     100
12345     นาย ก.     B     200
12345     นาย ก.     C     300
12345     นาย ก.     D     400
12346     นาย ข.     A     100
12346     นาย ข.     B     200
12346     นาย ข.     C     300
12347     นาย ค.     A     100
12347     นาย ค.     C     300
12347     นาย ค.     D     400

หากผมเข้าใจถูก และไม่สามารถหาหลักการที่จะใช้ Where Clause ได้จริงๆให้ลองทำตามตัวอย่างนี้ดูครับ
สมมุติตารางชื่อ Table1
สร้างฟอร์มเปล่าๆขึ้นมา สร้างปุ่มขึ้นมา 1 ปุ่ม ใส่โค๊ดลงใน Event > On Click ดังนี้:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
Dim Temp_txt As String, Temp_ID As Integer
rs.MoveFirst
    Do Until rs.EOF
        If Not IsNull(rs!รหัสลูกค้า) Then
            Temp_ID = rs!รหัสลูกค้า
            Temp_txt = rs!ชื่อลูกค้า
        Else
            rs.Edit
            rs!รหัสลูกค้า = Temp_ID
            rs!ชื่อลูกค้า = Temp_txt
            rs.Update
        End If
        rs.MoveNext
    Loop
MsgBox "Update Complete", , "Test"
   
rs.Close: db.Close: Set rs = Nothing: Set db = Nothing

ข้อจำกัด
- คือคุณต้องมั่นใจว่าเรคคอร์ดถูกเรียงลำดับต่อกันอย่างถูกต้อง เพราะโค๊ดนี้จะใช้การจำค่าฟิลด์ที่มี รหัสและชื่อมาใส่ในเรคคอร์ดที่อยู่ด้านล่างของมัน หากเรียงผิด การใส่ก็ผิด
- หากมีจำนวนเรคคอร์ดมากๆ จะช้า
ลองปรับใช้ดูครับ
2 @R14941
ขอบคุณ คุณ TTT มาเลยครับมาถูกทางแล้วครับ ตามที่คุณ TTT เข้าใจเลยครับ แต่ผมลืมข้อมูลไปส่วนหนึ่งครับ ซึ่งความเป็นจริง ของมูลจะเป็นแบบนี้ครับ ขออภัยด้วยครับ

รหัสลูกค้า     ชื่อลูกค้า     สินค้า     จำนวนเงิน
12345            นาย ก.        A           100
                                        B           200
                                        C          300
                                        D          400
Total                                          1,000
"เป็นแถวว่าง"
12346               นาย ข.     A          100
                                        B          200
                                        C          300
Total                                             600
"เป็นแถวว่าง"
12347               นาย ค.     A          100
                                        C          300
                                        D          400
Total                                             800
"เป็นแถวว่าง"

จากการทดสอบ run โปรแกรม ติดตรง ส่วนนี้ครับ Temp_txt = rs!ชื่อลูกค้า

ระบบฟ้อง Msg ว่า "Invalid Use of Null" ครับ รบกวนด้วยครับ

3 @R14942
ลืมไปอีกนิดครับ ข้อมูลลูกค้าบางคนก็มีแค่ Rcord เดี่ยวแบบนี้ครับ

12347               นาย ค.     A          100
Total                                             800

ขอบคุณครับ
4 @R14943
จากที่ run code มันไม่ตก Else เพื่อ edit สัก Record เลยครับ ไม่ทราบว่าผิดตรงไหน
5 @R14944
คำว่า Total อยู่ในฟิลด์ รหัสลูกค้า ด้วยใช่ไหมครับ หากใช่ก็เพิ่มเงื่อนไขเป็นแบบนี้ครับ

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
Dim Temp_txt As String, Temp_ID As String
rs.MoveFirst
    Do Until rs.EOF
        If Not IsNull(rs!รหัสลูกค้า) Then
            If rs!รหัสลูกค้า <> "Total" Then
               Temp_ID = rs!รหัสลูกค้า
               Temp_txt = rs!ชื่อลูกค้า
            Else
               Temp_ID = ""
               Temp_txt = ""
            End If
        Else
            rs.Edit
            rs!รหัสลูกค้า = Temp_ID
            rs!ชื่อลูกค้า = Temp_txt
            rs.Update
        End If
        rs.MoveNext
    Loop
MsgBox "Update Complete", , "Test"
   
rs.Close: db.Close: Set rs = Nothing: Set db = Nothing
6 @R14945
ถ้ายังไม่เข้า Else อีก ลองเปลี่ยน
If Not IsNull(rs!รหัสลูกค้า) Then
เป็น
If Val(rs!รหัสลูกค้า) > 0 Then
7 @R14946
ใช่ครับ คำว่า Total อยู่ในฟิลด์รหัสลูกค้าครับ

จากการทดสอบพบว่า code ไม่มีปัญหา แต่ Code ไม่ยอมตกที่ Else เผื่อ Edit สักรายการเลยครับ
8 @R14947
ขอบคุณ คุณ PichaiTC ที่มาช่วยอีกแรงครับ จากการทดสอบผ่านครับ แต่คำว่า Total ก็ถูกแทนด้วย รหัสลูกค้า กับชื่อลูกค้าไปด้วยครับ จะต้องแก้ไข Code ตรงไหนต่อครับ ขอบคุณครับ
9 @R14948
ลองตรวจสอบฟิลด์ รหัสลูกค้าเป็นค่าว่างจริงหรือเปล่า เช่นอาจติด วรรค หรือ Enter มา เพราะเป็นฐานข้อมูลที่ Import จาก Data อื่นเข้ามา MS Access อาจเกิดความผิดพลาดได้ หากแน่ใจว่าเป็นค่าว่างจริง ลองใช้เงื่อนไขนี้แทนดูครับ
จาก
If Not IsNull(rs!รหัสลูกค้า) Then
เป็น
If Not IsNull(rs!รหัสลูกค้า) Or rs!รหัสลูกค้า & "" <> "" Or rs!รหัสลูกค้า = "" Then
10 @R14949
แก้ไขพิมพ์ผิด
If Not IsNull(rs!รหัสลูกค้า) Or rs!รหัสลูกค้า & "" <> "" Or rs!รหัสลูกค้า <> "" Then
11 @R14950
ขอบคุณทั้งสองท่านมากเลยครับ ข้อมูลเกือบจะสมบูรณ์แล้วครับ แต่ติดตรงที่ ยอดรวมแทนที่จะอยู่ตรง ฟิลด์ จำนวนเงิน มัน ดันไปอยู่ตรง ฟิลด์สินค้า ผมจะต้องแก้ไขอย่างไรดีครับ ตามนี้ครับ

รหัสลูกค้า     ชื่อลูกค้า     สินค้า     จำนวนเงิน
12345            นาย ก.        A           100
                                        B           200
                                        C          300
                                        D          400
Total                            1,000

ขออภัยเพิ่งจะมาเห็นตอนหลังครับ ขอบคุณครับ
12 @R14951
จาก code ของคุณ TTT นะครับ ปรับแก้เป็นตามนี้

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
Dim Temp_txt As String, Temp_ID As String
rs.MoveFirst
    Do Until rs.EOF
        If Trim(rs!รหัสลูกค้า) = "Total" Then
'ย้ายจำนวนเงินให้ถูกช่อง
            rs.Edit
            rs!จำนวนเงิน = rs!สินค้า
            rs!สินค้า = Null
            rs.Update
        Else    '<> "Total"
'ตรวจว่าเป็นบรรทัดแรกของข้อมูลแต่ละชุดหรือไม่
            If Val(rs!รหัสลูกค้า) > 0 Then
'จำรหัสและชือไว้ก่อน
               Temp_ID = rs!รหัสลูกค้า
               Temp_txt = rs!ชื่อลูกค้า
            Else
'ระบุรหัสและชื่อตามบรรทัดแรกของชุดที่จำไว้แล้ว
               rs.Edit
               rs!รหัสลูกค้า = Temp_ID
               rs!ชื่อลูกค้า = Temp_txt
               rs.Update
            End If
        End If
        rs.MoveNext
    Loop
MsgBox "Update Complete", , "Test"
    
rs.Close: db.Close: Set rs = Nothing: Set db = Nothing
13 @R14952
สร้างอีกปุ่ม ใส่โค๊ดดังนี้
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
    rs.MoveFirst
        Do Until rs.EOF
            If rs!รหัสลูกค้า = "Total" Then
               rs.Edit
               rs!จำนวนเงิน = CLng(rs!สินค้า)
               rs!สินค้า = ""
               rs.Update
            End If
            rs.MoveNext
        Loop
    MsgBox "Update Complete", , "Test"
       
    rs.Close: db.Close: Set rs = Nothing: Set db = Nothing

แล้วสรุปจัดการปัญหายังไงครับ เพื่อเป็นประโยชน์กับคนที่มีปัญหาเหมือนกัน
14 @R14954
ขอขอบคุณทั้งสองท่านมากครับ ผมปรับแต่งออกมาได้สมบูรณ์แบบแล้วครับตามสูตรนี้ครับ

Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
Dim Temp_txt As String, Temp_ID As String
rs.MoveFirst
    Do Until rs.EOF
        'If Not IsNull(rs(0)) Then
        'If Val(rs(0)) > 0 Then
        'If Not IsNull(rs(0)) Or rs(0) & "" <> "" Or rs(0) = "" Then
            If Not IsNull(rs(0)) Or rs(0) & "" <> "" Or rs(0) <> "" Then
               If rs(0) <> "Total" Then
                    Temp_ID = rs(0)
                    Temp_txt = rs(1)
               Else
                    rs.Edit
                    rs(8) = rs(7) ' ฟิลด์ที่ 8 เท่า กับ ฟิลด์ที่7
                    rs(7) = Null 'แล้วทำให้ฟิลด์ที่ 7 เป็นว่างซะ
                    rs.Update
                    Temp_ID = ""
                    Temp_txt = ""
               End If
            Else
               rs.Edit
               rs(0) = Temp_ID
               rs(1) = Temp_txt
               rs.Update
            End If
            rs.MoveNext
    Loop
MsgBox "Update Complete", , "Test"
    
rs.Close: db.Close: Set rs = Nothing: Set db = Nothing
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2676s