Nguyên vật liệu chính của quá trình sản xuất là các loại vật liệu thép ở dạng thép cuộn như vật liệu thép 0.8 ly, vật liệu thép 0.9 ly, vật liệu thép 1.2 ly và các loại vật liệu phụ như hợp kim nhôm, chất hãm axit, ôxi già, kẽm Có tất cả 27 loại vật liệu thép, mỗi loại được dùng để tạo ra một nhóm bán thành phẩm thép bản rộng nên có 27 nhóm bán thành phẩm với tổng số 330 loại. Từ bán thành phẩm sẽ sản xuất ra 281 loại ống đen, tiếp tục sản xuất ống đen thành 76 loại ống mạ.
Hiện tại, công ty có 5 kho: kho ống mạ, kho ống đen, kho bán thành phẩm, kho vật liệu thép và kho vật liệu phụ
110 trang |
Chia sẻ: haianh_nguyen | Lượt xem: 1474 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đề tài Xây dựng phân hệ kế toán tập hợp chi phí sản xuất và tính giá thành sản xuất tại công ty TNHH ống thép Hòa Phát, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
154 và 621 được mở tiểu khoản theo nhóm vật tư, các tài khoản 622 và 627 được mở tiểu khoản theo từng công đoạn sản xuất.
Cách thức phân bổ chi phí
Nói chung, khi xuất nguyên vật liệu chính cũng như các chi phí sản xuất khác cho sản xuất sản phẩm, chỉ biết tổng số xuất và xuất cho công đoạn nào mà không biết cụ thể cho từng loại sản phẩm. Do đó, để tính được giá thành thực tế của sản phẩm, phải phân bổ chi phí cho từng loại sản phẩm theo định mức về số lượng nguyên vật liệu chính tương ứng đã xác định trước khi bắt đầu tháng sản xuất.
Công thức phân bổ:
Ví dụ, đầu kì có định mức vật liệu X (đơn vị tính: kilogam) cho sản xuất 2 loại sản phẩm như sau: 1 Sản phẩm A cần 10 kg vật liệu X 1 Sản phẩm B cần 15 kg vật liệu X
Cuối kì tính được tổng giá trị vật liệu X xuất dùng trong kì để sản xuất sản phẩm A và sản phẩm B là 5 000 000, hoàn thành nhập kho 1300 sản phẩm A và 800 sản phẩm B. Khi đó, phân bổ vật liệu X cho sản xuất từng loại sản phẩm là:
sản phẩm A:
sản phẩm B:
Các chi phí khác như chi phí vật liệu phụ, chi phí sản xuất chung, nhân công…nếu không tính được trực tiếp cho từng đối tượng thì phân bổ theo chi phí nguyên vật liệu chính. Coi như không có sản phẩm dở dang và không có hao hụt nên toàn bộ chi phí được tính vào sản phẩm của từng công đoạn.
Tính giá thành của bán thành phẩm
Sơ đồ hạch toán:
Các nghiệp vụ trong tháng:
(1): Khi xuất vật liệu thép để sản xuất bán thành phẩm, ghi:
Nợ TK 6210 Có TK 1521
Biết rõ xuất vật liệu thép để sản xuất loại bán thành phẩm nào nên có thể tính trực tiếp chi phí vật liệu chính cho từng đối tượng mà không cần phân bổ (2): Khi xuất vật liệu phụ để sản xuất bán thành phẩm, ghi:
Nợ TK 6210 Có TK 1522
(3): Cuối tháng, tính ra tiền lương và các khoản phải trả công nhân trực tiếp sản xuất:
Nợ TK 6220 Có TK 334,338…
(4): Tập hợp hợp chi phí sản xuất chung trong tháng:
Nợ TK 6270 Có TK 214,334…
Các bút toán kết chuyển cuối tháng:
(5): Kết chuyển chi phí nguyên vật liệu trực tiếp.
Nợ TK 1540 Có TK 6210
(6): Kết chuyển chi phí nhân công trực tiếp
Nợ TK 1540 Có TK 6220
(7): Kết chuyển chi phí sản xuất chung
Nợ TK 1540 Có TK 6270
(8): Tính ra giá thành bán thành phẩm nhập kho
Nợ TK 1550 Có TK 1540
Tính giá thành ống đen
Sơ đồ hạch toán:
Các nghiệp vụ trong tháng:
(1): Khi xuất bán thành phẩm để sản xuất ống đen, ghi:
Nợ TK 6211 Có TK 1550
Xuất chung chung, không chỉ rõ xuất cho từng loại là bao nhiêu nên cuối kì phải tiến hành phân bổ như đã trình bày ở trên
(2): Khi xuất vật liệu phụ để sản xuất ống đen, ghi:
Nợ TK 6211 Có TK 1522
(3): Cuối tháng, tính ra tiền lương và các khoản phải trả công nhân trực tiếp sản xuất:
Nợ TK 6221 Có TK 334,338…
(4): Tập hợp hợp chi phí sản xuất chung trong tháng:
Nợ TK 6271 Có TK 214,334… Sau khi phân bổ chi phí, thực hiện các bút toán kết chuyển cuối tháng:
(5): Kết chuyển chi phí nguyên vật liệu trực tiếp
Nợ TK 1541 Có TK 6211
(6): Kết chuyển chi phí nhân công trực tiếp
Nợ TK 1541 Có TK 6221
(7): Kết chuyển chi phí sản xuất chung
Nợ TK 1541 Có TK 6271
(8): Tính ra giá thành ống đen nhập kho
Nợ TK 1551 Có TK 1541
Tính giá thành ống mạ Sơ đồ hạch toán:
Các nghiệp vụ trong tháng:
(1): Khi xuất ống đen để sản xuất ống mạ, ghi:
Nợ TK 6212 Có TK 1551
Xuất chung chung, không chỉ rõ xuất cho từng loại là bao nhiêu nên cuối kì phải tiến hành phân bổ như đã trình bày ở trên
(2): Khi xuất vật liệu phụ để sản xuất ống mạ, ghi:
Nợ TK 6212 Có TK 1522
(3): Cuối tháng, tính ra tiền lương và các khoản phải trả công nhân trực tiếp sản xuất:
Nợ TK 6222 Có TK 334,338…
(4): Tập hợp hợp chi phí sản xuất chung trong tháng:
Nợ TK 6272 Có TK 214,334…
Các bút toán kết chuyển cuối tháng:
(5): Kết chuyển chi phí nguyên vật liệu trực tiếp
Nợ TK 1542 Có TK 6212
(6): Kết chuyển chi phí nhân công trực tiếp
Nợ TK 1542 Có TK 6222
(7): Kết chuyển chi phí sản xuất chung
Nợ TK 1542 Có TK 6272
(8): Tính ra giá thành ống mạ nhập kho
Nợ TK 1552 Có TK 1542
Để tính giá thành đơn vị, kế toán phải tập hợp tất cả các phiếu nhập kho để tính số lượng sản phẩm hoàn thành nhập kho của từng loại.
4.Sơ đồ luồng thông tin của hệ thống hiện tại
Chứng từ bao gồm các loại chứng từ vật tư như phiếu xuất kho, phiếu nhập kho và các chứng từ kế toán như phiếu chi tiền mặt (trong trường hợp mua vật tư dùng luôn cho sản xuất mà không nhập vào kho vật tư), các phiếu kế toán, các bút toán phân bổ. Dưới đây là một số mẫu chứng từ đang dùng tại công ty:
Phiếu chi:
Phiếu xuất kho:
Mẫu sổ nhật kí chung:
Mẫu sổ cái tài khoản:
Mỗi dòng trong sổ cái tương ứng với hai dòng trong sổ nhật kí chung
Công việc tính giá thành được thực hiện sau khi tiến hành phân bổ và kết chuyển các chi phí sản xuất, bao gồm tính tổng giá thành và giá thành đơn vị của từng loại sản phẩm. Các báo cáo về chi phí và giá thành được lập ra không chỉ dựa vào kết quả tính giá thành mà còn dựa vào các kết quả trung gian có được khi tiến hành phân bổ các loại chi phí.
Các báo cáo chi phí giá thành đang được dùng tại công ty bao gồm:
1. Bảng kê chứng từ theo sản phẩm 2. Tổng hợp phát sinh theo sản phẩm 3. Sổ chi tiết tài khoản 154 4. Phân tích giá thành 5. Phân tích hiệu quả kinh doanh cho từng loại sản phẩm 6. Tổng hợp chi phí theo khoản mục 7. Báo cáo chi tiết chi phí theo khoản mục 8. Bảng kê chi phí theo khoản mục 9. Báo cáo nguyên vật liệu trong giá thành 10.Báo cáo nguyên vật tồn liệu trên phân xưởng 11.Báo cáo tổng hợp chi phí giá thành 12.Báo cáo phân bổ nguyên vật liệu 13.Báo cáo phân bổ chi phí sản xuất chung vầ chi phí nhân công Dưới đây là một số mẫu báo cáo:
5.Sơ đồ luồng dữ liệu của hệ thống hiện tại
Sơ đồ luồng dữ liệu mức 0:
Sơ đồ luồng dữ liệu mức 1:
Phân rã xử lý 3.0
Phân rã xử lý 2.0
Sơ đồ luồng dữ liệu mức 2:
Phân rã xử lý 2.4:
6.Vấn đề của hệ thống tính giá thành hiện tại
Vấn đề
Mất rất nhiều thời gian để lập báo cáo về chi phí và giá thành, không lập được tất cả các báo cáo cần thiết
Không tính được giá thành từng loại sản phẩm trong nhóm sản phẩm mà chỉ tính được giá thành của nhóm từ đó quy đổi ra giá thành sản phẩm từng loại theo tỉ lệ xác định trước, do đó không chính xác.
Nguyên nhân
Việc tập hợp chi phí sản xuất ở công ty khá phức tạp do quy trình sản xuất sản phẩm trải qua các công đoạn với nhiều đối tượng tính giá thành.
Số lượng chứng từ lớn, nhiều nghiệp vụ phát sinh trong khi chỉ có một người đảm nhiệm với phương pháp thủ công.
Nhiều đối tượng tập hợp chi phí và nhiều đối tượng tính giá thành nên phải mở nhiều sổ chi tiết để theo dõi
Tính toán phải trải qua nhiều bước với khối lượng lớn, để tính được giá thành của giai đoạn này phải tính được giá thành của công đoạn trước đó
Mong muốn của người làm kế toán sản xuất
Tính giá thành bằng cách dùng phần mềm kế toán như các phân hệ kế toán khác đang dùng để có thể giải quyết được những vấn đề nêu trên, có thể nhanh chóng kết xuất các báo cáo chi phí và giá thành chi tiết cho từng loại sản phẩm. Chuyển phương pháp tính giá vốn hàng xuất kho từ trung bình di động sang trung bình tháng
Giải pháp tổng thể
Tin học hóa hệ thống tính giá thành bằng cách xây dựng phân hệ kế toán tập hợp chi phí sản xuất và tính giá thành sản phẩm trong phần mềm kế toán đang dùng. Tích hợp cơ sở dữ liệu của hệ thống này vào cơ sở dữ liệu của hệ thống thông tin kế toán, có thể sử dụng các kết quả của các phân hệ khác.
ii.thiết kế logic
1.Sơ đồ luồng dữ liệu mới
Sơ đồ luồng dữ liệu mức 0:
Sơ đồ luồng dữ liệu mức 1: Phân rã xử lý 3.0
Sơ đồ luồng dữ liệu mức 2
Phân rã xử lý 3.2:
Phân rã xử lý 3.4:
2.Sơ đồ luồng thông tin mới
3.Thiết kế cơ sở dữ liệu logic
Giải thích một số từ ngữ
Trong phần này những từ ngữ dưới đây được hiểu như sau:
Chứng từ: bao gồm các loại chứng từ vật tư như phiếu xuất kho, phiếu nhập kho, chứng từ kế toán như phiếu chi, phiếu kế toán, các bút toán phân bổ… hay nói chung là tất cả các nghiệp vụ kinh tế cần định khoản.
Đối tượng: những đối tượng công nợ của nghiệp vụ kinh tế phát sinh như người mua, người bán, người nhận tiền…
Vật tư: không chỉ bao gồm các loại nguyên vật liệu ban đầu của quá trình sản xuất mà còn bao gồm các loại bán thành phẩm và các loại thành phẩm thép ống đen vì chúng lại được dùng làm nguyên vật liệu cho giai đoạn sản xuất tiếp theo
Sản phẩm: không chỉ bao gồm các loại sản phẩm cuối cùng mà bao gồm tất cả các loại thành phẩm và bán thành phẩm.
Tài khoản giá thành: là tài khoản dùng để tổng hợp tất cả các loại chi phí theo từng đối tượng tính giá thành
Mối quan hệ giữa các thực thể của hệ thống tính giá thành:
Chứng từ của hệ thống tính giá thành có nhiều loại nhưng có thể lưu trong cùng một tệp số liệu gọi là tệp chứng từ bởi vì có thể chia các phần tử thông tin trên mỗi chứng từ thành hai nhóm: nhóm chung (ví dụ: số chứng từ, ngày…) và nhóm chi tiết (ví dụ: mã vật tư, số lượng…). Khi định khoản, mỗi dòng của phần chi tiết chứng từ sẽ tương ứng với một cặp tài khoản Nợ – Có trong sổ nhật kí chung và trong sổ cái.
Mỗi sản phẩm thuộc về một tài khoản giá thành nhưng mỗi tài khoản giá thành có thể bao gồm nhiều sản phẩm (vì những sản phẩm này tuy khác loại nhưng có chung giá thành).
Một sản phẩm có thể được sản xuất từ nhiều loại vật liệu chính đồng thời một loại vật liệu chính có thể được dùng để sản xuất nhiều loại sản phẩm. Giữa sản phẩm và vật liệu chính xác định một định mức về số lượng vật liệu chính
Sơ đồ thực thể quan hệ
Sơ đồ thực thể quan hệ trên có 6 thực thể và 2 mối quan hệ N@M nên cơ sở dữ liệu logic bao gồm 8 tệp
Sơ đồ cấu trúc dữ liệu
iii.thiết kế vật lý ngoài
1.Các màn hình nhập số liệu:
Thêm tài khoản
Thêm nhóm vật tư
Thêm vật tư
Thêm phiếu chi
Thêm phiếu xuất
Thêm định mức vật liệu chính:
Phân bổ chi phí vật liệu chính
Phân bổ các chi phí còn lại
Tính giá thành
Lựa chọn báo cáo
2.Trình tự các thao tác tính giá thành
Để tính được giá thành một cách chính xác, người sử dụng cần thực hiện các thao tác theo đúng trình tự sau:
Hàng ngày, cập nhật các chứng từ liên quan. Đối với các phiếu xuất kho, nếu chọn “Tự động áp giá xuất” thì chỉ cần nhập số lượng vật tư bởi vì theo phương pháp trung bình tháng: đến cuối tháng mới tính ra giá thực tế của vật tư xuất kho. Khi tính giá vốn, chương trình sẽ tự động áp đơn giá vào các phiếu xuất kho đã nhập.
Cuối tháng, đối với từng công đoạn sản xuất thực hiện các bước sau:
Tính giá vốn hàng xuất kho
Phân bổ chi phí
Tính giá thành
Sau khi tính xong giá thành (của một công đoạn), quay trở lại bước tính giá vốn (tính cho công đoạn tiếp theo). Hình minh họa trình tự tính giá thành:
Sau khi thực hiện xong các bước trên mới có thể xem và in các báo cáo về chi phí - giá thành
Màn hình chính:
Các nghiệp vụ cuối tháng
Báo cáo chi phí-giá thành
iv.thiết kế vật lý trong
1.Thiết kế cơ sở dữ liệu vật lý trong
Gộp tất cả các loại thành phẩm, bán thành phẩm vào tệp Vật Tư và thêm vào tệp này trường “Loại vật tư” để phân biệt: 1-Vật tư, hàng hóa; 2-Thành phẩm ngoài ra cũng thêm vào tệp này trường “Mã nhóm”.
Thêm tệp nhóm vật tư với các trường: “Mã nhóm”, “Tên nhóm”, “Bậc nhóm”, “Nhóm cuối”, “Nhóm mẹ”.
Tệp Sản Phẩm bao gồm tất cả các đối tượng tính giá thành, lúc đó trường “TK giá thành” không còn ý nghĩa nên loại bỏ trường này khỏi tệp Sản Phẩm. Giữa Sản Phẩm và Vật Tư ngoài mối quan hệ N@M về định mức số lượng vật liệu chính còn mối quan hệ 1@N: một đối tượng tính giá thành có thể bao gồm nhiều loại thành phẩm hoặc bán thành phẩm.
Đối với tệp Định Mức, thêm trường “Số lượng sản phẩm” còn trường “Định mức” thì chia chi tiết thành 12 trường ứng với 12 tháng.
Đối với tệp tài khoản, thêm trường “Tài khoản giá thành” nhận các giá trị: C-Tài khoản giá thành, K-Không phải tài khoản giá thành.
Đối với tệp đối tượng, thêm trường “Mã số thuế”
Thêm tệp Phân bổ để xác định các bút toán phân bổ, tệp này có các trường sau: “Số thứ tự”, “Tên bút toán”, “Tài khoản có”, “Tài khoản nợ”, “Chọn”
Đối với tệp chứng từ, thêm trường “Số thứ tự” (dùng làm khóa chính thay cho hai trường “Loại chứng từ” và “Số chứng từ”) còn tệp định khoản, thêm trường “Số thứ tự 0” để thể hiện thứ tự của một dòng trong phần chi tiết của chứng từ và cùng với trường “Số thứ tự” sẽ tạo thành khóa chính.
2.Sơ đồ cấu trúc dữ liệu của cơ sở dữ liệu vật lý trong
3.Cấu trúc các tệp
Tệp chứng từ: chungtu.dbf
Name
Type
Wid
Dec
Diễn giải
STT
C
10
Số thứ tự
LOAI_CT
C
2
Loại chứng từ
SO_CT
C
10
Số chứng từ
NGAY
D
8
Ngày chứng từ
MA_DT
C
16
Mã đối tượng
MA_KHO
C
8
Mã kho
DIEN_GIAI
C
128
Diễn giải
Tệp định khoản: dK.DBF
Name
Type
Wid
Dec
Diễn giải
STT
C
10
Số thứ tự chứng từ
STT0
C
3
Số thứ tự từng dòng trong chứng từ
LOAI_CT
C
2
Loại chứng từ
SO_CT
C
10
Số chứng từ
MA_VT
C
16
Mã vật tư
SO_LUONG
N
13
3
Số lượng
DON_GIA
N
12
2
Đơn giá
THANH_TIEN
N
15
2
Thành tiền
MA_SP
C
16
Mã sản phẩm
TK_NO
C
8
Tài khoản nợ
TK_CO
C
8
Tài khoản có
Tệp kho: KHO.dbf
Name
Type
Wid
Dec
Diễn giải
MA_KHO
C
8
Mã kho
TEN_KHO
C
64
Tên kho
Tệp Đối tượng: DT.DBF
Name
Type
Wid
Dec
Diễn giải
MA_DT
C
16
Mã đối tượng
TEN_DT
C
64
Tên đối tượng
DIA_CHI
C
48
Địa chỉ
MA_SO_THUE
C
18
Mã số thuế
Tệp tài khoản: TK.DBF
Name
Type
Wid
Dec
Diễn giải
MA_TK
C
8
Mã tài khoản
TEN_TK
C
100
Tên tài khoản
BAC_TK
N
1
Bậc tài khoản
TK_ME
C
8
Tài khoản mẹ
TK_GT
C
1
Tài khoản giá thành
Tệp phân bổ: phanbo.dbf
Name
Type
Wid
Dec
Diễn giải
STT
N
2
Số thứ tự phân bổ của bút toán
TEN_BT
C
48
Tên bút toán
TK_NO
C
8
Tài khoản nợ
TK_CO
C
8
Tài khoản có
CHON
C
1
Có thực hiện hay không
Tệp nhóm vật tư: NHOMVT.dbf
Name
Type
Wid
Dec
Diễn giải
MA_NHOM
C
8
Mã nhóm vật tư
TEN_NHOM
C
64
Tên nhóm vật tư
BAC_NHOM
N
1
Bậc nhóm
NHOM_ME
C
8
Nhóm mẹ
NHOM_CUOI
C
1
Nhóm cuối
Tệp vật tư: vattu.dbf
Name
Type
Wid
Dec
Diễn giải
MA_VT
C
16
Mã vật tư
TEN_VT
C
64
Tên vật tư
DON_VI
C
8
Đơn vị tính
LOAI_VT
C
1
Loại vật tư
MA_NHOM
C
8
Mã nhóm
TK_VT
C
8
Tài khoản vật tư
Tệp sản phẩm: sanpham.dbf
Name
Type
Wid
Dec
Diễn giải
MA_SP
C
16
Mã sản phẩm
TEN_SP
C
64
Tên sản phẩm
DON_VI
C
10
Đơn vị tính
Tệp định mức: DinhMuc.DBF
Name
Type
Wid
Dec
Diễn giải
MA_SP
C
16
Mã sản phẩm
SO_LUONGSP
N
15
2
Số lượng sản phẩm
MA_VT
C
16
Mã vật tư
SO_LUONG01
N
15
4
Định mức về số lượng vật tư tháng 1
SO_LUONG02
N
15
4
Định mức về số lượng vật tư tháng 2
SO_LUONG03
N
15
4
Định mức về số lượng vật tư tháng 3
SO_LUONG04
N
15
4
Định mức về số lượng vật tư tháng 4
SO_LUONG05
N
15
4
Định mức về số lượng vật tư tháng 5
SO_LUONG06
N
15
4
Định mức về số lượng vật tư tháng 6
SO_LUONG07
N
15
4
Định mức về số lượng vật tư tháng 7
SO_LUONG08
N
15
4
Định mức về số lượng vật tư tháng 8
SO_LUONG09
N
15
4
Định mức về số lượng vật tư tháng 9
SO_LUONG10
N
15
4
Định mức về số lượng vật tư tháng10
SO_LUONG11
N
15
4
Định mức về số lượng vật tư tháng11
SO_LUONG12
N
15
4
Định mức về số lượng vật tư tháng12
4.Tích hợp vào cơ sở dữ liệu của hệ thống thông tin kế toán hiện tại
Tệp
Tích hợp vào tệp
Tệp
Tích hợp vào tệp
Chungtu.dbf
Ct.dbf
TK.DBF
DMTK.DBF
DK.DBF
CT0.DBF
NHOMVT.DBF
DMNHVT.DBF
KHO.DBF
DMKHO.DBF
VATTU.DBF
DMVT.DBF
DT.DBF
DMDT.DBF
SanPham.DBF
DMSP.DBF
PhanBo.DBF
DMPB1.DBF
DinhMuc.DBF
DMDMVT.DBF
Tệp: CT.DBF
Name
Type
Wid
Dec
Tương ứng trong CHUNGTU.DBF
STT
C
10
STT
MA_CT
C
2
LOAI_CT
NGAY_CT
D
8
NGAY
SO_CT
C
10
SO_CT
DIEN_GIAI0
C
128
DIEN_GIAI
MA_DT
C
16
MA_DT
MA_KHO
C
8
MA_KHO
Tệp: CT0.DBF
Name
Type
Wid
Dec
Tương ứng trong DK.DBF
STT
C
10
STT
STT0
C
3
STT0
MA_CT
C
2
LOAI_CT
SO_CT
C
10
SO_CT
TK_NO
C
8
TK_NO
TK_CO
C
8
TK_CO
TIEN
N
15
THANH_TIEN
MA_VT
C
16
MA_VT
GIA
N
12
2
DON_GIA
SO_LUONG
N
13
3
SO_LUONG
MA_SP
C
16
MA_SP
Tệp: DMDT.DBF giống tệp DT.DBF
Tệp: DMKHO.DBF giống tệp KHO.DBF
Tệp: DMPB1.DBF
Name
Type
Wid
Dec
Tương ứng trong PHANBO.DBF
STT
N
2
STT
TK_CO
C
8
TK_CO
TEN_BT
C
48
TEN_BT
TK_NO
C
8
TK_NO
TAG
C
1
CHON
Tệp DMTK.DBF
Name
Type
Wid
Dec
Tương ứng trong DMTK.DBF
TK
C
8
MA_TK
TEN_TK
C
100
TEN_TK
BAC_TK
N
1
BAC_TK
TK_ME
C
8
TK_ME
TK_GT
C
1
TK_GT
Tệp DMNHVT.DBF
Name
Type
Wid
Dec
Tương ứng trong NHOMVT.DBF
MA_NH
C
8
MA_NHOM
TEN_NH
C
64
TEN_NHOM
BAC_NH
N
1
BAC_NHOM
NH_CUOI
C
1
NHOM_CUOI
NH_ME
C
8
NHOM_ME
Tệp DMVT.DBF
Name
Type
Wid
Dec
Tương ứng trong tệp VATTU.DBF
MA_VT
C
8
MA_VT
TEN_VT
C
64
TEN_VT
DVT
C
8
DON_VI
MA_NH
C
8
MA_NHOM
LOAI_VT
C
1
LOAI_VT
TK_VT
C
8
TK_VT
Tệp DMSP.DBF giống tệp SANPHAM.DBF
Tệp DMDMVT.DBF giữ nguyên như tệp DINHMUC.DBF
5.Sơ đồ phân rã chương trình:
6. Các thuật toán chính của chương trình
KHhkhkhkhkhkhk kkk
Kết luận
Xây dựng phần mềm để phục vụ công tác kế toán tập hợp chi phí sản xuất và tính giá thành sản phẩm nói chung là một phạm vi rộng, tuy nhiên, đề tài “Xây dựng phân hệ kế toán tập hợp chi phí sản xuất và tính giá thành sản phẩm tại công ty TNHH ống thép Hòa Phát” chỉ giới hạn trong những điều kiện cụ thể tại công ty này. Đây là một doanh nghiệp sản xuất điển hình với quy trình sản xuất gồm nhiều công đoạn và phải tính giá thành cho sản phẩm của từng công đoạn theo thứ tự tương ứng. Phương pháp tính giá thành tại công ty là giá thành công đoạn dựa trên định mức về số lượng vật tư, kì tính giá thành là tháng, hình thức ghi sổ là nhật kí chung. Chuyển phương pháp tính giá vốn hàng xuất kho từ trung bình di động sang trung bình tháng bằng cách sử dụng chức năng “Tự động áp giá vốn”.
Trong cơ sở dữ liệu của hệ thống tính giá thành đã thiết kế, tệp Định Khoản là tệp dữ liệu trung tâm, lưu trữ toàn bộ các nghiệp vụ phát sinh và tệp này sẽ được tích hợp vào tệp CT0.DBF trong cơ sở dữ liệu của hệ thống thông tin kế toán hiện tại.
Với phương pháp tính giá thành hiện tại ở công ty ống thép Hòa Phát, phân bổ chi phí là khâu chủ yếu trong quá trình tính giá thành. Việc phân bổ chi phí có thể chia làm hai bước chính theo thứ tự: một là phân bổ chi phí nguyên vật liệu chính, hai là phân bổ các chi phí còn lại (như nguyên vật liệu phụ, nhân công trực tiếp và chi phí sản xuất chung) dựa vào kết quả phân bổ chi phí nguyên vật liệu chính.
Giá thành sản phẩm phải tính lần lượt từ công đoạn đầu tiên cho đến công đoạn cuối cùng vì chỉ có thể tính được giá thành của một công đoạn khi đã biết giá thành của công đoạn trước đó. Để có kết quả đúng, người sử dụng phải tuân theo quy định về trình tự các thao tác, đó là: Tính giá vốn à Phân bổ chi phí à Tính giá thành. Các thao tác này được lặp lại đối với từng công đoạn sản xuất. Cuối cùng mới là xem và in các báo cáo về chi phí và giá thành.
Phụ lục
1.Thủ tục phân bổ chi phí nguyên vật liệu chính
PROCEDURE CmdPhanBo.Click()
LOCAL _Dummy
M.Thang1 = THISFORM.txtThang1.Value M.Thang2 = THISFORM.txtThang2.Value M.Thang = THISFORM.txtThang2.Value
IF M.Thang2 = 0 RETURN ENDIF
M.Ngay_Ct1 = CTOD([01/] + TRAN(M.Thang1, '@L ##') + [/] + M_Nam) M.Ngay_Ct2 = GOMONTH(M.Ngay_Ct1, 1 + (M.Thang2 - M.Thang1)) - 1
SELECT 0 USE (M_Data_Nam + [Ct]) ORDER Stt ALIAS K_Ct
SELECT 0 USE (M_Data_Nam + [Ct0]) ORDER Stt0 ALIAS K_Ct0
SELECT 0 USE (M_Data_Nam + [SoCai]) ORDER Stt ALIAS K_SoCai
SELECT 0 USE (M_Dm_Nam + [DmSp]) ORDER Ma_Sp ALIAS M_DmSp
SELECT M_DmPb1
_CoKhong = [K]
SCAN FOR (Tag = [x])
M.Stt = M_W_Id + [PB3] + RIGHT(M_Nam, 2) + TRANS(M.Thang2,; [@L 99]) + TRANS(Stt, [@L 99]) M.Ten_Bt = Ten_Bt M.Stt0 = TRANS(Stt, [@L 999]) M.Tk = ALLTRIM(Tk_Co) M.Tk0 = ALLTRIM(Tk_No) M.SttOld = M.Stt &&EVAL([Stt] + TRAN(M.Thang, '@L ##')) _Loai_Pb = LEFT(Loai_Pb, 1) M.SttNew = M.Stt
IF EMPTY(M.Tk) OR EMPTY(M.Tk0) OR EMPTY(_Loai_Pb) WAIT WINDOWS [Chua khai bao du tai khoan trong danh muc!] SELECT M_DmPb1 LOOP ENDIF
SELECT 0 CREATE TABLE (M_Temp + [Nhap_Tp]) (Ma_Vt C(16), Ma_Sp C(16),; So_Luong N(15, 3),Tk_No C(8), Tk_Co C(8))
DO ScanFileV WITH M.Ngay_Ct1, M.Ngay_Ct2, [(.T.)],; [(!EMPTY(Ma_Kho)).AND.(Tk_Co = "] + M.Tk0 + [")], [Nhap_Tp]
USE (M_Dm_Nam + [DmVt]) ORDER Ma_Vt ALIAS M_DmVt IN 0
SELECT Nhap_Tp SET RELATION TO Ma_Vt INTO M_DmVt REPLACE ALL Ma_Sp WITH M_DmVt.Ma_Sp SET RELATION TO
USE IN M_DmVt
SELECT Ma_Sp, SUM(So_Luong) AS So_Luong, Tk_Co AS Tk,; M.Stt AS Stt0, 000000000000000.0000 AS He_So,; 000000000000000.0000 AS He_So_Vt ; FROM Nhap_Tp ; INTO TABLE (M_Temp + [M_DmTmp]) ; GROUP BY Ma_Sp
SELECT M_DmTmp INDEX ON Ma_Sp TAG Ma_Sp SET ORDER TO 0
_Dummy0 = []
DO CASE CASE INLIST(_Loai_Pb, [0], [1]) _Dummy = [M_DmSp.DM_621_] + TRANS(M.Thang2, [@L 99]) CASE _Loai_Pb = [2]
_Dummy0 = [Tien2] _Dummy = [M_DmSp.DM_622_] + TRANS(M.Thang2, [@L 99]) CASE _Loai_Pb = [3] _Dummy0 = [Tien3] _Dummy = [M_DmSp.DM_623_] + TRANS(M.Thang2, [@L 99]) CASE _Loai_Pb = [4] _Dummy0 = [Tien7] _Dummy = [M_DmSp.DM_627_] + TRANS(M.Thang2, [@L 99]) CASE _Loai_Pb = [9] _Dummy = [M_DmSp.DM_Tong_] + TRANS(M.Thang2, [@L 99])
ENDCASE
SET RELATION TO Ma_Sp INTO M_DmSp ADDITIVE REPLACE ALL He_So WITH &_Dummy * So_Luong SET RELATION TO
USE IN Nhap_Tp
IF RECCOUNT([M_DmTmp])=0 WAIT WINDOW [Chua khai bao dinh muc hoac khong co thanh; pham nhap kho!] TIME 3 USE IN M_DmTmp SELECT M_DmPb1 LOOP ENDIF
SELECT K_Ct SEEK M.SttOld
IF K_Ct.Stt = M.SttOld IF _CoKhong = [K] _CoKhong = Yes_No([Cac but toan phan bo loai nhu vay cua; thang: ] + STR(M.Thang,2) + [ Stt: ] + ; ALLTRIM(M.Stt0) + [ da co, phan bo lai?])
IF UPPER(_CoKhong) # [C] USE IN M_DmTmp EXIT ENDIF
ENDIF
DO DeleteCt WITH M.SttOld IN (M_Prog + [PubLic])
ENDIF
SELECT 0 USE (M_Code + [CtTmp]) ALIAS K_CtTemp COPY STRU TO (M_Temp + [K_CtTmp])
SELECT 0 USE (M_Temp + [K_CtTmp]) EXCLU ALIAS K_CtTmp
USE IN K_CtTemp _Key = [(Tk_No = "] + M.Tk + [").OR.(Tk_Co = "] + M.Tk + [")]
DO ScanFile WITH M.Ngay_Ct1, M.Ngay_Ct2, _Key,; [(Tk = "] + M.Tk + [")], [K_CtTmp]
SELECT K_CtTmp
IF RECCOUNT() = 0 WAIT WINDOWS NOWAIT [Khong co so lieu de phan bo!] USE IN K_CtTmp USE IN M_DmTmp SELECT M_DmPb1 LOOP ENDIF
IF _Loai_Pb = [0] && Phân bổ theo định mức số lượng của vật tư USE (M_Dm_Nam + [DmDmVt]) ALIAS M_DmDmVt IN 0 SELECT 0 CREATE TABLE (M_Temp + [V_CtTmp]) (Nh_Ct C(1),; Ma_Vt C(16), So_Luong N(15, 3), Tien N(15, 2)) DO ScanFileV WITH M.Ngay_Ct1, M.Ngay_Ct2, [(.T.)], ; [(!EMPTY(Ma_Vt)).AND.((Tk_No = "] +; M.Tk + [").OR.] + [((Tk_Co = "] + M.Tk +; [".AND.Tk_No # "] + M.Tk0 + ")))], ; [V_CtTmp]
SELECT V_CtTmp INDEX ON Ma_Vt TAG Ma_Vt SET ORDER TO 0
SELECT Ma_Vt FROM M_DmDmVt INTO TABLE (M_Temp + [V_DmVt0]) GROUP BY Ma_Vt
SELECT V_DmVt0
SCAN _Ma_Vt = ALLTRIM(Ma_Vt) SELECT V_CtTmp REPLACE ALL Ma_Vt WITH _Ma_Vt FOR Ma_Vt = _Ma_Vt SELECT V_DmVt0 ENDSCAN
USE IN V_DmVt0
IF (This.Parent.Parent.chkPhanBoVTthua.Value = 1) AND ; FILE(M_Data_Nam + [CDVDD.DBF]) SELECT 0 USE (M_Data_Nam + [CDVDD]) ALIAS V_CdvDD SELECT [2] AS Nh_Ct, Tk, Ma_Vt, SUM(So_Luong); AS So_Luong,SUM(Tien) AS Tien, ; SUM(Tien) AS Ps_No ; FROM V_CdvDD ; WHERE (Thang = m.Thang1 - 1).AND.; (Tk = M.Tk).AND.; (INLIST(Loai_DD, [1], [3])) ; INTO TABLE (M_Temp + [V_DdTmp1]) ; GROUP BY Tk, Ma_Vt
SELECT [1] AS Nh_Ct, Tk, Ma_Vt,; SUM(So_Luong) AS So_Luong, ; SUM(Tien) AS Tien, SUM(Tien) AS Ps_Co ; FROM V_CdvDD ; WHERE (Thang = m.Thang2).AND.; (Tk = M.Tk).AND.(INLIST(Loai_DD, [1], [3])); INTO TABLE (M_Temp + [V_DdTmp2]) ; GROUP BY Tk, Ma_Vt
USE IN V_CdvDD USE IN V_DdTmp1 USE IN V_DdTmp2
SELECT V_CtTmp APPEND FROM (M_Temp + [V_DdTmp1]) APPEND FROM (M_Temp + [V_DdTmp2])
SELECT K_CtTmp APPEND FROM (M_Temp + [V_DdTmp1]) APPEND FROM (M_Temp + [V_DdTmp2])
ENDIF
_Dummy = [So_Luong] + TRANS(M.Thang2, [@L 99])
SELECT Ma_Sp, Ma_Vt, IIF(So_LuongSP#0,; &_Dummy/So_LuongSP, 00000000000.000000) AS SL_DinhMuc,; 0000000000000.00 AS SL_Nhap, 0000000000000.00 AS Gia, ; 0000000000000.00 AS T_SL_Nhap, 0000000000000.00 AS So_Luong, ; 0000000000000.00 AS T_So_Luong, 0000000000000.00 AS Tien, ; 0000000000000000 AS Tien_621, 0000000000000.00 AS T_Tien_621,; 0000000000000.000000 AS T_DinhMuc, 0000000000000.00 AS Dinh_Muc,; 0000000000000.000000 AS He_So, 0000000000000.000000 AS T_He_So, ;SPACE(80) AS Ten_Sp, SPACE(8) AS Dvt ;
FROM M_DmDmVt ; WHERE Ma_Sp IN (SELECT Ma_Sp FROM M_DmTmp) ; INTO TABLE (M_Temp + [M_DmTmp0]) ; ORDER BY Ma_Sp, Ma_Vt
SET ORDER TO Ma_Sp IN M_DmTmp SELECT V_CtTmp INDEX ON Ma_Vt TAG Ma_Vt SET ORDER TO 0
SELECT DISTINCT Ma_Vt FROM M_DmTmp0 ; INTO TABLE (M_Temp + [M_DmTmp6])
USE (M_Dm_Nam + [DmVt]) ORDER Ma_Vt ALIAS M_DmVt IN 0
SELECT M_DmTmp6
SCAN _Ma_Vt = ALLTRIM(M_DmTmp6.Ma_Vt) IF !SEEK(M_DmTmp6.Ma_Vt, [M_DmVt]) SELECT V_CtTmp REPLACE Ma_Vt WITH _Ma_Vt FOR Ma_Vt = _Ma_Vt SELECT M_DmTmp6 ENDIF ENDSCAN
USE IN M_DmTmp6 USE IN M_DmVt
* Tính tổng số tiền, số lượng của các vật tư đã sử dụng
SELECT Ma_Vt, SUM(IIF(Nh_Ct = [2], So_Luong, - So_Luong)) AS So_Luong, SUM(IIF(Nh_Ct = [2], Tien, - Tien)) AS Tien, ; 000000000000.000 AS Gia ; FROM V_CtTmp ; WHERE So_Luong # 0 AND Tien # 0 ; INTO TABLE (M_Temp + [VtTmp]) ; GROUP BY Ma_Vt
INDEX ON Ma_Vt TAG Ma_Vt USE IN V_CtTmp
SELECT Ma_Vt, SUM(SL_DinhMuc) AS T_Dinhmuc ; FROM M_DmTmp0 ; INTO TABLE (M_Temp + [M_DmTmp2]) ; GROUP BY Ma_Vt
SELECT M_DmTmp2 INDEX ON Ma_Vt TAG Ma_Vt
SELECT M_DmTmp0 SET RELATION TO Ma_Vt INTO M_DmTmp2 && Tong dinh muc ve luong ma vat tu nay da san xuat REPLACE ALL T_DinhMuc WITH M_DmTmp2.T_DinhMuc SET RELATION TO
SELECT M_DmTmp0 SET RELATION TO Ma_Sp INTO M_DmTmp && Tong so luong SP nhap kho hoan thanh REPLACE ALL SL_Nhap WITH M_DmTmp.So_Luong SELECT Ma_Vt, SUM(SL_Nhap) AS T_SL_Nhap; FROM M_DmTmp0 ; INTO TABLE (M_Temp + [M_DmTmp3]) ; GROUP BY Ma_Vt
SELECT M_DmTmp3 INDEX ON Ma_Vt TAG Ma_Vt
SELECT M_DmTmp0 SET RELATION TO Ma_Vt INTO M_DmTmp3 && Tong so luong nhap kho cua cac thanh pham duoc tao boi ma_vt REPLACE ALL T_SL_Nhap WITH M_DmTmp3.T_SL_Nhap SET RELATION TO
USE IN M_DmTmp3 SET RELATION TO Ma_Vt INTO M_DmTmp2 && Tong dinh muc ve luong ma vat tu nay da san xuat REPLACE ALL T_DinhMuc WITH M_DmTmp2.T_DinhMuc REPLACE ALL He_So WITH SL_DinhMuc * SL_Nhap
SELECT Ma_Vt, SUM(He_So) AS T_He_So; FROM M_DmTmp0 ; INTO TABLE (M_Temp + [M_DmTmp4]) ; GROUP BY Ma_Vt
SELECT M_DmTmp4 INDEX ON Ma_Vt TAG Ma_Vt
SELECT M_DmTmp0 SET RELATION TO Ma_Vt INTO M_DmTmp4 && Tong he so phan bo REPLACE ALL T_He_So WITH M_DmTmp4.T_He_So **********************
SET RELATION TO Ma_Vt INTO VtTmp REPLACE ALL T_Tien_621 WITH VtTmp.Tien, T_So_Luong; WITH VtTmp.So_Luong SET RELATION TO
REPLACE ALL Tien_621 WITH T_Tien_621*He_So / T_He_So,; So_Luong WITH T_So_Luong * He_So / T_He_So FOR (T_He_So) # 0
SELECT Ma_Vt, T_Tien_621, T_So_Luong, SUM(Tien_621) AS Tien_621, SUM(So_luong) AS So_Luong,; 000000000000000.00 AS CL_Tien, 000000000000000.00 AS CL_SL_Xuat;
FROM M_DmTmp0 ; INTO TABLE (M_Temp + [M_DmTmp5]) ; GROUP BY Ma_Vt
SELECT M_DmTmp5 REPLACE ALL CL_Tien WITH T_Tien_621 - Tien_621,; CL_SL_Xuat WITH T_So_Luong - So_Luong
SCAN FOR CL_Tien # 0 OR CL_SL_Xuat # 0 _Ma_Vt = Ma_Vt _CL_Tien = CL_Tien _CL_SL_Xuat = CL_SL_Xuat SELECT M_DmTmp0 CALCULATE MAX(Tien_621) TO _Max_Tien_621; FOR Ma_Vt = _Ma_Vt LOCATE FOR Tien_621 = _Max_Tien_621 AND Ma_Vt = _Ma_Vt REPLACE Tien_621 WITH Tien_621 + _CL_Tien, So_Luong ; WITH So_Luong + _CL_SL_Xuat
SELECT M_DmTmp5
ENDSCAN
SELECT M_DmTmp0
SET RELATION TO
**********************
SELECT Ma_Sp, SUM(Tien_621) AS Tien ; FROM M_DmTmp0 ; INTO TABLE (M_Temp + [M_DmTmp1]) ; GROUP BY Ma_Sp INDEX ON Ma_Sp TAG Ma_Sp SELECT M_DmTmp SET RELATION TO Ma_Sp INTO M_DmTmp1 REPLACE ALL He_So_Vt WITH M_DmTmp1.Tien SET RELATION TO REPLACE ALL He_So WITH He_So_Vt FOR He_So_Vt # 0 SET ORDER TO 0 IN M_DmTmp USE IN M_DmDmVt USE IN VtTmp USE IN M_DmTmp0 USE IN M_DmTmp1 USE IN M_DmTmp2 USE IN M_DmTmp4 USE IN M_DmTmp5
ELSE && Phân bổ lương và nhân công
IF FILE(M_Data_Nam + [CdVDD.DBF]) AND; !EMPTY(_Dummy0) USE (M_Data_Nam + [CdVDD]) ALIAS V_CdVDD IN 0
SELECT Ma_Sp, So_Luong, M.Tk AS Tk, &_Dummy0 AS; Tien, &_Dummy0 AS Ps_No; FROM V_CdVDD ; WHERE (Thang = M.Thang1 - 1).AND.; (Loai_DD = [2]).AND.(&_Dummy0 # 0); INTO TABLE (M_Temp + [V_SpDD1])
SELECT Ma_Sp, So_Luong, M.Tk AS Tk, &_Dummy0 AS ; Tien, &_Dummy0 AS Ps_Co ; FROM V_CdVDD ; WHERE (Thang = M.Thang2).AND.; (Loai_DD = [2]).AND.(&_Dummy0 # 0); INTO TABLE (M_Temp + [V_SpDD2]) USE IN V_SpDD1 USE IN V_SpDD2 USE IN V_CdvDD
SELECT K_CtTmp APPEND FROM (M_Temp + [V_SpDD1]) APPEND FROM (M_Temp + [V_SpDD2]) ENDIF ENDIF
SELECT M_DmTmp DELETE FOR He_So = 0 SUM He_So TO M.TongHeSo
IF M.TongHeSo = 0 WAIT WINDOWS NOWAIT [Chua khai bao he so phan bo!] USE IN M_DmTmp USE IN K_CtTmp SELECT M_DmPb1 LOOP ENDIF
SELECT K_CtTmp INDEX ON Tk TAG TkStt TOTAL TO (M_Temp + [K_CtTmp1]) ON Tk
USE IN K_CtTmp
SELECT 0 USE (M_Temp + [K_CtTmp1]) ALIAS K_CtTmp1 EXCLUSIVE INDEX ON Tk TAG Tk
SELECT 0 USE (M_Code + [DmCt]) ORDER Ma_Ct ALIAS M_DmCt SEEK [PK] _Ma_Ct = Ma_Ct _Nh_Ct = Nh_Ct _So_Ct = PADR(ALLTR(STR((M_DmCt->So_Ct + 1))), FSIZE([So_Ct]))
REPLACE So_Ct WITH So_Ct + 1 USE IN M_DmCt M.Len = LEN(ALLTR(M.Tk)) SELECT K_CtTmp1 SCATTER MEMVAR BLANK M.Stt = M.SttNew M.Stt0 = [001] M.User_Id = M_User_Id M.Ma_Ct = _Ma_Ct M.Nh_Ct = _Nh_Ct M.So_Ct = _So_Ct M.Ngay_Ct = M.Ngay_Ct2 M.Posted = [C] m.Ma_TTe = M_Ma_TTe0 _Ten_Bt = ALLTRIM(M.Ten_Bt)
SELECT K_CtTmp1 SCAN M.Tk_Co = K_CtTmp1->Tk WAIT WINDOWS NOWAIT M_Process + [Tk ghi co: ] + ; ALLTR(M.Tk_Co) && Lấy đuôi của Tk có (621) _Tag_Tk_No = RIGHT(M.Tk_Co, LEN(M.Tk_Co) - M.Len) _Tien = K_CtTmp1->Ps_No - K_CtTmp1->Ps_Co _Tien1 = _Tien
SELECT M_DmTmp SCAN M.Ma_Sp = Ma_SP M.Tk_No = ALLTRIM(M_DmTmp->Tk) + _Tag_Tk_No IF !SEEK(m.Tk_No, [M_DmTk]) m.Tk_No = m_DmTmp->Tk ENDIF WAIT WINDOW NOWAIT M_Process + [, Tk ghi No: ] + ; ALLTRIM(M.Tk_No)+[ - Tk ghi co: ]+ALLTR(M.Tk_Co) M.Dien_Giai=_Ten_Bt +[; ]+ALLTRIM(M.Tk_No)+[-]+; ALLTRIM(M.Tk_Co)+[- Sản phẩm: ]+ALLTRIM(M.Ma_Sp)
SKIP
IF EOF() SKIP –1 M.Tien = _Tien1 ELSE SKIP –1 M.Tien = ROUND((_Tien * M_DmTmp->He_So / ; M.TongHeSo), 0) _Tien1 = _Tien1 - M.Tien ENDIF
M.Tien_Nt = M.Tien M.Tien9 = M.Tien M.Tien_Nt9 = M.Tien_Nt SELECT K_Ct0
APPEND BLANK GATHER MEMVAR M.Stt0 = TRANS(VAL(M.Stt0) + 1, [@L 999])
SELECT M_DmTmp ENDSCAN
SELECT K_CtTmp1 ENDSCAN
M.Dien_Giai0 = _Ten_Bt M.TTien = _Tien M.TTien_Nt = _Tien SELECT K_Ct APPEND BLANK GATHER MEMVAR
DO UpDateSoCai WITH K_Ct.Stt IN (M_Prog + [Public]) USE IN M_DmTmp USE IN K_CtTmp1 SELECT M_DmPb1 ENDSCAN
USE IN K_Ct USE IN K_Ct0 USE IN K_SoCai USE IN M_DmSp
=MESSAGEBOX(M_End_Proc, 64, M_App_Name)
2.Thủ tục phân bổ các chi phí khác:
PROCEDURE CmdPhanBo.Click()
WAIT WIND M_Process NOWAIT THISFORM.SetAll([MousePointer], 11) THISFORM.LockScreen = .T.
M.Thang1 = THISFORM.txtThang1.Value M.Thang2 = THISFORM.txtThang2.Value M.Thang = THISFORM.txtThang2.Value
IF M.Thang2 = 0 RETURN ENDIF
SELECT 0 USE (M_Data_Nam + [Ct]) ORDER Stt ALIAS K_Ct
SELECT 0 USE (M_Data_Nam + [Ct0]) ORDER Stt0 ALIAS K_Ct0
SELECT 0 USE (M_Data_Nam + [SoCai]) ORDER Stt ALIAS K_SoCai
M.Ngay_Ct1 = CTOD([01/] + TRAN(M.Thang1, '@L ##') + [/] + M_Nam)M.Ngay_Ct2 = GOMONTH(M.Ngay_Ct1, 1 + (M.Thang2 - ; M.Thang1)) - 1
M.Ngay_Ct = M.Ngay_Ct2 M.Ma_Ct = [PK] M.Nh_Ct = [3] M.Ma_NVU = [K] M.Ma_TTe = M_Ma_TTe0 M.Ty_Gia = 1 M.Posted = [C] M.Ty_Gia = 1
M_Tk = ALLTRIM(THIS.Parent.txtTk.Value) && Tk phan bo = "627" M_Tk_Den = ALLTRIM(THIS.Parent.txtTk_Den.Value) && Den Tk = "154" M_Tk2 = ALLTRIM(THIS.Parent.txtTk2.Value) && Theo ty le = "622" M_Tk3 = ALLTRIM(THIS.Parent.txtTk3.Value) && Theo ty le = "621" M_Tk4 = ALLTRIM(THIS.Parent.txtTk4.Value) && Theo ty le = "623" M_Tk_Den2 = ALLTRIM(THIS.Parent.txtTk_Den2.Value) && Den Tk= 154"
SELECT K_SoTmp ZAP
SELECT M_DmTk SEEK M_Tk _Stt = M_W_ID + [P2] + TRANSFORM(RECNO(), [@L 999]) + ; TRANSFORM(M.Thang, [@L 99]) DO DeleteCt WITH _Stt IN (M_Prog + [PubLic])
SELECT 0 CREATE TABLE (M_Temp + [Tk622]) (Tk C(8), Ma_Sp C(16), TK_DU C(8), ; Ps_No N(15, 2), Ps_No_Nt N(15, 2),Ps_Co N(15, 2), ; Ps_Co_Nt N(15, 2))
_KeyTkDen = [(Tk_DU = "] + M_Tk_Den2 + [")] _KeyTkDi = [(Tk = "] + M_Tk2 + [")]
IF !EMPTY(M_Tk3) _KeyTkDi = _KeyTkDi + [.OR.(Tk = "] + M_Tk3 + [")] ENDIF
IF !EMPTY(M_Tk4) _KeyTkDi = _KeyTkDi + [.OR.(Tk = "] + M_Tk4 + [")] ENDIF _Key = [(] + _KeyTkDi + [).AND.(] + _KeyTkDen + [)] DO ScanFile WITH M.Ngay_Ct1, M.Ngay_Ct2, [(.T.)], _Key, [Tk622]
SELECT 0 CREATE TABLE (M_Temp + [Tk627]) (Tk C(8), Ps_No N(15, 2),; Ps_No_Nt N(15, 2),Ps_Co N(15, 2), Ps_Co_Nt N(15, 2))
DO ScanFile WITH M.Ngay_Ct1, M.Ngay_Ct2, [(Tk_No = M_Tk); .OR.(Tk_Co = M_Tk)], [(Tk = '] + M_Tk + [')], [Tk627]
SELECT Tk, SUM(Ps_No - Ps_Co) AS Tien; FROM Tk627 ; INTO TABLE (M_Temp + [K_So627]) ; GROUP BY Tk
SELECT K_So627 DELETE FOR Tien = 0 PACK
This.Parent.Grid2.RecordSource = [K_SoTmp] This.Parent.Grid2.RecordSourceType = 1
THISFORM.LockScreen = .F.
SCAN M.Stt = _Stt M.Stt = M.Stt + TRANS(RECNO(), [@L 99]) _Tk = ALLTRIM(Tk) _Tien = Tien IF SEEK(M_Tk2 + RIGHT(ALLTRIM(_Tk), 1), [M_DmTk]) _Tk622 = M_Tk2 + RIGHT(ALLTRIM(_Tk), 1) ELSE _Tk622 = M_Tk2 ENDIF SELECT Tk, Tk_Du, Ma_Sp, SUM(PS_Co - Ps_No) AS Tien622,; 0000000000000.00 AS Tien627 ; FROM Tk622 ; INTO TABLE (M_Temp + [Phan_Bo]) ; GROUP BY Tk, Tk_DU, Ma_SP ; ORDER BY Tien622 SUM Tien622 TO _Tong622 IF _Tong622 = 0 USE IN Phan_Bo LOOP ENDIF
SELECT Phan_Bo REPLACE ALL Tien627 WITH ROUND(_Tien*Tien622 / _Tong622, 0) SUM Tien627 TO _Tong627 IF _Tong627 # _Tien LOCATE FOR Tien622 # 0 IF FOUND() REPLACE Tien627 WITH Tien627 + _Tien - _Tong627 ENDIF ENDIF SELECT Phan_Bo SCAN M.Stt0 = TRANSFORM(RECNO(), [@L 999]) M.Dien_Giai = [Phân bổ ] + ALLTRIM(_Tk) + [ --> ] + ; ALLTRIM(M_Tk_Den) M.Tien_Nt = Tien627 M.Tien = Tien627 M.Tk_No = STRT(Tk_DU, M_Tk_Den2, M_Tk_Den) FOR _i = FSIZE([Tk], [M_DmTk]) TO 1 STEP –1 M.Tk_No = LEFT(M.Tk_No, _i) IF SEEK(M.Tk_No, [M_DmTk]) EXIT ENDIF ENDFOR M.Tk_Co = _Tk FOR _i = FSIZE([Tk], [M_DmTk]) TO 1 STEP –1 M.Tk_Co = LEFT(M.Tk_Co, _i) IF SEEK(M.Tk_Co, [M_DmTk]) EXIT ENDIF ENDFOR M.Ma_Sp = Ma_Sp M.Ma_TTe = M_Ma_TTe0 M.Ma_NVu = [K] INSERT INTO K_Ct0 FROM MEMVAR M.Tien0 = Tien622 M.Tk_No0 = Tk_DU M.Tk_Co0 = Tk M.Ty_Le = Tien627 * 100 / _Tien INSERT INTO K_SoTmp FROM MEMVAR ENDSCAN M.Dien_Giai0 = M.Dien_Giai M.Tong_Tien = _Tien INSERT INTO K_Ct FROM MEMVAR M.Tien0 = _Tong622 M.Tien = _Tien M.Tien_Nt = _Tien m.Tien9 = m.Tien m.Tien_Nt9 = m.Tien_Nt STORE [] TO M.Tk_No0, M.Tk_Co0, M.Tk_No, M.Tk_Co, M.Ma_Sp M.Ty_Le = 100 INSERT INTO K_SoTmp FROM MEMVAR USE IN Phan_Bo DO UpDateSoCai WITH M.Stt IN (M_Prog + [PUBLIC]) SELECT K_So627 ENDSCAN USE IN K_Ct USE IN K_Ct0 USE IN K_SoCai USE IN Tk627 USE IN Tk622 USE IN K_So627 SELECT K_SoTmp GO TOP This.Parent.Grid2.SetAll("DynamicFontBold", "IIF(Ty_Le = 100, .T., .F.)", ; "Column") This.Parent.Grid2.Refresh WAIT WINDOW NOWAIT M_End_Proc THISFORM.SetAll([MousePointer], 0)
3.Thủ tục tính giá thành
PROCEDURE Recalculate()
LPARAMETER _Thang1, _Thang2, _Tk IF _Thang2 < _Thang1 RETURN ENDIF
LOCAL _Str_Dau_Ky1, _Str_Dau_Ky2, _Str_Dau_Ky7, _Str_Dau_Ky8, _i, ; _MD_HT, _SL_SPDD
ThisForm.LockScreen = .T.
_Tk = ALLTRIM(_Tk) m.Ngay_Ct1 = CTOD([01/] + TRANS(_Thang1, [@L 99]) + [/] + M_Nam) m.Ngay_Ct2 = GOMONTH(CTOD([01/] + TRANS(_Thang2, [@L 99]) + [/] +; M_Nam), 1) – 1 M.Ngay_Ct0 = CTOD([01/] + TRANS(M_Th_Bd_Ht, [@L 99]) + [/] + M_Nam) _SL_SPDD = [SL_SPDD] + TRAN(_Thang2, [@L 99]) _MD_HT = [MD_HT] + TRAN(_Thang2, [@L 99])
STORE [Ps_No1_00] TO _Str_Dau_Ky1, _Str_Cuoi_Ky1 STORE [Ps_No2_00] TO _Str_Dau_Ky2, _Str_Cuoi_Ky2 STORE [Ps_No7_00] TO _Str_Dau_Ky7, _Str_Cuoi_Ky7 STORE [Ps_No8_00] TO _Str_Dau_Ky8, _Str_Cuoi_Ky8
FOR _i = M_Th_Bd_Ht TO _Thang1 – 1 _Str_Dau_Ky1 = _Str_Dau_Ky1 +[+(Ps_No1_]+TRAN(_i,[@L 99]) +[-; Ps_Co1_]+TRAN(_i,[@L 99])+[)] _Str_Dau_Ky2 = _Str_Dau_Ky2 +[+(Ps_No2_]+TRAN(_i,[@L 99]) +[-; Ps_Co2_]+TRAN(_i,[@L 99])+[)] _Str_Dau_Ky7 = _Str_Dau_Ky7 +[+(Ps_No7_]+TRAN(_i,[@L 99]) +[-; Ps_Co7_]+TRAN(_i,[@L 99])+[)] _Str_Dau_Ky8 = _Str_Dau_Ky8 +[+(Ps_No8_]+TRAN(_i,[@L 99]) +[-; Ps_Co8_]+TRAN(_i,[@L 99])+[)] ENDFOR
FOR _i = M_Th_Bd_Ht TO _Thang2 _Str_Cuoi_Ky1 = _Str_Cuoi_Ky1 +[+(Ps_No1_]+TRAN(_i,[@L 99]) +[-; Ps_Co1_]+TRAN(_i,[@L 99])+[)]
_Str_Cuoi_Ky2 = _Str_Cuoi_Ky2 +[+(Ps_No2_]+TRAN(_i,[@L 99]) +[-; Ps_Co2_]+TRAN(_i,[@L 99])+[)] _Str_Cuoi_Ky7 = _Str_Cuoi_Ky7 +[+(Ps_No7_]+TRAN(_i,[@L 99]) +[-; Ps_Co7_]+TRAN(_i,[@L 99])+[)] _Str_Cuoi_Ky8 = _Str_Cuoi_Ky8 +[+(Ps_No8_]+TRAN(_i,[@L 99]) +[-; Ps_Co8_]+TRAN(_i,[@L 99])+[)] ENDFOR
SELECT 0 USE (M_Code + [CtTmp]) ALIAS CtTmp COPY STRUCTURE TO (M_Temp + [K_CtTmp0]) COPY STRUCTURE TO (M_Temp + [K_CtTmp1])
USE IN CtTmp USE (M_Temp + [K_CtTmp0]) EXCLUSIVE IN 0 USE (M_Temp + [K_CtTmp1]) EXCLUSIVE IN 0
DO ScanFile WITH M.Ngay_Ct1, M.Ngay_Ct2, [(Tk_No = "] + _Tk + [").OR.; (Tk_Co = "] + _Tk + [")], [(Tk = '] + _Tk + [')], [K_CtTmp0]
_Key2 = [!EMPTY(Ma_Vt).AND.(Tk_Co = "] + _Tk + [")]
DO ScanFileV WITH M.Ngay_Ct1, M.Ngay_Ct2, [(.T.)], _Key2, [K_CtTmp1]
USE (M_Dm_Nam + [DmVt]) ORDER Ma_Vt ALIAS M_DmVt IN 0 SELECT K_CtTmp1 SET RELATION TO Ma_Vt INTO M_DmVt REPLACE ALL Ma_Sp WITH M_DmVt.Ma_Sp SET RELATION TO USE IN M_DmVt
SELECT K_CtTmp1 INDEX ON Tk_Co + Ma_Sp TAG Stt
SELECT K_CtTmp0 INDEX ON Tk + Ma_Sp + DTOS(Ngay_Ct) TAG Stt
SELECT 0 USE (M_Data_Nam + [CDK]) ORDER Tk_Ma_Sp ALIAS K_Cd
USE (M_Dm_Nam + [DmSp]) ORDER Ma_Sp ALIAS M_DmSp IN 0 SELECT Tk, Ma_Sp, SPACE(50) AS Ten_Sp, SPACE(50) AS Ten_Tk, ; 000000000000000 AS Dau_Ky,SUM(&_Str_Dau_Ky1) AS Dau_Ky1,; SUM(&_Str_Dau_Ky2) AS Dau_Ky2,SUM(&_Str_Dau_Ky7) AS; Dau_Ky7, SUM(&_Str_Dau_Ky8) AS Dau_Ky8, ; 000000000000000 AS SL_Nhap,000000000000000 AS Ps_No, ; 000000000000000 AS Ps_No1, 000000000000000 AS Ps_No2, ; 000000000000000 AS Ps_No7, 000000000000000 AS Ps_No8, ; 000000000000000 AS Ps_Co, 00000000000000 AS Ps_Co1,; 000000000000000 AS Ps_Co2,000000000000000 AS Ps_Co7, ; 000000000000000 AS Ps_Co8,000000000000000 AS SL_SPDD_QD, ; 000000000000000 AS SL_SPDD,000 AS MD_HT, ; 000000000000000 AS Gia,000000000000000 AS Gia_Thanh, ; 000000000000000 AS Cuoi_Ky,SUM(&_Str_Cuoi_Ky1) AS ; Cuoi_Ky1, SUM(&_Str_Cuoi_Ky2) AS Cuoi_Ky2,; SUM(&_Str_Cuoi_Ky7) AS Cuoi_Ky7, SUM(&_Str_Cuoi_Ky8); AS Cuoi_Ky8,000000000000000.00 AS DM_Vat_Tu,; 000000000000000.00 AS DM_Luong, ; 000000000000000.00 AS DM_CPchung ; FROM K_Cd ; WHERE (Tk = _Tk) AND !EMPTY(Ma_Sp); INTO TABLE (M_Temp + [K_SoTmp0]) ; GROUP BY Tk, Ma_Sp
IF ThisForm.chkDoDangTheoSP.Value = 1 REPLACE ALL Dau_Ky WITH Dau_Ky1 + Dau_Ky2 + Dau_Ky7 +; Dau_Ky8 ELSE REPLACE ALL Dau_Ky1 WITH 0, Dau_Ky2 WITH 0, Dau_Ky7; WITH 0, Dau_Ky8 WITH 0, Cuoi_Ky1 WITH 0, ; Cuoi_Ky2 WITH 0, Cuoi_Ky7 WITH 0, ; Cuoi_Ky8 WITH 0 ENDIF
SELECT Tk, Ma_Sp ; FROM K_CtTmp0 ; WHERE (Tk + Ma_Sp NOT IN(SELECT Tk + Ma_Sp FROM; K_SoTmp0)) ; INTO TABLE (M_Temp + [K_SoTmp1]) ; GROUP BY Tk, Ma_Sp USE IN K_SoTmp1
_Dummy1 = [M_DmSp.DM_621_] + TRANS(_Thang2, [@L 99]) _Dummy2 = [M_DmSp.DM_622_] + TRANS(_Thang2, [@L 99]) _Dummy7 = [M_DmSp.DM_627_] + TRANS(_Thang2, [@L 99])
SELECT K_SoTmp0 APPEND FROM (M_Temp + [K_SoTmp1]) SET RELATION TO Ma_Sp INTO M_DmSp REPLACE ALL Ten_Sp WITH M_DmSp.Ten_Sp, DM_Vat_Tu WITH &_Dummy1,DM_Luong WITH &_Dummy2, ; DM_CPchung WITH &_Dummy7
SET RELATION TO
SELECT K_SoTmp0 GO TOP
SCAN _Tk = Tk _Ma_Sp = Ma_Sp M.Du_No1 = Dau_Ky WAIT WINDOW M_Process + [ ] + _Tk NOWAIT
SELECT K_CtTmp0 SEEK _Tk +_Ma_Sp SUM Ps_No TO M.Ps_No1 REST WHILE (Tk = _Tk).AND.(Ma_Sp =; _Ma_Sp) FOR (TK_DU = [621]) SEEK _Tk +_Ma_Sp SUM Ps_No TO M.Ps_No2 REST WHILE (Tk = _Tk).AND.(Ma_Sp = ; _Ma_Sp) FOR (TK_DU = [622]) SEEK _Tk +_Ma_Sp SUM Ps_No TO M.Ps_No7 REST WHILE (Tk = _Tk).AND.(Ma_Sp = ; _Ma_Sp) FOR (TK_DU = [627]) SEEK _Tk +_Ma_Sp SUM Ps_No TO M.Ps_No8 REST WHILE (Tk = _Tk).AND.(Ma_Sp = ; _Ma_Sp) FOR (!INLIST(TK_DU, [621],[622],[627])) SELECT K_Cd SEEK _Tk +_Ma_Sp IF FOUND() M.MD_HT = &_MD_HT M.SL_SPDD = &_SL_SPDD ELSE STORE 0 TO M.MD_HT, M.SL_SPDD ENDIF
SELECT K_CtTmp1 SEEK _Tk +_Ma_Sp SUM So_Luong TO M.SL_Nhap ; REST WHILE (Tk_Co = _Tk).AND.(Ma_Sp = _Ma_Sp)
SELECT K_SoTmp0 M.Ps_No = M.Ps_No1 + M.Ps_No2 + M.Ps_No7 + M.Ps_No8 REPLACE SL_Nhap WITH M.SL_Nhap, SL_SPDD WITH M.SL_SPDD,; MD_HT WITH M.MD_HT,Ps_No WITH M.Ps_No, Ps_No1; WITH M.Ps_No1, Ps_No2 WITH M.Ps_No2, ; Ps_No7 WITH M.Ps_No7, Ps_No8 WITH M.Ps_No8 ENDSCAN
DELETE FOR Dau_Ky = 0 AND Dau_Ky1 = 0 AND Dau_Ky2 = 0 AND; Dau_Ky7 = 0 AND Dau_Ky8 = 0 AND SL_Nhap = 0 AND; Ps_No1 = 0 AND Ps_No2 = 0 AND Ps_No7 = 0 AND Ps_No8; = 0 AND Ps_Co = 0 AND Ps_Co1 = 0 AND Ps_Co2 = 0 AND ; Ps_Co7 = 0 AND Ps_Co8 = 0 AND Cuoi_Ky1 = 0 AND ; Cuoi_Ky2 = 0 AND Cuoi_Ky7 = 0 AND Cuoi_Ky8 = 0 PACK REPLACE ALL SL_SPDD_QD WITH SL_SPDD * MD_HT / 100, Cuoi_Ky ; WITH Cuoi_Ky1 + Cuoi_Ky2 + Cuoi_Ky7 + Cuoi_Ky8 _For = '((Cuoi_Ky = 0) OR (SL_SPDD_QD + MD_HT # 0))'
*!* Tinh gia tri do dang cuoi ky
DO CASE CASE (ThisForm.OptGrpPP_Danh_Gia.Value = 1) && Theo vt truc tiep REPLACE Cuoi_Ky1 WITH ROUND((Dau_Ky1 + Ps_No1) / (SL_Nhap; + SL_SPDD) * SL_SPDD, 0); FOR SL_Nhap + SL_SPDD # 0 AND &_For REPLACE ALL Cuoi_Ky2 WITH 0, Cuoi_Ky7 WITH 0, Cuoi_Ky8 ; WITH 0 FOR &_For CASE (ThisForm.OptGrpPP_Danh_Gia.Value = 2) &&San luong HTTĐ REPLACE Cuoi_Ky1 WITH ROUND((Dau_Ky1 + Ps_No1) / (SL_Nhap; + SL_SPDD) * SL_SPDD, 0) ; FOR SL_Nhap + SL_SPDD # 0 AND &_For
REPLACE Cuoi_Ky2 WITH ROUND((Dau_Ky2 + Ps_No2) / (SL_Nhap; + SL_SPDD_QD) * SL_SPDD_QD, 0); FOR SL_Nhap + SL_SPDD_QD # 0 AND &_For REPLACE Cuoi_Ky7 WITH ROUND((Dau_Ky7 + Ps_No7) / (SL_Nhap ; + SL_SPDD_QD) * SL_SPDD_QD, 0) ; FOR SL_Nhap + SL_SPDD_QD # 0 AND &_For REPLACE Cuoi_Ky8 WITH ROUND((Dau_Ky8 + Ps_No8) / (SL_Nhap ; + SL_SPDD_QD) * SL_SPDD_QD, 0) ; FOR SL_Nhap + SL_SPDD_QD # 0 AND &_For CASE (ThisForm.OptGrpPP_Danh_Gia.Value = 3) && Dinh muc REPLACE ALL Cuoi_Ky1 WITH ROUND(SL_SPDD*DM_Vat_Tu, 0),; Cuoi_Ky2 WITH ROUND(DM_Luong*SL_SPDD_QD,; 0),Cuoi_Ky7 WITH ROUND(DM_Cpchung; *SL_SPDD_QD,0), Cuoi_Ky8 WITH 0 FOR &_For ENDCASE
REPLACE ALL Cuoi_Ky WITH Cuoi_Ky1 + Cuoi_Ky2 + Cuoi_Ky7 + ; Cuoi_Ky8 REPLACE ALL Ps_Co WITH Dau_Ky + Ps_No - Cuoi_Ky,Ps_Co1 WITH ; Dau_Ky1 + Ps_No1 - Cuoi_Ky1, Ps_Co2 WITH Dau_Ky2 +; Ps_No2 - Cuoi_Ky2, Ps_Co7 WITH Dau_Ky7 + Ps_No7 - ; Cuoi_Ky7,Ps_Co8 WITH Dau_Ky8 + Ps_No8 - Cuoi_Ky8 SELECT K_SoTmp0 INDEX ON Tk + Ma_Sp TAG Stt REPLACE ALL Gia WITH IIF(SL_Nhap # 0, ROUND(Ps_Co / SL_Nhap, 0), 0)
USE IN M_DmSp USE IN K_CtTmp0 USE IN K_CtTmp1 USE IN K_SoTmp0 USE IN K_Cd
SELECT K_SoTmp IF RECCOUNT() # 0 THISFORM.Grid2.RecordSource = [] THISFORM.Grid2.RecordSourceType = 0 ZAP THISFORM.Grid2.RecordSourceType = 1 THISFORM.Grid2.RecordSource = [K_SoTmp] ENDIF
APPEND FROM (M_Temp + [K_SoTmp0]) DELETE ALL FOR EMPTY(Ma_Sp) THISFORM.Grid2.SETALL("DynamicForeColor", "IIF( NOT" + _For + ", ; RGB(0, 0, 128), RGB(0, 0, 0))", "Column")
WAIT CLEAR GO TOP THISFORM.Refresh
ThisForm.LockScreen = .F.
4.Thủ tục cập nhật giá
PROCEDURE CmdCapNhatGia.Click()
IF RECCOUNT('K_SoTmp') = 0 RETURN ENDIF
_Screen.MousePointer = 11 THISFORM.LockScreen = .T. WAIT WINDOW M_Process NOWAIT
LOCAL _i, _Dummy
USE (M_Data_Nam + [CDK]) ORDER Tk_Ma_Sp ALIAS K_Cd IN 0 USE (M_Data_Nam + [Ct]) ORDER Stt ALIAS K_Ct IN 0 USE (M_Data_Nam + [Ct0]) ORDER Stt0 ALIAS K_Ct0 IN 0 USE (M_Data_Nam + [SoCai]) ORDER Stt ALIAS K_SoCai IN 0 USE (M_Temp+[K_CtTmp1]) ORDER Stt ALIAS K_CtTmp1 Exclusive IN 0
SELECT K_SoTmp SCAN _Tk = Tk _Ma_Sp = Ma_Sp IF SL_nhap # 0 SELECT K_CtTmp1 SEEK _Tk + _Ma_Sp SCAN REST WHILE (Tk_Co = _Tk).AND.(Ma_Sp = _Ma_Sp) REPLACE Gia WITH K_SoTmp.Gia, Tien WITH; ROUND(So_Luong * K_SoTmp.Gia, 0), ; Gia_Nt WITH K_SoTmp.Gia, Tien_Nt WITH ; ROUND(So_Luong * K_SoTmp.Gia, 0) SELECT K_Ct0 SEEK K_CtTmp1.Stt + K_CtTmp1.Stt0 IF FOUND() REPLACE Tien WITH K_CtTmp1.Tien, Tien_Nt ; WITH K_CtTmp1.Tien_Nt, Ma_Sp; WITH K_SoTmp.Ma_Sp IF K_Ct0.Nh_Ct = [1] REPLACE Tien_Nhap WITH Tien + Tien5,; Tien_N_Nt WITH Tien_Nt + ; Tien_Nt5, Tien_Xuat WITH 0,; Tien_X_Nt WITH 0 ELSE REPLACE Tien_Nhap WITH 0, Tien_N_Nt; WITH 0, Tien_Xuat WITH Tien,; Tien_X_Nt WITH Tien_Nt ENDIF ENDIF DO UpdateSocai WITH K_CtTmp1.Stt IN (M_Prog+[PubLic]) SELECT K_CtTmp1 ENDSCAN
SEEK _Tk + _Ma_Sp SUM Tien TO _Tien REST WHILE (Tk_Co = _Tk).AND.(Ma_Sp ; = _Ma_Sp) _Chenh_Lech = K_SoTmp.Ps_Co - _Tien IF _Chenh_Lech # 0 SEEK _Tk + _Ma_Sp IF FOUND() REPLACE Tien WITH Tien + _Chenh_Lech, Tien_Nt; WITH Tien_Nt + _Chenh_Lech SELECT K_Ct0 SEEK K_CtTmp1.Stt + K_CtTmp1.Stt0 IF FOUND() REPLACE Tien WITH K_CtTmp1.Tien, Tien_Nt ; WITH K_CtTmp1.Tien_Nt IF K_Ct0.Nh_Ct = [1] REPLACE Tien_Nhap WITH Tien + Tien5, ; Tien_N_Nt WITH Tien_Nt + ; Tien_Nt5, Tien_Xuat WITH 0, ; Tien_X_Nt WITH 0 ELSE REPLACE Tien_Nhap WITH 0, Tien_N_Nt WITH 0,; Tien_Xuat WITH Tien, Tien_X_Nt WITH Tien_Nt ENDIF ENDIF
DO UpdateSocai WITH K_CtTmp1.Stt IN (M_Prog + [PubLic])
ENDIF ENDIF SELECT K_CtTmp1
ENDIF
SELECT K_Cd SEEK _Tk + _Ma_Sp IF !FOUND() APPEND BLANK REPLACE Tk WITH _Tk, Ma_Sp WITH _Ma_Sp ELSE _DummyN1 = [Ps_No1_] + TRANS(ThisForm.txtThang1.Value,; [@L 99]) _DummyN2 = [Ps_No2_] + TRANS(ThisForm.txtThang1.Value, ; [@L 99]) _DummyN7 = [Ps_No7_] + TRANS(ThisForm.txtThang1.Value,; [@L 99]) _DummyN8 = [Ps_No8_] + TRANS(ThisForm.txtThang1.Value,; [@L 99]) _DummyC1 = [Ps_Co1_] + TRANS(ThisForm.txtThang1.Value,; [@L 99]) _DummyC2 = [Ps_Co2_] + TRANS(ThisForm.txtThang1.Value,; [@L 99]) _DummyC7 = [Ps_Co7_] + TRANS(ThisForm.txtThang1.Value,; [@L 99]) _DummyC8 = [Ps_Co8_] + TRANS(ThisForm.txtThang1.Value,; [@L 99]) REPLACE &_DummyN1 WITH 0, &_DummyN2 WITH 0,; &_DummyN7 WITH 0, &_DummyN8 WITH 0 REPLACE &_DummyC1 WITH 0, &_DummyC2 WITH 0,; &_DummyC7 WITH 0, &_DummyC8 WITH 0 FOR _i = ThisForm.txtThang1.Value TO ThisForm.txtThang2.Value _DummyN1 = [Ps_No1_] + TRANS(_i, [@L 99]) _DummyN2 = [Ps_No2_] + TRANS(_i, [@L 99]) _DummyN7 = [Ps_No7_] + TRANS(_i, [@L 99]) _DummyN8 = [Ps_No8_] + TRANS(_i, [@L 99]) _DummyC1 = [Ps_Co1_] + TRANS(_i, [@L 99]) _DummyC2 = [Ps_Co2_] + TRANS(_i, [@L 99]) _DummyC7 = [Ps_Co7_] + TRANS(_i, [@L 99]) _DummyC8 = [Ps_Co8_] + TRANS(_i, [@L 99]) REPLACE &_DummyN1 WITH 0, &_DummyN2 WITH 0,; &_DummyN7 WITH 0, &_DummyN8 WITH 0 REPLACE &_DummyC1 WITH 0, &_DummyC2 WITH 0,; &_DummyC7 WITH 0, &_DummyC8 WITH 0
NEXT ENDIF _DummyN1 = [Ps_No1_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyN2 = [Ps_No2_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyN7 = [Ps_No7_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyN8 = [Ps_No8_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyC1 = [Ps_Co1_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyC2 = [Ps_Co2_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyC7 = [Ps_Co7_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyC8 = [Ps_Co8_] + TRANS(ThisForm.txtThang2.Value, [@L 99]) REPLACE &_DummyN1 WITH K_SoTmp.Ps_No1, &_DummyN2 WITH K_SoTmp.Ps_No2,&_DummyN7 WITH ; K_SoTmp.Ps_No7, &_DummyN8 WITH K_SoTmp.Ps_No8 REPLACE &_DummyC1 WITH K_SoTmp.Ps_Co1, &_DummyC2; WITH K_SoTmp.Ps_Co2, &_DummyC7 WITH; K_SoTmp.Ps_Co7, &_DummyC8 WITH K_SoTmp.Ps_Co8 _DummyN1 = [SL_SPDD] + TRANS(ThisForm.txtThang2.Value, [@L 99]) _DummyN2 = [MD_HT] + TRANS(ThisForm.txtThang2.Value, [@L 99])
REPLACE &_DummyN1 WITH K_SoTmp.SL_SPDD, &_DummyN2 ; WITH K_SoTmp.MD_HT
SELECT K_SoTmp ENDSCAN USE IN K_Ct0 USE IN K_Ct USE IN K_Cd USE IN K_SoCai USE IN K_CtTmp1 SELECT K_SoTmp
GO TOP THISFORM.LockScreen = .F. _Screen.MousePointer = 0
=MESSAGEBOX(M_End_Proc, 64, M_App_Name)
5.Thủ tục cập nhật sổ cái
PROCEDURE UpDateSoCai
PROCEDURE UpDateSoCai PARAMETER _Stt LOCAL _Select, _Used_Ct, _Used_Ct0, _Used_SoCai, _inTransaction
_Select = SELECT() _Used_Ct = USED([K_Ct]) _Used_Ct0 = USED([K_Ct0]) _Used_SoCai = USED([K_SoCai])
IF NOT _Used_Ct USE (M_Data_Nam + [Ct]) ORDER Stt ALIAS K_Ct AGAIN IN 0 ENDIF IF NOT _Used_Ct0 USE (M_Data_Nam + [Ct0]) ORDER Stt0 ALIAS K_Ct0 AGAIN IN 0 ENDIF IF NOT _Used_SoCai USE (M_Data_Nam + [SoCai]) ORDER Stt ALIAS K_SoCai Again IN 0 ENDIF
SELECT K_Ct SEEK _Stt
SELECT K_Ct0 SEEK _Stt IF !FOUND([K_Ct]) OR !FOUND([K_Ct0]) IF NOT _Used_Ct USE IN K_Ct ENDIF IF NOT _Used_Ct0 USE IN K_Ct0 ENDIF IF NOT _Used_SoCai USE IN K_SoCai ENDIF SELECT (_Select) RETURN ENDIF
_inTransaction = TXNLEVEL() IF _inTransaction = 0 BEGIN TRANSACTION ENDIF
*!* Xoá định khoản
DO UpdateCdK WITH _Stt, -1 SELECT K_SoCai SEEK _Stt SCAN REST WHILE K_SoCai.Stt = _Stt DELETE UNLOCK ENDSCAN
*! Các định khoản giá vốn, giá bán
SELECT K_Ct0 SEEK _Stt SCAN REST WHILE Stt = _Stt SCATTER MEMVAR M.Ma_Dt0 = M.Ma_Dt IF !EMPTY(M.Tk_No + M.Tk_Co) AND ((K_Ct0.Posted = [C]) OR; (K_Ct0.Ma_Ct $ [HD,TL])) DO UpDateSocai0 WITH [] ENDIF IF !EMPTY(M.Tk_No2 + M.Tk_Co2) AND (K_Ct0.Posted = [C]) DO UpDateSocai0 WITH [2] ENDIF IF !EMPTY(M.Tk_No3 + M.Tk_Co3) AND (K_Ct0.Posted = [C]) DO UpDateSocai0 WITH [3] ENDIF IF !EMPTY(M.Tk_No4 + M.Tk_Co4) AND (K_Ct0.Posted = [C]) DO UpDateSocai0 WITH [4] ENDIF IF !EMPTY(M.Tk_No5 + M.Tk_Co5) AND (K_Ct0.Posted = [C]) DO UpDateSocai0 WITH [5] ENDIF IF !EMPTY(M.Tk_No6 + M.Tk_Co6) AND (K_Ct0.Posted = [C]) DO UpDateSocai0 WITH [6] ENDIF IF !EMPTY(M.Tk_No7 + M.Tk_Co7) AND (K_Ct0.Posted = [C]) DO UpDateSocai0 WITH [7] ENDIF SELECT K_Ct0 ENDSCAN
DO UpdateCdK WITH _Stt, 1 DO UpDateTTien WITH _Stt IF _inTransaction = 0 END TRANSACTION ENDIF IF NOT _Used_Ct USE IN K_Ct ENDIF IF NOT _Used_Ct0 USE IN K_Ct0 ENDIF IF NOT _Used_SoCai USE IN K_SoCai ENDIF SELECT (_Select) RETURN
tài liệu tham khảo
1. Giáo trình Hệ Thống Thông Tin Quản Lý TS Trương Văn Tú – TS Trần Thị Song Minh NXB Thống Kê, Hà Nội, 2000
2. Giáo trình Kế Toán Máy TS Trần Thị Song Minh NXB Thống Kê, Hà Nội, 2000
3. Project Guide Apptech Limited - First Edition, 1999, India
4. Microsoft Visual Foxpro – Online Document.
5. Hướng dẫn thực hành về kế toán chi phí sản xuất và tính giá thành sản phẩm trong doanh nghiệp.
PTS.Võ Văn Nhị – ThS.Phạm Thanh Liêm – ThS.Lý Kim Huê NXB Thống Kê, Hà Nội, 1999
6. Kế toán tập hợp chi phí sản xuất và tính giá thành sản phẩm Nhà giáo ưu tú Vũ Huy Cẩm NXB Thống Kê, Hà Nội, 1996
7. Hướng dẫn thực hành chế độ kế toán mới. TS. Phạm Văn Dược - Đặng Kim Cương
NXB Thống Kê, Hà Nội, 1999
Các file đính kèm theo tài liệu này:
- K0342.doc