หยุดนับอายุงาน
กระทู้เก่าบอร์ด อ.Yeadram

 4,099   11
URL.หัวข้อ / URL
หยุดนับอายุงาน

เรียนถาม อ. ผู้รู้ทุกท่านครับ
     มีข้อมูลดังนี้ครับ
Text Box ที่ 1 ชื่อ psID เก็บรหัสพนักงาน
Text Boxที่2 ชื่อ txStartWork เก็บวันที่เริ่มทำงาน
Text Box ที่ 3 ชื่อ txAgeWork เก็บอายุงาน
Text Box ที่ 3 ชื่อ txExitWork เก็บวันที่ออกจากงาน
      ที่ txAgeWork จะทำการนับอายุงานไปทุกวัน เช่น 3 ปี 6เดือน 12 วัน ต้องการให้ txAgeWork หยุดการนับอายุงานเมื่อรหัสนี้ลาออก แต่รหัสอื่นๆก็ยังคงนับไปตามปกติ ต้องเขียนโค้ดมาควบคุมยังไงครับ ขอคำแนะนำด้วยครับ

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

1 @R05388
txAgeWork =iif(isnull([txExtwork]),date()-[txStartWork],[txExitWork]-[txStartWork])

ถ้านับเป็นปี เดือน วัน ให้ใช้ DateDiff เข้ามาควบคุมด้วย หาใน broad นี้แหละครับ
2 @R05393
IsNull([txtStartWork] ??
ทำไม "เก็บวันที่เริ่มทำงาน" ถึงเป็นค่า Null ในบางคนครับ มันน่าจะเป็นค่าที่เก็บง่ายที่สุด   ส่วน txExitWork ผมกลับคิดว่าเป็นค่าที่ Dynamic ไม่รู้ว่าจะลาออกเมื่อไร จึงน่าจะเป็นเงือนไขในการ Check ไม่ง่ายกว่าหรือครับ
3 @R05401
ผมไม่รู้ว่า function CalAgeYMD2 เขียนไว้ว่าอย่างไร แต่ผมเสนอแนวคึดแบบนี้ครับว่า การที่จะ Chcek อายุงานได้ต้องรู้ทั้ง txStartWork และ txExitWork
ใช่ไหมครับ ถ้างั้นก่อนที่จะตรวจสอบอายุงาน สำหรับ txStartWork สำหรับบุคลากรที่มีค่า เป็น Null คุณจะทำอย่างไร ถ้าเป็นผมผมจะทำอย่างนี้
Check ก่อนว่า txStartWork และ txExitWork
มีค่าเป็น Null หรือไม่ เช่น

IF isnull([txStartWork]) or isnull(txExitWork ) then
msgbox("ไม่สามารถ หา txAgeWork ได้")
else
txAgeWork=CalAgeYMD2([txStartWork])
end if
4 @R05406
คุณต้องพยามแยกเป็นเงื่อนไขต่างๆ ที่เกิดขึ้นได้ก่อน
เช่น Me.txStartWork เป็น Null คุณจะให้มันนับอย่างไร
หรือแจ้งให้ทราบเฉยๆว่าทำไม่ได้ คุณต้องตัดสินใจเอา

ถ้า Me. txExitWork เป็น Null คุณให้มันนับถึงวันที่ปัจจุบันใช่หรือไม่
แต่ถ้า Me. txExitWork มีค่าที่ Record ไว้แล้ว คุณนับถึงวันที่ระบุใช่ไหมครับ

ดังนั้นตัวอย่างน่าจะประมาณนี้ครับ

If IsNull(Me.txStartWork ) Then
msgbox("ไม่สามารถ หา txAgeWork ได้")
Exit Sub
End If

If IsNull(Me. txExitWork ) Then
Me. txExitWork = Date
End If

Dim a, b As Date
Dim y, m, d As Double
    a = txStartWork
    b = txExitWork

    y = DateDiff("yyyy", a, b)
    m = DateDiff("m", DateAdd("yyyy", y, a), b)
    d = DateDiff("d", DateAdd("m", m, DateAdd("yyyy", y, a)), b)

txAgeWork = (Abs(y) & " ปี " & Abs(m) & " เดือน " & Abs(d) & " วัน ")

    ***หมายเหตุ Code หาวันเดือนปี ประยุกต์จาก คุณ Yeadram
5 @R05413
Private Sub txWorking_Exit(Cancel As Integer)
if IsNull([txtStartWork]) then exit sub
if dcount("exitwork","table1","[psid] like '" & txpsid & "'")<1 then exit sub
txtworking = CalAgeYMD2([txStartWork])
End Sub


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

คลิ๊กลิงค์ ไปอ่านความขยายที่กระทู้นี้ครับ
6 @R05423
อ้าวนึกว่าได้แล้ว ลองดัดแปลง Code นี้ต่อก็ได้ครับ

If IsNull(Me.txStartWork ) Then
Exit Sub
End If

Dim a, b As Date
Dim y, m, d As Double

If IsNull(Me. txExitWork ) Then
b=date()
else
b=Me. txExitWork
End If

    a = txStartWork


    y = DateDiff("yyyy", a, b)
    m = DateDiff("m", DateAdd("yyyy", y, a), b)
    d = DateDiff("d", DateAdd("m", m, DateAdd("yyyy", y, a)), b)

txAgeWork = (Abs(y) & " ปี " & Abs(m) & " เดือน " & Abs(d) & " วัน ")

7 @R05437
คุณมีฟังก์ชั่น CalAgeYMD2 ของคุณเองอยู่แล้วไม่ใช่เหรอครับ
โค้ดที่มันสั้นๆ ก็ที่ผมให้ไป มันใช้ไม่ได้เหรอครับ

ลองตรวจสอบ ลองทดสอบ กับคำสั่ง Dcount ดูดีๆ ซิครับ เช่นลองเปลี่ยนจาก < 1 เป็น >0   นะครับ

ถ้าอยากได้สั้นๆ ต้องพยามลองปรับตรงนั้นดูครับ
8 @R05447
ครับ มันไม่หยุดนับหรอกครับ ถ้าเรียกใช้ฟังก์ชั่น

แต่โค้ดที่ให้ไปน่ะครับ มัน จะไม่เรียกใช้ฟังก์ชั่น ดังนั้นมันก็ไม่นับ ถูกต้องไหมครับ

คุณต้องเอาไปประยุกต์ใช้ครับ เขียนเงื่อนไขให้มัน ว่า
กรณีไหนถึงจะเรียกใช้ และกรณีไหนถึงจะ ไม่ให้เรียกใช้ (Exit Sub)
ที่ผมให้คุณกลับไปดู คือไปดูเงื่อนไข
ไม่ได้ให้ดูว่ามันหยุดหรือไม่หยุดนับ แหง๋ล่ะครับตราบใดที่คุณเรียกใช้ฟังก์ชั่นก็คือสั่งให้มันนับ ถ้ามันไม่นับมันก็ฝ่าฝืนคำสั่งซิครับ
9 @R05450
ขออภัยครับ น่าจะจับกันคนละประเด็น
-จาก R05422 "มันก็ยงคงทำการนับอายุงานอยู่เหมือนเดิมครับ" ผมนึกว่าคุณยังติดอยู่ว่า นับหรือไม่นับ
-จาก R05425 "ถ้าจะเขียนโค้ดให้สั้นโดยเรียกใช้ฟังก์ชั่น CalAgeYMD2 ตรงๆเลยมีวิธีไหมครับ" ผมก็ยังคิดว่าฟังก์ชั่นที่คุณเคย??ีนั้น มันไม่ได้มีปัญหาอะไร เพียงแค่ติดว่า จะเรียกใช้หรือจะไม่ให้เรียกใช้
ดังนั้นผมก็มุ่งประเด็นแค่ว่า มันจะนับหรือไม่นับ
โดยไม่ได้สนใจประเด็นว่า มันนับถึงไหน

ความเห็นล่าสุดของคุณทำให้ฉุกใจคิดได้ว่า อ้อ มันคนละประเด็น เพราะของคุณมุ่งไปที่ "นับถึงไหน" ส่วนของผมมุ่งไปที่ "นับหรือไม่นับ"
       ผมเลยย้อนไปอ่าน R05405 ซึ่งเห็นฟังก์ชั่นเดิมทีคุณมี และเทียบกับ R05425 ซึ่งเป็นฟังก์ชั่นที่คุณประยุกต์จาก ท่าน Kratokman และทวนคำถามความต้องการอีกครั้ง สรุปผมไม่มีแนะนำเพิ่มเติมไปจากของคุณ Kratokman แล้วละครับ หรือคุณก็เอาโค้ดจากคุณ Kratokman ไปประยุกต์ใส่ ในฟังก์ชั่นเดิมของคุณ แล้วค่อยเรียกใช้ฟังก์ชั่นนั้น จากที่อื่นๆ ก็อาจจะเรียกได้สั้นลง ถ้ามีโค้ดหลายที่ ที่จำเป็นต้อง "ให้นับ" การเขียนเป็นฟังก์ชั่นก็คงจะทำให้เขียนน้อยลง ตามที่ต้องการได้ แต่ถ้าบอกว่ามีการเรียกใช้แค่จุดเดียว (นับรวมทั้งโปรแกรม) ก็คิดว่าคงไม่ต่างกัน เรื่องปริมาณคำสั่งในการเขียนครับ
10 @R15089
การต้องการวิธีคำนวณอายุ เดือน ปี วัน ครับ ขอบคุณครับ
11 @R15102
ไปที่หน้าแรก แล้วค้นหาด้วยคำว่า "คำนวณอายู" ครับ มีถาม-ตอบกันเยอะ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3100s