กระทู้เก่าบอร์ด อ.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 ตรงไหนบ้างครับ.
ผมได้ โพสต์ ในกระทู้เดิม ไม่สามารถ โพสต์ได้ครับ ไม่ทราบสาเหตุครับ เมื่อคลิก โพสต์ ก้จะเปิดแต่หน้า 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
2 @R10563
กราบขอบพระคุณท่านอาจารย์สันติสุข มากครับ ตอนนี้ทำได้แล้วครับ ต่อไป คำถามที่ว่า กี่คน กี่ครั้ง มีอะไรบ้าง อย่างล่ะเท่าไหร่ ที่ซ้ำๆเท่าไหร่...และที่ไม่ซ้ำมีเท่าไหร่ ก็มีคำตอบ ในตารางเดียว....นับเป็นประโยชน์ กับการปฏิบัติงานมากครับ...เจ้าหน้าที่ชั้นผู้น้อยก็มีคำตอบให้กับผู้บริหาร....ที่ต้องการข้อมูลที่เป็น MIS (สารสนเทศ) เพื่อประกอบการตัดสินใจและบริหารงบประมาณ.....ข้อมูลลักษณะนี้ ในวงการสาธารณสุขใช้มากเลยครับ....ขอให้อาจารย์และทีมงาน มีสุขภาพแข็งแรง สมบูรณ์ เป็นบัวบานที่พ้นน้ำแล้ว ให้เหล่าพวกเราชาว Thai Access ที่ยังเป็น บัวตูม ใต้น้ำบ้าง ปริ่มน้ำบ้าง หรือใต้โคลนตม ได้เป็นที่พึ่ง ตลอดไป.....กราบขอบพระคุณครับ....
3 @R10564
ขอบคุณครับ แต่ถ้าเจอ Access 2007/2010 ผมก็เป็นบัวจมน้ำ บุ๋งๆๆๆๆ ต้อง อ.สุภาพครับ นั่นบัวพ้นน้ำติดปีกของแท้
ในส่วนของ
ดูไปดูมาเยิ่นเย้อเกะกะเกินไป ควรลดรูปลงมาเป็น
ส่วนในคำสั่ง SQL statement ที่มีส่วนที่เขียนว่า Table1 as Ta สามารถตัด as Ta ทิ้งได้ แล้วในคำสั่งตำแหน่งใดที่มี Ta. (ทีเอจุด) ก็ตัดออกได้ครับ เช่น Ta.HN ก็เป็น HN เฉยๆได้ครับ เพราะตอนแรกลองหลายๆวิธีที่มีการอ้าง Table1 ในหลายๆ Sub Query มันเลยต้องมี Alias Name (ชื่อเล่น) ของเทเบิลกำกับไว้ด้วย แต่ทีหลังเปลี่ยนมาเป็นโค้ดนี้ เลยลืมตัดออกครับ
ในส่วนของ
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 อยุ่ครับ
' ลบข้อมูลเดิมแล้วนำเข้าใหม่
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
- ส่วนเหตุที่ขึ้น #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 ดูครับว่าที่มาที่ไปเป็นยังไง
Time: 0.3493s
นี่คือโค้ดที่ปรับปรุงแล้ว
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( ) ไม่ได้มีการใช้อีกต่อไปครับ