กระทู้เก่าบอร์ด อ.Yeadram
2,040 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 ไม่ไหวครับ ขอบคุณมากครับ
รหัสลูกค้า ชื่อลูกค้า สินค้า จำนวนเงิน
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
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" ครับ รบกวนด้วยครับ
รหัสลูกค้า ชื่อลูกค้า สินค้า จำนวนเงิน
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
ขอบคุณครับ
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
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
If Not IsNull(rs!รหัสลูกค้า) Then
เป็น
If Val(rs!รหัสลูกค้า) > 0 Then
7 @R14946
ใช่ครับ คำว่า Total อยู่ในฟิลด์รหัสลูกค้าครับ
จากการทดสอบพบว่า code ไม่มีปัญหา แต่ Code ไม่ยอมตกที่ Else เผื่อ Edit สักรายการเลยครับ
จากการทดสอบพบว่า 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
จาก
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
If Not IsNull(rs!รหัสลูกค้า) Or rs!รหัสลูกค้า & "" <> "" Or rs!รหัสลูกค้า <> "" Then
11 @R14950
ขอบคุณทั้งสองท่านมากเลยครับ ข้อมูลเกือบจะสมบูรณ์แล้วครับ แต่ติดตรงที่ ยอดรวมแทนที่จะอยู่ตรง ฟิลด์ จำนวนเงิน มัน ดันไปอยู่ตรง ฟิลด์สินค้า ผมจะต้องแก้ไขอย่างไรดีครับ ตามนี้ครับ
รหัสลูกค้า ชื่อลูกค้า สินค้า จำนวนเงิน
12345 นาย ก. A 100
B 200
C 300
D 400
Total 1,000
ขออภัยเพิ่งจะมาเห็นตอนหลังครับ ขอบคุณครับ
รหัสลูกค้า ชื่อลูกค้า สินค้า จำนวนเงิน
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
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
แล้วสรุปจัดการปัญหายังไงครับ เพื่อเป็นประโยชน์กับคนที่มีปัญหาเหมือนกัน
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
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
Time: 0.3969s
แต่หากฟิลด์มีเท่านี้จริง และหลักการใส่คือเรคคอร์ดที่อยู่ล่างเรคคอร์ดที่มี รหัสและชื่อ หากเป็นค่าว่าง ก็ให้ใส่เป็น รหัสและชื่อเหมือนเรคคอร์ดก่อนหน้า ไม่รู้เข้าใจถูกหรือไม่ ตัวอย่างเช่น
รหัสลูกค้า ชื่อลูกค้า สินค้า จำนวนเงิน
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
ข้อจำกัด
- คือคุณต้องมั่นใจว่าเรคคอร์ดถูกเรียงลำดับต่อกันอย่างถูกต้อง เพราะโค๊ดนี้จะใช้การจำค่าฟิลด์ที่มี รหัสและชื่อมาใส่ในเรคคอร์ดที่อยู่ด้านล่างของมัน หากเรียงผิด การใส่ก็ผิด
- หากมีจำนวนเรคคอร์ดมากๆ จะช้า
ลองปรับใช้ดูครับ