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

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

docx135 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2634 | Lượt tải: 2download
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 l­u ®­î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:

  • docxPhâ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