สอบถามการแสดงข้อมูลวันที่ใน Report MS Access ในกรณีไม่นับวันอาทิตย์


0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

15 มี.ค. 67 , 11:24:39
อ่าน 338 ครั้ง

mtaccess

จากข้อมูลใน Table TP


ต้องการแสดงข้อมูลวันที่ใน Report 3 กรณี

กรณีที่ 1 ถ้า StartDate เป็นวันจันทร์ คือ 04/03/2024 และ EndDate เป็นวันพฤหัสบดี คือ 07/03/2024
ให้แสดงผลตามนี้ (ซึ่งในตัวอย่างที่ส่งโปรแกรมมาแสดงถูกแล้ว)


กรณีที่ 2 ถ้า StartDate เป็นวันพุธ คือ 06/03/2024 และ EndDate เป็นวันเสาร์ คือ 09/03/2024
ให้แสดงผลตามนี้ (ซึ่งในตัวอย่างที่ส่งโปรแกรมมาแสดงถูกแล้ว)


กรณีที่ 3 ถ้า StartDate เป็นวันศุกร์ คือ 08/03/2024 และ EndDate เป็นวันอังคาร คือ 12/03/2024
ต้องการให้แสดงผลตามนี้ (ซึ่งข้อนี้ที่ต้องการสอบถามว่าทำยังไงคะ เนื่องจากวันอาทิตย์เป็นวันหยุดของพนักงาน พนักงานอบรม 4 วันเท่านั้น ตอนนี้ติดปัญหาที่กรณีนี้ค่ะ ที่ยังคิดไม่ออกว่าต้องทำยังไง ในกรณีที่พนักงานอบรมวันศุกร์ แล้วติดวันอาทิตย์ ซึ่งเราไม่นับวันอาทิตย์ รบกวนแนะนำด้วยค่ะ)

ต้องการให้แสดงผลตามนี้ค่ะ

  วันที่ ๘ มีนาคม ๒๕๖๗ - วันที่ ๙ มีนาคม ๒๕๖๗
  และ ๑๑ มีนาคม ๒๕๖๗ - วันที่ ๑๒ มีนาคม ๒๕๖๗
             ให้ไว้ ณ วันที่ ๑๒ มีนาคม ๒๕๖๗



ตารางปฏิทิน


ได้แนบไฟล์งานโปรแกรมมาด้วยค่ะ รบกวนแนะนำด้วยนะคะ ขอบคุณค่ะ

 

15 มี.ค. 67 , 11:48:12
ตอบกลับ #1

ศรี-นคร

ใช้ DAO ร่วมกับคำสั่ง Do While

Do while not rst1.EOF
   เงื่อนไขที่ 1

   เงื่อนไขที่ 2

   เงื่อนไขที่ 3

  rst1.movenext
Loop
« แก้ไขครั้งสุดท้าย: 15 มี.ค. 67 , 12:18:35 โดย ศรี-นคร »

 
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

15 มี.ค. 67 , 13:05:47
ตอบกลับ #2

mtaccess

อยากรู้คำสั่งนะคะ ว่าจะ select ยังไงในกรณีติดวันอาทิตย์ ให้ออกมาเป็นวันที่ต้องการ

 

15 มี.ค. 67 , 14:07:31
ตอบกลับ #3

ศรี-นคร

รบกวน Save as ไฟล์ตัวอย่างเป็น Accdb --> MDB ไฟล์ แล้ว Upload เข้ามาให้ด้วยครับ
พอดีผมใช้ access 2002

ข้างใน Zip ไฟล์ที่ส่งมายังเป็น Accdb อยู่ครับ ขอเป็น mdb ไฟล์ครับ

แต่เท่าที่อ่านดู ใจความสำคัญคือ นับวันอบรม ไม่นับวันอาทิตย์ Weekday()
โดยฟังค์ชั่นนี้ จะนับวันอาทิตย์ = 1 เรื่อยไป เสาร์ = 7

เราก็สามารถใช้ประโยช์จากตรงนี้มาประยุกต์ใช้งานได้ครับผม
« แก้ไขครั้งสุดท้าย: 15 มี.ค. 67 , 14:15:39 โดย ศรี-นคร »

 
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

15 มี.ค. 67 , 14:20:47
ตอบกลับ #4

mtaccess

ใช้ยังไงคะ พอดีมือใหม่นะคะ ลองเซฟเป็น mdb แต่ไม่ได้ค่ะ เหมือนเวอร์ชั่นที่ทำเป็นเวอร์ชั่นใหม่กว่า 2002

 

15 มี.ค. 67 , 14:22:34
ตอบกลับ #5

mtaccess

รบกวน Save as ไฟล์ตัวอย่างเป็น Accdb --> MDB ไฟล์ แล้ว Upload ดข้ามาให้ด้วยครับ
พอดีผมใช้ access 2002

ข้างใน Zip ไฟล์ที่ส่งมายังเป็น Accdb อยู่ครับ ขอเป็น mdb ไฟล์ครับ

แต่เท่าที่อ่านดู ใจความสำคัญคือ นับวันอบรม ไม่นับวันอาทิตย์ Weekday()
โดยฟังค์ชั่นนี้ จะนับวันอาทิตย์ = 1 เรื่อยไป เสาร์ = 7

เราก็สามารถใช้ประโยช์จากตรงนี้มาประยุกต์ใช้งานได้ครับผม

อยากให้แสดงผลแบบนี้ค่ะ ในกรณี StartDate เป็นวันเสาร์ และ EndDate คือจบวันอังคาร ไม่นับวันอาทิตย์

  วันที่ ๘ มีนาคม ๒๕๖๗ - วันที่ ๙ มีนาคม ๒๕๖๗
  และ ๑๑ มีนาคม ๒๕๖๗ - วันที่ ๑๒ มีนาคม ๒๕๖๗
             ให้ไว้ ณ วันที่ ๑๒ มีนาคม ๒๕๖๗

 

15 มี.ค. 67 , 14:29:38
ตอบกลับ #6

ศรี-นคร

ถ้า Save เป็น mdb ไฟล์ไมไ่ด้ผมก็คงช่วยไม่ได้
คงต้องรบกวน กูรูท่านอื่นครับผม

 
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

15 มี.ค. 67 , 16:41:50
ตอบกลับ #7

mtaccess

ตามไฟล์ที่แนบมาค่ะ

 

15 มี.ค. 67 , 19:22:01
ตอบกลับ #8

ศรี-นคร

ก็ลองทำเป็นตัวอย่างออกมาให้แกะตัวอย่างโค๊ต และนำไปประยุกต์ต่อนะครับ
ส่วนหนึ่ง ต้องลองฝึกแกะโค๊ตด้วยครับ จะได้เข้าใจหลักการ ไม่กล้าก็ไม่เกิดครับ


 
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

18 มี.ค. 67 , 09:30:53
ตอบกลับ #9

mtaccess

ก็ลองทำเป็นตัวอย่างออกมาให้แกะตัวอย่างโค๊ต และนำไปประยุกต์ต่อนะครับ
ส่วนหนึ่ง ต้องลองฝึกแกะโค๊ตด้วยครับ จะได้เข้าใจหลักการ ไม่กล้าก็ไม่เกิดครับ



ขอขอบคุณมากๆนะคะ แต่ยังไม่ใช่ผลลัพธ์ที่ต้องการค่ะ ตอนนี้ติดปัญหาตรงที่ถ้าพนักงานอบรมวันศุกร์ จะไปจบที่วันอังคาร ซึ่งเวลาบันทึกเราบันทึก StartDate เป็น 08/03/2024 และวันจบ EndDate เป็น 12/03/2024 ซึ่งมีวันอาทิตย์ ซึ่งโดยปรกติเราอบรมแค่ 4 วัน แต่ทีนี้เราไม่ต้องการนับวันอาทิตย์ เลยต้องให้รายงานออกแบบนี้ เพื่อจะได้รู้ว่าพนักงานอบรมแค่สี่วันคือวันที่ 08/03/2024-09/03/2024 และ 11/03/2024-12/03/2024

ผลลัพธ์ที่ต้องการให้แสดงในรายงาน กรณีติดวันอาทิตย์
 วันที่ ๘ มีนาคม ๒๕๖๗ - วันที่ ๙ มีนาคม ๒๕๖๗
  และ ๑๑ มีนาคม ๒๕๖๗ - วันที่ ๑๒ มีนาคม ๒๕๖๗
       ให้ไว้ ณ วันที่ ๑๒ มีนาคม ๒๕๖๗

 

19 มี.ค. 67 , 01:34:11
ตอบกลับ #10

TTT

เห็นคำถามนี้น่าสนใจตรงเราสามารถใช้งานตัวแปรอาร์เรย์แบบ 2 มิติได้ เลยลองทำดู แต่ไม่รู้ว่าเข้าใจความต้องการของเจ้าของกระทู้ถูกหรือป่าวนะครับ
โค๊ด: [Select]
Public Function Seminar(sDate As Date, eDate As Date) As String
    Dim i As Long, o As Long, iCount As Long, iSun As Long, mCount As Long
    Dim tDay() As String ' กำหนดตัวแปรอาร์เรย์ จำทำแบบ 2 มิติ มิติแรกใช้เก็บตัดช่วงวันอาทิตย์ มิติสองใช้เก็บวันที่ไม่ใช่วันอาทิตย์
    ' หาช่วงเวลาเป้าหมายว่ามีวันอาทิตย์ทั้งหมดกี่วัน เพิ่มใช้กำหนดค่าตัวแปรอาร์เรย์ในมิติแรก----------------------
    For i = sDate To eDate 'ลูปหาตั้งแต่วันเริ่มต้นจนวันสิ้นสุด
        If Weekday(i) = 1 Then 'วันไหนมี Weekday เท่ากับ 1 คือวันอาทิตย์ ตาม Default ของฟังก์ชั่น
            iSun = iSun + 1 'นับจำนวนวันอาทิตย์ไปเรื่อยๆ
        End If
    Next
    '--------------------------------------------------------------------------------------------------
    'เก็บวันที่เป้าหมายทั้งหมดที่ไม่ใช่วันอาทิตย์ ลงในตัวแปรอาร์เรย์แบบไดนามิก-----------------------------------
    For i = sDate To eDate 'ลูปหาตั้งแต่วันเริ่มต้นจนวันสิ้นสุด
        If Weekday(i) <> 1 Then ' เมื่อไม่ใช่วันอาทิตย์ (1 คือ วันอาทิตย์)
            mCount = IIf(iCount > mCount, iCount, mCount) 'หาตัวเลขขยายมากขึ้นในแต่ละลูปเพื่อนำมาปรับขนาดความยาวของอาร์เรย์
            'ขยายความยาวของอาร์เรย์ให้มากขึ้น ตามข้อมูลวันที่ ที่ต้องจัดเก็บลงตัวแปร เพราะข้อมูลมีจำนวนมากน้อยไม่แน่นอนจึงต้องใช้ตัวแปรแบบไดนามิก
            ReDim Preserve tDay(iSun, mCount) 'ขยายมากขึ้นได้ แต่ทำให้น้อยลงไม่ได้ เพราะข้อมูลค่าเก่าจะหาย
            'แปรงข้อมูลวันที่เป้าหมายที่ไม่ตรงกับวันอาทิตย์ ไล่ใส่ลงไปในตัวแปรอาร์เรย์แบบ 2 มิติ
            tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Format(i, "yyyy"), Year(i) + 543, Format(i, "yyyy")))
            iCount = iCount + 1
        Else 'หากเป็นวันอาทิตย์
            o = o + 1 'หากเป็นวันอาทิตย์ ให้เลื่อนตัวแปรอาร์เรย์ในมิติแรกขึ้นไปอีกลำดับ เพื่อแยกชั้นตัวแปรระหว่างช่วงวันที่ติดวันอาทิตย์
            iCount = 0 'ปรับมิติที่สองให้เป็นลำดับ 0 เริ่มใหม่
        End If
    Next i
    '---------------------------------------------------------------------------------------------------
    'เรียกแสดงค่าตัวแปรอาร์เรย์ออกมาตามรูปแบบที่เราต้องการ------------------------------------------------
    Dim firstDay As Long 'เก็บค่าลำดับของมิติตัวแปรลำดับแรกที่จะแสดง
    Dim lastDay As String 'เก็บข้อมูลวันที่วันสุดท้ายก่อนถึงวันอาทิตย์
    Dim endDay As String 'เก็บวันที่สุดท้ายไว้ใช้ในข้อความ ให้ไว้ ณ วันที่
    Dim strDay As String 'ไล่เก็บรวบรวมสรุปข้อมูลแสดงทั้งหมด
    firstDay = -1 'เก็บค่าลำดับมิติตัวแปรแรกที่ไม่ตรงกับวันอาทิตย์ (กันไว้กรณีที่วันแรกของข้อมูลเป็นวันอาทิตย์พอดี ทำให้ตัวแปรมิติแรกอาจไม่ได้เริ่มต้นที่ 0 ก็ได้)
    For i = 0 To UBound(tDay, 1) 'ลูปตัวแปรอาร์เรย์ในมิติแรกที่มีการจัดเก็บ ตั้งแต่ลำดับแรกจนลำดับสุดท้าย
        lastDay = "" 'ล้างค่าวันที่สุดท้ายทุกครั้งเมื่อขึ้นมิติตัวแปรใหม่
        For o = 0 To UBound(tDay, 2) 'ลูปตัวแปรอาร์เรย์ในมิติสองที่มีการจัดเก็บ ตั้งแต่ลำดับแรกจนลำดับสุดท้าย
            If tDay(i, o) & "" <> "" Then 'ถ้าค่าตัวแปรอาร์เรย์ในมิตินั้นไม่ใช่ค่าว่าง (แสดงว่ามีข้อมูล)
                lastDay = tDay(i, o) ' ให้บันทึกในตัวแปร lastDay ไปเรื่อยๆ จนข้อมูลลูปไปถึงสุดท้ายเราก็จะได้วันที่วันสุดท้าย ของตัวแปรอาร์เรย์ในชั้นมิตินั้น
                endDay = lastDay
                If firstDay = -1 Then
                    firstDay = i 'หากตัวแปรอาร์เรย์ลำดับนั้นไม่ใช่ค่าว่าง ก็แสดงว่าให้เริ่มต้นวันที่ที่ลำดับมิตินั้น จึงบันทึกลงไปในตัวแปร fristDay
                End If
            End If
        Next o
        If i = firstDay Then 'ถ้า i เท่ากับค่าในตัวแปร firstDay แสดงว่าเป็นค่าวันที่แรกที่จะแสดง
            If tDay(i, 0) <> lastDay Then ' ถ้าวันที่นั้นไปใช่วันที่สุดท้ายในมิตินั้น แสดงว่าต้องมีวันที่ 2 ช่วง
                strDay = "วันที่ " & tDay(i, 0) & " - วันที่ " & lastDay ' บรรทัดแรกของวันที่ ที่จะแสดงให้ขึ้นต้นคำว่า วันที่
            Else
                strDay = "วันที่ " & tDay(i, 0) ' ถ้าวันที่นั้นเท่ากับวันที่สุดท้ายในมิตินั้นด้วย แสดงว่าจะมีวันที่แค่วันเดียว
            End If
        Else 'ถ้าเป็นบรรทัดต่อๆไป
            If tDay(i, 0) & "" <> "" And lastDay <> "" Then 'ถ้ามีข้อมูล
                If tDay(i, 0) <> lastDay Then ' ถ้าวันที่นั้นไปใช่วันที่สุดท้ายในมิตินั้น แสดงว่าต้องมีวันที่ 2 ช่วง
                    strDay = strDay & vbCrLf & "และ " & tDay(i, 0) & " - วันที่ " & lastDay 'บรรทัดต่อๆไปจะแสดงขึ้นต้นด้วยคำว่า และ
                Else
                    strDay = strDay & vbCrLf & "และ " & tDay(i, 0) ' ถ้าวันที่นั้นเท่ากับวันที่สุดท้ายในมิตินั้นด้วย แสดงว่าจะมีวันที่แค่วันเดียว
                End If
            End If
        End If
    Next i
    '---------------------------------------------------------------------------------------------------
    strDay = strDay & vbCrLf & "ให้ไว้ ณ วันที่ " & endDay 'เก็บข้อมูลในรูปแบบที่เราต้องการในตัวแปร strDay
    Seminar = strDay
End Function

การใช้งาน: Seminar(วันที่เริ่มต้น, วันที่สิ้นสุด)
Seminar(#3/1/2024#, #3/15/2024#)
ฐานข้อมูลเป็นเรื่องใกล้ตัว ใครๆก็ทำฐานข้อมูลเองได้นะครับhttp://www.youtube.com/c/AccessCreator
 
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, sjs, Su, mtaccess

19 มี.ค. 67 , 14:20:40
ตอบกลับ #11

mtaccess


การใช้งาน: Seminar(วันที่เริ่มต้น, วันที่สิ้นสุด)
Seminar(#3/1/2024#, #3/15/2024#)

ผลลัพธ์ได้ตามที่ต้องการแล้วค่ะ และนำไปใช้กับงานที่ทำได้แล้วค่ะ ขอขอบคุณมากๆนะคะ แต่ถ้าเราจะแก้ไขปีเป็น พ.ศ. ละคะ ต้องแก้ตรงไหน รบกวนอีกทีค่ะ ขอบคุณค่ะ

 

20 มี.ค. 67 , 10:41:23
ตอบกลับ #12

mtaccess



แก้ไขการแสดง คศ เป็น พศ ตรงไหนคะ ลองทำแล้ว ยังเป็น คศ เหมือนเดิม รบกวนแนะนำด้วยค่ะ ขอบคุณค่ะ

 

20 มี.ค. 67 , 13:48:20
ตอบกลับ #13

UnKnown

เครื่องคอมฯผมตั้งค่าแสดงวันที่เป็น US = แสดงผลออกเป็น ๒๐๒๔ เช่นกัน
จึงลองแกะโค้ดอ.TTT แล้วแก้ตรง
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Format(i, "yyyy"), Year(i) + 543, Format(i, "yyyy")))
ให้เหลือแค่
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(Year(i) + 543)

ได้ผลลัพธ์เป็นปี ๒๕๖๗  :love:
:ninja:     ลองคิด,ลองทำแนวคนไม่เก่งแอคเซส
หมายเหตุ เพื่อความปลอดภัยโปรดสำรองข้อมูลใว้ก่อนการแก้ไข
 
โพสต์นี้ได้รับคำขอบคุณจาก: TTT, mtaccess

20 มี.ค. 67 , 15:25:59
ตอบกลับ #14

mtaccess

เครื่องคอมฯผมตั้งค่าแสดงวันที่เป็น US = แสดงผลออกเป็น ๒๐๒๔ เช่นกัน
จึงลองแกะโค้ดอ.TTT แล้วแก้ตรง
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Format(i, "yyyy"), Year(i) + 543, Format(i, "yyyy")))
ให้เหลือแค่
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(Year(i) + 543)

ได้ผลลัพธ์เป็นปี ๒๕๖๗  :love:

ได้แล้วค่ะ ขอขอบคุณมากๆนะคะ

 

20 มี.ค. 67 , 16:46:47
ตอบกลับ #15

TTT

โทษทีครับ พอดีไม่ได้อ่าน ขอบคุณ คุณ UnKnow ครับ ที่ช่วยตอบ
แก้บรรทัดนี้ครับ
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Format(i, "yyyy"), Year(i) + 543, Format(i, "yyyy")))
เป็น
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Val(Format(i, "yyyy")), Year(i) + 543, Format(i, "yyyy")))
ใส่ฟังก์ชั่น Val() ลงไป เพราะสองค่ามันเป็น Data Type คนละอย่าง อันนึงเป็นตัวเลข อันนึงเป็นตัวอักษร เลยเทียบค่าแล้วไม่เท่ากัน ฟังก์ชั่น Val() จะตัดคำทั้งหมดทางขวาที่เป็น String ออก ให้เหลือแต่ตัวเลข แล้ว Return ค่ากลับมาเป็น Number จึงจะเทียบค่าตัวเลขกันได้ครับ
เปลี่ยนอย่างนี้ไม่ว่าเครื่องจะกำหนดปีเป็น ค.ศ. หรือ พ.ศ. ก็จะใช้ได้ครับ
« แก้ไขครั้งสุดท้าย: 20 มี.ค. 67 , 17:31:10 โดย TTT »
ฐานข้อมูลเป็นเรื่องใกล้ตัว ใครๆก็ทำฐานข้อมูลเองได้นะครับhttp://www.youtube.com/c/AccessCreator
 
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, sjs


บอร์ดเรียนรู้ Access สำหรับคนไทย


 

Sitemap 1 2 3 4 5