นำข้อมูลแถว ให้ไปอยู่ในคอลัม
กระทู้เก่าบอร์ด อ.Yeadram

 4,193   22
URL.หัวข้อ / URL
นำข้อมูลแถว ให้ไปอยู่ในคอลัม

มีตารางอยู่ 3 ตารางครับ ตารางที่ 1 เป็นตารางที่จะรวมข้อมูลในตารางที่ 2 และ 3 ซึ่งเก็บเป็นแถวมาเป็นคอลัม ในตารางที่ 1
ตาราง 1                           
ID        R1   R2   R3 Q1   Q2   Q3
1          X1   X2          Y1    
2          X4                 Y1    Y2   
3          X1

ตารางที่ 2                         ตารางที่ 3
ID        A                           ID           B
1          X1                          1            Y1
1          X2                          2            Y1
2          X4                          2            Y2
3          X1
คือตารางที่ 1 ID จะไม่ซ้ำกันครับ
ผมทำผมทำตารางที่ 2 ไปอยู่ตารางที่ 1 ได้แล้ว แต่ตารางที่ 3 ID มันไม่ตรงครับ ขอความช่วยเหลือจากอาจารทุกท่านด้วยครับ

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

1 @R05936
มึน
2 @R05938
ไม่มีอาจารย์ ท่านไหนว่างเลย
3 @R05939
ถ้านำข้อมูลจาก table2 ไป table1 ได้ แล้วทำไมจาก table3 ไป table1
ทำไม่ได้ล่ะครับ ติดตรงไหน ช่วยบอกด้วย
4 @R05940
ditasilk ครับ จากตารางที่ 1 นะครับ จะเห็นว่า Y2 มันต้องอยู่ตรง ID2
แต่พอทำแล้ว ไปอยู่ตรง ID1 มันไม่ไปอยู่ตรง ID2 ครับ

ส่วนวิธีการผมก็กอปมาแล้วเอามาปรับแต่งเอาครับ ไม่ได้เข้าใจว่าวิธีทำมันเป็นยังงัย ถ้าผมมีตัวอย่างคงจะลองผิดลองถูกได้ แต่ผมลองมา 2 วันละครับ เผื่อให้ช่วยได้ครับ
5 @R05941

วิธีการ
1 ต้องการนำข้อมูลจากตาราง3 ไป ตาราง1 ทั้งหมด
   เขียน SQL STATEMENT เพื่อเลือกข้อมูลทั้งหมด
       DIM strSQL AS String
       strSQL ="Select * From ตาราง3 " & _
                     "Order By ตาราง3.ID"
2 สร้าง recordset
       DIM RS AS DAO.RECORDSET
       Set RS =CurrentDB.OpenRecordSet(strSQL)
3 ตรวจเช็คข้อมูล และวนลูป
     IF RS.RECORDCOUNT>0 THEN
             DO WHILE NOT RS.EOF()
                   Call SaveDataTable1(RS)
                   RS.MOVENEXT
             LOOP
      END IF
      RS.CLOSE
      SET RS=NOTHING
6 @R05943

Sub SaveDataTable1(iRec as DAO.Recordset)
Dim tRec as Dao.RecordSet
Dim strSql as string
strSQL="Select * From ตาราง1 " & _
              "Where ตาราง1.ID = " & iRec("ID") & " " & _
             "Order By ตาราง1.ID "
Set tRec=CurrentDB.OpenRecordSet(strSQL)
IF tRec.RecordCount>0 then
     tRec.Edit
'else
     tRec.AddNew
        tRec("ID")=iRec("ID")
end if
'     เงื่อนไขที่คุณต้องการบันทึก
       R1 --> X1,X4
        R2 --> X2
        R3
        Q1-->Y1
        Q2-->Y2
        Q3    
        SELECT CASE iRec("B")
               case ..
               case ..
        End select
     tRec.Update
     tRec.Close
     set trec=nothing
End Sub

ลองเขียนเพิ่มเติมดูนะครับ สงสัยอะไร ก็ post ถาม อ.ท่านอื่นรอช่วยอยู่แล้ว
7 @R05944
ขอบคุณครับ ขอเวลาลองทำดูก่อนครับ
8 @R05947
ขอโทษครับ ตรง SELECT CASE
เงื่อนไขคือ Y2 ต้อง ไปลงให้ ID2 ตรงกัน ผมไม่เข้าใจตรงกำหนด CASE ให้ Y1ไปอยู่คอรัม Q1 และ Y2ไปอยู่คอรัม Q2 โดย ID ต้องตรงกัน
9 @R05948

ที่ Sub SaveDataTable1(iRec as DAO.Recordset)
จะส่ง recordset เข้ามาที่ sub SaveDataTable1 ชื่อ iRec ซึ่งเป็นข้อมูลจากตาราง 3
ที่ strSQL จะเลือกข้อมูลจาก ตาราง 1 โดยมีเงื่อนไขว่า ID ต้องตรงกัน
strSQL="Select * From ตาราง1 " & _
              "Where ตาราง1.ID = " & [Red]iRec("ID")[/Color] & " " & _
             "Order By ตาราง1.ID "
ความหมายก็คือ ถ้าตาราง3.ID ตรงกับ ตาราง1.ID จะให้เอา Field B
ไปใส่ในช่องไหน ตามที่คุณต้องการ(เงื่อนไข) ซึ่งมีคุณคนเดียวเท่านั้นที่รู้เงื่อนไขของตัวเอง โดยใส่ตรง select case
10 @R05949
ก็วิธีเปลี่ยนให้เป็น ภาษานี่หล่ะที่ไม่รู้ เศร้า
11 @R05950

SELECT CASE iRec("B")
      case "Y1"
            tRec("Q1")=iRec("B")
      case "Y2"
            tRec("Q2")=iRec("B")

End Select

ถ้าตามที่คุณสมมุติ เขียนได้ตามนี้
ขอให้คุณ UN ทดลองดูว่า เป็นไปตามที่ตัวเองต้องการรึเปล่า
โดยสร้างปุ่ม Command1 แล้วสร้างเหตุการณ์
command1_afterUpdate เอาcode ไปไว้ที่เหตุการณ์นี้แล้วลองกดเล่นดูครับ แล้วจะเข้าใจมากขึ้นครับ
12 @R05951
มันไม่น่าจะใช้อะครับ SELECT CASE แบบนี้ เพราะ Y1 มันเป็นข้อมูล
มีเป็นหมื่น มันจะ SELECT CASE ไปจนถึง Y10000 คงไม่ใช่ ผมเอาข้อมูลจากตาราง 2 เข้าได้แบบไม่เข้าใจ ทำตางราง 3 เข้าโดยใช้แบบเดิมแปลงเอา
ผมมันออกมามันขึ้น Record ใหม่เลยครับ ID เลยซ้ำกัน

ลองดูตัวอย่างมั้ยครับ ผมจะส่งไปให้ดู
13 @R05952
ส่งข้อมูลไปที่ accboard@gmail.com ท่านอื่นจะได้ช่วยดูด้วยครับ

14 @R05955
Private Sub Command_Click()
On Error GoTo E:
Dim ib   As Byte, i As Byte, filename, wrkDefault As Workspace
Dim dbsNew As Database, dbs As Database, rstQ, rstC, rstt As Recordset, vNo As Long
               Me.Visible = False
               DoCmd.SetWarnings False
               i = 1
               vNo = 0
               DoCmd.SetWarnings True
                    Set dbs = CurrentDb
                    Set rstQ = dbs.OpenRecordset("ตาราง2", dbOpenSnapshot)
                    Set rstt = dbs.OpenRecordset("ตาราง1", dbOpenDynaset)
                            Do Until rstQ.EOF
                                If vNo = 0 Then
                                    rstt.addNew
                                    rstt!ID = rstQ!ID
                                    rstt!R1 = rstQ!A
                                    rstt.update
                                    i = i + 1
                                    vNo = rstQ!ID
                                ElseIf rstQ!ID = vNo Then
                                    If i = 2 Then
                                           rstt.MoveLast
                                           rstt.Edit
                                           rstt!R2 = rstQ!A
                                           rstt.update
                                           i = i + 1
                                           vNo = rstQ!vn
                                    ElseIf i = 3 Then
                                           rstt.MoveLast
                                           rstt.Edit
                                           rstt!R3 = rstQ!A
                                           rstt.update
                                           i = i + 1
                                           vNo = rstQ!ID
                                    End If
                                ElseIf rstQ!ID <> vNo Then
                                        rstt.addNew
                                        rstt!ID = rstQ!ID
                                        rstt!R1 = rstQ!A
                                        rstt.update
                                        i = 2
                                        vNo = rstQ!ID
                                End If
                                rstQ.MoveNext
                            Loop
                            
                            ' -----------นำตาราง2เข้าแล้ว จะนำตาราง3เข้า-----------------
                            
                            Set dbs = CurrentDb
                    Set rstC = dbs.OpenRecordset("ตาราง3", dbOpenSnapshot)
                    Set rstt = dbs.OpenRecordset("ตาราง1", dbOpenDynaset)
                            Do Until rstC.EOF
                                If vNo = 0 Then
                                    rstt.addNew
                                    rstt!ID = rstC!ID
                                    rstt!Q1 = rstC!B
                                    rstt.update
                                    i = i + 1
                                    vNo = rstC!ID
                                ElseIf rstC!ID = vNo Then
                                    If i = 2 Then
                                           rstt.MoveLast
                                           rstt.Edit
                                           rstt!Q2 = rstC!B
                                           rstt.update
                                           i = i + 1
                                           vNo = rstC!ID
                                    ElseIf i = 3 Then
                                           rstt.MoveLast
                                           rstt.Edit
                                           rstt!Q3 = rstC!B
                                           rstt.update
                                           i = i + 1
                                           vNo = rstC!ID
                                    End If
                                ElseIf rstC!ID <> vNo Then
                                        rstt.addNew
                                        rstt!ID = rstC!ID
                                        rstt!Q1 = rstC!B
                                        rstt.update
                                        i = 2
                                        vNo = rstC!ID
                                End If
                                rstC.MoveNext
                            Loop
                            DoCmd.SetWarnings False
                            MsgBox "Success", vbOKOnly, "Un"

                                           'DoCmd.RunSQL "Delete * from ตาราง1"
                                           'DoCmd.RunSQL "Delete * from ตาราง2"


                            Exit Sub

E:
                            MsgBox Err.Description, vbCritical, "Information"
                            DoCmd.SetWarnings True
End Sub
15 @R05956
ผมลองก๊อปตัวอย่างที่ทำตรับจะได้เห็นชัดๆ

ผมทำจากความไม่เข้าใจลองผิดลองถูก

ในขั้นตอนแรกตาราง 2 เข้าไปอยู่ตาราง 1 ได้ตามที่ต้องการครับ

แต่ขั้นตอน 2 ตาราง 3 ไม่เข้าไปอยู่ในตาราง 1 ตามตัวอย่างบนสุด

ในขั้นที่ 2 ที่ลองทำก็คือก๊อป ขั้นตอนแรกมา ปรับๆ เปลี่ยนๆ หลายแบบ

Err บ้าง ไม่รันบ้าง แล้วก็ออกมาผิดๆ บ้าง ไม่รู้ว่าตรงไหนต้องแก้ยังงัยครับ
16 @R05957
1 ผมเห็น code แล้วครับ
2 ผมรู้ว่าคุณ un ยังไม่เข้าใจความหมายของคำสั่งที่เขียน
ผมดูแล้ว มึนเลย
3 ขอถาม ทำไมต้องมี ตัวนับ i
4 ทำไมเปิด rstQ = dbs.OpenRecordset("ตาราง2", dbOpenSnapshot)
   ตรงตาราง2 ไปดูที่ผมเปิด sql statement แบบมีเงื่อนไข ตรวจสอบว่า
มี ID หรือไม่
   ถ้ามีอยู่จะใช้ rstQ.Edit เวลาคุณใส่ข้อมูลเข้าไปมันจะไปบันทึก ณ.บันทึกที่ ID นั้น เช่น ID=2 คุณ UN ก็ดูแถวของ 2 ในตาราง1
ข้อมูลก็จะใส่เข้าในแถวนั้นไงครับ
   ถ้าไม่มีข้อมูล ใช้ rstQ.Add มันตรวจไม่พบ ID ที่ซ้ำกัน ก็เพิ่มข้อมูลเข้าไปแถวใหม่
5 ผมไม่เห็นความสัมพันธ์ของข้อมูล ในตาราง2 และ 3 ที่จะนำไปบันทึกในตาราง1 ว่าสัมพันธ์กันอย่างไร หรือมีข้อแม้ เงื่อนไขที่ต้องเกลา ออกมาเป็นบทสรุปก่อน คงเป็นการบ้าน
6 จากไฟล์ที่ส่งมา เป็น วันที่ และ vn และ diagnosis (ไม่ทราบว่าเป็น
code : ICD9 หรือ ICD10 ขอถาม ว่าต้องการทำตารางที่1 เพื่อนำไปทำอะไรหรือครับ เผื่อไม่ต้องทำ อาจใช้ queryช่วยก็ได้ครับ
พอดีผมติดธุระ พรุ่งนี้จะเข้ามาดูอีกทีนะครับ
17 @R05960
- ผมไม่เข้าใจจริงๆ ครับ กอปมาแก้แล้วก็ใช้ได้
- i นี่หล่ะครับทำให้ผม งง แล้วยังมี vNO อีกแต่มันกำทำงานได้
- ที่ไม่พิมชื่อตาราง เพราะกัวคนอ่านจะ งง เลยใช้
   ตาราง1 แทน diagSSS
    ตาราง2 แทน DiagSSS_tmp
    ตาราง3 แทน DiagSSSCause_tmp
    ID แทน vn และ Visitno ของแต่ละตาราง ตามที่ส่งให้ดู
   (เผอิญ สมมุติเป็น ID ทั้ง 2 ตารางเลย)
- ตารางมันสัมพันกันนะครับ ตรงตาราง 2 มันเรียงเป็นแถวซ้ำคนแต่ไม่ซ้ำ ICD10 ลงมา ตาราง 3 ก็เหมือนตาราง 2 เพียงแต่เป็น ICD10 คนละชนิดกัน เอามาเรียงในตาราง 1 ให้เป็นคอลัม มันจะทำเป็นคิวรีไม่ได้เพราะ ICD10 มีเป็นหมื่น ต้องเรียงเป็น Diag1 2 3 ตามลำดับ

คือเต้ากำหนดรูปแบบมาให้ส่งแบบตาราง 1 ครับเลยต้องมานั่งทำ
18 @R05969
อันนี้เป็นรูปแบบที่ทางการต้องการ
ถ้าเข้าใจไม่ผิดน่าจะเป็น โรคหลัก โรค รอง และโรคร่วม อะไรทำนองนี้
ซึ่งอยู่ในตารางที่ 2 และนำสาเหตุของโรคในตารางที่3 มาใส่ทั้งหมดเข้าในตารางที่ 1 ใช่หรือไม่
โดยหลักการที่นำมาใส่ ให้เรียงตาม อะไรไม่ทราบ แต่คิดว่า ให้ใส่การวินิจฉัยเรียงไปเรื่อย ๆ จนกว่า โรคมีมากกว่า คอลัมน์
และเช่นเดียวกับสาเหตุของโรค ที่สอดคล้องกับ ทุกVisit no ต้องมีโรคและสาเหตุ เป็นไปตามนี้หรือไม่ครับ
19 @R05972
แต่ละคนจะมีการวินิจฉัยหลายอย่าง ในการรับบริการครั้งเดียว(ดูจากvisitNO) จากสูตรข้างบนผมก็ทำให้มาเรียงต่อกันเป็นคอลัมได้แล้ว
แต่พอต้องการเอาสาเหตมาลงด้วย ซึ่งสาเหตุก็เป็นการวินิจฉัยในคร้งนั้น(ดูจากvisitNO)
เพราะฉนั้นการที่จะนำสาเหตุ จากตาราง3 ไปใส่ตาราง 1 ถ้าVisitNO ตรงกัน และเป็นคนเดียวกัน สาเหตุนั้นจะไปอยู่ใน Cause1 และถ้ามีหลายสาเหตุ ก็จะเรียนอยู่ใน Cause2 และ Cause3
20 @R05973
เพื่อการต่อยอดนะครับ
1 ความต้องการ ของเราหรือของผู้ใช้งานคืออะไร(requirement)
2 เวลา copy code มา ควรจะรู้ว่า codeนั้นไปทำอะไร,อย่างไร กับ
   table , field ไหนบ้าง
3 ผลงานในข้อ 2 กับ ความต้องการในข้อ 1 จุดไหนที่ไม่ตรงกับความต้องการ ก็เข้าไปแก้ที่ ข้อ 2
4 ควรตรวจสอบความถูกต้องของข้อมูลด้วยครับ

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