Chơng iii
5.Sơ đồ phân rã chơng trình:
tại Công ty ống thép Hòa Phát Tập hợp chi phí sản xuất Phân bổ chi phí sản xuất Tính
giá thành sản xuất Lập các báo cáo
Chi phí nhân công trực tiếp Chi phí sản xuất chung Chi phí nguyên vật liệu phụ Chi phí nguyên vật liệu chính Phân bổ chi phí vật liệu chính Phân bổ các chi phí khác Tính số lượng sản phẩm hoàn thành Tính tổng giá thành và giá thành đơn vị Bảng phân tích giá thành Báo cáo tổng hợp chi phí giá thành Báo cáo phân bổ nguyên vật liệu Các báo cáo khác Xác định tỉ lệ phân bổ vật liệu chính Tra cứu định mức số lượng vật liệu chính Tra cứu sản phẩm hoàn thành Tính tỉ lệ phân bổ vật liệu chính
6. Các thuật toán chính của chơng trình Trang - 77 - Trang - 77 - Bắt đầu Chọn tệp Định khoản Tính tổng của trường "Thành tiền" theo từng "Mã sản phẩm" Đọc bản ghi Tính giá thành đơn vị sản phẩm từng loại Chuyển sang bản
ghi tiếp theo
Đ
s
đ <Điều kiện về thời gian>
Đ Cập nhật giá Kết thúc <TK nợ = 154> <TK nợ = 155>
Tính tổng của trường "Số lượng" theo từng "Mã sản phẩm" Bản ghi cuối ? đ s s s
Thuật toán tính giá thành sản xuất
Bắt đầu
Mở các tệp cần thiết để phân bổ
Tạo ra tệp các tạm thời
để lưu các kết quả trung gian
Chọn tệp
DANH Mục Phân Bổ
Đọc bản ghi
Kiểm tra biến M.Chọn=[x]
Xác định bút toán phân bổ: TK nợ,TK có
Phân bổ chi phí sản xuất theo bút toán đã xác định
Định khoản kết quả phân
bổ vào tệp định khoản
Chuyển sang bản
ghi tiếp theo Bản ghi cuối ?
Đ Đ s s Kết thúc Xóa các tệp Tạm thời
Thuật toán tổng quát phân bổ chi phí sản xuất
Trang - 79 -
Bắt đầu
Chọn tệp
Định khoản
Tính tổng của trường "Thành tiền" theo từng "Mã vật tư"
Lưu kết quả vào tệp
tạm thời Đọc bản ghi Tính tỉ lệ phân bổ vật liệu chính Chọn tệp định mức Chuyển sang bản
ghi tiếp theo Bản ghi cuối ? Đ
s
s
<Điều kiện về thời gian> .AND.<TK nợ=6211> Đ Phân bổ chi phí vật liệu chính Định khoản kết quả phân bổ Bắt đầu
Thuật toán phân bổ chi
phí nguyên vật liệu chính Bắt đầu
Lấy các tham số để lập báo cáo
Xử lý số liệu để tạo ra một tệp tạm trước khi lên báo cáo Lọc ra các số liệu từ các tệp dữ
liệu phát sinh và số dư
Preview báo cáo
In báo cáo
Kết thúc Browse tệp số liệu tạm thời
Browse tệp số liệu tạm thời
Thuật toán tổng quát lập báo cáo
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, lu 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
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 EXCLUSIVEINDEX 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
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_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]) +[-;