เรื่องเดิมครับ....อาจารย์สันติสุข...
กระทู้เก่าบอร์ด อ.Yeadram

 3,172   7
URL.หัวข้อ / URL
เรื่องเดิมครับ....อาจารย์สันติสุข...

ขออนุญาติรบกวนอาจารย์ สันติสุขอีกครั้งครับ.........
ผมได้ โพสต์ ในกระทู้เดิม ไม่สามารถ โพสต์ได้ครับ ไม่ทราบสาเหตุครับ เมื่อคลิก โพสต์ ก้จะเปิดแต่หน้า Preview...ครับ...

Table1 (ข้อมูลที่มีอยู่)
--------------------------------------------------------------------
HN(Text)        nLevel(Text)       NoLab(Num)
--------------------------------------------------------------------      
000011111           10A                      1                                                             
000011111           10A                      2      
000011111           30C                      3      
000011111           40T                      4
000011111           30C                      5
--------------------------------------------------------------------
000022222           10A                      1      
000022222           10A                      2
--------------------------------------------------------------------      
000033333           10A                      1      
000033333           20A                      2
000033333           30A                      3
---------------------------------------------------------------------

ต้องการนำไปประมวลผลในตารางใหม่ดังนี้
1. นำค่าในTable1 คอลัมภ์ nLevel(Text) แต่ละค่าในคอลัมภ์ มาเรียงในแนวนอน โดย Group ตาม HN(Text)   แล้วนำมา เก็บไว้ ที่   nLevel(Text)   ใน Table2
2. นับจำนวน Record ของแต่ละ HN(Text) แล้วนำจำนวนที่นับได้ มาเก็บไว้ ที่    CountNoLab(Num) ใน Table2

[SIZE=4]เพิ่มเติมจากของเดิมครับ....[/SIZE]

3. ค้นหา อักขระใน Table2 คอลัมภ์ nLevel(Text) หากพบข้อความ ที่มีมากกว่าหรือเท่ากับ 1 ข้อความ ให้แสดงข้อความนั้นในคอลัมภ์ Ctrl(Text) เพียง 1 ข้อความ หากมีข้อความไม่ซ้ำกันเลยให้แสดงค่า ทุกค่า
4. นับจำนวน ข้อความ ที่ซ้ำกัน(ซ้ำกัน=1) ว่ามีกี่ค่า แล้วนำมาเก็บไว้ที่ CountCtrl(Num)
Table2
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
HN(Text)               nLevel(Text)                                 CountNoLab(Num)                  Ctrl(Text)                      CountCtrl(Num)   
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------      
000011111               10A ,10A,30C,40T,30C                         5                                   100A, 30C, 40T                          3
000022222               10A,10A                                                    2                                   10A                                                1
000033333               10A, 20A,30A                                          3                                   10A, 20A, 30A                             3


ผมได้ลองพยายามทำแล้วครับ...โดยใช้ Code เดิมที่อาจารย์กรุณาให้มา คนหาในเว็บ ก็ เจอการเปรียบเทียบอักขระ   Str(Expression)   ก้ยังไม่เข้าใจวิธีการใช้งาน ผมได้ลองเปลี่ยน   nLevel(Num) เป็น nLevel(Text) ใน Table1แล้วสั่ง Run โปรแกรม ถ้าข้อความ ในคอลัมภ์ nLevel(Text) ใน Table1 เป็นอักระที่เป็นตัวเลข อาทิ 1,2,3,4,5 จะไม่มี Error   แต่ถ้าเปลี่ยนเป็น ข้อความจริงๆ อาทิ   10A, 30C ในคอลัมภ์ nLevel(Text) ใน Table1 จะมี Error เกิดขึ้นที่ Modul Function DupLevel ตรงบรรทัดที่   C(RS!nLevel)=C(RS!nLevel)+1 ครับ....ผมต้องแก้ไข Code ตรงไหนบ้างครับ.

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

1 @R10562
C เป็นตัวแปรที่เป็น Array ของข้อมูลประเภท Integer   ตัวแปรที่เป็น Array หมายถึงตัวแปรที่มีเลขกำกับอยู่ในวงเล็บเพื่อระบุตัวแปรนั้นๆ เช่น C(1) ก็คือตัวแปร C ที่มี element ที่ 1, C(2) ก็คือตัวแปร C ที่มี element ที่ 2 เป็นต้น ดังนั้นค่าในวงเล็บต้องเป็นค่าตัวเลขเท่านั้น แต่กรณีนี้ประเภทข้อมูลของ nText ได้เปลี่ยนจากประเภทตัวเลขไปเป็นประเภทตัวอักษร (10A เป็นต้น) ดังนั้นเวลาอ้างว่า C(10A) มันก็ย่อม error เป็นธรรมดาครับ

นี่คือโค้ดที่ปรับปรุงแล้ว

Public Sub GenTable2()
    Dim SQL As String
    
    SQL = "insert into table2(HN, nLevel, CountNoLab, Ctrl, CountCtrl) " _
        & "select Ta.HN, CombineLevel(Ta.HN,'D') as nLevel, CountLevel(Ta.HN,'D') as CountNoLab, CombineLevel(Ta.HN,'N') as Ctrl, CountLevel(Ta.HN,'N') as CountCtrl " _
        & "from Table1 as Ta " _
        & "group by Ta.HN " _
        & "order by Ta.HN "
    CurrentDb.Execute SQL, dbFailOnError
End Sub

Public Function CombineLevel(HN As String, Fn As String) As String
    Dim SQL As String
    Dim RS As DAO.Recordset
    Dim DB As DAO.Database
    
    Set DB = CurrentDb
    If Fn = "N" Then ' Not duplicate level
        SQL = "select distinct nLevel from table1 where HN = '" & HN & "' order by nLevel"
    ElseIf Fn = "D" Then
        SQL = "select nLevel from table1 where HN = '" & HN & "' order by nLevel"
    End If
    Set RS = DB.OpenRecordset(SQL)
    Do Until RS.EOF
        CombineLevel = IIf(CombineLevel = "", RS!nlevel, CombineLevel & "," & RS!nlevel)

        RS.MoveNext
    Loop
    RS.Close: Set RS = Nothing
End Function

Public Function CountLevel(HN As String, Fn As String) As Integer
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim SQL As String
    
    If Fn = "N" Then ' Not duplicate level
        SQL = "select distinct nLevel from table1 where HN = '" & HN & "' "
    ElseIf Fn = "D" Then
        SQL = "select nLevel from table1 where HN = '" & HN & "' "
    End If
    
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset(SQL)
    If RS.EOF Then
        CountLevel = RS.RecordCount
    Else
        RS.MoveLast
        CountLevel = RS.RecordCount
    End If
    RS.Close: Set RS = Nothing
End Function


หมายเหตุ ฟังก์ชั่น DupLevel( ) ไม่ได้มีการใช้อีกต่อไปครับ

2 @R10563
กราบขอบพระคุณท่านอาจารย์สันติสุข มากครับ   ตอนนี้ทำได้แล้วครับ ต่อไป คำถามที่ว่า   กี่คน กี่ครั้ง มีอะไรบ้าง อย่างล่ะเท่าไหร่ ที่ซ้ำๆเท่าไหร่...และที่ไม่ซ้ำมีเท่าไหร่ ก็มีคำตอบ ในตารางเดียว....นับเป็นประโยชน์ กับการปฏิบัติงานมากครับ...เจ้าหน้าที่ชั้นผู้น้อยก็มีคำตอบให้กับผู้บริหาร....ที่ต้องการข้อมูลที่เป็น MIS (สารสนเทศ) เพื่อประกอบการตัดสินใจและบริหารงบประมาณ.....ข้อมูลลักษณะนี้ ในวงการสาธารณสุขใช้มากเลยครับ....ขอให้อาจารย์และทีมงาน มีสุขภาพแข็งแรง สมบูรณ์ เป็นบัวบานที่พ้นน้ำแล้ว ให้เหล่าพวกเราชาว Thai Access ที่ยังเป็น บัวตูม ใต้น้ำบ้าง ปริ่มน้ำบ้าง หรือใต้โคลนตม ได้เป็นที่พึ่ง ตลอดไป.....กราบขอบพระคุณครับ....
3 @R10564
ขอบคุณครับ แต่ถ้าเจอ Access 2007/2010 ผมก็เป็นบัวจมน้ำ บุ๋งๆๆๆๆ     ต้อง อ.สุภาพครับ นั่นบัวพ้นน้ำติดปีกของแท้

ในส่วนของ
    If RS.EOF Then
        CountLevel = RS.RecordCount
    Else
        RS.MoveLast
        CountLevel = RS.RecordCount
    End If


ดูไปดูมาเยิ่นเย้อเกะกะเกินไป ควรลดรูปลงมาเป็น
    If Not RS.EOF Then
        RS.MoveLast
    End If
    CountLevel = RS.RecordCount


ส่วนในคำสั่ง SQL statement ที่มีส่วนที่เขียนว่า Table1 as Ta สามารถตัด as Ta ทิ้งได้ แล้วในคำสั่งตำแหน่งใดที่มี Ta. (ทีเอจุด) ก็ตัดออกได้ครับ เช่น Ta.HN ก็เป็น HN เฉยๆได้ครับ เพราะตอนแรกลองหลายๆวิธีที่มีการอ้าง Table1 ในหลายๆ Sub Query มันเลยต้องมี Alias Name (ชื่อเล่น) ของเทเบิลกำกับไว้ด้วย แต่ทีหลังเปลี่ยนมาเป็นโค้ดนี้ เลยลืมตัดออกครับ
4 @R10566
ขอบพระคุณมากครับ อาจารย์สันติสุข ภาษา SQL ผมไม่ค่อยชำนาญมากนัก อาศัย ทำใน Query ของ Access แล้วเลือกมุมมอง SQL แล้ว Copy Code มา มันก็จะมี Alias Name ติดมาด้วย ทุกครั้ง....แล้วใช้ คำสั่ง แบบนี้ ครับ DoCmd.RunSQL "UPDATE Table1 SET NoLab = Null" แล้วนำมาวางไว้ใน code Tex editer เห็นมีคำสั่ง อีกหลายคำสั่ง ที่ไม่เคยใช้เลยครับ อาจต้องได้รบกวนอาจารย์ สันติสุขอีกหลายครั้งครับ อย่าง คำสั่ง Requery ผมก็ไม่แน่ในนัก ว่าแบบไหนถูกต้อง   DoCmd.Requery "NoLab" หรือ แค่ DoCmd.Requery หรือต้องมี DoCmd.GoToControl "ชื่อ Object" ก่อนแล้วจังสั่ง Requery บางครั้งก้ทำงานบ้างครั้งก้ไม่ทำงาน....(ในมุมมอง View ของ Form) อย่าง เช่น สั่ง ลบข้อมูล ในเทเบิล ก่อน แล้ว Append ข้อมูลเข้าไปใหม่ จะม่ีร่องรอย ของ #Delete # ค้างอยู่ใน MainForm หรือ SubForm แต่เปิดดูใน เทบิลจริงๆ ข้อมูลถูกลบไปหมดแล้ว และถูก Append แล้วเรียบร้อย หน้า Form ยังมีร่องรอย ของ #Delete # ค้างอยู่.ต้องทำปุ่ม Refresh Data เพิ่มอีกหนึ่งปุ่ม พอจะแก้ไขหรือเขียน Code ที่ถูกต้องอย่างไรครับ.....ที่ผมทำอยู่ใช้แบบนี้ครับ...มีปัญหาบ้างครับแต่ก้พอใช้งานได้ครับ....

' ลบข้อมูลเดิมแล้วนำเข้าใหม่
DoCmd.SetWarnings False
CreateObject("WScript.Shell").PopUp "กรุณารอสักครู่กำลังประมวลผลอยู่ครับ", 1, "ประมวลผล", vbOKOnly
DoCmd.RunSQL "Delete From ReportDM"
DoCmd.RunSQL "INSERT INTO ReportDM ( HN, CID, Total_Chk, TEST ) SELECT DM3_M.HN, DM3_M.CID, DM3_M.TotalNoLab, DM3_M.ReSult FROM DM3_M GROUP BY DM3_M.HN, DM3_M.CID, DM3_M.TotalNoLab, DM3_M.ReSult"
DoCmd.GoToControl "ReportDM"
DoCmd.Requery

หรือว่าเป็นที่ เครื่องคอมพิวเตอร์ เกี่ยวกับการประมวลผลของ CPU ผมใช้ Intel Core I5 อยุ่ครับ
5 @R10569
- "ภาษา SQL ผมไม่ค่อยชำนาญมากนัก อาศัย ทำใน Query ของ Access แล้วเลือกมุมมอง SQL แล้ว Copy Code มา" ผมก็ทำอย่างนี้แหล่ะ ไม่ได้ไปจำไอ้ SQL Command อะไรหรอกครับ

- ส่วนเหตุที่ขึ้น #Delete# เพราะ เรคอร์ดบนหน้าฟอร์มได้ถูกลบหายไปแล้วจากคำสั่งที่คุณสั่ง ดังนั้นเพื่อบอกให้ผู้ใช้ได้ทราบ Access จึงต้องแสดงอะไรสักอย่างออกมา ในกรณีนี้เป็นหน้าที่ของเราที่จะต้องอัพเดตหน้าจอเอาเองด้วยคำสั่ง Me.Requery ครับ คำสั่งก็จะเป็น

DoCmd.SetWarnings False
CreateObject("WScript.Shell") ...
DoCmd.RunSQL "Delete From ...
DoCmd.RunSQL "INSERT INTO ...
Me.Refresh
6 @R17833
แล้วชุดคำสั่งนี้เอาไปวางตรงไหน ยังไงครับพอดีไม่เคยทำแบบนี้
7 @R17834
เหมือนว่ากระทู้นี้จะต่อมาจากกระทู้อื่นนะครับ ผมจำไม่ได้แล้ว น่าจะวางโค้ดนี้ไว้ที่ command button อะไรสักอันที่คุณแหลมทองเขาสร้างไว้บนฟอร์มมั้งครับ ไม่ก็ คุณลองไปค้นหากระทู้เก่าด้วยคำว่า "แหลมทอง" ที่ใกล้ๆกับวันที่ 28/7/54 ดูครับว่าที่มาที่ไปเป็นยังไง
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3493s