Tính toán qua lại giữa ngày trước và ngày sau

Một phần của tài liệu Tài liệu Đặc tả xử lý và xử lý tự động doc (Trang 31 - 37)

a) Chỉ rõ ngày làm mốc và khoảng thời gian xê dịch để tính ngày đích

{QUOTE

{ASK NgayBatDau “Xin nhập vào ngày bắt đầu làm mốc tính theo định dạng dd/mm/yyyy:” \d {DATE \@ “d/MM/yyyy”}}{ASK KhoangThoiGianTheoNgay “Nhập khoảng thời gian +/- tính bằng số ngày so với ngày mốc?”}

{SET a{=INT((14-{NgayBatDau \@ M})/12)}} {SET b{={NgayBatDau \@ yyyy}+4800-a}} {SET c{={NgayBatDau \@ M}+12*a-3}}

{SET d{NgayBatDau \@ d}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045+KhoangThoiGianTheoNgay}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}} {IF{={IF{={NgayBatDau \@ “dddd”}}=”!*” 0 1}+{IF{={NgayBatDau \@ “MMMM”}}=”!*” 0 1}+{IF{a}=”!*” 1 0}+{IF{=KhoangThoiGianTheoNgay}=”{KhoangThoiGianTheoNgay}” 0 1}}=0 “Nếu ngày bắt đầu là {NgayBatDau \@ “dd/MM/yyyy”} và khoảng thời gian lệch đi so với ngày bắt đầu là {=KhoangThoiGianTheoNgay} ngày, thì ngày cần tính là {QUOTE “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}.” “Dữ liệu nhập vào sai!”}}

Khi thi hành nhấn F9, hiện hộp thoại:

Hình 1.14. Hộp thoại hỏi ngày bắt đầu làm mốc để tính

Hình 1.15. Hộp thoại hỏi số ngày xê dịch so với ngày làm mốc

Kết quả sẽ được:

Nếu ngày bắt đầu là 22/02/2010 và khoảng thời gian lệch đi so với ngày bắt đầu là 100 ngày, thì ngày cần tính là 25/02/2010.

b) Tính khoảng thời gian bằng số ngày giữa hai ngày làm mốc

Ở đây sử dụng NgayBatDau là ngày có được ở ví dụ trước đó, còn NgayKetThuc được gõ dấu bằng BookMark (Lựa chọn bôi đen, Insert/BookMark để hiển thị hình 1.4ở trang5)

Ngày bắt đầu: 22/02/2010 (Được đưa vào biến NgayBatDau ví dụ minh hoạ ở hình 1.14 trang 32).

Ngày kết thúc:30/6/2012 (bôi đen, Insert/BookMark để hiển thị hình 1.4 ở trang 22/02/2010

5 đặt tên NgayKetThuc).

Số ngày: 859, được nhập vào trường theo nội dung: {=

{SET a{=INT((14-{NgayKetThuc \@ M})/12)}} {SET b{={NgayKetThuc \@ yyyy}+4800-a}} {SET c{={NgayKetThuc \@ M}+12*a-3}} {SET d{NgayKetThuc \@ d}}

{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)-32045} -

{SET a{=INT((14-{NgayBatDau \@ M})/12)}} {SET b{={NgayBatDau \@ yyyy}+4800-a}} {SET c{={NgayBatDau \@ M}+12*a-3}} {SET d{NgayBatDau \@ d}}

{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)-32045} \# 0}

Chú ý: Các ngày gõ dấu có thể định dạng khác nhau, nhưng phải viết theo đúng quy định định dạng ngày tháng. Cả 2 ngày phải sau 31/12/1900.

c) Tính toán dạng tuổi một người

{QUOTE

{ASK NgaySinh “Xin nhập vào ngày sinh theo đinh dạng dd/MM/yyyy?”} {SET by {NgaySinh \@ yyyy}}

{SET bm {NgaySinh \@ M}} {SET bd {NgaySinh \@ d}} {SET yy {DATE \@ yyyy}} {SET mm {DATE \@ M}} {SET dd {DATE \@ d}} {SET md{=IF((mm=2);28+(mm=2)*((MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0));31-((mm=4)+(mm=6)+(mm=9)+(mm=11)))}} {Set SoNam{=yy-by-(mm<bm)-(mm=bm)*(dd<bd) \# 0}} {Set SoThang{=MOD(12+mm-bm-(dd<bd);12) \# 0}} {Set SoNgay{=MOD(md+dd-bd;md) \# 0}} {IF{={IF{={NgaySinh \@ “dddd”}}=”!*” 0 1}+{IF{={NgaySinh \@ “MMMM”}}=”!*” 0 1}+{IF{by}=”!*” 1 0}+{IF{NgaySinh \@ yyyyMMdd}<{DATE \@ yyyyMMdd} 0 1}}=0 “Nếu ngày sinh là {NgaySinh \@ “dd/MM/yyyy”}, thì số tuổi tính đến hôm nay (theo máy tính báo là {date \@ “dd/MM/yyyy”}, nếu sai phải chỉnh lại ngày trong máy) được {SoNam} năm, {SoThang} tháng và {SoNgay} ngày.” “Dữ liệu nhập sai!”}}

Khi thi hành bằng cách bôi đen, nhấn F9 sẽ có:

Hình 1.16. Hộp thoại nhập ngày sinh

Kết quả nhận được:

báo là 22/02/2010, nếu sai phải chỉnh lại ngày trong máy) được40 năm,5 tháng và19 ngày.

Để tính tuổi từ một formfield thiết lập BookMark ‘NgaySinh’ và đặt thuộc tính của nó là ‘calculate on exit’:

{QUOTE

{SET by {NgaySinh \@ yyyy}} {SET bm {NgaySinh \@ M}} {SET bd {NgaySinh \@ d}} {SET yy {DATE \@ yyyy}} {SET mm {DATE \@ M}} {SET dd {DATE \@ d}} {SET md{=IF((mm=2);28+(mm=2)*((MOD(yy;4)=0)+(MOD(yy;400)=0)- (MOD(yy;100)=0));31-((mm=4)+(mm=6)+(mm=9)+(mm=11)))}} {Set SoNam{=yy-by-(mm<bm)-(mm=bm)*(dd<bd) \# 0}} {Set SoThang{=MOD(12+mm-bm-(dd<bd);12) \# 0}} {Set SoNgay{=MOD(md+dd-bd;md) \# 0}}

”Tuổi được tính là {SoNam} năm, {SoThang} tháng và {SoNgay} ngày.”} Nếu hôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả:

Tuổi được tính là 40 năm,5 tháng và 19 ngày.

d) Tính một ngày định trước trong khoảng 1 tuần

Trường sau tính toán một ngày trong khoảng 1 tuần định trước, ví dụ như ngày chủ nhật. Nếu hôm nay là ngày chủ nhật thì chỉ ra ngày hôm nay, nếu chủ nhật qua rồi thì đưa ra chủ nhật kế tiếp. Có thể thay chủ nhật bằng các ngày khác, bằng các sửa chữa dòng:

{SET NgayThuMayTrongTuan 6}

(0=Thứ hai, 1=Thứ ba, 2=Thứ tư, 3=Thứ năm, 4=Thứ sáu, 5=Thứ bảy, 6=Chủ nhật) {QUOTE

{SET a{=INT((14-{DATE \@ M})/12)}} {SET b{={DATE \@ yyyy}+4800-a}} {SET c{={DATE \@ M}+12*a-3}} {SET d{DATE \@ d}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045}} {SET NgayThuMayTrongTuan 6} {SET jd{=INT((jd)/7)*7+NgayThuMayTrongTuan}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}

{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}

{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật” {IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}

Nếu hôm nay ngày 22 tháng 02 năm2010 sử dụng code trên, kết quả: Thứ hai, 22/02/2010

e) Tính toán một khoảng thời gian định trước

Nhiều trường hợp muốn tổ chức một sự kiện nào trong khoảng thờigian x ngày từ ngày A đến ngày B, muốn tự động được chỉ ra. Ví dụ như 1 tuần trực, muốn chỉ ra ngày bắt đầu và ngày kết thúc, hoặc như tạp chí bán nguyệt san 2 tuần 1 lần chẳng hạn, có thể dùng code sau để chỉ ra ngày hiện tại đang ở trong khoảng ngày nào,ở đây sử dụng số 32 là ký tự dấu cách:

{QUOTE

{SET KhoangThoiGianLaBaoNhieuNgay 8} {SET a{=INT((14-{DATE \@ M})/12)}} {SET b{={DATE \@ yyyy}+4800-a}} {SET c{={DATE \@ M}+12*a-3}} {SET d{DATE \@ d}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045}} {SET NgayBatDauLaThuMayTrongTuan 0} {SET jd{=INT((jd)/7)*7+NgayBatDauLaThuMayTrongTuan}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}

{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}

{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật” {IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}

{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”} 32 đến 32 ngày 32 {SET jd{=jd+KhoangThoiGianLaBaoNhieuNgay}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}

{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}

{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật” {IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}

{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}}

Thực hiện đặt KhoangThoiGianLaBaoNhieuNgay=7, căn cứ quy định

NgayBatDauLaThuMayTrongTuan=0 (Thứ hai) sẽ có kết quả: Thứ hai, 22/02/2010đếnngày Thứ hai, 22/02/2010

f) Ghi lịch cho các ngày tăng dần

Khi cần viết một chuỗi thời gian tăng dần thì cần viết:

B1. Xác định ngày ban đầu cần cố định. Giả sử ngày ban đầu là hôm nay thì viết code trường như sau:

{QUOTE

{SET ThuTA{DATE \@ “ddd”}}

{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”

{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}

{quote {ThuTV},}32 {DATE \@ “dd/MM/yyyy”}} Nhấn F9 để thi hành, kết quả:

Thứ hai, 22/02/2010

B2. Đặt bước nhảy cho ngày kế tiếp, viết code sau để có ngày kế: {QUOTE

{SET BuocNhayTinhBangNgay 1} {SET a{=INT((14-{DATE \@ M})/12)}} {SET b{={DATE \@ yyyy}+4800-a}} {SET c{={DATE \@ M}+12*a-3}} {SET d{DATE \@ d}} {SET jd{=d+INT((153*c+2)/5)+365*b+INT(b/4)-INT(b/100)+INT(b/400)- 32045+BuocNhayTinhBangNgay}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}} {SET mm{=i+3-12*INT(i/10)}} {SET yy{=100*e+g-4800+INT(i/10)}}

{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}

{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”

{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}

{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}} Nhấn F9 để thi hành, kết quả:Thứ hai, 22/02/2010

B3. Viết code cho các ngày còn lại. Code này chung nên muốn có các ngày tăng theo bước nhảy chỉ việc copy sẽ có luôn:

{QUOTE{SET jd{=jd+BuocNhayTinhBangNgay}} {SET jd{=jd+BuocNhayTinhBangNgay}} {SET e{=INT((4*(jd+32044)+3)/146097)}} {SET f{=jd+32044-INT(146097*e/4)}} {SET g{=INT((4*f+3)/1461)}} {SET h{=f-INT(1461*g/4)}} {SET i{=INT((5*h+2)/153)}} {SET dd{=h-INT((153*i+2)/5)+1}}

{SET mm{=i+3-12*INT(i/10)}}

{SET yy{=100*e+g-4800+INT(i/10)}}

{SET ThuTA{quote “{dd}-{mm}-{yy}” \@ “ddd”}}

{SET ThuTV{IF {ThuTA}=”Mon” “Thứ hai” {IF{ThuTA}=”Sun” “Chủ nhật”

{IF{ThuTA}=”Tue” “Thứ ba” {IF{ThuTA}=”Wed” “Thứ tư” {IF{ThuTA}=”Fri” “Thứ sáu” {IF{thuTA}=”Sat” “Thứ bảy” “Thứ năm”}}}}}}}

{quote {ThuTV},}32 {quote “{dd}-{mm}-{yy}” \@ “dd/MM/yyyy”}} Nhấn F9 để thi hành, kết quả:

Thứ hai, 22/02/2010

B4. Tương tự, ta có thể copy nội dung của B3 để có được số ngày như mong muốn: Thứ hai, 22/02/2010 Thứ hai, 22/02/2010 Thứ hai, 22/02/2010 Thứ hai, 22/02/2010 Thứ hai, 22/02/2010 Thứ hai, 22/02/2010 Thứ hai, 22/02/2010 Thứ hai, 22/02/2010 Thứ hai, 22/02/2010

Một phần của tài liệu Tài liệu Đặc tả xử lý và xử lý tự động doc (Trang 31 - 37)