คำนวนวันยกเว้นวันเสาร์และอาทิตย์
กระทู้เก่าบอร์ด อ.Yeadram

 2,586   7
URL.หัวข้อ / URL
คำนวนวันยกเว้นวันเสาร์และอาทิตย์

คือผมยากจะคำนวนวันในคิวรี่ที่ตั้งแต่เริ่มทำจนวันที่เสร็จหรือถึงวันที่ปัจจุบันแต่ยกเว้นวันเสาร์และอาทิตย์ว่าทำใช้เวลาทำไปกี่วันแล้วครับ
[Today]-[StartDate] =_____ ?
หรือ
[Finish]-[StartDate] = _____ ?


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

1 @R06262
ใน Access ไม่มีฟังก์ชั่น หรือคำสั่งสำเร็จรูปมาให้ครับ
แต่ Access ให้ VBA มา เราก็สามารถสร้างฟังก์ชั่นขึ้นมาใช้เองด้วย VBA ได้ครับ

หลักการสร้างฟังก์ชั่นขึ้นมาใช้เอง
- เขียนฟังก์ชั่นให้เป็น Public (นำหน้าคำว่า ฟังก์ชั่นด้วย คำว่า Public) วางไว้ในโมดูล (จะสร้างโมดูลใหม่ชื่ออะไรก็ได้ที่ไม่ผิดหลักการตั้งชื่อขึ้นมาก็ได้ หรือจะเอาฟังก์ชั่นที่เขียนขึ้นไปวางแปะใส่โมดูลตัวเก่าๆ ก็ได้)
- เราสามารถเรียกใช้ Public Function ได้จากทุกที่ในโปรแกรมของเราเอง เช่นการเรียกใช้จากฟอร์ม
   เขียนนิพจน์ลงใน textbox =ชื่อฟังก์ชั่นของเรา(อาร์กิวเมนต์,อาร์กิวร์เมนต์,...)
การเรียกใช้จากคิวรี่
   เขียนนิพจน์ใส่มุมมองออกแบบของคิวรี่เช่นการสร้างฟิลด์ใหม่
Expr1:ชื่อฟังก์ชั่นของเรา(อาร์กิวเมนต์1, อาร์กิวร์เมนต์2, อาร์กิวเมนต์3,...)


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

Count Working Days
2 @R06287
การนับวันทำงาน (Count Working days) เราจะทำการนับในคิวรี่ โดยในคิวรี่ จะมีการเรียกใช้ฟังก์ชั่นที่เราเขียนขึ้นเอง โดยแยกลำดับงานที่สำคัญ เป็น 2 ขั้นตอนดังนี้
1) การสร้างฟังก์ชั่นใช้เอง
- สร้างโมดูลใหม่มา 1 อัน ระบบมันให้ชื่ออะไรก็เอาตามนั้นเลย ไม่ต้องไปเปลี่ยนชื่อมัน เซฟโมดูลเปล่าๆ นั้นเลย 1 ครั้ง (สาเหตุที่เน้นข้อนี้เพราะมือใหม่ทั้งหลาย รู้เท่าไม่ถึงการณ์หลายรายมาแล้ว พอจะเขียนฟังก์ชั่นใช้เองทีไร ดันตั้งชื่อฟังก์ชั่นกับชื่อโมดูล เป็นคำเดียวกัน มันก็เลยไม่ทำงาน)
- เอาโค้ดนี้ไปวางในโมดูล แล้วเซฟโมดูล
Pulic Function Work_Days (BegDate As Variant, EndDate As Variant) As Integer
.......
.....รายการคำสั่งทั้งหมด โปรดย้อนอ่านตามความเห็นข้างบน
.....
End Sub

2) การสร้างคิวรี่ขึ้นมาใช้งาน
- สร้างคิวรี่ในมุมมองออกแบบ> เลือกตาราง > เลือกชื่อฟิลด์ที่การ
- สร้างฟิลด์ใหม่ เขียนในช่องกรอกนิพจน์ว่า Expr1: Work_Days(AA, BB)
โดยที่ AA คือ ใส่ชื่อฟิลด์วันที่เริ่มต้นของคุณ
และที่ BB คือ ใส่ชื่อฟิลด์วันที่สิ้นสุดของคุณ ถ้าอยากนับถึงวันปัจจุบันให้ใส่ Date() แทน
- เซฟคิวรี่ แล้วทดสอบรันคิวรี่ดูครับ
3 @R06292
ทำตามคำแนะนำแล้วค่ะ พอเซฟคิวรี่ แล้วทดสอบรันคิวรี่
มันก็ขึ้นหน้าต่างฟ้องว่า

Undefined Function 'Module1'in expression

รบกวนผู้รู้ช่วยชี้แนะด้วยน่ะค่ะ
4 @R06294
จาก Error ที่แจ้งมา มันบอกว่า "ไม่รู้จักฟังก์ชั่นชื่อ Module1"
เอ... ที่ให้คัดลอกไปน่ะ ฟังก์ชั่นมันชื่อ Work_days ไม่ใช่เหรอ หรือคุณไปเปลี่ยนชื่อมัน หรือว่าคุณเอาคำว่า Module1 ใส่เข้าไปเองหรือเปล่า


Expr1: Work_Days(AA, BB)
ที่ให้ไปเขียนในคิวรี่น่ะ อย่างนี้ ไม่เห็นมีคำว่า Module1 เลย


ถ้าคุณทำตามที่ผมแนะนำไปทีละขั้น
คุณจะได้ objects ต่างๆ ดังนี้
1) มีฟังก์ชั่น 1 ตัว ชื่อว่า Work_Days
2) มีโมดูล 1 ตัว ชื่อว่า Module1
3) มีคิวรี่ 1 ตัว ชื่ออะไรก็ไม่รู้แล้วแต่คุณ หรืออาจจะเป็น Query1 ก็ได้มั้ง (ไม่น่าจะใช่สาเหตุของ Error นี้)
เวลาเอาไปเขียนในคิวรี่ ให้เอาชื่อฟังก์ชั่นไปเขียน อย่าเอาชื่อโมดูลไปใช้


*** อย่าตั้งชื่อโมดูล ให้เหมือนกับชื่อฟังก์ชั่น *** อย่าตั้งชื่อฟังก์ชั่นให้เหมือนกับชื่อโมดูล *** เวลาเอาไปเขียนในคิวรี่ ให้เอาชื่อฟังก์ชั่นไปใช้ *** ห้ามเอาชื่อโมดูลไปใช้ ***

*** การสังเกต ชื่อฟังก์ชั่นที่ไปคัดลอกคนอื่นเขามา หรือฟังก์ชั่นที่เราเขียนขึ้นเอง
เช่น
Pulic Function Work_Days (BegDate As Variant, EndDate As Variant) As Integer
คำที่อยู่หลังคำว่า Function และอยู่หน้า วงเล็บ นั่นคือชื่อของมัน
เพราะฉะนั้นในตัวอย่างข้างต้น ชื่อฟังก์ชั่นก็คือ Work_Days
5 @R06302
คือตออนี้มันสามารถนับวันได้แล้วโดยไม่นับวันเสาร์และวันอาทิตย์
แต่มันจะขึ้น Err. ตรง record ที่ยังไม่ได้กรอกวันที่เสร็จลงไป
ถ้าrecord ที่ยังไม่ได้กรอกวันที่เสร็จลงไป อยากให้คำนวนจาก วันที่ StartDate ถึง Today แทนค่ะ
จะทำยังไงดีค่ะ
รบกวนผู้รู้ช่วยชี้แนะด้วยน่ะค่ะ

Error ที่ฟ้องขึ้นมาค่ะ
Run-time error '94'
Invalid use of Nul


6 @R06306
ก็เพิ่มเงื่อนไข iif() เข้าไปด้วยครับ
ถ้าข้อมูลมันเป็น Null (ยังไม่กรอกมา) จะให้มันทำอย่างไร
ถ้าข้อมูล ไม่เป็น Null (กรอกมาแล้ว) จะให้ทำอย่างไร


Work_Days(AA, nz(BB,Date()))
หรือ
Work_Days(AA, iif(BB=Null, Date(),BB))
หรือ
Work_Days(AA, iif(not isnull(BB), BB,Date()))
7 @R06310
เย้ๆ ทำได้แล้วค่ะ
ขอคุณ yeadram มากๆเลยน่ะค่ะ

@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2613s