202 Chương ð: Phần kế tốn cơng nợ phải trả
Chú $: Để tìm hiểu chức năng này, bạn bắt đầu trinh don Account Payable | Purchase Invoices | Purchase Invoice Batchs để kích hoạt form
có tên frmPurchaselnvoiceBatchs, các thủ tục lưu trong tap tin PurchaseInvoiceBatchProcedures.sql
2.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ố @BatchStatus tinyint, @Keyword nvarchar (50), @StartDate smalldatetime, @EndDate smalidatetime, @UserName varchar (50) AS +] Liệt bề miẩu tin if (@Keywords'')
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 InvoiceBatchDate<=@EndDate
and CreatedBy = case @UserName when '' then CreatedBy else @UserName end
order by InvoiceBatchDate DESC else
£] 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
Trang 2Chuong 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ố @Flag BIT, 2 @invoiceBatchid VARCHAR (10), @invoiceBatchDate SMALLDATETIME, @bescriptionInVietnamese NVARCHAR (150), @BatchStatus BIT AS {/ Truong hợp thâm mới mẫu tin IF @Flag =1 INSERT INTO PurchaseInvoiceBatchs ( InvoiceBatchld, InvoiceBatchDate, DescriptioninVietnamese, BatchStatus, CreatedBy, CreatedDate} VALUES {(@InvoiceBatchId, @InvoiceBatchDate, @DescriptionInVietnamese, @BatchStatus, CURRENT_USER, GETDATE(}) ELSE 11 Trường hợp cập nhật mẩu tin UPDATE PurchaseInvoiceBatchs SET InvoiceBatchDate = @Invoi DescriptionInVietnamese = @DescriptionInVietnamese, BatchStatus = @BatchStatus, Modi fiedBy = CURRENT_USER, ModifiedDate = getdate() WHERE InvoiceBatchid=@InvoiceBatchid GO
Đối với trường hợp chỉnh sửa mẩu tin, bạn khai báo gọi thủ tục nội tại có tên udsPurchaseInvoiceBatchs;2 trong phương thức EditPurchaselnvoiceBatch
Trang 3Chương 5: Phần kế tốn cơng nợ phải trả CREATE PROC udsPurchaseInvoiceBatchs;2 @InvoiceBatchId varchar (10) AS
select 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
Trang 4Chương 5ð: Phần kế toán công nợ phải trả 205 UPDATE PurchaseTnvoices SET InvoiceStatus = 1 WHERE InvoiceBatchId = @InvoiceBatchId GO Lưu ý: Những phương thức như DeletePurchaselInvoiceBatch, SavePurchaselnvoice, FillPurchaseInvoiceBatchsToGridView va EditPurchaseInvoiceBatch cé cu tric tuong tu cdc phuong thiic cling muc
đí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
Trang 5
206 Chương 5: Phần kế tốn cơng nợ phải trả
hi làm việc với chức năng quản lý hóa đơn bán hàng cho khách hàng, bạn quan tâm đến các bảng dữ liệu liên quan như: SalesInvoiceTypes,
SalesInvoiceBatchs, 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ố @SupplierId char (5}, §Batch1đ VARCHAR (10), @InvoiceStatus tinyint, @keyword nvarchar(50}, @StartDate smalldatetime, @EndDate smalldatetime, @UserName varchar (50) AS /} Ligt k@ mdu tin if (@Keyword='')
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,
Trang 6Chương ð: Phần kế toán công nợ phải trả 207 CompanyNameInVietnamese, Currencyld, ExchangeRate, ` SUM (Quanr i=y*Price* (1+VATRate/100) -Discount) AS Amount, DescriptionInVietnamese from PurchaseInvoices P, Suppliers S, PurchaseInvoiceNetails D WHERE P.SupplierId = $.SupplierId and D.Invoiceld = P,Invoiceld
P.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, ExchangeRate, DescriptionInVietnamese order by InvoiceDate DESC Q 3
Để 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 udsPurchaseInvoices CREATE PROC udsPurchaseInveices @ItemId varchar (5}, @Level tinyint, @InvoiceStatus tinyint, @UserName varchar (50) AS f1 Trường hợp liệt bê mầu tìn theo mã tính thành if @Level=2
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
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, CompanyNameInVietnamese, Currencyld,
ExchangeRate, DescriptionInVietnamese, P.CreatedBy Go
Thi chỉnh sửa thông tin hóa đơn mua hàng, bạn cũng khai báo gọi thủ tục nội tại có tên udsPurchaselnvoices;3 trong phương thức EditPurchaselnvoice với cấu trúc như ví dụ 5-15
í 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
Trang 8Chương 5ð: Phần kế tố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
PurchaseInvoic
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 Le ee 7 =ƒ xi He Gereraliedo Aetrtm-Mulb Acartonlle verter Carts Oredanes core re Rg _ eb Edit Purchase Invoice
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 Hài Bên | [CS BH Darga banking beh Ding tanTte twos Stahe Agpovel [Puchase
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
Trang 9
210 Chương ð: Phần kế toán cơng nợ phải trả
Ngồ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ố @Flag bit, @OrdinalNumber int, @Invoiceld varchar(10) , @Productid varchar (50) , @Quantity DECIMAL(18,2), @Price DECIMAL(18,2) , @VATRate DECIMAL(18,2) , @ImportTaxRate DECIMAL (18,2) AS £¡ Trường hợp thêm mới mẩu tin +£ 8Flag =1
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
GO
Chú ý: Khi chỉnh sửa chi tiết hóa đơn mua hàng, ngoài các thuộc tính như đã trình bày trong phương thức EditDetails và biến cố Click của nút
btnNewDetail trong phản chí tiết hóa đơn bán hàng, bạn phải gán thuộc
tính Salesinvoiee là false
Chẳng hạn, khi người sử dụng Double Click vào chỉ tiết hóa đơn mua
Trang 10Chương 5: Phần kế tốn cơng nợ phải trả EB Invoice Details fe 15 Xt Purchase Invoice Details - Edit Item Product Name Quantity [150.00 Price [mm VAT Rate [70.00 x ImpotTaxRate [ «0.00 % Add New | Update | - Delete Close 4 Hinh 5-5: Chi tiét hoa don mua hang
Đối với trường hợp xóa hóa đơn mua hàng, bạn khai báo gọi thủ tục nội tại có tên udsPurchaselnvoices;õ với cấu trúc như ví dụ 5-18 trong phương thức DeletePurchaselnvoiee i_du 5-18: Thu tuc ndi tai udsPurchaseInvoices;5} CREATE PROC udsPurchaseInvoices;5 @InvoicelId varchar (10) AS
delete 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) ,
Trang 11
Chương 5ð: Phần kế tốn cơng nợ phải trả
AS -
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ư
Trang 12Chương 5: Phần kế toán công nợ phải trả 213 [M]° 22 es Sinn meee le Generlledgar AcostBeewalie Account Bavoble_Invertry Account Payable
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
Trang 13
|? z4 Chương 5: Phần kế toán công nợ phải trả
công nợ phải trả cho nhà cung cấp kể từ ngày đâu đến ngày chỉ định trong tháng thay vì đến ngày cuối tháng
mt System Monogement Console (Account Payable] Pana eal
Several Ledger Account Recehable Account Bayable _Irvertory Contos Drectories ose North Rights Hợp Account Payable SiatDae fov0a7at07 =] EndDae [27027207 *]: ` CảeidelPlm Ê ASayen C 3aedsieoie OK Đ Mentha C $eseMenh Coat AP
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ố @ProvinceTd CHAR (3), @MonthYear CHAR (8) AS 1] Trường hợp liệt bê mẩu tin tháng hiện hành IF @MonthYear = ''!
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
Trang 15216 Chương ð: Phần kế tốn cơng nợ phải trả btnPrint.Enabled = true; } else { } btnPrint.Enabled = false; catch (Exception ex) { ASUIHelper ShowMessageBox ( “Account Receivable-FillAPToGridview", ex); } }
Chú ý: Phương thức AddSumAmount dùng để tính tổng công nợ phải trả đầu kỳ, tổng giá trị hàng mua, tổng giá trị tiền đã trả và tổng công nợ phải trả cuối kỳ rồi tạo ra mẩu tin cuối cùng và thêm vào đối tượng DataTable đã được trình bày trong phần trước
Bằ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
= Coty Cet ute Oe
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]
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}
le General Ledger Account Receivable Account Payable Inventory Controls Directories Close Month Riợts Help
Accaunt Payable 7 Month Oct/2007 ( Specific Month C Calculate AP Morth: [Sep >] Year [2007 > = County Cause AP for Œ United States = Vietnam Thủa Thên - Huế H8 Chi Minh HaiPhing Hà Nội Đăng Nai Đànẵng, Can Ths Binh Ding Country 3 28 Ready 2 Logged as [Administrator] [E] Account Payable Logged in [11:26:40 AM]
Hinh 5-11: Tinh hình công nợ phải trả trong tháng 09/2007 Ngoài ra, nếu muốn che giấu hay hiển thị các tùy chọn, ngoài cách khai báo trong phương thức CheckPermission, bạn khai báo phương thức
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
Trang 17Chương 5: Phần kế tốn cơng nợ phải trả RNs Be 2 MenhDE/207 7 Spectic Month Coledate AP ET tess] ares Seatac Ready $2 Logged as [Administrator] Account Payable Logged i {11:26:40 AM)
Hinh 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
Trang 18Chương 5: Phản kế tố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 SELECT SupplierTd, 0, isnull (SUM(Quantity*Price* (1+VATRate/100)-Discount), 0) As PurchaseAmount, 0 FROM Purchaseinvoices S, PurchaseInvoiceDetails D
WHERE S.Invoiceld = D.Invoiceld
AND InvoiceDate between @StartDate and @EndDate GROUP BY SupplierTđ UNION ALL L1 Khai báo tổng hợp dữ liệu từ bằng Payments ung véi 11 tiên trả cho nhà cùng cấp SELECT SupplierTrd, 0, 0, 1snu11 (SUM(PaymentAmount},0) As PaymenEAmounE FROM Payments WHERE PaymentDate between @StartDate and @EndDate GROUP BY Supplierid £7 Khai báo thêm tổng hợp dữ liệu tw bing ARBAndPurchaseAmount + bèo bảng MonthiyAccountPayable
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 ) - SUM(PaymentsAmount) AS EndAmount FROM Suppliers C LEFT JOIN ARBAndPurchaseAmount ARC ON C.SupplierId = ARC.SupplierId GROUP BY C.SupplierId;
Trong trường hợp tính lại công nợ phải trả của nhà cung cấp đang chọn, bạn khai báo thủ tục nội tại có tên udsAccountPayable;3 với cấu trúc
Trang 19220 Chương 5: Phần kế tốn cơng nợ phải trả í dụ Thi tuc n udsAccountPayable;3|
CREATE PROC udsAccount Payable; 3
{1 Khai bdo tham sé @SupplierIdCHAR (5) @PreviousMonth CHAR(8), @StartDate smalidatetime, @EndDate smalldatetime AS
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
SELECT SupplierId, 0,
isnull (SUM (Quant ity* Price* (1+VATRate/100)-Discount), 0) As PurchaseAmount, 0
FROM Purchaseinvoices S, PurchaseInvoiceDetails D WHERE S.Invoiceld = D Invoiceld
1} Loc theo một nhà cung cấp
AND Supplierid = @SupplierId
AND InvoiceDate between @StartDate and @EndDate
GROUP BY SupplierId
UNION ALL *
Trang 20
Chương 5: Phản kế tố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) - SUM{PaymentsAmount) AS EndAmount FROM Suppliers c LEFT JOIN ARBAndPurchaseAmount ARC ON C.Suppliertd = ARC.SupplierId (1 Loc theo một nhà cùng cấp WHERE ARC SupplierId = 8SupplierTd GROUP BY C.SupplierId; GO
Sau đó, bạn khai báo gọi hai thủ tục nội tại trên trong biến cố Click của nút btnCalculate như ví dụ 5-24
Đrivate void bcncalculace_C1iek(tobject sender,
EventArgs e)
{
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
Trang 21
222 Chuong 5: Phan kế tốn cơng nợ phải trả #1 Khai báo thuộc tính cho dối tượng ASDataProuider
dataProvider CommandType =
CommandType StoredProcedure; 11 Khai báo mảng tham số uà giá trị
string[(] parameterName = null; object (] parameterValue = null;
11 Trường hop tinh công nợ phải trả cho tất cả nhà cung cấp if (rdoAllSuppliers.Checked) { {} Khai bdo chi dink thd tuc noi tại dataProvider CommandText = “udsAccount Payable;2";
if Khai báo khối tạo giá trị cho mảng tham số 0à giá trị parameterName = new string[3] {
*@PreviousMonth", "@StartDate", "@EndDate" };
parameterValue = new object [3] { previousMonth, dtpStart.Value.ToString( ASParameters.dateFormat), dtpEnd Value.ToString( ASParameters.dateFormat) }; } else { £J Trường hợp tính công nợ phải trả cho một nhà cung cấp if (dataGridView.CurrentRow != null) {
11 Khai báo lấy mã nhà cùng cấp
string supplierId = Convert ToString( dataGridView.CurrentRow.Cells({ “SupplierId "].value); + Khai báo chỉ định thủ tục nội tại đaEaProviđer CommandText = "uđsAccountPayable;3°;
Trang 22Chuong 5: Phan ké todn céng ng phai tra rll (dataProvider.ErrorMessage FS) { ASUIHelper ShowMessageBox ( “Account Payable-Calculate", dataProvider.ErrorMessage) ; else FillAPToGridVview("", "");
/1 Khai báo goi phuong thite FillAPToGridView catch (Exception ex)
ASUIHelper ShowMessageBox ( "Account Payable-Calculate", ex); Mr
}
Chẳng hạn, sau khi người sử dung chon vao til chon Calculate AP va chọn tiếp tùy chọn All Suppliers rồi nhấn nút OK thì kết quả trình bày
tương tự như hình 5-13
Account Payable © Month 0172007 Spectic Mori Calulale AP
} Stat Date: [01700172007 =] EndDae [3170472007 =] lade AP Lr ALSupene Selected Sunnie Ok | _Công ty Trách Nhiệm HẦu Hạn 3500000 8745000, | $132.50 "xẻ .n | sooo ingly TchNiémHOsHen 1.500000 3497500 638000 s05 Cin io —— Tim S00 CảngwTrảchNhệmHồuHạn, = — Z2 21odAe.n 557845001 4682000
Hinh 5-13: Tính công nợ phải trả cho tất cả nhà cung cấp
Trang 23224 Chương 5ð: Phần kế tốn cơng nợ phải trả Account Payable : C Medh0cU2007.C SpeeleMenh (2 CdoideAPp
Stan Date: [0170c1 72007 =] EndDae [5/04/2007 | Caledste AP for AlSupplere Selected Supper _ÚK
= County ConparyNenaiivetnanese | BeprAnoun| Rachesohno| Padhnaunt| ExiAnart
nae 'Công ty Trách Nhệm Hồu Hạn, 2500000 24854500 12030000 iw CénglyTréchNhm Huson 3800000, 8745000 3132500) This Thin Hud Mà Chinh Céng ly phin Veaka ma Vite 4500000 12 1717780 Hà Phòng h i Heme Cing y Tesch Nim HDs Ho | ĐăngNg i Banking Cin ths Beh Dung 4 Je Carhy tte |
Reedy {92 Logged as (Adkins ator} “Account Payable ae)
Hình 5-14: Tính công nợ phải trả cho một nhà cung cấp
5 KẾT LUẬN
Bạn vừa tìm hiểu chức năng liệt kê và tìm kiếm mẩu tin, thêm mới và cập nhật mẩu tin, xóa và kích hoạt hay đóng nhà cung cấp cùng với cách tính công nợ phải trả cho mỗi nhà cung cấp dựa trên công nợ đầu kỳ, tổng giá trị mua trên hóa đơn và tiền đã trả
Ngoài ra, bạn cũng tham khảo cách quản lý hóa đơn mua hàng với thông tin chỉ tiết và tính tổng giá trị hóa đơn mua hàng cùng với khai báo
đối tượng DataTable để lưu dữ liệu cho phép in báo cáo theo mẫu
Bạn có thể tham khảo diễn giải chỉ tiết của các ghi chú được đánh dấu
theo thứ tự như sau:
(1): Công ng phai tra (Account Payable) là chức năng quản lý công nợ
mà doanh nghiệp còn thiếu nợ của nhà cung cấp
Trang 24Chương 6: Phần kế toán xuất - nhập - tén 225 Chuong 6: PHAN KE TOAN XUAT - NHAP - TON Tóm tắt chương 6;
Tương tự như phần công nợ phái thu của khách hàng và
công nợ phải trả cho nhà cung cấp, chức năng xuất nhập tồn là phần dùng để quần lý sản phẩm nhập và xuất kho
Sau khi mua hàng của nhà cung cấp, doanh nghiệp nhập hàng vào kho rồi khi bán hàng cho khách hàng, doanh nghiệp lại
tiếp tục xuất hàng, Muốn theo đõi tình hình xuất và nhập để biết được số lượng tổn kho”, bạn cần quần lý danh mục sản phẩm, loại sản phẩm, kho, tình hình xuất nhập và tồn kho Các vấn đề chính sẽ được đề cập: Y Quan ly san phẩm _ Nhập và xuất kho * Tình hình tôn kho v_ Cập nhật số lượng thực
1 QUAN LY SAN PHAM
Sản phẩm là đối tượng chính áp dụng cho chức năng quản lý xuất
nhập tên kho, nhưng do nó có liên quan đến các bảng dữ liệu khác như loại
sản phẩm (category), danh mục kho (stock), danh muc sắn phẩm (product),
nên chúng ta chỉ tìm hiểu cách làm việc với bảng Products
Chú ý: Đề tìm hiểu chức năng này, bạn bắt đầu trình đơn Inventory
Controls | Products | Products để kích hoạt form có tén frmProducts va các thủ tục lưu trong tập tin ProductProcedures.sal
1.1 Giao dién chinh
Bạn đã làm quen với giao diện chung trong cùng một form của chức
Trang 25226 Chương 6: Phần kế toán xuất - nhập - tôn chúng ta lại tiếp tục tìm hiểu cách dùng chung nhiều chức năng trên cùng một form để quản lý sản phẩm
Chúng ta thiết kế giao diện phần bên trái là danh sách loại sản phẩm
và phần bên phải là danh sách sản phẩm như hình 6-1 (Products) List of Products
& Categories Tonich Từ nhe th dn toa
Tử Hohle thun TW 19 babes ih Talent Tnkch dig choc och To xieh minh vàđ4{ † Tito moa
Ì Tiixbch aie cho My toh Từ hp do động Tach dr oP Tihuich rg co 4 4 ile besten | | poet] _ ng [ 7 awd oan a[Aereresto]TE]moảets (agmedD[I92978)
Hinh 6-1: Giao dién chinh
Nếu cho phép người sử dụng tìm kiếm nâng cao thì bạn thiết kế giao
Trang 26Chương 6: Phần kế toán xuất - nhập - tồn 227
Ngoài ra, phần bên phải sẽ bao gồm các chức năng liệt kê và tìm
kiếm mẩu tin, thêm mới và cập nhật mẩu tin, xóa và kích hoạt hay đóng
sản phẩm
Để làm điều này, bạn thiết kế giao diện dùng cho thêm mới và cập nhật thông tin sản phẩm Khi người sử dụng nhấn nút Edit hay Add New thì bạn chỉ cần vô hiệu hóa điều khiển txtId
Chẳng hạn, khi người sử dụng nhấn nút Edit để cập nhật thông tin
sản phẩm thì giao diện xuất hiện tương tự như hình 6-3 Ce mỹ : alls! fle GereralLodgr Account rcevala Accu Boyble _fwertory Cot Close trth Ritts Heb Edit Product i S Daegae Tảxách đện thoa ddy| Pelsetld PEE Caegpy [Taxkhmpirhvad 2 bs Tả xách học sen, ạt T6xáehbocsehram | Due Date [/Fah/200g v] Mawaehwe [HKE Tả xáchkhác 1
Tis ndch mip inh vb di] Product Name [Tutxach ding cho din thes dng Deeteien [Turnch ding cho din thoi dling
VATRate [ — “T6 Impat Taxote [0
Product Unt frit ‘Image Location 1 Discontinued
‘Quariy In Stock A
1 1 »
(Clestety dbo’ Crested ate 12/25/2007 41.00 PM: Mediedy dbo: ModiedD ale 2/1/2008 5 10.00 AM
teste | tuck | nove | fe | Decne GEN
Reedy $93 Logged as (Admistrator) “S] Products Logged in [3:19:99 Pe]
Hình 6-3: Giao diện cập nhật mẩu tin
1.2 Khai báo liệt kê mẩu tin
1.2.1 Liệt kê dữ liệu phía bên trái
Để liệt kê danh sách loại sản phẩm trên điều khiển TreeView, bạn
Trang 27
228 Chương 6: Phần kế toán xuất - nhập - tồn £J Khai bảo uà khối tạo đối tượng ASDataProvider ASDataProvider dataProvider = new ASDataProvider(); /} Khai bdo thuge tính cho đốt tượng ASDataProuider dataProvider.CommandText = CreateCommandText ForTreeView(); LÍ Khai báo gọi phương thức GetDataTubile DataTable dataTable = dataProvider.GetDataTable {); ASUIHelper.FillDataToTreeView("Category", dataTable, this.tvwCategories); } catch (Exception ex) { ASUIHelper ShowMessageBox ( "Product -FillDataToTreeView", ex); Ỳ }
Sau đó, bạn khai báo gọi phương thức FillDataToTreeView trong biến
cố Load của frmProducts Nếu thực thi chương trình, bạn có thể tìm thấy
danh sách loại sản phẩm xuất hiện như hình 6-4
€] Categories
Túi xách điện thoại di động Túi xách hoe sinh
Túi xách học sinh nam
Túi sách khác †
Túi xách máy tỉnh và điện thoại di động
Hình 6-4: Danh sách loại sản phẩm
thi người sử dụng chọn vào tên loại sản phẩm thì bạn liệt kê danh
Trang 28Chương 6: Phan ké todn xuat - nhap - tén 229 e.Node Level); ResizeGridViewForProducts ( rightOnForm IndexOf ("A") !=-1); } 1b1Warning.Text = e.Node,Text;
Trong đó, phương thức FillProductsToGridView va ResizeGridViewForProducts được khai báo tương tự như những phương
thức cùng mục đích đã trình bày trong phần trước
Tuy nhiên, để hoàn thiện chức năng của phương thức này, bạn cần
khai báo thủ tục nội tại có tên udsProducts;3 với cấu trúc như ví dụ 6-3
EM $À) icy
CREATE PROC udsProducts;3
// Khai bdo tham số @CategoryId varchar (10), @ProductStatus tinyint, @UserName varchar (50) AS SELECT P Discontinued, P.Discontinued AS Status, ProductId, ProductNameTnVietnamese, ProđuctUniE, VATRate, Import TaxRate, Product DescriptionInVietnamese, Manufactureld, CategoryNameInVietnamese FROM Products P, Categories Cc WHERE P.CategoryId=C.Category!Id AND P.CategoryId = @Categoryid
AND P Discontinued = CASE @ProductStatus
WHEN 2 THEN P.Discontinued ELSE @ProductStatus END
AND C.CreatedBy = CASE @UserName
WHEN '' THEN C.CreatedBy ELSE @UserName END ORDER BY ProductId ASC
GO
Chú $: Bạn có thể thay đổi thủ tục nội tại trên để cho phép người sử
dụng chọn vào chuỗi Category Phía bên phải thì liệt kê danh sách sản
Trang 29
Chương 6: Phần kế toán xuất - nhập - tổn
CREATE PROC udsProducts;3
£/ Khai báo tham số @Level tinyinE, @CategoryTd varchar (10), @ProductStatus tinyint, @UserName varchar (50) AS /1 Liét ké sdn phdm theo logi sdn phém IF @Level =1 SELECT P Discontinued, P.Discontinued AS Status, ProductId, ProductNameInVietnamese, ProductUnit, VATRate, ImportTaxRate, ProductDescript ionInVietnamese, Manufactureld, CategoryNameInVietnamese FROM Products P, Categories € WHERE P.Categoryld=C.CategoryId
AND P.Categoryld = @CategoryId
AND P.Discontinued = CASE @ProductStatus WHEN 2 THEN P.Discontinued
ELSE @ProductStatus END
AND C.CreatedBy = CASE @UserName
WHEN '' THEN C.CreatedBy ELSE @UserName ORDER BY ProductId ASC
11 Liệt kê sân phẩm không theo loại sản phẩm SELECT P Discontinued, P.Discontinued AS Status, Productid, ProductNameinVietnamese, ProductUnit, VATRate, ImportTaxRate, ProductDescriptionInVietnamese, Manufactureld, CategoryNameInVietnamese FROM Products P, Categories C WHERE P.CategoryId-=C.Categoryld
AND P.Discontinued = CASE @Product Status
WHEN 2 THEN P.Discontinued
ELSE @ProductStatus END
AND C.CreatedBy = CASE @UserName
WHEN '' THEN C.CreatedBy ELSE @UserName END ORDER BY ProductId ASC
GO
Trang 30
Chương 6: Phần kế toán xuất - nhập - tổn 231 private void tvwProvinces_AfterSelect (object sender, TreeViewEventArgs e) { FillProductsToGridView( Convert ToString(e.Node.Tag) ,e.Node.Level) ; ResizeGridViewForProducts ( rightOnForm.IndexOf ("A") !=~-1); lblWarning.Text = e.Node.Text;
Mỗi khi người sử dụng chọn loại sản phẩm, thủ tục nội tại trên được
gọi là danh sách sản phẩm liệt kê theo loại sản phẩm tương tự như hình 6-5 dị L4 Tả sách học th
ttle | ta | oe | pet | See a
Ready {Logged as (Adrstrotr] Products Lopged in [3:19:99 4]
Hinh 6-5: Liệt bê sản phẩm theo loại sản phẩm
1.9.2 Liệt kê dữ liệu phía bên phải
Bạn có thể khai báo phương thức FillProduetsToGridView dùng để trình bày danh sách sản phẩm khi người sử dụng tìm kiếm theo từ khóa hay
các tùy chọn mở rộng khác rồi gọi trong biến cố Click của nút btnSearch
Để làm điều này, trước tiên bạn khai báo thủ tục nội tại có tên
udsProducts;4 với cấu trúc như ví dụ 6-6 và gọi trong phương thức FillProductsToGridView
Thủ tục nội tại
Trang 31
° 232 Chương 6: Phần kế toán xuất - nhập - tồn // Khai báo tham sé @CategoryTd varchar (10), @ManufactureTd char (5), @ProductStatus tinyint, @Keyword nvarchar (50), @StartDate smalldatetime, @EndDate smalldatetime, @UserName varchar (50) /1 Liét kê mẩu tin không theo từ khóa if @Keyword='' select P.Discontinued, P.Discont inued AS Status, ProducttId, ProductNameInVietnamese, ProductUnit, VATRate, ImportTaxRate, ProductDescriptionInvietnamese, Manufactureld, CategoryNameInVietnamese from Products P, Categories C WHERE P.CategoryId=C.Category1Id
and P.CategoryId = case @CategoryId when 0 then
P.Categoryld else @CategorylId end
and Manufactureld = case @ManufactureId when '’ then ManufacturelId else @Manufactureld end
and P.Discontinued = case @Product Status
when 2 then P Discontinued else @Product Status end
and P.CreatedBy = case @UserName when '' then
P.CreatedBy else @UserName end
and P.CreatedDate>= @StartDate and | P.CreatedDate<=@EndDate
order by ProductId ASC else // Tim kiếm mẩu tin dựa uào từ khóa select P.Discontinueđ, P.Discontinued AS Status, ProductId, ProductNameInVietnamese, Productunit, VATRate, ImportTaxRate, ProductDescriptionInVietnamese, Manufactureld, CategoryNameInVietnamese from Products P, Categories C WHERE P.CategoryId=C.CategoryId
and P.Categoryld = case @CategorylId when 0 then P.Categoryld else @CategoryId ena
and Manufactureld = case @Manufactureld when '' then Manufactureld else @Manufactureld end
and P Discontinued = case @ProductStatus
when 2 then P Discontinued else @ProductStatus end
and P.CreatedBy = case @UserNamewhen '' then P.CreatedBy else @UserName end
Trang 32Chương 6: Phần kế toán xuất - nhap - tén 233
and CONTAINS (F.*, @Keyword)
order by ProductId ASC
GO
1.8 Khai báo thêm mới hay cập nhật mẩu tin
Để thêm mới hay cập nhật mẩu tin, bạn khai báo phương thức SaveProduet để gọi thủ tục nội tại udsProducts;7 với cấu trúc như ví dụ 6-7
CREATE PROC udsProducts;7
{1 Khai báo tham số @Flag BIT, @ProductId VARCHAR (10), @Manufactureid CHAR(5), @CategoryId varchar (10), @DueDate SMALLDATETIME, @ProductNameInVietnamese NVARCHAR (150), @ProductDescriptionInVietnamese NVARCHAR (250), @ProductUnit NVARCHAR (20), @Imagebocation NVARCHAR(50), @VATRate floạt, @importTaxRate float, @Discont inued BIT AS 71 Trường hợp thêm mới mẫu tin IF @Flag=1 INSERT INTO Products (ProductId, ProductNameInVietnamese, Product DescriptionInVietnamese, Categoryld, Manufactureld, ProductUnit, ImageLocation,
DueDate, Discontinued, VATRate,
Trang 33Chương 6: Phần kế toán xuất - nhập - tồn ProductDescriptioninVietnamese = @ProductDescriptioniInVietnamese, Categoryl@ = @Categoryid, Manufactureld = @Manufactureld, ProductUnit = @ProductUnit, TImageLocation = @ImageLocation, DueDate = @DueDate, Discontinued = @Discontinued, VATRate = @VATRate, ImportTaxRate = @ImportTaxRate, ModifiedBy = CURRENT_USER, ModifiedDate = getdate() WHERE Product id=@ProductId GO
Đối với trường hợp chỉnh sửa để cho phép cập nhật mẩu tin, bạn khai
báo phương thức EditProduet để gọi thủ tục nội tại có tên udsProduets;ð với cấu trúc như ví dụ 6-8
(iY VOM Comets) udsProduct:
CREATE PROC udsProducts;5 @ProductId VARCHAR {10) AS SELECT Convert (char (11), DueDate,106} AS JoinDate,* FROM Products where ProductId = @ProductId GO
Ngoài ra, trong phương thức EditProduct, bạn cần gọi phương thức để liệt kê danh sách số lượng sản phẩm trong kho bằng cách khai báo phương
Trang 34Chương 6: Phần kế toán xuất - nhập - tôn 235 dataProvider GetDataTable ( “@ProductiId", ProductId); 11 Khai báo gọi phương thúc FillDataToGridView ASUTHelper.FillDataToGridview( dataTable, this.dataGridViewl); if (dataTable.Rows.Count > 0) { 11 Khai báo gọi phương thức ApplyStylePorProductInStocks LÍ nà ResizeGridVieuForProductinStocks ApplyStyleForProductInstocks Qa ResizeGridViewForProduct InStocks (); } lblRecordText.Text = "Products found: "; lblRecords.Text = dataTable.Rows.Count Tostring(); if (dataProvider.ErrorMessage !="") ASUIHelper ShowMessageBox ( "product -Fill Product ToGridvView", dataProvider ErrorMessage) ; } } catch (Exception ex) ASUIHelper ShowMessageBox ( "Product -FillProductToGridview", ex); } t Trong đó, thủ tục nội tại có tên udsProduets;8 khai báo với cấu trúc như ví dụ 6-10 í dụ CREATE PROC udsProducts;8 @ProductId VARCHAR (10) AS
SELECT StockName, ProductNameInVietnamese,
ProductUnit, GoodProduct Instock AS QttyInStock,
BadProductInStock AS BadQtty FROM Products P INNER JOIN
Product InStocks PIS ON PIS Productid = P.ProductId INNER JOIN Stocks S ON S.StockId = PIS Stockid
WHERE PIS ProductId = @productId
Go
hi thực thi chương trình, nếu bạn chỉnh sửa một sản phẩm thì danh
Trang 35Chương 6: Phần kế toán xuất - nhập - tồn
Hình 6-6: Số lượng đang có trong kho của sản phẩm có mã số là P0006
1.4 Khai báo xóa mẩu tin
Trong trường hợp xóa mẩu tin, bạn cũng khai báo xác nhận hành động xóa và gọi phương thức DeleteProduct thông qua thủ tục nội tại có tên
udsProduets;6 với cấu trúc như ví dụ 6-11 udsProdu CREATE PROC udsProducts;6 @Productid VARCHAR (10) AS
DELETE FROM Products
where ProductId = @Productid
GO
Chú §: Bạn có thể tìm thấy thủ tục nội tại liên quan đến loại sản phẩm và danh mục kho trong ứng dụng đính kèm
2 NHẬP VÀ XUẤT KHO
Chức năng nhập kho và xuất kho là hai chức năng đối nghịch nhau, phương thức và thủ tục nội tại đều có nội dung tương tự nhau chỉ khác nhau
Trang 36Chương 6: Phần kế toán xuất - nhập - tồn 237
Chúng ta chỉ cân tập trung tìm hiểu chức năng xuất kho Bạn có thể
tự tìm hiểu chức năng nhập kho từ form, Bảng dữ liệu và thủ tục nội tại trong ứng dụng
Chẳng hạn, khi làm việc với chức năng nhập kho thì các bảng liên quan là: ImportTypes, ImportBatchs, Imports; thủ tục nội tại có tên udsImports và form giao diện chính cho chức năng này là frmlmports
Tuy nhiên, phần xuất kho (Export) cũng có hai phần là chức năng quản lý lô phiếu xuất và phiếu xuất Bạn cũng có thể tự tìm hiểu chức năng
quản lý lô phiếu xuất do nó tương tự như chức năng quản lý lô hóa đơn bán hàng
Bạn có thể tìm hiểu chức năng lô phiếu xuất kho bao gồm bảng
ImportBatchs; thủ tục nội tại có tên udsImportBatchs và form giao diện chính cho chức năng này là frmImportBatchs
Chú ý: Đề tìm hiểu chức năng này, bạn bắt đầu trình đơn Inventory
Controls | Exports | Export để kích hoạt form có tên frmExports và các thủ tục luu trong tap tin ExportProcedures.sql, UpdateStockTriggers.sql va ProductProcedures.sql
2.1 Giao dién chinh
Khác với giao diện chức năng quản lý sản phẩm, bạn thiết kế
frmExports với giao diện như hình 6-7
2W04/2007| A005 |CmpyCSànswwmVemn '8Đu8871 Ai0m_ lumgyuehdelôulinMtsd- 3 3
19/04/27 A002 Cang TúáchNh&mkOaMwIENVe
‘wre | sa "Cig ohn acne est | a |i dom 9/84/3671 Ađ87.|ceavbasicnUEA OA USA i [esa | Att | cha ah nation THSG/E07) A085 | Congy phn Sa Vitro ea
Tả92/2M71 HH1 |ChgylugaNhenluMenMasee
cee | A Cry Thi er |x| Ne si sn ‘van |" ~| Cig ich shen
Reeth AD Leeda (Art) SDesors
Trang 37
238 Chương 6: Phần kế toán xuất - nhập - tồn
Tương tự như các trường hợp tìm kiếm đã trình bày trong phần trước, bạn thiết kế khung cung cấp tùy chọn tìm kiếm nâng cao như hình 6-8 Customer: ES aE Batch No: pio (29640 edostiiioquil asqy Toc 4 Dae [01/04/2007 =] Ts [a/0a/207 x] UserName EE :
Hinh 6-8: Giao dién tim kiém
“Tương tự như các loại form khác, bạn thiết kế giao diện thêm mới hay
cập nhật mẩu tin chung như hình 6-9
EditExporl Sip
twgeeld- [TT TT” Cwomer [Cig CE phan Recudleien lmseeOse [i0/0a/207 =] ĐaehMe [f80010902201 2 Iace Situs I~ Approval twee - [EŒ - 5 Dereon re" Ũ (nos Beate [Ta xách dìng ohợc tr nam, [Táo ma hesy BìlogzdeIShwttivo]T]eoee tey»dbftl6i8f8)
Hình 6-9: Giao diện cập nhật mẩu tin
2.2 Khai báo liệt kê mẩu tin
Để trình bày danh sách phiếu xuất hàng, bạn khai báo thủ tục nội tại
Trang 38Chương 6: Phần kế toán xuất - nhập - tổn 239
CREATE PROC udsExports
11 Khai báo tham số 8CustomerTd char (5), @Batchfđ VARCHAR (10), @ExportStatus tinyint, @Keyword nvarchar (50), @StartDate smalldatetime, @EndDate smaildatetime, @UserName varchar (50) AS 11 Liệt kê mẩu tin if (@Keyword='')
select Approval, Status, Exportid,
ExportBatchId, ExportEDate, CustomerTd,
CompanyNameInVietnamese, Products, ExportTypeName,
DescriptionInVietnamese from vwExports
where CustomerId = case @CustomerId when '' then Customerid else @CustomeriId end
and Export Batchid = case @BatchId when '' then Export Batchid else @BatchId end
and Status = case @ExportStatus when 2 then Status else
@Export Status end
and Export Date>= @StartDate and ExportDate<-=@EndDate
and CreatedBy = case @UserName when '' then CreatedBy else @UserName end
order by ExportDate DESC
else
21 Tìm kiém mau tin dua véo tit khoa select ExportStatus AS Approval,
ExportStatus AS Status, I.ExportId,
ExportBatchTd, ExportDate, 1.CustomerTỏ, CompanyNameInvietnamese, COUNT (D ExportId) AS Products, ExportTypeName, DescriptionInVietnamese from Exports I, Customers S, ExportDetails D, ExportTypes T
WHERE I.CustomerId = S.Customerid and D.ExportId = I.ExportId and T.ExportTypeId=1.ExportTypeld AND I.Customerid = case @CustomerId when '' then
I.CustomerId else @CustomerId end
and ExportBatchid = case @BatchId
when '' then ExportBatchId else @Batchid end and ExportStatus = case @ExportStatus when 2 then ExportStatus else @ExportStatus end
Trang 39
GO
240 Chương 6: Phần kế toán xuất - nhập - tồn and ExportDate>= @StartDate and Export Date<=@EndDate
and CONTAINS (I.*, @Keyword)
Group by ExportStatus, I.Exportid,
ExportBatchid, ExportDate,
I.CustomerId, ExportTypeName,
CompanyNameInVietnamese, DescriptionInVietnamese
order by ExportDate DESC
Trong đó, đối tượng View có tên vwExports dùng để kết nối ba bảng
Customers, Exports, ExportTypes va ExportDetails được khai báo tương tự
như ví dụ 6-13
CREATE VIEW vwExports AS
select ExportStatus AS Approval,
ExportStatus AS Status, I.Exportid, Provinceld, ExportBatchTd, ExportDate, 1,CustomerTd, ExportTypeName, CompanyNameInVietnamese, I.CreatedBy, COUNT(D.ExportId) AS Products, DescriptionInVietnamese from Customers S inner join Exports I on I.CustomerId = §.CustomerId inner join ExportTypes T on T.ExportTypeld = I ExportTypeld left join ExportDetails D on D.ExportId =1.ExportId
Group by ExportStatus, I.ExportId, Provinceld,
ExportBatchId, ExportDate, 1.CustomerTd, ExportTypeName, CompanyNameInVietnamese, DescriptioninVietnamese, I.CreatedBy GO 2.3 Khai báo thêm mới và cập nhật mẩu tin CR:
Để thêm mới hay cập nhật mẩu tin, bạn khai báo thủ tục nội tại có
tên udsExports;7 và gọi trong phương thức SaveExport ứng với hai trường hợp dựa theo tham số Flag
EATE PROC udsExports;7
11 Khai bdo tham số
@Flag bit,
Trang 40Chương 6: Phân kế toán xuất - nhập - tôn 241 @BatchId varchar (10; , @ExportDate Smal] DateTime, @ExportTypeld char (3) , @CustomerTd char (5) „ @ExportStatus bit , @DescriptionInVietnamese varchar (150) AS i} Truong hop thém mdi méu tin if @Flag =1
INSERT INTO Exports
{ExportBatchId, ExportId, ExportTypeld,
ExportDate, Customerld, ExportStatus,
DescriptioninVietnamese)
VALUES (@BatchId, @ExportId, @ExportTypeld,
@ExportDate, @Customerid, @ExportStatus, @DescriptionInVietnamese} Else !† Trường hợp cập nhật mẫu tin update Exports set Export BatchId=@Batchld, Export Typeld=@ExportTypeld, ExportDate=@ExportDate, CustomerId=@Customerld, ExportStatus = @ExportStatus, DescriptioninVietnamese = @DescriptionInVietnamese Where ExportId = @ExportId GO
Trong trường hợp chỉnh sửa hóa đơn bán hang để xem hay cập nhật, bạn khai báo thủ tục nội tại có tên udsExport;3 với cấu trúc như ví dụ 6-15 và gọi trong phương thức EditExport CREATE PROC udsExports;3 @Exportid varchar (10) AS select ExportStatus,
ExportStatus AS Status, I.*,