แตกข้อมูลจาก 1 แถวเป็นหลายๆแถว
กระทู้เก่าบอร์ด อ.Yeadram

 2,853   11
URL.หัวข้อ / URL
แตกข้อมูลจาก 1 แถวเป็นหลายๆแถว

มีข้อมูลอยู่แค่ 1 แถวแต่อยากแตกตามจำนวนที่มันมีอยู่ เช่น

Name   Qty
AAA       3

ต้องการให้ข้อมูลออกมาเป็น
Name   Qty
AAA       1
AAA       1
AAA       1

รบกวนขอผู้รุ้เขียน code เป็นตัวอย่างให้หน่อยค่ะ

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

1 @R11449
ลองสร้างปุ่มคำสั่งแล้วใส่ code เข้าไป
Private Sub Command0_Click()
Dim MyRec As DAO.Recordset
Set MyRec = CurrentDb.OpenRecordset("ชื่อตารางก่อนแตกข้อมูล")
If MyRec.RecordCount > 0 Then
     Do While Not MyRec.EOF
           'ส่งข้อมูลไปกระจาย
           Call SpreadData(MyRec)
           MyRec.MoveNext
     Loop
End If
MyRec.Close
End Sub

Sub SpreadData(iRec As DAO.Recordset)
Dim MyRec As DAO.Recordset
Dim MySql As String
Dim i As Integer
Set MyRec = CurrentDb.OpenRecordset("ชื่อตารางเป้าหมาย")
แตกข้อมูลตามจำนวนในฟิลด์ qty
For i = 1 To iRec("qty")
    MyRec.AddNew
'ข้อมูลที่ต้องการแตก เห็นชื่อฟิลด์ เป็น Name มันเป็นคำสงวน ไม่ควรตั้งชื่อนี้ครับ ควรสื่อไปเลยว่าเป็น name อะไร ตามตัวอย่าง
           MyRec("ProductName") = iRec("ProductName")
           MyRec("qty") = 1
    MyRec.Update
Next
MyRec.Close
End Sub

คุณต้องปรับให้เข้ากับความต้องการ เองนะครับ
2 @R11450
คุณ Yai ครับ
สงสัยว่านำไปใช้ทำอะไรครับ ขอความรู้หน่อย
3 @R11455
ขอบคุณค่ะ คุณ ditasik ,
คุณ PichiTC เอาไปแตกจำนวนของ Assembly ชิ้นงานค่ะ ซึ่งเป็นงานเกี่ยวกับ construction ถ้าทำงานวงการเดียวกันก็ add เมล์มาคุยได้นะค่ะ ไว้เพื่อแลกเปลี่ย่นความรู้ค่ะ lam_yai2008@hotmail.com ค่ะ

PS. ว่าแต่ว่า TC นี่ชื่อ บ. คุ้นๆ เหมือนกับอยู่วงการเดียวกันเลยค่ะ หุหุ
4 @R11456
คุณ ditasilk คะ รบกวนอีกรอบค่ะ จริงๆ แล้วใน table มันมีหลายฟิลด์ค่ะ แต่ยกตัวอย่างมาแค่ 2 ฟิลด์ ลืมนึกถึงเรื่องนี้ค่ะ ทีนี้จะทำอย่างไรดีค่ะ ในกรณีที่มี หลายๆ ฟิลด์ คือ Item,Desc,Shipment,Package,Weight ประมาณนี้ค่ะ

ปล. กรณีฟิลด์ name ไม่ได้ใช้ค่ะ เพียงแต่ยกตัวอย่างง่ายๆ เข้าไว้ แต่ก็ขอบคุณมากค่ะที่ให้คำแนะนำเกี่ยวกับเรื่องชื่อ ฟิลด์
5 @R11457
คุณ distasilk รบกวนอีกครั้งค่ะ พอดีทำได้แล้วค่ะ โดยเพิ่ม MrRec,iRec ของแต่ละฟิลด์เข้าไป มีกี่ฟิลด์ก็เพิ่มตามฟิลด์ แต่ถ้า คุณ distasilk มีคำแนะนำที่ดีและง่ายกว่านี้ก็รบกวน แนะนำมาได้เลยค่ะ

ขอบคุณมากๆ ที่ให้ความรู้นะค่ะ
6 @R11458
ทำตามนั้นไปก่อนนะครับ ที่จริงถ้าใช้ประโยชน์ จาก
ลำดับฟิลด์ที่เหมือนกัน สามารถใช้ for ... next ในการ addข้อมูลเข้าได้
แต่ยังไม่ว่าง นะครับ ถ้ามีเวลาจะลองทำให้ดู
7 @R11459
Sub SpreadData2(iRec As DAO.Recordset)
Dim MyRec As DAO.Recordset
Dim MySql As String
Dim i As Integer
Dim j as Integer
Set MyRec = CurrentDb.OpenRecordset("tbTarget")
For i = 1 To iRec("qty")

    MyRec.AddNew
        For j = 0 To iRec.Fields.Count - 2
           MyRec.Fields(j).Value = iRec.Fields(j).Value
       Next
    MyRec.Update
Next
MyRec.Close
End Sub
กรณีนี้ไม่ได้บันทึก ฟิลด์ qty เนื่องจาก มีค่าเป็น 1 ตลอด ไม่ทราบว่าจำเป็นต้องใช้ หรือไม่ ในทางตรรกะผมไม่เห็นความจำเป็น ครับ
8 @R11460
ตามคุณ ditasilk
(R11459) "กรณีนี้ไม่ได้บันทึก ฟิลด์ qty เนื่องจาก มีค่าเป็น 1 ตลอด ไม่ทราบว่าจำเป็นต้องใช้ หรือไม่ ในทางตรรกะผมไม่เห็นความจำเป็น"

ผมก็เลยสงสัยว่าจะนำไปใช้ประโยชน์อะไร
คือจะเอาไปออกรายงาน หรือ ใบสั่งงาน หรือเปล่า
ถ้าอย่างนั้นให้ใช้ Query หรือ Report จัดการข้อมูลก็พอ
9 @R11461
ถ้าจำนวน (Qty) ที่มีทั้งหมด มีจำนวนไม่มากเกินไป เช่น มีตั้งแต่ 1 ถึง 20 ชิ้นเป็นต้น ผมขอเสนอวิธีซื่อๆสักวิธี คือ สร้างอีกเทเบิล สมมุติว่าชื่อ C และมีฟิลด์เดียวชื่อว่า N เป็นประเภท Integer ก็ได้ เทเบิลนี้ไม่มี Primary Key แต่ให้สร้าง index ให้กับ N โดยไม่เป็น unique index จากนั้นก็ป้อนค่า 1 ลงฟิลด์ N ป้อนเพียง 1 เรคอร์ด   ป้อนค่า 2 โดยป้อน 2 เรคอร์ด   ป้อนค่า 3 โดยป้อน 3 เรคอร์ด ทำอย่างนี้ไปเรื่อยๆจนครบจำนวนชิ้นสูงสุดที่เป็นไปได้

แล้วเราก็มาทำ SQL ที่เกิดจาก inner join ระหว่างฟิลด์ QTY กับฟิลด์ N เช่น

select T.*, 1 from ชื่อเทเบิล as T inner join C on T.Qty = C.N

เสร็จแล้วครับ มีแค่นี้
10 @R11462
ขอบคุณค่ะ ทั้งคุณ ditasilk และ อ.สันติสุข
จะเอาไปลองใช้ทั้งสองแบบเลยค่ะ ของ อ. ก็ง่ายและสะดวกดี ส่วนของคุณ ditasik ก็ต้องเก็บเอาไว้เพื่อเรียนรู้ค่ะ ขอบอกตรงๆ ว่าไม่มีความรู้ด้านเขียนโปรแกรมเลยค่ะ อาศัยจากค่อยๆสะสมประสบการณ์จากในบอร์ดนี้แหละค่ะ ทำได้มาหลายอย่างแล้ว

ขอบคุณจริงๆ ค่ะ

ปล. มีปัญหาใหม่มาอีกแล้วค่ะ ตั้งเป็นกระทู้ใหม่ รบกวนช่วยอธิบายให้หน่อยนะค่ะ ขอบคุณค่ะ
11 @R11464
ลองใช้วิธี อ.สันติสุข by coding
Sub SpreadData3(iRec As DAO.Recordset)
Dim MyRec As DAO.Recordset
Dim MySql As String
Dim i As Integer
Set MyRec = CurrentDb.OpenRecordset("Select * From C Where N =" & iRec("qty"))
if MyRec.RecordCount<=0 then
For i = 1 To iRec("qty")
    MyRec.AddNew
           MyRec("N") = iRec("qty")
     MyRec.Update
Next
End If
MyRec.Close
End Sub

ไม่ได้ตรวจสอบ (เขียนสด) น่าจะใช้ได้ครับ
ปกติผมใช้กับการออก sticker ตามจำนวนที่ต้องการ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3360s