กระทู้เก่าบอร์ด อ.Yeadram
2,853 11
URL.หัวข้อ /
URL
แตกข้อมูลจาก 1 แถวเป็นหลายๆแถว
มีข้อมูลอยู่แค่ 1 แถวแต่อยากแตกตามจำนวนที่มันมีอยู่ เช่น
Name Qty
AAA 3
ต้องการให้ข้อมูลออกมาเป็น
Name Qty
AAA 1
AAA 1
AAA 1
รบกวนขอผู้รุ้เขียน code เป็นตัวอย่างให้หน่อยค่ะ
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
2 @R11450
คุณ Yai ครับ
สงสัยว่านำไปใช้ทำอะไรครับ ขอความรู้หน่อย
สงสัยว่านำไปใช้ทำอะไรครับ ขอความรู้หน่อย
3 @R11455
ขอบคุณค่ะ คุณ ditasik ,
คุณ PichiTC เอาไปแตกจำนวนของ Assembly ชิ้นงานค่ะ ซึ่งเป็นงานเกี่ยวกับ construction ถ้าทำงานวงการเดียวกันก็ add เมล์มาคุยได้นะค่ะ ไว้เพื่อแลกเปลี่ย่นความรู้ค่ะ lam_yai2008@hotmail.com ค่ะ
PS. ว่าแต่ว่า TC นี่ชื่อ บ. คุ้นๆ เหมือนกับอยู่วงการเดียวกันเลยค่ะ หุหุ
คุณ PichiTC เอาไปแตกจำนวนของ Assembly ชิ้นงานค่ะ ซึ่งเป็นงานเกี่ยวกับ construction ถ้าทำงานวงการเดียวกันก็ add เมล์มาคุยได้นะค่ะ ไว้เพื่อแลกเปลี่ย่นความรู้ค่ะ lam_yai2008@hotmail.com ค่ะ
PS. ว่าแต่ว่า TC นี่ชื่อ บ. คุ้นๆ เหมือนกับอยู่วงการเดียวกันเลยค่ะ หุหุ
4 @R11456
คุณ ditasilk คะ รบกวนอีกรอบค่ะ จริงๆ แล้วใน table มันมีหลายฟิลด์ค่ะ แต่ยกตัวอย่างมาแค่ 2 ฟิลด์ ลืมนึกถึงเรื่องนี้ค่ะ ทีนี้จะทำอย่างไรดีค่ะ ในกรณีที่มี หลายๆ ฟิลด์ คือ Item,Desc,Shipment,Package,Weight ประมาณนี้ค่ะ
ปล. กรณีฟิลด์ name ไม่ได้ใช้ค่ะ เพียงแต่ยกตัวอย่างง่ายๆ เข้าไว้ แต่ก็ขอบคุณมากค่ะที่ให้คำแนะนำเกี่ยวกับเรื่องชื่อ ฟิลด์
ปล. กรณีฟิลด์ name ไม่ได้ใช้ค่ะ เพียงแต่ยกตัวอย่างง่ายๆ เข้าไว้ แต่ก็ขอบคุณมากค่ะที่ให้คำแนะนำเกี่ยวกับเรื่องชื่อ ฟิลด์
5 @R11457
คุณ distasilk รบกวนอีกครั้งค่ะ พอดีทำได้แล้วค่ะ โดยเพิ่ม MrRec,iRec ของแต่ละฟิลด์เข้าไป มีกี่ฟิลด์ก็เพิ่มตามฟิลด์ แต่ถ้า คุณ distasilk มีคำแนะนำที่ดีและง่ายกว่านี้ก็รบกวน แนะนำมาได้เลยค่ะ
ขอบคุณมากๆ ที่ให้ความรู้นะค่ะ
ขอบคุณมากๆ ที่ให้ความรู้นะค่ะ
6 @R11458
ทำตามนั้นไปก่อนนะครับ ที่จริงถ้าใช้ประโยชน์ จาก
ลำดับฟิลด์ที่เหมือนกัน สามารถใช้ for ... next ในการ addข้อมูลเข้าได้
แต่ยังไม่ว่าง นะครับ ถ้ามีเวลาจะลองทำให้ดู
ลำดับฟิลด์ที่เหมือนกัน สามารถใช้ 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 ตลอด ไม่ทราบว่าจำเป็นต้องใช้ หรือไม่ ในทางตรรกะผมไม่เห็นความจำเป็น ครับ
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 จัดการข้อมูลก็พอ
(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
เสร็จแล้วครับ มีแค่นี้
แล้วเราก็มาทำ SQL ที่เกิดจาก inner join ระหว่างฟิลด์ QTY กับฟิลด์ N เช่น
select T.*, 1 from ชื่อเทเบิล as T inner join C on T.Qty = C.N
เสร็จแล้วครับ มีแค่นี้
10 @R11462
ขอบคุณค่ะ ทั้งคุณ ditasilk และ อ.สันติสุข
จะเอาไปลองใช้ทั้งสองแบบเลยค่ะ ของ อ. ก็ง่ายและสะดวกดี ส่วนของคุณ ditasik ก็ต้องเก็บเอาไว้เพื่อเรียนรู้ค่ะ ขอบอกตรงๆ ว่าไม่มีความรู้ด้านเขียนโปรแกรมเลยค่ะ อาศัยจากค่อยๆสะสมประสบการณ์จากในบอร์ดนี้แหละค่ะ ทำได้มาหลายอย่างแล้ว
ขอบคุณจริงๆ ค่ะ
ปล. มีปัญหาใหม่มาอีกแล้วค่ะ ตั้งเป็นกระทู้ใหม่ รบกวนช่วยอธิบายให้หน่อยนะค่ะ ขอบคุณค่ะ
จะเอาไปลองใช้ทั้งสองแบบเลยค่ะ ของ อ. ก็ง่ายและสะดวกดี ส่วนของคุณ 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 ตามจำนวนที่ต้องการ
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 ตามจำนวนที่ต้องการ
Time: 0.3360s
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
คุณต้องปรับให้เข้ากับความต้องการ เองนะครับ