MỞ ĐẦU
Đất nước ta đang trong quá trình đổi mới và phát triển, bước đầu đã gặt hái được những thành công nhất định, điều đó được thể hiện qua mức tăng trưởng kinh tế ổn định và ngày càng cao, tỉ lệ lạm phát được kiềm chế, được đánh giá là “điểm đến” của du khách và các nhà đầu tư quốc tế. Thành công này có sự đóng góp không nhỏ của ngành Tin học, ngành đã và đang trở thành mũi nhọn của quá trình công nghiệp hóa, hiện đại hóa đất nước.
Cùng với sự đổi mới của đất nước, sự phát triển vượt trội của ngành Công nghệ thông tin nói chung cũng như nhu cầu cấp thiết ứng dụng tin học trong công tác quản lý của các doanh nghiệp nói riêng, trong mấy năm vừa qua, hàng loạt các Công ty phần mềm đã ra đời trên thị trường Việt Nam. Điển hình có công ty phần mềm CardPro chuyên về lĩnh vực đồ họa, Hp Group chuyên về phần mềm giáo dục đào tạo, đặc biệt, có rất nhiều công ty phần mềm tài chính kế toán như phần mềm kế toán Fast Accouting, phần mềm kế toán Effect, phần mềm Cyber Accounting của công ty Cổ phần phần mềm QTDN Cybersoft.
Cybersoft là một công ty máy tính chuyên cung cấp các giải pháp phần mềm trong lĩnh vực quản trị doanh nghiệp, với đội ngũ nhân viên năng động và có trách nhiệm. Trong thời gian này, được sự hướng dẫn trực tiếp của GĐ. Lê Cảnh Toàn và sự giúp đỡ của đội ngũ cán bộ, nhân viên Cybersoft, em thực hiện đề tài “Phân tích, thiết kế và xây dựng hệ thống tính lương cho Xí nghiệp Xe buýt Hà Nội” bằng Visual Foxpro 7.0.
Xí nghiệp Xe buýt Hà Nội là đơn vị trực thuộc Tổng Công ty vận tải Hà Nội. Với gần 900 cán bộ công nhân viên được bố trí trong các bộ phận khác nhau như lái xe, sửa chữa, văn phòng, bán vé, bảo vệ , việc tính lương cho Xí nghiệp rất phức tạp, yêu cầu tỉ mỉ và chi tiết. Mỗi tháng, kế toán viên phải tính lương theo hai kỳ với nhiều loại mẫu biểu, chứng từ như bảng lương tạm ứng, bảng thanh toán tiền lương, tiền thưởng, lương ngoài giờ, báo cáo đóng bảo hiểm y tế, bảo hiểm xã hội Toàn bộ các công việc này nếu được thực hiện bằng thủ công đơn thuần sẽ vô cùng vất vả, tốn kém thời gian, nhân lực và có thể còn dẫn đến sai sót khó kiểm soát. Chính vì thế, việc tin học hóa kế toán lương cho Xí nghiệp là rất cần thiết nhằm tiết kiệm thời gian, sức lao động, giảm bớt sai sót, góp phần nâng cao hiệu quả kinh doanh.
Ngoài phần mở đầu và kết luận, nội dung chính của chuyên đề bao gồm:
Chương I: Vài nét về công ty
Chương này sẽ giới thiệu sơ lược về cơ sở thực tập – Công ty cổ phần phần mềm QTDN Cybersoft – một công ty đã chiếm được uy tín lớn trên thị trường phần mềm kế toán.
Chương II: Phương pháp phân tích và thiết kế hệ thống thông tin quản lý
Phương pháp luận nghiên cứu là nền tảng khoa học để phát triển tư duy thực tiễn. Khi nghiên cứu một bài toán quản lý từ cấp chiến lược đến cụ thể, phương pháp phân tích và thiết kế hợp lý giúp giải quyết vấn đề một cách đúng đắn và khoa học.
Chương này sẽ giới thiệu sơ lược cách tiếp cận hệ thống, phương pháp vòng đời phát triển của một hệ thống thông tin với bảy giai đoạn: Đánh giá yêu cầu phát triển hệ thống thông tin, Phân tích chi tiết, Thiết kế logic, Đề xuất các phương án của giải pháp, Thiết kế vật lý ngoài, Triển khai kỹ thuật hệ thống, Cài đặt và khai thác.
Chương III: Khảo sát, phân tích, thiết kế và xây dựng hệ thống thông tin tính lương tại Xí nghiệp Xe buýt Hà Nội
Những nội dung, công việc khảo sát, phân tích, thiết kế, lập trinh hệ thống thông tin tính lương cho Xí nghiệp Xe buýt Hà Nội sẽ được trình bày cụ thể trong chương này.
Phần cuối của chuyên đề là các phụ lục:
Phụ lục 1: Mã của một số thủ tục chính của chương trình.
Phụ lục 2: Tài liệu tham khảo.
MỤC LỤC
MỤC LỤC 1
Mở đầu 3
CHƯƠNG I: VÀI NÉT VỀ CÔNG TY 6
I. Những nét cơ bản về công ty 6
1. Thành lập công ty 6
2. Chức năng 7
3. Mục tiêu của công ty 7
4. Giá trị và niềm tin 7
5. Cơ cấu tổ chức 8
6. Hình thức tổ chức kinh doanh 9
II. Sản phẩm, dịch vụ và khách hàng của Cybersoft 10
1. Các sản phẩm 10
2. Dịch vụ 11
3. Khách hàng của công ty 12
III. Lý do lựa chọn đề tài 12
CHƯƠNG II: PHƯƠNG PHÁP PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG THÔNG TIN QUẢN LÝ 14
I. Khái quát về hệ thống thông tin quản lý 14
1. Cách tiếp cận hệ thống 14
2. Cơ sở dữ liệu của hệ thống thông tin 15
3. Tầm quan trọng của hệ thống thông tin hoạt động tốt 17
II. Ứng dụng tin học trong công tác xây dựng hệ thống thông tin quản lý 19
1. Lý do để phát triển một hệ thống thông tin quản lý 19
2. Phương pháp phát triển hệ thống thông tin quản lý 20
CHƯƠNG III: KHẢO SÁT, PHÂN TÍCH, THIẾT KẾ VÀ XÂY DỰNG HỆ THỐNG THÔNG TIN TÍNH LƯƠNG TẠI XÍ NGHIỆP XE BUÝT HÀ NỘI 34
I. Khảo sát hệ thống thực tại 34
1. Vài nét về Xí nghiệp Xe buýt Hà Nội 34
2. Đặc điểm tình hình sản xuất kinh doanh và tổ chức bộ máy quản lý của doanh nghiệp 35
3. Tổ chức hệ thống thông tin 37
4. Nhiệm vụ đối với hệ thống thông tin kế toán lương 38
5. Các công thức tính lương 39
II. Phân tích chi tiết 41
1. Các chức năng của hệ thống 41
2. Sơ đồ luồng thông tin trong hệ thống kế toán lương 45
3. Sơ đồ luồng dữ liệu 45
4. Lý do để xây dựng hệ thống thông tin tính lương mới 47
5. Xây dựng hệ thống mã hóa trong xử lý các nghiệp vụ tính lương 48
III. Thiết kế hệ thống 52
1. Hệ thống Menu kế toán lương 52
2. Thiết kế cơ sở dữ liệu 53
3. Thiết kế các thuật toán 71
4. Lựa chọn hệ quản trị cơ sở dữ liệu 76
IV. Một số giao diện màn hình của chương trình 77
1. Màn hình đăng nhập vào hệ thống 77
2. Màn hình danh mục nhân viên 78
3. Màn hình sửa danh mục nhân viên 79
4. Màn hình lọc Danh mục nhân viên 79
5. Màn hình tìm kiếm nhân viên 80
6. Màn hình thêm mới nhóm nhân viên 80
7. Màn hình lọc công thức tính lương theo tháng 81
8. Màn hình sửa công thức tính 81
9. Màn hình cập nhật số liệu 82
10. Màn hình nhập số liệu 83
Kết luận 84
Phụ lục 1 86
Phụ lục 2 132
135 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2634 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Phân tích, thiết kế và xây dựng hệ thống tính lương cho Xí nghiệp Xe buýt Hà Nội, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Matx ( = STR(nam,4) + STR(thang,2) + Matx)
STT
Tên trường
Kiểu
Độ rộng
Diễn giải
1
Matx
C
6
Mã tuyến xe
2
Tentx
C
50
Tên tuyến xe
3
Giatx
N
12,0
Giá tuyến xe
4
Nam
N
4,0
Năm
5
Thang
N
2,0
Tháng
6
Gia_Nvbv
N
7,2
Giá nhân viên bảo vệ
7
Gia_Lx
N
7,2
Giá lái xe
8
Gia_khac
N
7,2
Giá khác
9
Date0
D
8
Ngày thêm mới
10
Time
C
8
Giờ thêm mới
11
User_Id0
C
20
Người thêm mới
12
Date
D
8
Giờ sửa hoặc xóa
13
Time
C
8
Giờ sửa hoặc xóa
14
User_Id
C
20
Người sửa hoặc xóa
15
Status
C
1
Trạng thái xóa = “ * ” – bị xóa bởi chương trình
TỆP DANH MỤC CÔNG THỨC TÍNH: DMCT
Bí danh: Dmct
Khóa chính: STTVALID ( = STR(nam,4)+STR(thang,2)+nh_nv2+mact)
STT
Tên trường
Kiểu
Độ rộng
Diễn giải
1
Nam
N
4,0
Năm
2
Thang
N
2,0
Tháng
3
Nh_nv2
C
8
Nhóm nhân viên 2
4
Stt
N
3,0
Số thứ tự
5
Mact
C
10
Mã công thức
6
Ct
C
254
Công thức
7
Tenct
C
50
Tên công thức
8
Nh_nv1
C
8
Nhóm nhân viên 1
9
Ghichu
M
4
Ghi chú
10
Date0
D
8
Ngày thêm mới
11
Time0
C
8
Giờ thêm mới
12
User_Id0
C
20
Người thêm mới
13
Date
D
8
Ngày sửa hoặc xóa
14
Time
C
8
Giờ sửa hoặc xóa
15
User_Id
C
20
Người sửa hoặc xóa
16
Status
C
1
Trạng thái xóa = “ * ” – bị xóa bởi chương trình
TỆP CÔNG THỨC TÍNH LƯƠNG HÀNG THÁNG: CTLUONGT
Bí danh: Ctluongt
Khóa chính: STT1 ( = STR(thang,2)+STR(nam,4)+manv)
STT
Tên trường
Kiểu
Độ rộng
Diễn giải
1
Nam
N
4,0
Năm
2
Thang
N
2,0
Tháng
3
Manv
C
16
Mã nhân viên
4
Nh_nv1
C
8
Nhóm nhân viên 1
5
Nh_nv2
C
8
Nhóm nhân viên 2
6
Nh_nv3
C
8
Nhóm nhân viên 3
7
Matx
C
8
Mã tuyến xe
8
Lcb_Hsc
N
5,2
Hệ số lương cơ bản cũ
9
Lcb_Hsm
N
5,2
Hệ số lương cơ bản mới
10
Lcb_Tt
N
16,2
Lương cơ bản – thành tiền
11
Ltg_Clv
N
4,2
Lương thời gian – công làm việc
12
Ltg_Ccd
N
4,2
Lương thời gian – công chế độ
13
Ltg_Cnlv
N
4,2
Lương thời gian – công ngày làm việc
14
Ltg_Ckx
N
4,2
Lương thời gian – công khác
15
Ltg_Cl
N
4,2
Lương thời gian – công L
16
Ltg_Cdf
N
4,2
Lương thời gian – công DF
17
Ltg_Tt
N
16,2
Lương thời gian – thành tiền
18
Lcp_Lktl
N
4,2
Lương chất lượng phục vụ - lượt không tính lương
19
Lcp_Tt
N
16,2
Lương chất lượng phục vụ - thành tiền
20
Lsp_C
N
4,2
Lương sản phẩm – công
21
Lsp_Tt
N
16,2
Lương sản phẩm – thành tiền
22
Tg0_Cnl
N
4,2
Công thêm giờ - ngày lễ
23
Tg0_Ccn
N
4,2
Công thêm giờ - chủ nhật
24
Tg0_Cnt
N
4,2
Công thêm giờ - ngày thường
25
Tg_Tt
N
16,2
Thêm giờ - thành tiền
26
Ptn_Tt
N
16,2
Phụ cấp thất nghiệp – thành tiền
27
Pc3_Tt
N
16,2
Phụ cấp thất nghiệp – thành tiền
28
Tong_luong
N
16,2
Tổng lương
29
Kpt_Kpcd
N
16,2
Kinh phí công đoàn
30
Kpt_Bhxh
N
16,2
Bảo hiểm xã hội
31
Kpt_Bhyt
N
16,2
Bảo hiểm y tế
32
Kpt_Tdtu
N
16,2
Tiền tạm ứng
33
Tru_khac1
N
16,2
Trừ khác 1
34
Tru_khac2
N
16,2
Trừ khác 2
35
Tru_khac3
N
16,2
Trừ khác 3
36
Cong_khac1
N
16,2
Cộng khác 1
37
Cong_khac2
N
16,2
Cộng khác 2
38
Cong_khac3
N
16,2
Cộng khác 3
39
Ghichu1
M
4
Ghi chú 1
40
Ghichu2
M
4
Ghi chú 2
41
Ghichu3
M
4
Ghi chú 3
42
Nop_Bhxh
N
1,0
Nộp bảo hiểm xã hội
43
Trachnhiem
N
16,2
Trách nhiệm
44
Lsp_At
N
16,2
Lương sản phẩm – Ăn trưa
45
Ltg_At
N
16,2
Lương thời gian – Ăn trưa
46
Lcp_At
N
16,2
Lương chất lượng phục vụ - Ăn trưa
47
Ltg_Nlv
N
16,2
Lương thời gian – Ngày làm việc
48
Tru_Congsp
N
16,2
Trừ công sản phẩm
49
Tru_Khac
N
16,2
Trừ khác
50
Tru_Tu
N
16,2
Trừ tạm ứng
51
Tien_Tn
N
16,2
Tiền trách nhiệm
52
Tien_Linh
N
16,2
Tiền lĩnh
53
At_Tt
N
12,2
Ăn trưa – thành tiền
54
Kpt_Kx
N
5,2
Khoản phải thu – khác
55
Tg_Cnl
N
5,2
Thêm giờ - công ngày lễ
56
Tg_Ccn
N
5,2
Thêm giờ - công chủ nhật
57
Tg_Cnt
N
5,2
Thêm giờ -công ngày thường
58
Ltg_Llvtt
N
12,2
Lương thời gian – công làm việc thành tiền (bộ phận văn phòng)
59
Ltg_Lcdtt
N
12,2
Lương thời gian – công chế độ thành tiền
60
Lcp_Lktltt
N
12,2
Lương chất lượng phục vụ - lượt không tính lương thành tiền
61
Kpt_Bttn
N
12,2
Khoản phải thu – bồi thường trách nhiệm
62
Kpt_Nolai
N
12,2
Khoản phải thu – nợ lại (trường hợp tiền lĩnh âm)
63
Kpt_Truno
N
12,2
Khoản phải thu trừ nợ (trừ nợ lại tháng trước)
64
Tinhluong
N
1,0
Tính lương
65
Gia_Laixe
N
7,2
Giá – lái xe
66
Gia_Tknl
N
7,2
Giá – tiết kiệm nhiên liệu
67
Gia_Nvbv
N
7.2
Giá – nhân viên bảo vệ
68
Gia_Khac
N
7,2
Giá – khác
69
Chotso
C
1
Trạng thái chốt sổ
70
Status
C
1
Trạng thái xóa = “ * ” – bị xóa bởi chương trình
TỆP CHỐT SỔ: CHOTSO
Bí danh: Chotso
Khóa chính: STT ( = STR(nam,4)+STR(thang,2))
STT
Tên trường
Kiểu
Độ rộng
Diễn giải
1
Nam
N
4,0
Năm
2
Thang
N
2,0
Tháng
3
Ngay_Chot
D
8
Ngày chốt sổ
4
Gio_Chot
C
8
Giờ chốt sổ
Thiết kế các thuật toán
Thuật toán đăng nhập vào chương trình
Thuật toán thêm mới nhóm nhân viên trong danh mục nhóm nhân viên
Thuật toán lấy thông tin trong các danh mục
Thuật toán tìm kiếm nhân viên trong danh mục nhân viên
Thuật toán xóa nhóm nhân viên trong danh mục nhóm nhân viên
Lựa chọn hệ quản trị cơ sở dữ liệu
Cùng với sự phát triển như vũ bão của ngành Công nghệ thông tin nói chung cũng như sự phát triển của Công nghệ phần mềm nói riêng, các hệ quản trị không ngừng phát triển, bổ sung nhiều tính năng mới. Microsoft Visual Foxpro là một hệ quản trị cơ sở dữ liệu có nhiều công cụ giúp tổng hợp, truy xuất dữ liệu thông tin một cách nhanh chóng, thuận tiện và một bộ lệnh lập trình rất phong phú. Hệ quản trị cơ sở dữ liệu Visual Foxpro có nhiều tính năng hiện đại:
Tạo lập và quản lý các tệp cơ sở dữ liệu có dung lượng lớn (tới một tỷ dòng một tệp).
Hỗ trợ xây dựng cơ sở dữ liệu theo mô hình quan hệ.
Hỗ trợ một bộ lệnh và các hàm mạnh, đầy đủ, giúp cho người sử dụng dễ dàng hơn trong việc quản lý và khai thác dữ liệu.
Từ phiên bản 3.0 có hỗ trợ phương pháp lập trình hướng đối tượng.
Ứng dụng sau khi được xây dựng có khả năng triển khai nhanh, đơn giản.
Hỗ trợ cho việc tạo các ứng dụng nhiều người dùng.
Chính vì những lý do trên, chương trình Kế toán lương cho Xí nghiệp Xe buýt Hà Nội lựa chọn hệ quản trị cơ sở dữ liệu Visual Foxpro, cụ thể là Visual Foxpro 7.0 để làm cơ sở phân tích, thiết kế và lập trình.
Một số giao diện màn hình của chương trình
Màn hình đăng nhập vào hệ thống
Để bảo đảm an toàn cho hệ thống, chỉ những người sử dụng có quyền mới được phép đăng nhập vào hệ thống và sử dụng các chức năng chương trình tùy thuộc quyền hạn được phân.
Màn hình danh mục nhân viên
Màn hình Danh mục nhân viên hiện thị các thông tin về nhân viên như mã nhân viên, hệ số lương cũ, hệ số lương mới, địa chỉ, tài khoản ngân hàng.
Kế toán viên sẽ thực hiện các thao tác thêm mới, xóa, sửa nhân viên… thông qua việc sử dụng các phím chức năng F3, F4, F8…
Màn hình sửa danh mục nhân viên
Từ màn hình Danh mục nhân viên, khi kế toán viên nhấn phím chức năng F3, màn hình Sửa danh mục nhân viên (thực chất là sửa thông tin của một nhân viên nào đó trong danh mục) sẽ được hiển thị.
Nút Nhận sẽ xác nhận và lưu những thông tin mới sửa chữa vào cơ sở dữ liệu nếu hợp lệ. Ngược lại, nút Hủy sẽ thoát khỏi màn hình Sửa danh mục nhân viên, đồng thời mọi thông tin được bảo toàn.
Màn hình lọc Danh mục nhân viên
Việc nhấn phím F9 từ Danh mục nhân viên sẽ kích hoạt form Lọc danh mục nhân viên.
Người sử dụng có nhiều lựa chọn để lọc nhân viên từ Danh mục nhân viên. Có thể lọc theo mã nhân viên, tên nhân viên, bộ phận (nhóm NV2), chức vụ (nhóm NV3), tuyến xe, hoặc kết hợp những điều kiện lọc trên.
Màn hình tìm kiếm nhân viên
Để tìm kiếm nhân viên trong Danh mục nhân viên theo tên, chương trình đưa ra hai lựa chọn cho người sử dụng, đó là tìm tên nhân viên được bắt đầu hoặc bao gồm (chứa) cụm từ cần tìm. Giả sử tìm những nhân viên có tên chứa tử “Anh”, kết quả nhận được sẽ là Nguyễn Anh Đức, Nguyễn Thị Lan Anh, Phan Thanh Huyền, Trần Nguyên Hanh… Còn nếu tìm những nhân viên có tên bắt đầu bằng từ “Anh” thì chương trình sẽ đưa ra kết quả là Nguyễn Anh Đức, Nguyễn Thị Lan Anh…
Màn hình Tìm kiếm nhân viên hiển thị khi kế toán viên nhấn F5 từ Danh mục nhân viên.
Màn hình thêm mới nhóm nhân viên
Khi Danh mục nhóm nhân viên đang hiển thị, để thêm mới một nhóm nhân viên người dùng sẽ nhấn phím F4.
Màn hình lọc công thức tính lương theo tháng
Công thức tính lương của mỗi tháng khác nhau, để tiện cho việc tra cứu, kế toán viên có thể lọc các công thức này theo tháng, năm nhất định.
Màn hình sửa công thức tính
Việc kích hoạt Form Sửa công thức tính được thực hiện bằng cách nhấn phím F3 khi chương trình đang hiển thị Danh mục công thức tính lương. Việc Thêm mới công thức tính cũng tương tự nhưng thay bằng nhấn phím F3, kế toán viên phải nhấn phím F4.
Màn hình cập nhật số liệu
Mỗi tháng, trước khi tính lương, kế toán viên phải cập nhật các số liệu phát sinh trong tháng từ các bảng chấm công, phiếu chi, phiếu thu…, gồm các thông tin như tiền đã tạm ứng, công làm việc ngày thường, công làm việc ngày nghỉ, các khoản cộng khác, trừ khác…
Màn hình nhập số liệu
Nhấn F3 từ Form trên sẽ hiện ra Form Cập nhật số liệu như dưới đây, việc cập nhật số liệu được thực hiện chi tiết cho từng nhân viên.
KẾT LUẬN
Ngày nay, trong thời đại lĩnh vực Công Nghệ Thông Tin bùng nổ trên toàn cầu thì các quốc gia trên thế giới, dù phát triển hay đang phát triển đều áp dụng tin học vào để hiện đại hóa quy trình quản lý sản xuất của mình nhằm đạt hiệu quả cao nhất.
Qua quá trình khảo sát thực tế, phân tích và đánh giá hệ thống thông tin kế toán lương đang được triển khai tại Xí nghiệp Xe buýt Hà Nội, có thể kết luận một số ưu nhược điểm sau:
Ưu điểm:
Xí nghiệp Xe buýt Hà Nội có đội ngũ nhân viên, chuyên viên nắm vững kiến thức tin học căn bản, có hiểu biết nhất định về máy tính và các thiết bị tin học. Đây là điều kiện thuận lợi cho việc triển khai tin học hóa công tác quản lý lương.
Máy móc, thiết bị được trang bị tương đối đầy đủ và hiện đại, có thể áp dụng ngay quy trình quản lý tự động.
Ban lãnh đạo của Xí nghiệp am hiểu, tiếp cận tốt lĩnh vực Công nghệ thông tin.
Các báo biểu đã được thống nhất từ Tổng Công ty đến các bộ phận.
Các phân hệ kế toán khác hoạt động rất hiệu quả với phần mềm kế toán Cyber Accounting 2005 được viết bằng Visual Foxpro. Việc đồng bộ hóa quy trình quản lý của toàn Xí nghiệp ở tất cả các bộ phận sẽ tương đối thuận lợi, có khả năng liên kết và chia sẻ dữ liệu với nhau.
Hạn chế:
Hệ quản trị cơ sở dữ liệu Visual Foxpro tuy phổ biến, nhưng với các cán bộ quản lý tại Xí nghiệp Xe buýt Hà Nội thì hoàn toàn mới mẻ. Vì thế, công việc đào tạo không phải chỉ trong ngày một ngày hai là hoàn tất, người sử dụng còn rất lạ lẫm khi xử lý tình huống.
Đây là chương trình áp dụng lần đầu tại Xí nghiệp Xe buýt Hà Nội, chưa được triển khai ở các bộ phận khác, vì thế việc đồng bộ hóa dữ liệu chưa được giải quyết triệt để.
Hiện tại, chương trình đã cơ bản hoàn thành, chỉ còn một số báo cáo và chức năng phụ đang được hoàn thiện. Nhìn chung, trong giai đoạn đầu, hệ thống hoạt động tốt và chứng tỏ được ưu thế hơn hẳn so với hệ thống kế toán lương cũ.
Tuy nhiên, vì hệ thống lương tại Xí nghiệp Xe buýt tương đối phức tạp, người viết lại chưa có kinh nghiệm thực tế và kỹ năng lập trình chuyên nghiệp nên chắc chắn sẽ không tránh khỏi thiếu sót.
Một lần nữa, em xin chân thành cảm ơn thầy Bùi Thế Ngũ, đội ngũ cán bộ nhân viên Công ty Cổ phần phần mềm Cybersoft, đội ngũ cán bộ Phòng Lao động – Tiền lương – Hành chính Xí nghiệp Xe buýt Hà Nội đã giúp đỡ em hoàn thành đề tài này.
PHỤ LỤC 1
Mã của một số thủ tục chính
Thủ tục cập nhật danh mục nhân viên
*************************************************************** Dmnv_F3 Sua or them moi mot nhan vien
* Dmnv_Nhan Luu nhan vien
* Dmnv_F8 Xoa mot nhan vien
* Dmnv_F10 Sap xep danh muc nhan vien
**************************************************************
*!* ======== Thu tuc cap nhat danh muc nhan vien ============*
CLOSE TABLES ALL
USE (P_Cod + [Dmtx]) ORDER Matx ALIAS Dmtx IN 0
USE (P_Cod + [Dmnhnv]) ORDER Stt ALIAS Dmnhnv IN 0
SELECT 0
USE (P_Cod + [Dmnv]) ORDER Manv ALIAS Dmnv SHARED
GO TOP
_rec=0
SCAN
_rec = _rec+1
REPLACE ftag WITH _rec
ENDSCAN
GO TOP
ON KEY LABEL F3 DO Dmnv_F3 with [S]
ON KEY LABEL F4 DO Dmnv_F3 with [M]
ON KEY LABEL F8 DO Dmnv_F8
ON KEY LABEL F9 DO Dmnv_F9
ON KEY LABEL F5 DO Dmnv_F5
SELECT Dmnv
BROWSE FIELDS Manv :H = [M· nh©n viªn] :16,;
Tennv :H = [Tªn nh©n viªn] :25,;
Lcb_hsc :H = [HSL cò],;
Lcb_hsm :H = [HSL míi],;
Nh_nv1 :H = [Bé phËn],;
Nh_nv2 :H = [Chøc vô],;
Nh_nv3 :H = [Nhãm NV3],;
Matx :H = [Matx] :8,;
Tknh :H = [Tknh] :16,;
Diachi :H = [§Þa chØ] :10,;
Dt :H = [§iÖn tho¹i] :10,;
Email :H = [Email] :10,;
Tinh_thanh :H = [TØnh thµnh] :10,;
Ghichu :H = [Ghi chó],;
Date,;
Time,;
User_id,;
Date0,;
Time0,;
User_id0,;
Status;
FONT [Vn-sans-serif],8;
TITLE "F3-Sua, F4-Them moi, F5-Tim, F8-Xoa, F9-Loc, ESC-Thoat" NOAPPEND NOMODIFY NODELETE NOMENU WINDOW WinBrw
ON KEY LABEL F3
ON KEY LABEL F4
ON KEY LABEL F5
ON KEY LABEL F8
ON KEY LABEL F9
USE IN Dmnv
USE IN Dmnhnv
USE IN Dmtx
IF USED([Temp7])
USE IN Temp7
ENDIF
********************* PROCEDURE Dmnv_F3 **********************
PROCEDURE Dmnv_F3
LPARAMETERS _M_S
_InSELECT = SELECT()
_Recno = RECNO()
STORE _M_S TO _Moi_Sua
PUSH KEY CLEAR
IF _Moi_Sua = [S] AND RECNO() > RECCOUNT([Dmnv])
POP KEY
SELECT (_InSELECT)
RETURN
ENDIF
SELECT Dmnv
IF _Moi_Sua = [M]
SCATTER MEMVAR MEMO BLANK
ELSE
GO _Recno
SCATTER MEMVAR MEMO
ENDIF
M.Manv_old = M.Manv
M.Date0 = IIF(_Moi_Sua = [M],Date[],M.Date0)
M.Time0 = IIF(_Moi_Sua = [M],Time[],M.Time0)
M.User_Id0 = IIF(_Moi_Sua = [M],M.Name,M.User_Id0)
_Caption = IIF(_Moi_Sua = [M],"Them moi nhan vien","Sua chua danh muc nhan vien")
=SEEK([1] + M.Nh_nv1, [DmNhnv])
M.Ten_Nh_nv1 = IIF(FOUND([DmNhnv]), DmNhnv.Tennh, [])
=SEEK([2] + M.Nh_nv2, [DmNhnv])
M.Ten_Nh_nv2 = IIF(FOUND([DmNhnv]), DmNhnv.TenNh, [])
=SEEK([3] + M.Nh_nv3, [DmNhnv])
M.Ten_Nh_nv3 = IIF(FOUND([DmNhnv]), DmNhnv.TenNh, [])
=SEEK(M.Matx, [Dmtx])
M.Tentx = IIF(FOUND([Dmtx]), Dmtx.Tentx, [])
ON KEY LABEL F9 KEYBOARD CHR(23)
DO FORM (P_Screen + [Dmnv_F3]) NAME _SCX LINKED ON KEY LABEL F9
POP KEY
SELECT (_InSelect)
RETURN
********************* PROCEDURE _Nhan **********************
FUNCTION _Nhan
PARAMETERS M_Nhan
SELECT Dmnv
IF LASTKEY()= 27 OR M_Nhan 1
IF _Recno<=RECCOUNT([Dmnv])
GO _Recno
_SCX = ""
ENDIF
_SCX = ""
RETURN .T.
ELSE
IF M_Nhan = 1
IF EMPTY(ALLTRIM(M.Manv)) OR; EMPTY(ALLTRIM(M.Tennv))
MESSAGEBOX('M· hoÆc tªn nh©n viªn kh«ng ®îc ®Ó trèng !',0+48,'Chu y')
_SCX.txtManv.SetFocus
RETURN .F.
ELSE
IF _Moi_Sua = [M]
M.Time0 = Time()
M.Date0 = DATE()
M.User_Id0 = M.Name
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
APPEND BLANK
GATHER MEMVAR memo
FLUSH
UNLOCK IN Dmnv
ELSE
SELECT Dmnv
GO _Recno
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
GATHER MEMVAR MEMO
FLUSH
UNLOCK IN Dmnv
ENDIF
ENDIF
_SCX = ""
ENDIF
ENDIF
SELECT Dmnv
RETURN .T.
*!* ******************* PROCEDURE Dmnv_F8 ******************
PROCEDURE Dmnv_F8
CLEAR
GO RECNO()
_RecNo = RECNO()
SELECT Dmnv
fmin = RECCOUNT()
SCAN
fmin = MIN(fmin, ftag)
ENDSCAN
GO _Recno
IF RECNO() > RECCOUNT([Dmnv])
RETURN .T.
ENDIF
SCATTER MEMVAR MEMO
IF (MESSAGEBOX('Cã ch¾c ch¾n xãa kh«ng?',4+32+256,'Chu y') 6)
GO _Recno
RETURN
ENDIF
M.Time = Time()
M.Date = DATE()
M.User_Id = M.Name
M.Status="*"
IF ftag = fmin
SELE Dmnv
GO _Recno
REPLACE ftag WITH (RECCOUNT() + 1)
INDEX ON ftag TO ftag
SET ORDER TO ftag
fmin = RECCOUNT()
SCAN
fmin = MIN(fmin, ftag)
ENDSCAN
GO _Recno
GATHER MEMVAR MEMO
FLUSH
DELETE
= SEEK(fmin,[Dmnv])
GO RECNO()
ELSE
SET OPTIMIZE ON
SET EXCLUSIVE ON
SET MULTILOCKS ON && Must be on for table buffering
= CURSORSETPROP('Buffering', 5, 'Dmnv' )
GATHER MEMVAR MEMO
FLUSH
DELETE
TABLEUPDATE(.T.)
ENDIF
= CURSORSETPROP('Buffering',1, 'Dmnv' )
SET EXCLUSIVE OFF
SET MULTILOCKS OFF
RETURN .T.
*!* ***************** PROCEDURE Dmnv_F9 ********************
PROCEDURE Dmnv_F9
PRIVATE _Form
PUSH KEY
DO FORM (P_Screen + [Dmnv_F9]) NAME _Form LINKED
POP KEY
ENDPROC
***************
PROCEDURE Dmnv_F9_Nhan
PARAMETERS _NhanHuy
PRIVATE _key
_key=".T."
IF _NhanHuy 1
_Form = ""
RETURN
ENDIF
_Form = ""
SELECT Dmnv
IF !EMPTY(ALLTRIM(M.Manv))
_key = 'Manv = M.Manv'
ENDIF
IF !EMPTY(ALLTRIM(M.Tennv))
_key = _key + ' AND Tennv = M.Tennv'
ENDIF
IF !EMPTY(ALLTRIM(M.Nh_nv1))
_key = _key + ' AND M.Nh_nv1 = Nh_nv1'
ENDIF
IF !EMPTY(ALLTRIM(M.Nh_nv2))
_key = _key + ' AND M.Nh_nv2 = Nh_nv2'
ENDIF
IF !EMPTY(ALLTRIM(M.Nh_nv3))
_key = _key + ' AND M.Nh_nv3 = Nh_nv3'
ENDIF
SET FILTER TO &_key
GO TOP
RETURN
ENDPROC
*!* *************** PROCEDURE Dmnv_F5 ********************
PROCEDURE Dmnv_F5
PRIVATE _Form
PUBLIC _C,M.Ten
_C = 1
M.Ten=""
PUSH KEY
DO FORM (P_Screen + [Dmnv_F5]) NAME _Form LINKED
IF _C = 1
SELECT Dmnv
SELECT * FROM Dmnv WHERE UPPER(ALLTRIM(M.Ten)) $ UPPER(ALLTRIM(Tennv)) INTO TABLE P_TEMP+[Temp7]
ELSE
SELECT Dmnv
_at = AT(" ",ALLTRIM(Tennv),1)
SELECT * FROM Dmnv WHERE UPPER(ALLTRIM(M.Ten)) = UPPER(LEFT(Tennv,_at-1)) INTO TABLE P_TEMP+[Temp7]
ENDIF
ON KEY LABEL ENTER do _Chon
SELECT Temp7
BROWSE FIELDS Manv :H = [M· nh©n viªn] :16,;
Tennv :H = [Tªn nh©n viªn] :25,;
Lcb_hsc :H = [HSL cò],;
Lcb_hsm :H = [HSL míi],;
Nh_nv1 :H = [Bé phËn],;
Nh_nv2 :H = [Chøc vô],;
Nh_nv3 :H = [Nhãm NV3],;
Matx :H = [Matx] :8,;
Tknh :H = [Tknh] :16,;
Diachi :H = [§Þa chØ] :10,;
Dt :H = [§iÖn tho¹i] :10,;
Email :H = [Email] :10,;
Tinh_thanh :H = [TØnh thµnh] :10,;
Ghichu :H = [Ghi chó],;
Date,;
Time,;
User_id,;
Date0,;
Time0,;
User_id0,;
Status;
FONT [Vn-sans-serif],8;
TITLE "Enter-Chon, ESC-Thoat" NOAPPEND NOMODIFY NODELETE NOMENU WINDOW WinBrw
ON KEY LABEL ENTER
POP KEY
ENDPROC
*!* *** Thu tuc tham chieu nhom nhan vien tu danh muc nhom nhan vien ****
PROCEDURE _CHK_NV
PARAM _ObjectNV,_sort
M.Ma = UPPER(EVAL(_ObjectNV.Controlsource))
IF USED([Dmnhnv])
SELECT Dmnhnv
ELSE
USE (P_Cod + [Dmnhnv]) ORDER Stt ALIAS Dmnhnv IN 0
ENDIF
IF USED([Dmtx])
SELECT Dmtx
ELSE
USE (P_Cod + [Dmtx]) ORDER Matx ALIAS Dmtx IN 0
ENDIF
DO CASE
CASE _sort = 1
SET FILTER TO Loainh = 1 IN Dmnhnv
CASE _sort = 2
SET FILTER TO Loainh = 2 AND Manh "ALL" IN Dmnhnv
CASE _sort = 3
SET FILTER TO Loainh = 3 IN Dmnhnv
ENDCASE
ON KEY LABEL ENTER do _Nhan_huy with [N]
ON KEY LABEL ESC do _Nhan_huy with [H]
IF _sort 4
SELECT Dmnhnv
BROWSE FIELDS Manh :H = [M· nhãm],;
Tennh :H = [Tªn nhãm];
TITLE "ENTER-Nhan, ESC-Thoat" FONT [Vn-sans-serif], 8 NOAPPEND NOMODIFY NODELETE
ELSE
SELECT Dmtx
BROWSE FIELDS Matx :H = [M· tuyÕn xe],;
Tentx :H = [Tªn tuyÕn xe];
TITLE "ENTER-Nhan, ESC-Thoat" FONT [Vn-sans-serif], 8 NOAPPEND NOMODIFY NODELETE NAME OBrow2
ENDIF
ON KEY LABEL ENTER
ON KEY LABEL ESC
_ObjectNV.VALUE= M.Ma
_ObjectNV.Refresh
IF !USED([Dmnhnv])
USE (P_Cod + [Dmnhnv]) ORDER Stt ALIAS Dmnhnv IN 0
ENDIF
IF !USED([Dmtx])
USE (P_Cod + [Dmtx]) ORDER Matx ALIAS Dmtx IN 0
ENDIF
RETURN
*************
PROCEDURE _Nhan_huy
PARAMETERS _N_H
IF _N_H = [H]
IF _sort 4
IF _chkvalid = 1
_Left = LEFT(M.Ma,1)
SELECT Dmnhnv
GO TOP
_yes = 0
SCAN
IF _Left = LEFT(Manh,1)
_yes = 1
EXIT
ENDIF
ENDSCAN
IF _yes = 0
GO TOP
ENDIF
M.Ma = Dmnhnv.Manh
_ObjectNV.REFRESH
ENDIF
USE IN Dmnhnv
RETURN
ELSE
USE IN Dmtx
RETURN
ENDIF
ELSE
IF _sort 4
M.Ma = Dmnhnv.Manh
_ObjectNV.REFRESH
USE IN Dmnhnv
ELSE
M.Ma = Dmtx.Matx
_ObjectNV.REFRESH
USE IN Dmtx
ENDIF
ENDIF
FLUSH
RETURN
ENDPROC
*!*-------------------------_Chon ----------------------------
PROCEDURE _Chon
PRIVATE _Ma
_Ma=Temp7.Manv
SELECT Dmnv
= SEEK (_Ma,[Dmnv])
USE IN Temp7
RETURN
Thủ tục cập nhật danh mục nhóm nhân viên
**************************************************************
* Dmnhnv_F3 Sua or them moi mot nhom nhan vien
* Dmnhnv_Nhan Luu nhom nhan vien
* Dmnhnv_F8 Xoa mot nhom nhan vien
**************************************************************
*!* ============ Thu tuc sua danh muc nhom nhan vien =========
CLOSE TABLES ALL
USE (P_Cod + [Dmnv]) ORDER Manv ALIAS Dmnv IN 0
SELECT 0
USE (P_Cod + [Dmnhnv]) ORDER STT ALIAS Dmnhnv SHARED
ON KEY LABEL F3 DO Dmnhnv_F3 with [S]
ON KEY LABEL F4 DO Dmnhnv_F3 with [M]
ON KEY LABEL F8 DO Dmnhnv_F8
ON KEY LABEL F10 DO Dmnhnv_F10
SELECT Dmnhnv
BROWSE FIELDS Loainh :H=[KiÓu ph©n lo¹i] :18,; Manh :H=[M· nhãm] :20,;
Tennh :H=[Tªn nhãm] ;
FONT [vn-sans-serif],8;
TITLE "F3-Sua, F4-Them moi, F8-Xoa, F10-Sap xep, ESC-Thoat" ;
NOAPPEND NOMODIFY NODELETE NOMENU WINDOW WinBrw
ON KEY LABEL F3
ON KEY LABEL F4
ON KEY LABEL F8
USE IN Dmnv
USE IN Dmnhnv
******************* PROCEDURE Dmnhnv_F3 ********************
PROCEDURE Dmnhnv_F3
LPARAMETERS _M_S
_InSELECT = SELECT()
_Recno = RECNO()
STORE _M_S TO _Moi_Sua
PUSH KEY CLEAR
IF _Moi_Sua = [S] AND RECNO() > RECCOUNT([Dmnhnv])
POP KEY
SELECT (_InSELECT)
RETURN
ENDIF
SELECT Dmnhnv
IF _Moi_Sua = [M]
SCATTER MEMVAR MEMO BLANK
ELSE
GO _Recno
SCATTER MEMVAR MEMO
ENDIF
M.Manh_old = M.Manh
M.Date0 = IIF(_Moi_Sua = [M],Date[],M.Date0)
M.Time0 = IIF(_Moi_Sua = [M],Time[],M.Time0)
M.User_Id0 = IIF(_Moi_Sua = [M],M.Name,M.User_Id0)
_Caption = IIF(_Moi_Sua = [M],"Them moi nhom nhan vien","Sua chua nhom nhan vien")
ON KEY LABEL F10 KEYBOARD CHR(23)
DO FORM (P_Screen + [Dmnhnv_F3]) NAME _SCX LINKED
POP KEY
SELECT (_InSelect)
RETURN
********************** PROCEDURE _Nhan **********************
FUNCTION _Nhan
PARAMETERS M_Nhan
SELECT Dmnhnv
COUNT TO Dem FOR ALLTRIM(STR(Loainh,1) + Manh) == ALLTRIM(STR(M.Loainh,1) + m.Manh)
IF LASTKEY()= 27 OR M_Nhan 1
IF _Recno<=RECCOUNT([Dmnhnv])
GO _Recno
_SCX = ""
ENDIF
_SCX = ""
RETURN .T.
ELSE
IF M_Nhan = 1
DO CASE
CASE EMPTY(ALLTRIM(M.Manh)) OR EMPTY(ALLTRIM(M.Tennh))
MESSAGEBOX('M· hoÆc tªn nhãm kh«ng ®îc ®Ó trèng !',0+48,'Chu y')
_SCX.txtManh.SetFocus
CASE _Moi_Sua = [M] AND Dem>0
=MESSAGEBOX([M· ®· cã!],64,[Chu y])
_SCX.TxtManh.SetFocus
CASE _Moi_Sua = [S] AND Dem>0 AND ALLTRIM(_SCX.TxtManh.Value)_CurrValue
=MESSAGEBOX([M· ®· cã!],64,[Chu y])
_SCX.TxtManh.SetFocus
OTHERWISE
IF _Moi_Sua = [M]
M.Time0 = Time()
M.Date0 = DATE()
M.User_Id0 = M.Name
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
APPEND BLANK
GATHER MEMVAR memo
FLUSH
UNLOCK IN Dmnhnv
ELSE
SELECT Dmnhnv
GO _Recno
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
GATHER MEMVAR memo
FLUSH
UNLOCK IN Dmnhnv
ENDIF
_SCX = ""
ENDCASE
ENDIF
ENDIF
SELECT Dmnhnv
RETURN .T.
*!* **************** PROCEDURE Dmnhnv_F8 *****************
PROCEDURE Dmnhnv_F8
GO RECNO()
_RecNo = RECNO()
_Kiemtra = Manh
IF RECNO() > RECCOUNT([Dmnhnv])
RETURN .T.
ENDIF
SCATTER MEMVAR MEMO
SELECT Dmnhnv
DO CASE
CASE Loainh = 1
SELECT Dmnv
INDEX ON Nh_nv1 TO Nh_nv1
IF SEEK(Dmnhnv.Manh)
MESSAGEBOX('Cã ph¸t sinh, kh«ng ®îc xãa!',0+48,'Chu y')
ELSE
DO Del
ENDIF
CASE Loainh = 2
SELECT Dmnv
INDEX ON Nh_nv2 TO Nh_nv2
IF SEEK(Dmnhnv.Manh)
MESSAGEBOX('Cã ph¸t sinh, kh«ng ®îc xãa!',0+48,'Chu y')
ELSE
DO Del
ENDIF
CASE Loainh = 3
SELECT Dmnv
INDEX ON Nh_nv3 TO Nh_nv3
IF SEEK(Dmnhnv.Manh)
MESSAGEBOX('Cã ph¸t sinh, kh«ng ®îc xãa!',0+48,'Chu y')
ELSE
DO Del
ENDIF
OTHERWISE
DO Del
ENDCASE
RETURN .T.
*!*……………………………………………… PROCEDURE Del ……………………………………
PROCEDURE Del
IF (MESSAGEBOX('Cã ch¾c ch¾n xãa kh«ng?',4+32+256,'Chu y') 6)
SELECT Dmnhnv
GO _Recno
RETURN
ENDIF
SELECT Dmnhnv
M.Time = Time()
M.Date = DATE()
M.User_Id = M.Name
M.Status="*"
GATHER MEMVAR MEMO
FLUSH
DELETE
SKIP
ENDPROC
Thủ tục cập nhật danh mục tuyến xe
*!* ========= Thu tuc cap nhat danh muc tuyen xe ========== *
CLOSE TABLES ALL
SELECT 0
USE (P_Cod + [Dmtx]) ORDER Matx ALIAS Dmtx SHARED
M.thang = MONTH(DATE())
M.Nam = YEAR(DATE())
SET FILTER TO Thang = M.Thang AND Nam = M.Nam
ON KEY LABEL F3 DO Dmtx_F3 with [S]
ON KEY LABEL F4 DO Dmtx_F3 with [M]
ON KEY LABEL F8 DO Dmtx_F8
ON KEY LABEL F9 DO Dmtx_F9
SELECT Dmtx
BROWSE FIELDS Thang :H = [Th¸ng],; Nam :H = [N¨m],;
Matx :H = [M· tuyÕn xe] :16,;
Tentx :H = [Tªn tuyÕn xe] :37,;
Giatx :H = [Gi¸ tuyÕn xe] :15,;
Gia_nvbv :H = [Gi¸ NVBV],;
Gia_laixe :H = [Gi¸ LX],;
Gia_khac :H = [Gi¸ Kh¸c],;
Gia_tknl :H = [Gi¸ TKNL],;
User_id0,;
Time0,;
Date0,;
User_id,;
Time,;
Date,;
Status;
FONT [vn-sans-serif],8;
TITLE "F3-Sua, F4-Them moi, F8-Xoa, F9-Loc theo thang, ESC-Thoat" NOAPPEND NOMODIFY NODELETE NOMENU WINDOW WinBrw
ON KEY LABEL F3
ON KEY LABEL F4
ON KEY LABEL F8
ON KEY LABEL F9
USE IN Dmtx
******************* PROCEDURE Dmtx_F3 **********************
PROCEDURE Dmtx_F3
LPARAMETERS _M_S
_InSELECT = SELECT()
_Recno = RECNO()
STORE _M_S TO _Moi_Sua
PUSH KEY CLEAR
IF _Moi_Sua = [S] AND RECNO() > RECCOUNT([Dmtx])
POP KEY
SELECT (_InSELECT)
RETURN
ENDIF
SELECT Dmtx
IF _Moi_Sua = [M]
SCATTER MEMVAR MEMO BLANK
ELSE
GO _Recno
SCATTER MEMVAR MEMO
ENDIF
M.Matx_old = M.Matx
M.Date0 = IIF(_Moi_Sua = [M],Date[],M.Date0)
M.Time0 = IIF(_Moi_Sua = [M],Time[],M.Time0)
M.User_Id0 = IIF(_Moi_Sua = [M],M.Name,M.User_Id0)
_Caption = IIF(_Moi_Sua = [M],"Them moi tuyen xe","Sua chua danh muc tuyen xe")
ON KEY LABEL F9 KEYBOARD CHR(23)
DO FORM (P_Screen + [Dmtx_F3]) NAME _SCX LINKED
ON KEY LABEL F9
POP KEY
SELECT (_InSelect)
RETURN
*!* *************** PROCEDURE _Nhan **********************
FUNCTION _Nhan
PARAMETERS M_Nhan
SELECT Dmtx
COUNT TO Dem FOR ALLTRIM(Matx) == ALLTRIM(M.Matx) IF LASTKEY()= 27 OR M_Nhan 1
IF _Recno<=RECCOUNT([Dmtx])
GO _Recno
_SCX = ""
ENDIF
_SCX = ""
RETURN .T.
ELSE
IF M_Nhan = 1
DO CASE
CASE EMPTY(ALLTRIM(M.Matx)) OR EMPTY(ALLTRIM(M.Tentx))
MESSAGEBOX('M· hoÆc tªn tuyÕn xe kh«ng ®îc ®Ó trèng !',0+48,'Chu y')
_SCX.txtMatx.SetFocus
CASE _Moi_Sua = [M] AND Dem>0
=MESSAGEBOX([M· ®· cã!],64,[Chu y])
_SCX.TxtMatx.SetFocus
CASE _Moi_Sua = [S] AND Dem>0 AND ALLTRIM(_SCX.TxtMatx.Value)_CurrValue
=MESSAGEBOX([M· ®· cã!],64,[Chu y])
_SCX.TxtMatx.SetFocus
OTHERWISE
IF _Moi_Sua = [M]
M.Time0 = Time()
M.Date0 = DATE()
M.User_Id0 = M.Name
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
APPEND BLANK
GATHER MEMVAR memo
FLUSH
UNLOCK IN Dmtx
ELSE
SELECT Dmtx
GO _Recno
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
GATHER MEMVAR memo
FLUSH
UNLOCK IN Dmtx
ENDIF
_SCX = ""
ENDCASE
ENDIF
ENDIF
SELECT Dmtx
RETURN .T.
*!* ***************** PROCEDURE Dmtx_F8 ******************
PROCEDURE Dmtx_F8
GO RECNO()
_RecNo = RECNO()
SELECT Dmtx
IF RECNO() > RECCOUNT([Dmtx])
RETURN .T.
ENDIF
SCATTER MEMVAR MEMO
IF (MESSAGEBOX('Cã ch¾c ch¾n xãa kh«ng?',4+32+256,'Chu y') 6) GO _Recno
RETURN
ENDIF
M.Time = Time()
M.Date = DATE()
M.User_Id = M.Name
M.Status="*"
SET OPTIMIZE ON
SET EXCLUSIVE ON
SET MULTILOCKS ON && Must be on for table buffering
= CURSORSETPROP('Buffering', 5, 'Dmtx' )
GATHER MEMVAR MEMO
FLUSH
DELETE
SKIP
TABLEUPDATE(.T.)
RETURN .T.
*!* ++++++++++++++++++++++ Procedure Dmtx_F9
PROCEDURE Dmtx_F9
PRIVATE _Form
PUSH KEY
DO FORM (P_Screen + [Dmtx_F9]) NAME _Form LINKED
POP KEY
ENDPROC
***************
PROCEDURE Dmtx_F9_Nhan
PARAMETERS _NhanHuy
IF _NhanHuy 1
_Form = ""
RETURN
ENDIF
_Form = ""
M.Ngay1 = CTOD("01/"+STR(M.thang,2)+"/"+STR(M.Nam,4))
SET FILTER TO Thang = Month(M.Ngay1) and NAM = Year(M.Ngay1)
GO TOP
RETURN
ENDPROC
Thủ tục cập nhật danh mục công thức
**************************************************************
* dmct_F3 Sua/them moi mot vu viec
* dmct_F8 Xoa mot vu viec * V_Nhan Luu vu viec
*!* ================= Procedure: dmct ===================*
CLOSE TABLES ALL
USE (P_Cod + [Dmnhnv]) ORDER STT ALIAS Dmnhnv IN 0
SELECT 0
USE (P_Cod + [Dmct]) ORDER STT ALIAS Dmct
M.Thang = MONTH(DATE())&&(M.Ngay1)
M.Nam = YEAR(DATE())&&(M.Ngay1)
SET FILTER TO Thang = M.Thang and Nam = M.Nam
ON KEY LABEL F3 DO dmct_F3 WITH [S]
ON KEY LABEL F4 DO dmct_F3 WITH [M]
ON KEY LABEL F8 DO dmct_F8
ON KEY LABEL F9 DO Dmct_F9
BROWSE FIELDS Thang :H = [Th¸ng] :8,;
Nam :H = [N¨m] :5,;
Nh_nv2 :H = [Chøc vô] :12,;
Mact :H = [Tªn kÕt qu¶] :15,;
Tenct :H = [Tªn c«ng thøc] :40,;
Ct :H = [C«ng thøc tÝnh];
TITLE "F3-Sua, F4-Them moi, F8-Xoa, F9-Loc theo thang, ESC-Thoat" ;
FONT [vn-sans-serif],8;
NOAPPEND NOMODIFY NODELETE NOMENU WINDOW WinBrw
ON KEY LABEL F3
ON KEY LABEL F4
ON KEY LABEL F8
ON KEY LABEL F9
USE IN Dmnhnv
USE IN dmct
RETURN
*!* **************** PROCEDURE Dmct_F3 ********************
PROCEDURE dmct_F3
LPARAMETERS _M_S
_InSELECT = SELECT()
_Recno = RECNO()
ThangOld=M.Thang
NamOld=M.Nam
STORE _M_S TO _Moi_Sua
PUSH KEY CLEAR
IF _Moi_Sua = [S] AND RECNO() > RECCOUNT([dmct])
POP KEY
SELECT (_InSELECT)
RETURN
ENDIF
SELECT dmct
IF _Moi_Sua = [M]
SCATTER MEMVAR MEMO BLANK
ELSE
GO _Recno
SCATTER MEMVAR MEMO
ENDIF
M.mact_old = M.mact
M.Date0 = IIF(_Moi_Sua = [M],Date[],M.Date0)
M.Time0 = IIF(_Moi_Sua = [M],Time[],M.Time0)
M.User_Id0 = IIF(_Moi_Sua = [M],M.Name,M.User_Id0)
_Caption = IIF(_Moi_Sua = [M],"Them","Sua")
ON KEY LABEL F9 KEYBOARD CHR(23)
DO FORM (P_Screen + [dmct_F3]) NAME _SCX LINKED
ON KEY LABEL F9
POP KEY
SELECT (_InSelect)
RETURN
*!* ***************** PROCEDURE _Nhan **********************
FUNCTION _Nhan
PARAMETERS M_Nhan
SELECT dmct
COUNT TO Dem FOR ALLTRIM(Nh_nv2 + Mact) == ALLTRIM(M.Nh_nv2 + M.Mact)
IF LASTKEY()= 27 OR M_Nhan 1
IF _Recno<=RECCOUNT([dmct])
GO _Recno
_SCX = ""
ENDIF
_SCX = ""
RETURN .T.
ELSE
IF M_Nhan = 1
DO CASE
CASE EMPTY(ALLTRIM(M.Nh_nv2)) OR EMPTY(ALLTRIM(M.Tenct)) OR EMPTY(ALLTRIM(M.Mact))
=MESSAGEBOX('Chøc vô, tªn kÕt qu¶, tªn c«ng thøc kh«ng ®îc ®Ó trèng !',0+48,'Chu y')
CASE _Moi_Sua = [M] AND Dem>0
=MESSAGEBOX([C«ng thøc ®· cã!],64,[Chu y])
CASE _Moi_Sua = [S] AND Dem>0 AND ALLTRIM(_SCX.TxtNh_nv2.Value + _SCX.TxtMact.Value)_CurrValue
=MESSAGEBOX([C«ng thøc ®· cã!],64,[Chu y])
OTHERWISE
IF _Moi_Sua = [M]
M.Time0 = Time()
M.Date0 = DATE()
M.User_Id0 = M.Name
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
APPEND BLANK
GATHER MEMVAR memo
FLUSH
UNLOCK IN dmct
ELSE
SELECT dmct
GO _Recno
M.Time = TIME()
M.Date = DATE()
M.User_Id = M.Name
GATHER MEMVAR memo
FLUSH
UNLOCK IN dmct
ENDIF
_SCX = ""
ENDCASE
ENDIF
ENDIF
SELECT dmct
RETURN .T.
*!* *************** PROCEDURE Dmct_F8 *********************
PROCEDURE dmct_F8
GO RECNO()
_RecNo = RECNO()
IF RECNO() > RECCOUNT([dmct])
RETURN .T.
ENDIF
SCATTER MEMVAR MEMO
IF (MESSAGEBOX('Cã ch¾c ch¾n xãa kh«ng?',4+32+256,'Chu y') 6)
GO _Recno
RETURN
ENDIF
M.Time = Time()
M.Date = DATE()
M.User_Id = M.Name
M.Status="*"
SET OPTIMIZE ON
SET EXCLUSIVE ON
SET MULTILOCKS ON && Must be on for table buffering
= CURSORSETPROP('Buffering', 5, 'dmct' )
GATHER MEMVAR MEMO
FLUSH
DELETE
SKIP
TABLEUPDATE(.T.)
= CURSORSETPROP('Buffering',1, 'dmct' )
SET EXCLUSIVE OFF
SET MULTILOCKS OFF
RETURN .T.
*!* **************** PROCEDURE Dmct_F9 ******************
PROCEDURE Dmct_F9
PRIVATE _Form
PUSH KEY
DO FORM (P_Screen + [Dmct_F9]) NAME _Form LINKED
POP KEY
ENDPROC
***********
PROCEDURE Dmct_F9_Nhan
PARAMETERS _NhanHuy
IF _NhanHuy 1
_Form = ""
RETURN
ENDIF
_Form = ""
M.Ngay1 = CTOD("01/"+STR(M.thang,2)+"/"+STR(M.Nam,4))
SET FILTER TO Thang = Month(M.Ngay1) and NAM = Year(M.Ngay1)
GO TOP
RETURN
ENDPROC
*+++++++++++++++++++
PROCEDURE _CHK_CT
PARAM _ObjectCT
M.Nh_nv2 = UPPER(EVAL(_ObjectCT.Controlsource))
IF !USED([Dmnhnv])
USE (P_Cod + [Dmnhnv]) ORDER STT ALIAS Dmnhnv IN 0
ELSE
SELECT Dmnhnv
ENDIF
SET FILTER TO Loainh = 2
ON KEY LABEL ENTER do _Nhan_huy with [N]
ON KEY LABEL ESC do _Nhan_huy with [H]
BROWSE TITLE "ENTER-Nhan, ESC-Thoat" NOAPPEND NOMODIFY NODELETE NAME OBrow
ON KEY LABEL ENTER
ON KEY LABEL ESC
_ObjectCT.VALUE= M.Nh_nv2
_ObjectCT.Refresh
RETURN
***********
PROCEDURE _Nhan_huy
PARAMETERS _N_H
SELECT Dmnhnv
IF _N_H = [H]
USE IN Dmnhnv
USE (P_Cod + [Dmnhnv]) ORDER STT ALIAS Dmnhnv IN 0
RETURN
ENDIF
M.Nh_nv2 = Dmnhnv.Manh
_SCX.TXTTennh.Value = Dmnhnv.Tennh
_ObjectCT.REFRESH
USE IN Dmnhnv
USE (P_Cod + [Dmnhnv]) ORDER STT ALIAS Dmnhnv IN 0
RETURN
ENDPROC
Thủ tục tính lương hàng tháng
*!* =============== Procedure: Tinhluong ===================*
CLOSE TABLES ALL
PUBLIC M.Nhan
M.Nam = YEAR(DATE())
M.Thang = MONTH(DATE())
M.Hsl = 290000
m.Luong_cb = 290000 &&M_hsl
M.hsbh = 5
M.hsyt = 1
DO FORM (P_SCREEN + [Tinhluong])
IF M.Nhan = 0
RETURN
ENDIF
USE (P_COD + [Dmnv] ) ORDER Manv ALIAS Dmnv IN 0
USE (P_COD + [Dmnhnv]) ORDER Stt ALIAS Dmnhnv IN 0
USE (P_COD + [Dmtd]) ORDER Matd ALIAS Dmtd IN 0
USE (P_COD + [Dmct]) ORDER STTVALID ALIAS Dmct IN 0
USE (P_COD + [Dmtx]) ORDER Matx ALIAS Dmtx IN 0
USE (P_DATA + [CTLUONGT]) ORDER STT3 ALIAS CTLUONGT IN 0
WAIT WINDOW NOWAIT [§ang tÝnh...]
SELECT Dmtx
SET FILTER TO Thang = M.Thang AND Nam = M.Nam
SELE CTLUONGT
SET FILTER TO Thang = M.Thang AND Nam = M.Nam
SET RELATION TO Matx INTO Dmtx
REPLACE ALL Gia_Nvbv WITH Dmtx.Gia_Nvbv ,;
Gia_Laixe WITH Dmtx.Gia_Laixe,;
Gia_Tknl WITH Dmtx.Gia_Tknl,;
Gia_Khac WITH Dmtx.Gia_Khac
SET RELATION TO
SET ORDER TO STT3
EEVALUATE()
SET FILTER TO
USE IN CTLUONGT
=MESSAGEBOX("Ch¬ng tr×nh ®· thùc hiÖn xong!")
RETURN
**************
FUNCTION EEVALUATE
LOCAL _STR
SELECT * FROM Dmct ;
WHERE Thang=M.Thang and Nam = M.Nam AND Nh_nv2 LIKE [ALL%];
ORDER BY Nam,Thang,STT ;
INTO TABLE (P_TEMP + [Temp3])
INDEX ON STR(Nam,4)+STR(Thang,2)+Nh_nv2 TAG STT
SET ORDER TO STT
GO TOP
SCAN REST WHILE STT < 4
_FIELDTT = ALLTR(Mact)
_CT = ALLTR(CT)
SELE CTLUONGT
REPL &_FIELDTT WITH TINHLUONG*ROUND(EVAL(_CT),-2) ALL
SELECT Temp3
ENDSCAN
SELECT DISTINCT Nam, Thang, Nh_nv2 ;
FROM CTLUONGT ;
WHERE Thang=M.Thang and Nam = M.Nam ;
ORDER BY Nam,Thang,Nh_nv2 ;
INTO TABLE (P_TEMP + [Temp4])
GO TOP
SCAN
_STR = STR(Temp4.Nam,4)+STR(Temp4.Thang,2)+Temp4.Nh_nv2
SELECT Dmct
IF SEEK(_STR)
COPY TO (P_TEMP + [Temp5]) REST WHILE STR(Nam,4)+STR(Thang,2)+Nh_nv2 = _STR
SELECT 0
USE (P_TEMP + [Temp5]) ALIAS Temp5 EXCL
INDE ON STR(Nam,4)+STR(Thang,2)+Nh_nv2 + STR(STT,3) TAG STT
SET ORDER TO STT
GO TOP
SCAN
_FIELDTT = ALLTR(Mact)
_CT = ALLTR(CT)
SELECT CTLUONGT
GO TOP
IF(SEEK(_STR))
REPL &_FIELDTT WITH TINHLUONG*ROUND(EVAL(_CT),-2) ;
REST WHILE STR(Nam,4)+STR(Thang,2)+Nh_nv2 = _STR
ENDIF
SELECT Temp5
ENDSCAN
USE IN Temp5
ELSE
ENDIF
SELECT Temp4
ENDSCAN
USE IN Temp4
SELECT Temp3
GO TOP
SCAN FOR STT > 3
_FIELDTT = ALLTR(Mact)
_CT = ALLTR(CT)
SELE CTLUONGT
REPL &_FIELDTT WITH TINHLUONG*ROUND(EVAL(_CT),-2) ALL
SELE Temp3
ENDSCA
USE IN Temp3
SELECT CTLUONGT
RETURN
Thủ tục cập nhât công thức tính lương hàng tháng
CLOSE TABLES ALL
PUBLIC M.Nhan
M.Nam = YEAR(DATE())
M.Thang = MONTH(DATE())
M.Nh_nv1 = ""
M.Matx_Old = ""
USE (P_COD + [Dmnhnv]) ORDER STT ALIAS Dmnhnv IN 0
USE (P_SYSTEM + [CHotso]) ORDER STT ALIAS Chotso IN 0
USE (P_COD + [Dmnv]) ORDER Manv ALIAS Dmnv IN 0
USE (P_COD + [Dmtx]) ORDER Matx ALIAS Dmtx IN 0
USE (P_DATA + [CTLUONGT]) ORDER STT2 ALIAS CTLUONGT IN 0
DO FORM (P_SCREEN + [Luong])
IF M.Nhan = 0
CLOSE TABLES ALL
RETURN
ENDIF
M.Mabp = M.Nh_nv1
M.Ngay = CTOD("01/"+STR(M.Thang,2)+"/"+STR(M.Nam,4))
M.ngay1 = M.ngay
IF SEEK(STR(M.Nam,4)+STR(M.Thang,2),[Chotso])
IF Chotso.VALUE = [1]
MESSAGEBOX([§· chèt sæ th¸ng ] + STR(M.THANG,2)+[/]+STR(M.NAM,4))
RETURN .F.
ENDIF
ENDIF
SELECT Dmnv
SELECT M.Nam AS Nam, ;
M.Thang AS Thang, ;
Manv,;
Nh_nv1,;
Nh_nv2,;
Nh_nv3,;
Matx, ;
Lcb_Hsc,;
Lcb_Hsm,;
1 as Nop_BHXH,;
1 as TinhLuong,;
1 as Moi;
FROM Dmnv ;
WHERE Manv NOT IN (SELECT Manv FROM CTLUONGT WHERE Nam = M.Nam AND Thang = M.Thang);
AND !EMPTY(Nh_nv1) ;
INTO TABLE (P_TEMP + [Temp1])
INDEX ON Nh_nv2 TAG Nh_nv2
SET RELATION TO ([2] + Nh_nv2) INTO Dmnhnv
SET RELATION TO Matx INTO Dmtx ADDITIVE
SET ORDER TO Nh_nv2
USE IN Temp1
SELECT CTLUONGT
APPEND FROM (P_TEMP + [Temp1])
WAIT CLEAR
SELECT *, SPACE(5) AS STT, SPACE(28) AS Tennv;
FROM CTLUONGT;
WHERE Nam = M.Nam AND Thang = M.Thang AND Nh_nv1=M.Nh_nv1 AND Nh_nv2=M.Nh_nv2 AND Matx =M.Matx;
ORDER BY CTLUONGT.Nh_nv1,CTLUONGT.Manv;
INTO TABLE(P_TEMP + [Temp2])
INDEX ON Manv TAG Manv
SET RELA TO Manv INTO Dmnv
REPLACE ALL Tennv WITH Dmnv.Tennv
SELECT Temp2
GO top
_Rec=0
SCAN
_Rec=_Rec+1
GO RECNO()
REPLACE STT WITH STR(_Rec,4)
ENDSCAN
GO TOP
ON KEY LABEL F3 DO Luong_F3 with [S]
ON KEY LABEL F4 DO Luong_F3 with [M]
ON KEY LABEL F8 DO Luong_F8
BROWSE FIELDS STT : 5, ;
Thang :H = [Th¸ng] : 5, ;
Manv :H = [M· NV] : 14, ;
Tennv :H = [Tªn NV] : 22, ;
Matx :H = [M· tuyÕn xe], ;
Nh_nv1 :H = [Bé phËn], ;
Nh_nv2 :H = [Chøc vô], ;
Lcb_Hsc :H = [HSL cò], ;
Lcb_Hsm :H = [HSL míi], ;
Ltg_Clv :H = [C«ng LV], ;
Ltg_Ccd :H = [C«ng C§], ;
Ltg_Cnlv :H = [C«ng NLV], ;
Ltg_Ckx :H = [C«ng Khac], ;
Ltg_Cl :H = [C«ng L], ;
Ltg_Cdf :H = [C«ng DF],;
Ltg_Tt :H = [L¬ng TG],;
Lcp_L :H = [CL P.Vu - Luot] ,;
Lcp_Lktl :H = [CL P.Vu - LKTL],;
Lcp_Tt :H = [L¬ng CLPV],;
Tg0_Cnl :H = [Thªm giê NL],;
Tg0_Ccn :H = [Thªm giê CN],;
Tg0_Cnt :H = [Thªm giê NT],;
Tg_Tt :H = [TiÒn LTG],;
Ptn_Pt :H = [% P.C TN],;
Ptn_Tt :H = [TiÒn P.C TN],;
Pc3_C :H = [P.C C3-Cg],;
Pc3_Tt :H = [TiÒn P.C C3],;
Kpt_Kpcd :H = [Kinh phÝ C§],;
Kpt_BHXH :H = [BHXH] ,;
Kpt_BHYT :H = [BHYT] ,;
Kpt_Tdtu :H = [§· t¹m øng],;
Kpt_Bttn :H = [Båi thêng TN],;
Kpt_Nolai :H = [Nî l¹i TT],;
Kpt_Tt :H = [Tæng tiÒn trõ],;
Ttk1_Tt :H = [Thëng TK-NL],;
Ttk2_Sl :H = [Lîng TK-NL],;
Ttk2_Tt :H = [TiÒn TK-NL],;
Cong_khac1:H = [Céng kh¸c 1], ;
Cong_khac2:H = [Céng kh¸c 2], ;
Cong_khac3:H = [Céng kh¸c 3], ;
Tru_khac1 :H = [Trõ kh¸c 1],;
Tru_khac2 :H = [Trõ kh¸c 2],;
Tru_khac3 :H = [Trõ kh¸c 3];
FONT [vn-sans-serif],8;
LOCK 4 ;
NAME oBrowse ;
TITLE "F3-Sua, F8-Xoa NV trong bang luong, Esc-Thoat";
NOMODIFY NOAPPEND NODELETE WINDOW WinBrw
ON KEY LABEL F3
ON KEY LABEL F4
ON KEY LABEL F5
ON KEY LABEL F8
USE IN CTLUONGT
USE IN Temp2
USE IN Dmnv
USE IN Dmnhnv
USE IN Dmtx
USE IN Chotso
POP KEY
RETURN
*~~~~~~~~~~~~~~ PROCEDURE LUONG_F3 ~~~~~~~~~~~~~~~~
PROCEDURE Luong_F3
PARAMETER _M_S
_InSELECT = SELECT()
_Recno = RECNO()
STORE _M_S TO _Moi_Sua
PUSH KEY CLEAR
IF RECNO() > RECCOUNT([Temp2])
POP KEY
SELECT (_InSelect)
RETURN
ENDIF
SELECT Temp2
IF _Moi_Sua = [M]
SCATTER MEMVAR MEMO
M.Nop_BHXH = 0
M.Matx_Old = M.Matx
ELSE
GO _Recno
SCATTER MEMVAR MEMO
M.tennv = IIF(SEEK(M.Manv,[Dmnv]), ALLTRIM(Dmnv.Tennv), [])
M.Tentx = IIF(SEEK(ALLTRIM(M.Matx),[Dmtx]), ALLTRIM(Dmtx.Tentx), [])
M.Ten_Nh_nv1=IIF(SEEK([1]+M.Nh_nv1,[Dmnhnv]), ALLTRIM(Dmnhnv.Tennh),[])
M.Ten_Nh_nv2=IIF(SEEK([2]+M.Nh_nv2,[Dmnhnv]), ALLTRIM(Dmnhnv.Tennh),[])
M.Ten_Nh_nv3=IIF(SEEK([3]+M.Nh_nv3,[Dmnhnv]), ALLTRIM(Dmnhnv.Tennh),[])
ENDIF
ON KEY LABEL F10 KEYBOARD CHR(23)
DO FORM (P_Screen + [Luong_F3]) NAME _SCX LINKED
ON KEY LABEL F10
POP KEY
IF _Moi_Sua = [S] THEN
IF MESSAGEBOX("Cã nhËp tiÕp kh«ng?",4+32+256,"Chu y") 6
RETURN .T.
ELSE
IF !EOF()
SKIP
DO Luong_F3 with _M_S
ELSE
MESSAGEBOX("§· ®Õn dßn cuèi cïng!",0+64,"Chu y")
ENDIF
ENDIF
ENDIF
SELECT (_InSelect)
RETURN
*~~~~~~~~~~~~~~~~ PROCEDURE _Nhan ~~~~~~~~~~~~~~~~~~~ *
FUNCTION _Nhan
PARAMETERS M_Nhan
SELECT Temp2
IF LASTKEY()=27 OR M_Nhan 1
IF _RecNo <= RECCOUNT([Temp2])
GO _RecNo
_SCX = ""
ENDIF
_SCX = ""
RETURN .T.
ELSE
IF M_Nhan = 1
IF EMPTY(ALLTRIM(M.Nh_nv1))
=MESSAGEBOX("Nhãm NV1 kh«ng ®îc ®Ó trèng",0+48),"Chu y")
SELECT Temp2
GO _RecNo
RETURN
ENDIF
M.User_id = M.Name
M.Date = DATE()
M.Time = TIME()
DO CASE
CASE _Moi_Sua = [S]
SELECT Temp2
GO _RecNo
GATHER MEMVAR
FLUSH
SELECT CTLUONGT
SET ORDER TO STT2
IF SEEK(STR(M.Thang,2) +STR(M.Nam,4)+M.Manv+M.Matx)
GATHER MEMVAR
FLUSH
ENDIF
CASE _Moi_Sua = [M]
SELECT Temp2
IF M.Matx= M.Matx_Old then
MESSAGEBOX([M· tuyÔn xe míi trïng m· tuyÕn xe cò] + chr(10)+chr(13) + [Kh«ng lu ®îc !],48)
RETURN .F.
ENDIF
GO _RecNo
INSERT BLANK
GATHER MEMVAR MEMO
FLUSH
SELECT CTLUONGT
SET ORDER TO STT2
IF SEEK(STR(M.Thang,2) +STR(M.Nam,4)+M.Manv+M.Matx_Old)
APPEND BLANK
GATHER MEMVAR MEMO
REPL Nop_BHXH WITH 0
FLUSH
ENDIF
ENDCASE
_SCX = ""
REPL MOI WITH 5
UNLOCK IN CTLUONGT
ENDIF
ENDIF
SELECT Temp2
RETURN .T.
*~~~~~~~~~~~~~~~~~ PROCEDURE Luong_F8 ~~~~~~~~~~~~~~~~~~
PROCEDURE Luong_F8
SELECT Temp2
IF RECNO() > RECCOUNT([CTLUONGT])
RETURN .T.
ENDIF
SCATTER MEMVAR MEMO
_RecNo = RECNO()
IF (MESSAGEBOX('Cã ch¾c ch¾n xãa kh«ng?',4+32+256,'Chu y') 6)
GO _Recno
RETURN
ENDIF
M.Time = Time()
M.Date = DATE()
M.User_Id = M.Name
M.Status="*"
SET OPTIMIZE ON
SET EXCLUSIVE ON
SET MULTILOCKS ON && Must be on for table buffering
= CURSORSETPROP('Buffering', 5, 'Temp2' )
GATHER MEMVAR
FLUSH
DELETE
SKIP
TABLEUPDATE(.T.)
SELECT CTLUONGT
SET ORDER TO STT2
IF SEEK(ALLTRIM(STR(M.Thang,2)) +ALLTRIM(STR(M.Nam,4)) +ALLTRIM(M.Manv)+ALLTRIM(M.Matx))
GATHER MEMVAR
FLUSH
DELETE
SKIP
ENDIF
= CURSORSETPROP('Buffering',1, 'Temp2' )
SET EXCLUSIVE OFF
SET MULTILOCKS OFF
SELECT Temp2
RETURN .T.
*!*
PROCEDURE _CHK_LG
PARAM _ObjectLG,_sort
M.Ma = UPPER(EVAL(_ObjectLG.Controlsource))
IF USED([Dmnhnv])
SELECT Dmnhnv
ELSE
USE (P_Cod + [Dmnhnv]) ORDER Stt ALIAS Dmnhnv IN 0
ENDIF
IF USED([Dmtx])
SELECT Dmtx
ELSE
USE (P_Cod + [Dmtx]) ORDER Matx ALIAS Dmtx IN 0
ENDIF
DO CASE
CASE _sort = 1
SET FILTER TO Loainh = 1 IN Dmnhnv
CASE _sort = 2
SET FILTER TO Loainh=2 AND Manh"ALL" IN Dmnhnv
CASE _sort = 3
SET FILTER TO Loainh = 3 IN Dmnhnv
ENDCASE
ON KEY LABEL ENTER do _Nhan_huy with [N]
ON KEY LABEL ESC do _Nhan_huy with [H]
IF _sort 4
SELECT Dmnhnv
BROWSE FIELDS Manh :H = [M· nhãm],;
Tennh :H = [Tªn nhãm];
TITLE "ENTER-Nhan, ESC-Thoat" FONT [Vn-sans-serif], 8 NOAPPEND NOMODIFY NODELETE NAME OBrow1
ELSE
SELECT Dmtx
BROWSE FIELDS Matx :H = [M· tuyÕn xe],;
Tentx :H = [Tªn tuyÕn xe];
TITLE "ENTER-Nhan, ESC-Thoat" FONT [Vn-sans-serif], 8 NOAPPEND NOMODIFY NODELETE NAME OBrow2
ENDIF
ON KEY LABEL ENTER
ON KEY LABEL ESC
_ObjectLG.VALUE= M.Ma
_ObjectLG.Refresh
IF !USED([Dmnhnv])
USE (P_Cod + [Dmnhnv]) ORDER Stt ALIAS Dmnhnv IN 0
ENDIF
IF !USED([Dmtx])
USE (P_Cod + [Dmtx]) ORDER Matx ALIAS Dmtx IN 0
ENDIF
RETURN
*************
PROCEDURE _Nhan_huy
PARAMETERS _N_H
IF _N_H = [H]
IF _sort 4
USE IN Dmnhnv
RETURN
ELSE
USE IN Dmtx
RETURN
ENDIF
ENDIF
IF _sort 4
M.Ma = Dmnhnv.Manh
_ObjectLG.REFRESH
USE IN Dmnhnv
ELSE
M.Ma = Dmtx.Matx
_ObjectLG.REFRESH
USE IN Dmtx
ENDIF
FLUSH
RETURN
ENDPROC
Thủ tục lên báo cáo thanh toán lương hàng tháng
*!* **********************************************************
*!* Bao cao thanh toan luong hang thang
*!* **********************************************************
CLOSE TABLES ALL
USE (P_COD + [Dmnhnv]) ORDER STT ALIAS Dmnhnv IN 0
USE (P_COD + [Dmnv]) ORDER Manv ALIAS Dmnv IN 0
USE (P_COD + [Dmtx]) ALIAS Dmtx IN 0
USE (P_DATA + [CTLUONGT]) ORDER STT ALIAS Ctluongt EXCLUSIVE IN 0
M.Nh_nv2 =UPPER(ALLTR(M.Nh_nv2))
_F=[]
_File_Name = [BTTLuong]
M.Nhan = 1
M.Nam = YEAR(DATE())
M.Nam1 = YEAR(DATE())
M.Thang = MONTH(DATE())
M.Thang1= MONTH(DATE())
DO FORM (P_SCREEN + "BTTLuong") NAME _SCX LINKED
IF M.Nhan = 0
RETURN
ENDIF
M_Ngay1 = CTOD("01/"+STR(M.thang,2)+"/"+STR(M.Nam,4))
M_Ngay2 = CTOD("01/"+STR(M.thang1,2)+"/"+STR(M.nam1,4))
MyQuery = [,Tong_Luong,Kpt_Tdtu AS Tam_Ung,Kpt_Bttn AS Bttn,Kpt_Kpcd AS Kpcd,Kpt_Bhyt AS Bhyt,Tru_Khac + Tru_Khac1+ Tru_Khac2 AS Thu_Khac,Cong_Khac + Cong_Khac1 + Cong_Khac2 AS Cong_Khac,Kpt_TruNo AS Thu_No_Lai,Kpt_Nolai AS No_Lai,Tien_Linh AS Con_Linh]
_MyQuery = [,Tong_Luong, Tam_Ung, Bttn, Kpcd, Bhyt, Thu_No_Lai, Thu_Khac, Cong_Khac, No_Lai, Con_Linh]
__TCUOI = STRTRAN(_MyQuery,[,],[,M.])
qr_Lcb = [,Lcb_Hsc,Lcb_Hsm,Lcb_Tt] && Luong co ban
_FLcb = [,Lcb_Hsc,Lcb_Hsm,Lcb_Tt]
__TLcb = [,M.Lcb_Tt]
qr_Ltg_Vp = [,Ltg_Clv,Ltg_Ccd,Ltg_Tt,Ltg_Lcdtt,Ltg_Llvtt] && Luong thoi gian
_qr_Ltg_Vp =[,Ltg_Clv,Ltg_Ccd,Ltg_Tt,Ltg_Lcdtt,Ltg_Llvtt]
__TLtg_Vp = STRTRAN(_qr_Ltg_Vp,[,],[,M.])
qr_Ltg_Lx = [,Ltg_Cnlv,Ltg_Ckx,Ltg_Cl,Ltg_Cdf,Ltg_Tt]
_qr_Ltg_Lx =[,Ltg_Cnlv,Ltg_Ckx,Ltg_Cl,Ltg_Cdf,Ltg_Tt]
__TLtg_Lx = STRTRAN(_qr_Ltg_Lx ,[,],[,M.])
qr_Ltg_Sc = [,Ltg_Clv,Ltg_Ccd,Ltg_Tt]
_qr_Ltg_Sc=[,Ltg_Clv,Ltg_Ccd,Ltg_Tt]
__TLtg_Sc = STRTRAN(_qr_Ltg_Sc,[,],[,M.])
qr_Lcp=[,Lcp_L,Lcp_Lktl,Lcp_Lktltt,Lcp_Tt,Tien_Tn,Ttk1_Tt] && Luong chat luong phuc vu
_qr_Lcp=[,Lcp_L,Lcp_Lktl,Lcp_Lktltt,Lcp_Tt,Tien_Tn,Ttk1_Tt]
__TLcp = STRTRAN(+_qr_Lcp,[,],[,M.])
qr_Lsp=[,Lsp_C,Lsp_Tt] && Luong chat luong phuc vu
_qr_Lsp=[,Lsp_C,Lsp_Tt]
__TLsp = STRTRAN(+_qr_Lsp,[,],[,M.])
qr_Tg = [,Tg_Cnl,Tg_Ccn,Tg_Cnt,Tg_Tt] && Luong them gio
_qr_Tg =[,Tg_Cnl,Tg_Ccn,Tg_Cnt,Tg_Tt]
__TTg = STRTRAN(_qr_TG,[,],[,M.])
qr_Pc3=[,Pc3_C,Pc3_Tt] && Phu cap Ca 3
_qr_Pc3=[,Pc3_C,Pc3_Tt]
__TPc3 = STRTRAN(_qr_Pc3,[,],[,M.])
qr_Ptn=[,Ptn_Pt,Ptn_Tt] && Phu cap that nghiep
_qr_Ptn =[,Ptn_Pt,Ptn_Tt]
__TPtn = STRTRAN(_qr_Ptn,[,],[,M.])
qr_At=[,At_Tt] && Tien an trua
_qr_At=[,At_Tt]
__TAt= STRTRAN(_qr_At,[,],[,M.])
qr = qr_Lcb
_F=_FLcb
__T=__TLcb
DO CASE
CASE M.Nh_nv2 = [LAIXE] OR M.Nh_nv2 = [BANVE]
qr = qr + qr_Ltg_Lx + qr_Lcp
_F=_F+_qr_Ltg_Lx+_qr_Lcp
__T=__T+__TLtg_Lx+__TLcp
_file_Name = _file_Name + [Lx]
CASE M.Nh_nv2 = [VANPHONG]
qr = qr + qr_Ltg_Vp + qr_Pc3 + qr_Ptn + qr_Tg
_F=_F+_qr_Ltg_Vp+_qr_Pc3+_qr_Ptn+_qr_Tg
__T=__T+__TLtg_Vp+__TPc3+__TPtn+__Ttg
_file_Name = _file_Name + [Vp]
CASE M.Nh_nv2 = [BAOVE]
qr = qr + qr_Ltg_Vp + qr_Pc3 + qr_Ptn + qr_Tg
_F=_F+_qr_Ltg_Vp+_qr_Pc3+_qr_Ptn+_qr_Tg
__T=__T+__TLtg_Vp+__TPc3+__TPtn+__Ttg
_file_Name = _file_Name + [BV]
CASE M.Nh_nv2 = [SUACHUA]
qr = qr + qr_Ltg_Sc + qr_Lsp+ qr_Ptn + qr_Tg
_F=_F+_qr_Ltg_Sc+_qr_Lsp+_qr_Ptn+_qr_tg
__T=__T+__TLtg_Sc+__TLsp+__TPtn+__Ttg
_file_Name = _file_Name + [SC]
CASE M.Nh_nv2 = [VSPT]
qr = qr + qr_Ltg_Sc + qr_Ptn + qr_Tg
_F=_F+_qr_Ltg_Sc+_qr_ptn+_qr_tg
__T=__T+__TLtg_Sc+__TPtn+__Ttg
_file_Name = _file_Name + [VSPT]
OTHERWISE
ENDCASE
qr = qr + qr_AT + MyQuery
_F=_F+_qr_AT+_MyQuery
__T=SUBSTR(__T,2,LEN(__T))+__TAT+__TCuoi
__T2=STRTRAN(__T,[,M.],[,M_])
_T=SUBSTR(STRTRAN(__T,[,M.],[,]),3,LEN(__T))
SELECT ;
Manv,Nh_nv1,Nh_nv2,Nh_nv3,Matx;
&qr;
FROM Ctluongt ;
WHERE Nh_nv1=M.Nh_nv1 AND;
Nh_nv2=M.Nh_nv2 AND;
Nh_nv3=M.Nh_nv3 AND ;
Matx=M.Matx AND ;
IIF(M.Nam==M.Nam1,;
(Nam=M.Nam AND BETWEEN(Thang,M.Thang,M.Thang1)),;
((Nam=M.Nam AND BETWEEN(Thang,M.Thang,12)) OR (Nam=M.Nam1 AND BETWEEN(Thang,1,M.Thang1))));
GROUP BY Manv, Nh_nv1,Nh_nv2,Nh_nv3;
ORDER BY Manv, Nh_nv1,Nh_nv2,Nh_nv3;
INTO TABLE (P_TEMP + "Temp6")
PUBLIC &__T2
SUM &_T TO &__T
SUM &_T TO &__T2
SELECT ;
SPACE(5) AS STT,SPACE(50) AS Tennv, *;
FROM Temp6 ;
GROUP BY Manv ;
ORDER BY Manv ;
INTO TABLE (P_TEMP + _File_name)
INDEX ON Manv TAG Manv
SET RELATION TO Manv INTO Dmnv
REPLACE ALL Tennv WITH Dmnv.Tennv
GO TOP
_Rec=0
SCAN
_Rec=_Rec+1
GO RECNO()
REPLACE STT WITH STR(_Rec,3)
ENDSCAN
SET RELATION TO
_ERR = ON([ERROR])
ON ERROR *
APPEN BLANK
GATHER MEMVAR
ON ERROR &_ERR
REPLACE Tennv WITH [Tæng céng],STT WITH STR(0,3)
APPEN BLANK
INDEX ON STT + Manv TAG STT
USE IN Temp6
USE IN &_File_name
USE IN Dmnhnv
USE IN Dmnv
USE IN CTLUONGT
IF M.Thang==M.Thang1 AND M.Nam==M.Nam1
_TITLE = [Bang thanh toan luong thang ] + ALLTRIM(STR(M.Thang)) +[/]+ALLTRIM(STR(M.Nam))
ELSE
_TITLE = [Bang thanh toan luong tu thang ]+ ALLTRIM(STR(M.Thang))+[/]+ALLTRIM(STR(M.Nam))+
[ den thang ] + ALLTRIM(STR(M.Thang1))+[/]+ALLTRIM(STR(M.Nam1))
ENDIF
SELECT 0
USE (P_TEMP + _file_Name) ORDER STT
ON KEY LABEL F7 DO Print
BROWSE FIELDS STT:5,Tennv :H=[Tªn nh©n viªn] :25 &_F; FONT [vn-sans-serif],8;
NAME ObjBrowse ;
NOMODIFY NOAPPEND NODELETE NOMENU WINDOW WinBrw;
LOCK 2;
TITLE _TITLE + [. F7-In,ESC-Thoat]
ON KEY LABEL F7&& DO Pr_report
RETURN
*************
PROCEDURE Print
_CLIPTEXt = A_Report(l_report, 3)
A_Report(l_report, 3) = _FILE_REPO
Set filter to VAL(STT) > 0
DO PR_REPORT WITH .F.
Set filter to
ENDPROC
PHỤ LỤC 2
Tài liệu tham khảo
1. ThS. Trần Công Uẩn
Giáo trình Cơ sở dữ liệu SQL, Access, NXB Thống kê, Hà Nội, 2000.
2. TS. Trương Văn Tú – TS. Trần Thị Song Minh
Giáo trình Hệ thống thông tin quản lý, NXB Thống kê, Hà Nội, 2000.
3. KS. Đinh Xuân Lâm, Vn-Guide
Kế toán doanh nghiệp với Visual Foxpro, phân hệ kế toán lương, NXB Thống kê, Hà Nội, 2004.
4. TS. Trần Thị Song Minh
Giáo trình Kế toán máy, NXB Lao động – Xã hội, Hà Nội, 2005.
5. TS. Nguyễn Văn Ba
Phân tích và thiết kế hệ thống thông tin - các phương pháp có cấu trúc, NXB Đại học quốc gia Hà Nội, Hà Nội, 2005.
6. KS. Đinh Xuân Lâm, Vn-Guide
Những bài thực hành Visual Foxpro, NXB Thống kê, Hà Nội, 2004.
7. Văn bản của Phòng Lao động – tiền lương – hành chính, Xí nghiệp Xe buýt Hà Nội.
8. Bộ Tài chính
Thông tư số 103/2005/TT-BTC – Hướng dẫn tiêu chuẩn và điều kiện của phần mềm kế toán.
Các file đính kèm theo tài liệu này:
- Phân tích, thiết kế và xây dựng hệ thống tính lương cho Xí nghiệp Xe buýt Hà Nội.docx