208 Chương ð: Phần kế toán công nợ phải trả and CreatedBy = case @UserName when '' then CreatedBy else @UserName end ` order by InvoiceDate DESC if @Level=3 11 Trường hợp liệt kê mẩu t
Trang 12.1 Liét ké và tìm kiếm mẩu tin
Đối với trường hợp liệt kê và tìm kiếm lô hóa đơn mua hàng, bạn gọi thủ tục nội tại có tên udsPurchaselnvoiceBatchs có cấu trúc như ví dụ 5-7 bằng phương thức FillPurehaselnvoiceBatchsToGridView
CREATE PROC uđsPurchaseTnvoiceBatchs
#1 Khai báo tham số
select BatchStatus AS Approval,
BatchStatus AS Status, InvoiceBatchId,
InvoiceBatchDate,
DescriptionInVietnamese,
CreatedBy, CreatedDate, ModifiedBy, ModifiedDate
from PurchaseInvoiceBatchs
where BatchStatus = case @BatchStatus
when 2 then BatchStatus else @BatchStatus end
and InvoiceRatchDate>= @StartDate and
£] Tìm kiếm mầu tin dựa uào từ khóa
select BatchStatus AS Approval,
BatchStatus AS Status, InvoiceBatchId,
InvoiceBatchDate,
DescriptionInVietnamese,
CreatedBy, CreatedDate, ModifiedBy, ModifiedDate
from PurchaseInvoiceBatchs
where BatchStatus = case @BatchStatus
when 2 then BatchStatus else @BatchStatus end
and InvoiceBatchDate>= @StartDate and
InvoiceBatchDate<=@EndDate
Trang 2
Chuong 5; Phan ké toan céng ng phai tra 203
and CreatedBy = case @UserName when '' then CreatedBy
else @UserName end
and CONTAINS (*, @Keyword)
order by InvoiceBatchDate DESC
co
2.2 Thêm mới và cập nhật mẩu tin
Để thêm mới và cập nhật lô hóa đơn mua hàng, bạn khai báo gọi thủ
tục nội tại có tên udsPurchaselnvoiceBatchs;4 có cấu trúc như ví dụ 5-8 trong phương thức SavePurchaselInvoiceBatch
haseInvoiceBatchs;4
CREATE PROC udsPurchaseInvoiceBatchs;4
11 Khai báo tham số
Trang 3select Convert (char(11), InvoiceBatchDate, 106)
AS DateOfInvoiceBatch, * from PurchaseInvoiceBatchs Where InvoiceBatchId = @InvoiceBatchId
GO
2.3 Xóa mẩu tin
Tương tự, để xóa mẩu tin trong bảng PurchaselnvoiceBatchs, bạn có
thể gọi thủ tục nội tại có tên udsPurchaselnvoiceBatchs;3 trong phương thức DeletePurchaseInvoiceBatch như ví dụ 5-10
Ví dụ 5-10: Thủ tục nội tai udsPurchaseInvoiceBatchs;3
CREATE PROC udsPurchaseTnvoiceBatchs ; 3
@InvoiceBatchId varchar (10)
AS
11 Xéa mau tin
delete from PurchaseInvoiceBatchs
Where InvoiceBatchId = @InvoiceBatchId
GO
Ngoài ra, tương tự như bảng SalesInvoieeBatchs, bạn cần khai báo Trigger trong bảng PurchaselnvoiceBatchs có tên trgSalesInvoiceBatch với cấu trúc như ví dụ 4-17 để cập nhật trạng thái hóa đơn mua hàng khi người
sử dụng duyệt lồ hóa đơn mua hàng
Ví dụ 5-11: Cấu trúc Trig gPurchaseÍfnvoieeBatchi
CREATE TRIGGER trgPurchaseInvoiceBatch
ON PurchaseInvoiceBatchs
FOR UPDATE
AS
+7 Khai bdo biển
DECLARE @BatchStatus bit
DECLARE @InvoiceBatchId VARCHAR (10)
1Ị Rhai báo lấy gid tri tu bang INSERTED
SELECT @BatchStatus = BatchStatus,
Trang 4đích đã được trình bày trong phần trước
3 HÓA ĐƠN MUA HÀNG
Trong khi chức năng quản lý hóa đơn bán hàng mà doanh nghiệp ghỉ
nợ cho khách hàng thì chức năng quản lý hóa đơn mua hàng là nghiệp vụ
mà doanh nghiệp ghi nợ phải trả cho nhà cung cấp khi mua sản phẩm hay dịch vụ của họ
Tương tự như chức năng quản lý hóa đơn bán hàng, giao diện chính
của frmPurchaselnvoices bao gồm hai phần Phần bên trái là danh sách
`_eountry, province và nhà cung cấp, bên phải là phần liệt kê danh sách hóa đơn mua hàng như hình 5-3
Trang 5SalesInvoiceBatchs, SalesInvoices, SalesInvoiceDetails va Customers còn
chức năng quản lý hóa đơn mua hàng từ nhà cưng cấp thì liên quan đến các bảng tương ứng cùng mục dich như: PurchaseinvoiceTypes,
PurchaseInvoiceBatchs, Purchaselnvoices, PurchaseInvoiceDetails va
Suppliers
Để trình bày danh sách hóa đơn mua hàng, bạn khai báo thủ tục nội tại có tên udsPurchaselnvoices;2 có cấu trúc như vi du 5-12 va goi trong phuong thie FillPurchaseInvoicesToGridView
wdsPurchaseInvo
CREATE PROC udsPurchaselInvoices;2
1ƒ Khai báo tham số
select Approval, Status, Invoiceld,
InvoiceBatchId, InvoiceDate, SupplierId,
€ompanyNameTnVietnamese, Currency14,
ExchangeRate, Amount, DescriptionInVietnamese from
vwPurchaseInvoices
where SupplierId = case @SupplieriId when '' then
SupplierId else @SupplierId end
and InvciceBatchId = case @BatchId when '' then
InvoiceBatchId else @BatchId end
and Status = case @InvoiceStatus when 2 then Status else @InvoiceStatus end
and InvoiceDate>= @StartDate and
TnvoiceDate<=@EndDate
and CreatedBy = case @UserName when '' then CreatedBy
else @UserName end
order by InvoiceDate DESC
else
1] Tim kiém méu tin dua vdo tit khéa
select InvoiceStatus AS Approval,
InvoiceStatus AS Status, P.Invoiceld,
InvoiceBatchId, InvoiceDate, P.SupplierTd,
Trang 6P.SupplierId = case @SupplierId when '' then
P.Supplierid else @Supplierid end
and InvoiceBatchId = case @BatchId
when '' then InvoiceBatchId else @Batchid end
and InvoiceStatus = case @InvoiceStatus when 2 then involceStatus else @InvoiceStatus end
and P,CreatedBy = case @UserName when '' then
P.CreatedBy else @UserName end
and InvoiceDaLe>= @StartDate and
invoicebate<=@EndDate
and CONTAINS (P.*, @Keyword)
Group by InvoiceStatus, P.Invoiceld,
InvoiceBatchld, Invoicebate, P.SupplierId,
CompanyName InVietnamese, Currencyld,
Để cho phép người sử dụng Hệt kê danh sách hóa đơn mua hàng ứng
với mã tỉnh thành hay mã nhà cưng cấp, bạn khai báo gọi thủ tục nội tại có tên udsPurchaselnvoices như ví dụ õ-13 trong phương thức được cài đặt overload 1a FillPurchaseInvoicesToGridView
select Approval, Status, Invoiceld,
InvoiceBatchId, InvoiceDate, SupplierId,
CompanyNameInVietnamese, Currencyld,
ExchangeRate, Amount, DescriptionInVietnamese
from vwPurchaseInvoices
where Provinceld = @ItemId
and Status = case @InvoiceStatus when 2 then Status
else @InvoiceStatus end
Trang 7
208 Chương ð: Phần kế toán công nợ phải trả and CreatedBy = case @UserName when '' then CreatedBy else @UserName end `
order by InvoiceDate DESC
if @Level=3
11 Trường hợp liệt kê mẩu tin theo mã nhà cung cấp
select * from vwPurchaseTnvoices
NHERE Supp1ierTđ = @ItemId
and Status = case @InvoiceStatus when 2 then Status else @InvoiceStatus end
and CreatedBy = case @UserName when '' then CreatedBy
else @UserName end
order by InvoiceDate DESC
GO
Trong đó, đối tượng View có tên vwPurchaselnvoices dùng để tổng
hợp dữ liệu từ hai bảng Purchaselnvoices và PurchaselnvoiceDetails có cấu trúc như vi dy 5-14
CREATE VIEW vwPurchaseInvoices
AS
select InvoiceStatus AS Approval,
InvoiceStatus AS Status, P.Invoiceld, Provinceld,
InvoiceBatchId, InvoiceDate, P.SupplierId,
CompanyNameInVietnamese, Currencyid, P.CreatedBy,
ExchangeRare, SUM (Quantity*Price* (1+VArRate/100)
-Discount) AS Amount, DescriptionInVietnamese
from Suppliers S inner join PurchaseInvoices P
on P.SupplierId = S§.Supplierid
left join PurchaseInvoiceDetails D
on D.Invoiceld =P.InvoicelId
Group by InvoiceStatus, P.Invoiceld, Provinceld,
InvoiceBatchId, InvoiceDate, P.Supplier1d,
í dụ 5-15: Thủ tục nội tại udsPurchaselnv:
CREATE PROC udsPurchaselInvoices;3
@Invoiceld varchar (10}
AS
select P.*, CompanyNameInVietnamese,
Convert (char(11), InvoiceDate,106) AS DateOfInvoice
from PurchaseInvoices P, Suppliers S
Trang 8
Chương 5ð: Phần kế toán công nợ phải trả 209
Where P.Supplier1Id = S.SupplierTd
and InvoiceId = @Invoiceld `
GO
Khi liệt kê thông tin của hóa đơn mua hàng đang chọn, bạn cần gọi thủ tục nội tại có tên udsPurchaselnvoices;4 với cấu trúc như ví dụ 5-16 trong phương thức FillPurchaseInvoiceDetailsToGridView
CREATE PROC uđsPurchaseTnvoices; 4
@InvoicelId varchar (10)
AS
select OrdinalNumber AS '#', D.ProductId,
ProductNameInVietnamese, Quantity, Price,
Discount, D.VATRate, D.ImportTaxRate,
Quantity*Price* (1+D VATRate/100)
-Discount AS Amount
from PurchaseInvoiceDetails D, Products P
Where P ProductId = D ProductId
and InvoiceId = @InvoicelId
GO
Chẳng hạn, khi chỉnh sửa thông tin của hóa đơn mua hàng, danh
sách chỉ tiết hóa đơn mua hàng trình bày như hình 5-4
Oe = Vietnam Und Sate lewoice Date [G/02/207 =] BatchNa [PBDI2(020A40) ced : SSC
The Tana Hã Chí Mnh Canny eran bore 3] Em Hobdmmahing TM
Sales Invice Dota
2 POOOD2 _Tiixéch dig chohe seh
Createdfiy: dbo: CreatedD ate: 12/25/2007 4:18:00 PM: ModiiedBy dba: ModtiedD ste: 12/28/2007 41:00PM *
Uodite [ Bak | Dese | - Pạt | AdiDeud | DadsDeai| — Aemwe[ Hep | Gove |
end 9) Logged oe hdintroter) E]Prchge Ives Logpedn 6.4030 dóf 4i Jù es
Hinh 5-4: Chi tiết hóa đơn mua hàng
Trang 9
210 Chương ð: Phần kế toán công nợ phải trả
Ngoài ra, để thêm mới chỉ tiết hóa đơn mua hàng, bạn khai báo thủ tục nội tại có tên udsPurchaselnvoices;8 nhu vi du 5-17 và gọi trong phương thức SaveInvoiceDetail thuộc frmlnvoieeDetails dùng cho trường hợp khai
báo chỉ tiết hóa đơn bán hàng
hủ tục nội tại udsPurchaseInvoiees;8|
CREATE PROC udsPurchaseInvoices;8
£† Khai bảo tham số
INSERT INTO PurchaseInvoiceDetails
(OrdinalNumber, Invoiceld, ProductId,
Quantity, Price, VATRate, Import TaxRate)
VALUES (@OrdinalNumber, @Invoiceld, @Productid,
@Quantity, @Price, @VATRate, @ImportTaxRate)
Else
/f Truong hop cdp nhat méu tin
update PurchaseInvoiceDetails
set Quantity=@Quantity, Price=@Price,
VATRate=@VATRate, Import TaxRate=@ImportTaxRate
Where InvoiceId= @Invoiceld
and ProductId = @ProductId
and OrdinalNumber = @OrdinalNumber
Chẳng hạn, khi người sử dụng Double Click vào chỉ tiết hóa đơn mua
hang thi frmInvoiceDetails xuất biện như hình 5-5,
Trang 10delete from PurchaseInvoices
Where InvoiceId= @InvoiceId
GO
Ngoài ra, dé cho phép người sử dụng xóa chỉ tiết hóa đơn mua hàng,
bạn khai báo gọi thủ tục nội tại có tên udsPurehaselnvoices;6 với cấu trúc như ví dụ 5-19 trong phương thức DeletelnvoiceDetail
Thu tuc ni tai udsPurchaseInvoices;6|
CREATE PROC udsPurchaseInvoices; 6
// Khai bdo tham sé
@OrdinalNumber int,
@InvoiceId varchar (10) ,
@ProductId varchar (50)
Trang 11
Chương 5ð: Phần kế toán công nợ phải trả
delete from PurchaselnvoicesPetails
Where InvoicelId = @Invoicelda
and ProductId = @ProductIid
and OrdinalNumber = @OrdinalNumber
GO
Ngoài ra, những phương thức có cùng chung mục đích tương tự chức năng quản lý hóa đơn bán hàng sẽ không được trình bày trong phần này
4 TÌNH HÌNH CÔNG NỢ PHÁI TRẢ
Ngược lại với chức năng quản lý công nợ phải thu, doanh nghiệp có
thể mua hàng từ nhà cung cấp và thực hiện việc thanh toán theo hóa đơn cũng như số tiên còn nợ chưa thanh toán, bạn xây dựng chức năng này để
theo dõi công nợ phải trả đầu kỳ, quá trình mua hàng và thanh toán trong
kỳ để tính công nợ phải trả cuối kỳ
Công nợ phải trả cuối kỳ cho nhà cung cấp được tính bằng công nợ phải trả đầu kỳ cộng với tổng giá trị tiền mua dựa trên hóa đơn mua hàng trừ đi số tiền mà doanh nghiệp đã trả bằng cách tính tổng cộng phiếu chỉ
với công thức như sau:
CONG NO PHAT TRA CUỐI KY = CONG NO PHAI TRA DAU KY + TONG
TIEN MUA TRONG THANG — TONG TIEN DA TRA TRONG THANG
Chit §: DE tim hiéu chtfc nang nay, ban b&t ddu trinh don Account
Payable | Account Payable dé kich hoat form cé tén frmAccountPayable va cde thd tuc luu trong tap tin AccountPayableProcedures.sql
4.1 Giao diện chính
frmAccountPayable được thiết kế thành hai phần, phần bên trái là
danh sách country và province, phần bên phải là tình hình công nợ phải trả
cho nhà cung cấp
Chẳng hạn, bạn thiết kế form có tên frmAccountPayvable có giao diện bao gồm hai phần như hình 5-6
Đối với phần bên phải, bạn chia ra thành ba trường hợp Trường hợp
thứ nhất là đọc mẩu tin ứng với tình hình công nợ phải trả đã tính toán trong bảng AccountPayable bằng cách nhấn nút Refresh với tùy chọn như
hình 6-7,
Trang 12Chương 5: Phần kế toán công nợ phải trả 213 [M]°
Hinh 5-7: Liét ké tình hình công nợ phải trả trong tháng
“Trường hợp thứ hai là cho phép người sử dụng liệt kê tình hình công
nợ phải trả của các tháng trong quá khứ bằng cách nhấn nút Refresh
Giả sử, tháng hiện tại là 10/2007, tháng trước đó là tháng 09/2007 thì
bạn chọn tùy chọn tương tự như hình 5-8
Hình ð-8: Liệt kê công nợ phải trả trong tháng 09/2007
Lưu §: Cả hai trường hợp trên đều dựa theo mã tỉnh thành nếu người
sử dụng chọn mã tỉnh thành phía bên trái
Đối với trường hợp thứ ba là tính lại công nợ phải trả cho nhà cung
cấp trong tháng hiện hành hoặc bạn có thể cho phép người sử dụng tính
Trang 13mt System Monogement Console (Account Payable] Pana eal
Several Ledger Account Recehable Account Bayable _Irvertory Contos Drectories ose North Rights Hợp
Hinh 5-9: Tinh cong ng phdi trả theo bhoảng thời gian trong tháng
4.2 Khai báo liệt kê
Để liệt kê mẩu tin ứng với công nợ phải trả cho nhà cung cấp trong
bảng MonthlyAccountPayable da tam tinh hay tình hình công nợ phải trả của các tháng trước từ bảng CloseAccountReceivableDetails, bạn khai báo thủ tục nội tại có tên udsAccountPayable như ví dụ 5-20
20: Thủ tục nội tai udsAccountPayable
CREATE PROC udsAccount Payable
11 Khai báo tham số
SELECT C.SupplierId, CompanyNameInVietnamese,
BeginAmount, PurchaseAmount, PaidAmount, EndAmount,
MaxDebitAmount, case when EndAmount -MaxDebitAmount>0 then 'Over Debit' else '' end AS 'Debit Status’
FROM Suppliers C LEFT JOIN
MonthlyAccount Payable AP
ON C.SupplierId = AP.SupplierTd
WHERE Provinceld = CASE @Provinceld
WHEN '' THEN ProvinceId ELSE @Provinceld END
ELSE
LỊ Trường hợp liệt bê mẩu tin tháng chỉ định trong quá khứ
SELECT C.SupplierId, CompanyNameInVietnamese,
BeginAmount, PurchaseAmount, PaidAmount, EndAmount
FROM Suppliers C LEFT JOIN
CloseMonthAccount PayableDetails AP
ON C.SupplierId = AP.SupplierId
WHERE Provinceld = CASE @Provinceld
WHEN '' THEN Provinceld ELSE @ProvincelId END
AND CloseMonth = @MonthYear
GO
Trang 14Chuong 5: Phan ké todn công nợ phải trả 215
Sau đó, bạn khai báo gọi thủ tục nội tại này trong phương thức THIAPToGridView như ví dụ 5-21,
if (dataTable.Rows.Count > 0)
{
Trang 15Bằng cách gọi phương thức FillAPToGridView trong biến cố Load của
form hay Click của nut btnRefresh, bạn có thể liệt kê mẩu tin theo hai tùy
chọn trên
Chẳng hạn, khi bạn thực thi chương trình, dữ liệu đang có trong bảng MonthlyAceountPayable sẽ trình bày tương tự như hình 5-10
ven 3 ÌCăngty Trách Nhện Hu Hon Suz Ì
Thaathendu: || |” 3m3 lcưgyGEgaaYmaaVAMe | ne weownn | Icing ich ib en oss) smo
me | Cingy ch it utero ng ich it sant
Zot Amount |
Cee nef
Roady SE) Lopied ae [AdrinstratorZ) Account Payable Logged [11:26:40 AM]
Hinh 5-10: Tinh hinh cong ng phdi tra
Trang 16Chương 5: Phần kế toán công nợ phải trả 217 [M|°
Trong trường hợp bạn muốn trình bày công nợ phải trả cho nhà cung cấp trong tháng 09/2007, bạn chọn vào tùy chọn Specifie Month và nhấn
nút Refresh thì kết quả trình bày như hình 5-11
it System Management Console « [Account Payable}
ShowPanels và gọi nó trong biến cố CheckedChanged của 3 điều khiển
rdoCalculate, rdoSpeciñieMonth và rdoMonthly tương tự như đã trình bày
trong phần trước
Tương tự cách so sánh với số tiền nợ phải thu lớn nhất cho phép được
khai báo trong cột MaxDebitAmount của mỗi nhà cung cấp thuộc bảng
Suppliers, bạn có thể trình bày trạng thái công nợ phải trả vượt quá số
lượng cho phép
Để làm điều này, bạn khai báo trong thủ tục nội tại
udsAccountPayable, trạng thái này sẽ trình bày như hình 5-12
Trang 17Hinh 5-12: Cong ng phdi tré vuot quá giới hạn cho phép
4.3 Tinh céng ng phai tra
Tương tự như cách tính công nợ phải thu của khách hàng, bạn cũng chia chức năng này thành hai trường hợp Trường hợp thứ nhất là tính cho tất cả nhà cung cấp Trường hợp thứ hai chỉ tính lại công nợ cho nhà cung cấp đang chọn
Để làm điểu này, bạn khai báo thủ tục nội tại có tên udsAccountPayable;2 ding để tính công nợ phải trả cho tất cả nhà cung cấp
với cấu trúc như ví dụ 5-22
CREATE PROC uđsAccountPayable;2
11 Khai báo tham số
@PreviousMonth CHAR (8),
@startDate smalldatetime,
@EndDate smalldatetime
AS
// Khai bdo xéa dit ligu dang tén tai trong bang MonthlyAccountReceivable
DELETE FROM MonthlyAccount Payable;
11 Khai báo bảng dữ liệu ảo uới phát biểu WITH
WITH ARBAndPurchaseAmount
Trang 18
Chương 5: Phản kế toán công nợ phải trả - 219
71 Khai báo tổng hợp dữ liệu từ bảng CloseMonthAccountPayableDetails
71 ứng uới công nợ đầu kỳ
SELECT SupplierId, EndAmount As BeginningAmount,
0 As PurchaseAmount, 0 As PaymentsAmount
FROM CloseMonthAccount PayableDetails
WHERE CloseMonth = @PreviousMonth
UNION ALL
// Khai béo téng hop da liệu từ bảng Purchaselnvoices va
11 PurehaselnuoiceDetalls ứng uới tiền mua hàng
WHERE S.Invoiceld = D.Invoiceld
AND InvoiceDate between @StartDate and @EndDate
INSERT INTO MonthlyAccount Payable
(SupplierId, BeginAmount, PurchaseAmount, PaidAmount,
EndAmount }
SELECT C.SupplierId,
SUM (BeginningAmount) AS BeginningAmount,
SUM (PurchaseAmount) AS PurchaseAmount,
SUM (PaymentsAmount) AS PaymentsAmount,
SUM (BeginningAmount) + SUM(PurchaseAmount )
Trang 19CREATE PROC udsAccount Payable; 3
{1 Khai bdo tham sé
11 Khai báo xóa dữ liệu dang tén tai trong bang
(† MonthlyAceountPayable của một nhà cung cấp
DELETE FROM MonthlyAccount Payable
WHERE Supplierld = @Supplierid;
£1 Khai báo bảng dữ liệu áo uới phát biểu WITH
WITH ARBAndSalesAmount
AS
{ {
+] Khai báo tổng hợp dữ liệu lừ bảng CloseMonthAccouniPayableDetaiis
17 ứng uới công nợ phải trả đầu hỳ của một nhà cung cấp
SELECT SupplierTd, EndAmount As BeginningAmounE,
OAs PurchaseAmount, 6 As PaymentsAmount
FROM CloseMonthAccount PayableDetails
WHERE CloseMonth = @PreviousMonth
/1 Lọc theo một nhà cung cấp
AND Supp1ierTả z @SupplierTđ
UNION ALL
11 Khai báo tổng hợp dữ liệu từ bảng Purchaselnvoices va
11 PurehaselnuoiceDetails ứng uới tiên mua hàng của nhà cung cấp
1} Loc theo một nhà cung cấp
AND Supplierid = @SupplierId
AND InvoiceDate between @StartDate and @EndDate
GROUP BY SupplierId
11 Khai báo tổng hợp dit ligu tit bang Payments ting vdi
// tién tré cia nha eung edp
Trang 20
Chương 5: Phản kế toán công nợ phải trả 221
AND PaymentDate between @StartDate and @EndDate
GROUP BY SupplierId
11 Khai báo thêm tổng hợp dữ liệu từ bằng ARBAndPurchaseAmount
£ƒ uào bằng MontllyAccountPayable của một nhà cung cấp
INSERT INTO MonthlyAccount Payable
(SupplierlId, BeginAmount, PurchaseAmount, PaidAmount,
EndAmount )
SELECT C.Supplierld,
SUM (BeginningAmount} AS BeginningAmount,
SUM{PurchaseAmount) AS PurchaseAmount,
SUM (PaymentsAmount) AS PaymentsAmount,
SUM (BeginningAmount} + SUM(PurchaseAmount)
1 Khai bảo vd khởi tạo đối tượng ASCommon
ASCommon asCommon = new ASConunon (} ;
đJ Tính tháng trước đó bằng cách gọi phương thức
417 GetPreulousMonth khai báo trong lớp ASCommon