กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
428 4
URL.หัวข้อ /
URL
Accesses.. จะแปลงข้อมูลในrecordที่มีข้อมูลบางfieldซ้ำกันอย่างไร
ผมมีฐานข้อมูล accesses มีTable ซึ่งมี 3 field คือ Date, ID , icd ข้อมูลที่มีจะมี Date , ID ซ้ำกันแต่มี หลาย icd เช่น record ที่ 1 มี date #01-01-2002# ID 005 , icd = D001 record ที่ 2 มี date #01-01-2002# ID 005 , icd = X003 record ที่ 3 มี date #01-01-2002# ID 005 , icd = R461 ข้อมูลมีลักษณะเช่นนี้ หลายหมื่น Record ผมต้องแปลงข้อมูลให้ ใน field date และ ID ที่เหมือนกัน ต้องรวม ICD ออกเป็น field icd1,icd2,icd3,..... เป็น date #01-01-2002# ID 005 , icd1 = D001 ,icd2 = X003 , icd3 = R461 เป็น Table ใหม่ ผมต้องทำอย่างไรครับ ขอคำแนะนำด้วยครับ ขอบคุณครับ
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00156
ก่อนอื่นต้องขอบอกว่า ไม่ควรตั้งชื่อฟีลด์ให้ซ้ำกับ Reserved Words ของ Access นะครับ อาจก่อปัญหาอันไม่พึงประสงค์ได้ เช่น Date, Time, Table, ...
ต้องระวังด้วยครับ
ผมยังไม่เข้าใจตรงการรวมฟีลด์สุดท้ายว่า icd1 = D001 ,icd2 = X003 , icd3 = R461 อยู่ในฟีลด์เดียวกัน หรืออยู่ต่างฟีลด์กัน เช่นให้มีการเพิ่มฟีลด์เป็น icd1,icd2, icd3
ถ้าเป็นแบบแรก ก็ใช้ Crosstab Query ถ้าเป็นแบบสองก็อาจต้องใช้โค้ดเข้าไปจัดการครับ
แบบแรกจะเป็นอย่างนี้ครับ ผมให้ตารางผมชื่อง tblReArrange2 เมื่อทำเป็น Crosstab Query จะได้ SQL ดังนี้
TRANSFORM Max(tblReArrange2.icd) AS [The Value]
SELECT tblReArrange2.DDate, tblReArrange2.Idx
FROM tblReArrange2
GROUP BY tblReArrange2.DDate, tblReArrange2.Idx
PIVOT tblReArrange2.icd;
ถ้าเป็นแบบสอง จะสร้างโค้ดได้อย่างนี้ครับ
Sub ReArranged()
Dim dbs As Database, rst As Recordset, rst1 As Recordset
Dim rst2 As Recordset, qdf As QueryDef, I As Integer, J As Integer
Dim strICD As String
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("qryUnique")
Set rst2 = dbs.OpenRecordset("tblArranged")
' Delete tblArranged if there are any records left.
dbs.Execute "Delete * From tblArranged;"
If Not rst.EOF Then
rst.MoveLast
rst.MoveFirst
For J = 1 To rst.RecordCount
Set qdf = dbs.QueryDefs("qryParameter")
' Feed parameters based on the DDate and IDX of the qryUnique
qdf.Parameters!MyDate = rst("DDate")
qdf.Parameters!MyID = rst("IDX")
Set rst1 = qdf.OpenRecordset()
rst1.MoveLast
rst1.MoveFirst
' Collect all ICD belongs to this DDate and IDX
For I = 1 To rst1.RecordCount
strICD = strICD & ", " & rst1("ICD")
rst1.MoveNext
Next I
' Trim out the extra , at the first digit of the strICD
strICD = Mid(strICD, 2)
rst1.MoveFirst
rst2.AddNew
rst2("DDate") = rst1("DDate")
rst2("IDX") = rst1("IDX")
rst2("ICD") = strICD
rst2.Update
' Reset strICD
strICD = ""
rst.MoveNext
Next J
End If
rst2.Close
rst1.Close
rst.Close
qdf.Close
dbs.Close
End Sub
ผมว่าดูตัวอย่างจริงดีกว่า ให้ download ที่
http://agserver.kku.ac.th/basiceng/computer/manit.zip
ครับ
2 @R00157
เรียนอ.สุภาพ
ผมขอบพระคุณ อาจารย์มากครับที่กรุณาให้ความช่วยเหลือ ผมอาจจะเขียนไม่ clear รบกวน อ.ช่วยพิจารณาเพิ่มครับ
Table ที่มีอยู่ มี 3 field ครับ คือ ddate, ID , icd โดยใน 1 record จะมี icd code ได้เพียง 1 ตัวดังนั้นใน 1 วันข้อมูลมีจะมี Date , ID ซ้ำกันได้ไม่เกิน 3 record คือใน 1 วันจะลง icd ไม่เกิน 3 reccord สำหรับ 1 ID บาง ID อาจมี 1 หรือ 2 Record
วัตถุประสงค์ที่ต้องการ คือ ต้องทำตารางใหม่ ให้มี field 5 field เป็น ddate, ID , icd1,icd2,icd3
คือ ถ้า record ใดมี icd ตัวเดียว ก็ให้อยู่ใน field icd1
ถ้ามี ddate,ID ซ้ำ คือมี icd เป็นตัวที่ 2 ก็ในไปอยู่ในตารางใหม่ใน field icd2
และถ้ามี icd ตัวที่ 3 ก็ให้ไปอยู่ใน icd3
สรุปคือ นำไปทำเป็นตารางใหม่ ให้ DDate,ID,ICD อยู่ใน record เดียวกัน
ถ้า ddate,ID มี ICD 1 record ก็ไปอยู่ใน field icd1
ถ้ามี ddate,ID ซ้ำกัน และมี ICD ไม่เหมือนกัน 2 - 3 record ก็ย้าย icd ตัวแรกไปอยู่ใน field icd1 ย้าย icd ตัวที่ 2 ไปอยู่ใน field icd2 และถ้ามี icd ตัวที่ 3 ก็ย้ายไปอยู่ใน field icd3 คือให้อยู่ใน record เดียวกัน ดังนั้นในตารางที่ได้ใหม่ บาง record จะมีข้อมูลใน icd1 ทุก record แต่ใน field icd2,icd3 บางrecord จะมีข้อมูล
เนื่องจากรหัส icd มีหลายพันตัว ถ้าทำแบบ crosstab query จะมี fieldออกมาตามจำนวนรหัส icd ที่มี แต่ตารางที่ต้องการให้มี 5 field field icd1 อาจมีรหัส icd ที่ซ้ำกัน หรือไม่ซ้ำก็ได้
ฝากรบกวนอาจารย์ ช่วยแนะนำด้วยครับ ผมเป็นทันตแพทย์ที่รพ.สูงเนิน โคราช ที่รพ.ใช้โปรแกรมให้บริการคนไข้ เวลาลงรหัส icd จะลงที่ละ record ลงได้ที่ละรหัส
ทำให้ใน 1 คน 1 วัน ต้องมีรหัส icd หลาย record แต่เวลาที่ต้องนำมาสรุป ต้องสรุปเป็น record เดียวกัน เพิ่งหัดใช้access ยังเขียน code ไม่เป็นครับ
ขอบคุณมากครับ
3 @R00160
ลองดูตัวอย่างใหม่ โดยผมปรับโค้ดให้แล้ว ลอง Run ดู ถ้ามี Bugs กรุณาแจ้งเข้ามาด้วยครับ เพราะผมมีตัวอย่างน้อย อาจยังไม่ครอบคลุม ให้ d/l ตัวอย่างที่
http://agserver.kku.ac.th/basiceng/manit.zip ครับ
ให้ดูที่โค้ดนี้
Sub ReArranged2()
Dim dbs As Database, rst As Recordset, rst1 As Recordset
Dim rst2 As Recordset, qdf As QueryDef, I As Integer, J As Integer
Dim strICD As String
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("qryUnique")
Set rst2 = dbs.OpenRecordset("tblArranged")
' Delete tblArranged if there are any records left.
dbs.Execute "Delete * From tblArranged;"
If Not rst.EOF Then
rst.MoveLast
rst.MoveFirst
For J = 1 To rst.RecordCount
Set qdf = dbs.QueryDefs("qryParameter")
' Feed parameters based on the DDate and IDX of the qryUnique
qdf.Parameters!MyDate = rst("DDate")
qdf.Parameters!MyID = rst("IDX")
Set rst1 = qdf.OpenRecordset()
rst1.MoveLast
rst1.MoveFirst
' Collect all ICD belongs to this DDate and IDX
For I = 1 To rst1.RecordCount
If I = 1 Then
rst2.AddNew
rst2("DDate") = rst1("DDate")
rst2("IDX") = rst1("IDX")
rst2("ICD1") = rst1("ICD")
rst2.Update
Else
rst2.MoveLast
rst2.Edit
rst2("ICD" & (I)) = rst1("ICD")
rst2.Update
End If
rst1.MoveNext
Next I
rst.MoveNext
Next J
End If
rst2.Close
rst1.Close
rst.Close
qdf.Close
dbs.Close
End Sub
4 @R00163
เรียน อ.สุภาพ
ผมลองใช้ดู เบื้องต้น ลองเพิ่มข้อมูลดู แล้ว run module ใช้ได้ครับ จะนำไปใช้กับฐานข้อมูลจริง ได้ผลอย่างไรจะเรียนให้อาจารย์ทราบ ขอบคุณมากครับ มานิต
Time: 0.1057s