ขอวิธีคำนวนอายุจากวันเกิดถึงอนาคตต่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 6,921   15
URL.หัวข้อ / URL
ขอวิธีคำนวนอายุจากวันเกิดถึงอนาคตต่ะ

ขอวิธีคำนวนอายุจากวันเกิดถึงอนาคต(จากปัจจุบันไปอีก 45 วัน) ต้องการทำรายงานล่วงหน้าไป 45 วันค่ะ

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

1 @R01595
Birthday + 45

เอาวันที่ที่ต้องการ + ด้วยจำนวนวันได้เลยครับ
ผลลัพธ์ออกมาจะเป็นวันที่
2 @R01596
ขอบคุณอาจารย์แดนน้อยค่ะ แต่..มันยังไม่ตรงตามที่ต้องการค่ะ หนูอ่านคำถามตัวเองแล้วก็ยังเข้าใจยากอยู่เหมือนกัน ขอถามใหม่่ให้ตรงประเด็นเลยนะคะ
หนูต้องการสร้าง Report คัดเฉพาะรายชื่อผู้ที่กำลังจะมีอายุครบ 20 ปีบริบูรณ์ ณ วันที่เราสามารถกำหนดไว้ล่วงหน้าได้ตามที่ต้องการ
โดยมี input box ให้เราสามารถใส่วันเดือนปีที่เราต้องการ เช่น ปัจจุบัน วันที่ 7 เดือนมีนาคม2552 แต่ที่เราต้องการให้นับอายุคือวันที่ 30 เดือนเมษายน
ก็ให้เราใส่ 30/04/2552 ในช่อง input box นะค่ะ หรืออาจใช้วิธีอื่นที่มันสะดวกกว่าก็ได้ค่ะ
ขอความกรุณาด้วยนะคะ หากมีไฟล์ตัวอย่างได้ด้วยก็ยิ่งดีค่ะ
3 @R01597
เอาวันที่ 30 เมษา เป็นตัวตั้ง
เอาวันเกิดสมาชิก เป็นตัวลบ
ตรวจสอบว่า ครบ 20 ปี บริบูรณ์ หรือไม่
ถ้าครบ ให้ ........
ถ้าไม่ครบ ให้ .......

อย่างนี้หรือเปล่าครับ
4 @R01598
ทำนองนี้เลยคะ่อาจารย์ yeadram คือให้ตัดยอดเอาเฉพาะที่ครบ 20 บิบริบูรณ์ึ้ขึ้นไป เท่านั้นค่ะ ส่วนผู้ทีู่ี้่้้ยังไม่ถึง 20 ปี ก็ไม่ต้องเอามา Report ค่ะ
5 @R01599
bDate คือวันเกิด ของบุคคลนั้น
xDate คือวันที่ต้องการเช็ค (จะเป็นอดีตกาล หรืออนาคต ในอีก 45 วันข้างหน้าก็ช่างมัน ของให้มันข้อมูล Date/Time นะ อิอิ)

การตรวจสอบเริ่มจากตรวจจำนวนปี
ถ้าปีน้อยกว่า 20 แจ้งว่า "ไม่ครบ" เลิกทำงาน (หยุดการตรวจ)
ถ้าปี มากว่า 20 แจ้งว่า "ครบแล้ว" เลิกทำงาน
ถ้าปี พอดี 20 ให้ตรวจต่อไป ที่ จำนวนเดือน

ก็ทำเหมือนเดิมนั่นแหละครับ วนไป จากเดือนก็เลื่อนไปเป็นวัน

การลบ การเพิ่ม ใช้ DateAdd()
การหาผลต่างใช้ DateDiff()
การสร้างเงื่อนไขการตรวจกรณีทางเลือกมีมากกว่า สอง ใช้ Select case
หรือ if-----then----elseif-----elseif------else-----end if

ประมาณนี้นะครับ พอจะเอาไปวางเองได้มั้ยครับ พอดีผมเข้ามาอ่านดึกไปหน่อย จะเขียนให้ทั้งหมด ก็กระไรอยู่ ยังไงถ้ายังไม่ได้ ไม่เกินวันจันทร์เดี๋ยวผมมาเพิ่มเติมให้ครับ วันอาทิตย์อาจจะไม่อยู่หน้าคอมฯ ส่วนวันนี้ ต้องบรรทมแล้วครับ อิอิ
6 @R01603
ยังไงหนูจะขอรอวันจันทร์แล้วกันนะคะอาจารย์ yeadram เพราะดูที่อาจารย์แนะแนวมานี่ เกินความสามารถหนูจริงๆค่ะ ถ้าอาจารย์จะกรุณาทำไฟล์ตัวอย่างให้ด้วยก็จะเป็นพระคุณอย่างยิ่งค่ะ หนูอยากได้ที่เป็นฟอร์มสำหรับใส่ข้อมูลแทน input box ค่ะจะได้ตกแต่งให้สวยได้ค่ะ
7 @R01604
เอาอันนี้ไปวางใน โมดูล
แล้วทดสอบ (ด้วยการวางพ้อยเตอร์ ไว้ในบริเวณ sub แล้วกด F5)
ถ้ามันถาม วันที่ ต้องกรอกให้มัน แล้วกรอกอย่างถูกต้องด้วย

ลองศึกษาดูครับ

Sub Ar20()
Dim xDate As Date
Dim xBirth As Date
Dim xResult

Do
On Error Resume Next
xBirth = CDate(InputBox("กรอกวันเกิด dd/mm/yy "))
Loop Until xBirth <> 0

Do
On Error Resume Next
xDate = CDate(InputBox("กรอกวันที่ ที่ต้องการตรวจนับ dd/mm/yy "))
Loop Until xDate <> 0

xResult = DateDiff("yyyy", CDate(xBirth), CDate(xDate))

'Debug.Print "check Date = " & CDate(xDate) & vbTab & " Birth Date = " & CDate(xBirth)
'Debug.Print "Diff Year = " & xResult

Select Case xResult
Case Is < 20
MsgBox "ยังไม่ครบ 20 ปีบริบูรณ์"
Case Is > 20
MsgBox "ครบ 20 ปีแล้ว"
Case Else
xBirth = DateAdd("yyyy", 20, xBirth)
xResult = DateDiff("m", CDate(xBirth), CDate(xDate))

'Debug.Print "Diff Month = " & xResult

Select Case xResult
Case Is < 0
MsgBox "ยังไม่ครบ 20 ปีบริบูรณ์"
Case Is > 0
MsgBox "ครบ 20 ปีแล้ว"
Case Else
xResult = DateDiff("d", CDate(xBirth), CDate(xDate))

'Debug.Print "Diff Day = " & xResult

If xResult < 0 Then
MsgBox "ยังไม่ครบ 20 ปีบริบูรณ์"
Else
MsgBox "ครบ 20 ปีแล้ว"
End If
End Select
End Select

End Sub
8 @R01605
นั่นเป็นการเขียนแบบยืดๆ เพื่อให้อ่านและตามไปทำความเข้าใจได้ง่ายๆ นะครับ
ซึ่งก็พอจะรวบๆ ให้สั้นๆ เอาไว้ไปใช้จริง ในคิวรี่ในฟอร์ม ก็จะประมาณนี้

- ต้องวางฟังก์ชั่นนี้ไว้ในโมดูล
- ต้องส่งค่า เข้าฟังก์ชั่นสองค่า คือวันเริ่มต้น กับวันสิ้นสุด
- เช็คได้เฉพาะ 20ปีบริบูรณ์เท่านั้น จะเช็ค 5 ปี 15 ปีไม่ได้ (ถ้าต้องการก็ต้องไปปรับแต่งเพิ่มอีก)
- จะคืนค่ามาแค่สองกรณีเท่านั้น คือ True กับ False

ตัวอย่างการเรียกใช้ใน คิวรี่
Select iif(R20([วันเกิด],#30/04/09#),"อายุครบ", "อายุไม่ถึงเกณฑ์") as condition from table1

ตัวอย่างการเรียกใช้ผ่านฟอร์ม
R20(text1, #30/04/09#)


Function R20(frDate As Date, toDate As Date) As Integer
    Dim xResult
    xResult = DateDiff("yyyy", CDate(frDate), CDate(toDate))
    R20 = False
    If xResult > 20 Then
        R20 = True
    Else
        frDate = DateAdd("yyyy", 20, frDate)
        xResult = DateDiff("m", CDate(frDate), CDate(toDate))
        If xResult > 0 Then
            R20 = True
        Else
            xResult = DateDiff("d", CDate(frDate), CDate(toDate))
            If xResult >= 0 Then R20 = True
        End If
    End If
End Function
9 @R01610
ขอบคุณค่ะอาจารย์ yeadram หนูยังไม่เข้าใจถึงขั้นตอนนำไปใช้ค่ะ ไม่ทราบว่าจะเอาไปผูกกับฟอร์มตรงไหนยังไง
10 @R01612
จากต้นจนถึงตอนนี้คุณก็ยังคงเอกลักษณ์ ถามคำถามทีละบรรทัด
แต่ดูที่ผมตอบซิครับ ทำไมผมเขียนได้ยาวจังเลย

"ไม่ทราบว่าจะเอาไปผูกกับฟอร์มตรงไหนยังไง"
ผมก็ไม่รู้เหมือนกันครับ ผมไม่รู้สักนิดว่าคุณมีอะไรบ้าง คุณทำอะไรบ้าง หรือว่าคุณไม่รู้เลย ว่าตัวเองมีอะไรบ้าง แล้วทำอะไรไปแล้วบ้าง สามารถบอกกับคน ที่ไม่ได้นั้งหน้าจอของคุณให้เขารู้ได้ไหม   

งานเขียนโปรแกรม งานออกแบบโปรแกรม มันไม่ใช่สูตรคูณนะครับ มันไม่มีรูปแบบตายตัว คุณวางกระบวนงานของคุณไว้อย่างไรบ้าง

ลองย้อนกลับไปหาจุดประสงค์ของคุณ
หัวกระทู้ : "ขอวิธีคำนวนอายุ"
R01596 : ผู้ใช้กรอกเข้าทาง Inputbox
R01597 : ผมต้องถามนำร่อง เพื่อให้คุณได้ถามชัดขึ้น
R01598 : "ทำนองนี้เลยค่ะ"
R01603 : "หนูอยากได้ที่เป็นฟอร์มสำหรับใส่ข้อมูลแทน input box ค่ะ"
R01605 :

- จะคืนค่ามาแค่สองกรณีเท่านั้น คือ True กับ False

ตัวอย่างการเรียกใช้ใน คิวรี่
iif(R20([วันเกิด],#30/04/09#),"อายุครบ", "อายุไม่ถึงเกณฑ์")

ตัวอย่างการเรียกใช้ผ่านฟอร์ม
R20(text1, #30/04/09#)

R01610 : "ไม่ทราบว่าจะเอาไปผูกกับฟอร์มตรงไหนยังไง"

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


11 @R01614
หนูต้องขออภัยจริงๆเลยค่ะอาจารย์ และขอยอมรับว่าตัวเองตั้งคำถามไม่เคลียร์ อ่านแล้วเข้าใจยาก อาจารย์อย่าพึ่งตัดความช่วยเหลือหนูนะคะ หนูขอแก้ตัวใหม่ จะพยายามเรียบเรียงทบทวนคำถามใหม่ให้ชัดเจนจาก Notepad ก่อนแล้วค่อยนำมา Paste คงจะดีกว่าเพราะหนูพิมพ์ไม่ค่อยคล่องพอรีบร้อนแข่งเวลากับ internet ที่ไล่หลังอยู่ก็เลยเป็นอย่างนี้ทุกที (มือใหม่ค่ะอิอิ)
12 @R01617
หนูขออธิบายจุดประสงค์ที่หนูต้องการอีกครั้งนะคะอาจารย์
ตอนนี้หนูมีข้อมูลพนักงานอยู่จำนวนหนึ่งประมาณ 200 คนอายุตั้งแต่15 ปีถึง 59 ปี ในแต่ละปีจะมีการจัดกิจกรรมช่วงปลายปี
โดยมีเงื่อนไขเลือกเอาเฉพาะผู้ที่มีอายุตั้งแต่ 30 บริบูรณ์ ขึ้นไปถึง 59 ปีเข้าร่วมกิจกรรม โดยจะมีการติดประกาศรายชื่อกันล่วงหน้า
ประมาน 2 เดือน ทีนี้ก็มาเข้าประเด็นปัญหาของหนูคือ เราจะสามารคำนวณอายุพนักงานล่วงหน้าได้อย่างไรว่า ณ วันจัดกิจกรรมนั้น
ใครจะมีอายุครบ 30 บริบูรณ์กันบ้าง โดยหนูอยากให้มีฟอร์มสำหรับใส่ วันเดือนปี ทีจะจัดกิจกรรมเข้าไป พอกดปุ่ม Enter ก็ให้มันแสดง
Quary เฉพาะรายชื่อพนักงานที่มีอายุครบ 30 บริบูรณ์ขึ้นไปถึง 59 ปี ณ วันที่เราระบุในฟอร์มออกมาเลย จากนั้นหนูก็จะเอา Quary นี้แหละไปสร้าง Report อีกทีค่ะ (ในบางกิจกรรมก็เอาอายุ 20 ปี แต่ไม่เป็นไรค่ะ ถ้าอันนี้ได้แล้ว หนูพอจะดัดแปลงเป็นอายุ อื่นๆได้ค่ะ้)
ตอนนี้หนูทำได้เพียงแค่คำนวณอายุจากวันเกิดถึงปัจจุบัน Now() เท่านั้น ซึ่งก็ได้ความรู้จากในบอร์ดนี้แหละค่ะ
13 @R01620
การออกรายงานเพื่อหาพนักงานที่มีอายุ ตั้งแต่ 20ปีบริบูรณ์ขึ้นไป ได้ดังนี้

- วาง ฟังก์ชั่นที่ให้ไป (R20) ไว้ในโมดูล

- สร้าง คิวรี่ตัวใหม่ เปิดในมุมมอง sql เขียน :
SELECT * FROM EMPLOYEE;
- เซฟและปิดคิวรี่
- เอาคิวรี่ตัวนี้ไป ออกแบบรายงาน
- ตั้งค่าให้รายงาน สามารถใช้ตัวกรองได้ (คุณสมบัติ แท็บ DATA)
- เซฟและปิดรายงาน

ที่ฟอร์ม
- มี "ปุ่มคำสั่งเรียกรายงาน"
- ที่ "ปุ่มคำสั่งเรียกรายงาน" ของฟอร์ม สร้าง [Event Procedure] เขียนโค้ดดังนี้
docmd.openReport "ชื่อรายงานที่สร้างไว้แล้ว", acPreview,,"R20([ชื่อฟิลด์วันเกิด],cdate(" & ชื่อคอนโทรลบนฟอร์มที่รับค่าวันจัดงาน & "))=-1"
- เซฟและปิดฟอร์ม

ทดสอบการทำงาน
เปิดฟอร์ม > กรอกวันที่จัดงาน > กดปุ่มคำสั่งเรียกงานงาน



14 @R01627
ว้าว..เจ๋งสุดๆเลยค่ะอาจารย์ เห็ภาพชัดเจนอย่างนี้หนูพอคลำไปได้แล้วค่ะ กำลังจะลงมือทำอยู่ ได้หรือไม่ได้อย่างไรอาจขอรบกวนท่านอีก
ขอให้อาจารย์มีความสุขมากๆนะคะ
ขอบคุณค่ะ...
15 @R04531
คุณ Saimon มีข้อมูลอะไรบ้าง
ข้อมูลถูกจัดเก็บที่ไหน อยู่ในรูปแบบไหน (ชนิดข้อมูลแบบใด)
ตอบด่วนไม่ได้หรอกครับ ไม่มีใครเห็นข้อมูลของคุณ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3591s