Accesses.. จะแปลงข้อมูลในrecordที่มีข้อมูลบางfieldซ้ำกันอย่างไร
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 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 ใช้ได้ครับ จะนำไปใช้กับฐานข้อมูลจริง ได้ผลอย่างไรจะเรียนให้อาจารย์ทราบ ขอบคุณมากครับ มานิต
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.1057s