186 Chương 4: Phần kế toán công nợ phải thu
Để tiện theo dõi công nợ phải thu của-khách hàng, bạn cần xây dựng chức năng này để lưu trữ thông tin liên quan đến khách hàng cũng như danh sách hóa đơn mà khách hàng đã mua trong tháng
Chú ý: Đề tìm hiểu chức năng này, bạn bắt đầu trình đơn Aecount
Receivable | Customers để kích hoạt form có tên frmCustomers, cùng
với các thủ tục lưu trong tap tin CustomerProcedures.sql và SalesInvoiceProcedures.sql
1.1 Giao diện chính
Trong chương trình bày về chức năng thu và chỉ tiền, chúng ta đã làm quen với giao diện chung trong cùng một form, trong chương này chúng ta lại tiếp tìm hiểu cách dùng chung nhiều chức năng trên một form
Tuy nhiên, để tránh lặp lại giao diện của chương trước, chúng ta thiết kế giao diện cho chức năng này theo hai phân, phần bên trái là danh sách mẩu tin thuộc bảng quan hệ 1) và mẩu tin của bảng quan hệ N nằm bên phải như hình 4-1 List of Customers = tong Ga nied Sates = Vetnon Th Thin Ho HB GhiMeh HšPhong
Hanes ing | | Cn WCB pin Suman ain [The doin uciusa
bàng Cnt 2Ì † † | cing y Base a FCA
Bri Dverg | Cons 6 dn Rectan [BỊ Trang tm gio de Vira)
ingly Tdch Nhs HD Hon fat Geta |XtACepaion ae
aby Limo tb tr) 3) cites Longe 627A
Hinh 4-1: Giao dién chinh
Tương tự như phần trước, phần tìm kiếm nâng cao cũng có giao diện như hình 4-2 khi người sử dụng nhấn nút [>|
Trang 2Chương 4: Phần kế tốn cơng nợ phải thu 187 ` | x] Date 01/Oct /2007 > To |31/0ct/2007 pas UseNore [SS
Hình 4-2: Tìm hiếm nâng cao
Cụ thể, trong chức năng quản lý danh sách khách hàng, phía bên trái
là danh sách quốc gia (country), danh sách tỉnh thành (province) được trình
bày bởi điều khiển TreeView; trong khi đó phía bên phải là danh sách khách hàng được trình bày bởi điều khiển DataGridView
Như vậy, 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 khách
hàng
Chẳng hạn, giao diện thêm mới thông tin khách hàng khi người sử dụng nhấn nút Add New trông giống như hình 4-3
I Account System Management Console - [Custoeners]
le_Gereraliedger Acca Recsvable A<owkPardie UveteryCertrds Orecaies Cove tenth ngư
Roady 2
see | aoa oe] ¬-
Reedy 9 Logged as [Adminstrator] S) customers Logged in (10:54:41 AM]
Trang 3
188 Chương 4: Phần kế toán công nợ phải thu
Nếu bạn chọn mẩu tin trong màn hình liệt kê và nhấn nút Edit hay Double Click thì màn hình trình bày mẩu tin cho phép cập nhật sẽ trình bày như hình 4-4 cùng với danh sách hóa đơn mà khách hàng đã mua trong tháng Chú ý: Bạn cũng có thể tạo tự động mã khách hàng nhờ vào các thông số trong bảng AutomaticValues thông qua phương thức CreateDefaultValueForld crm — ==lx
Receivable Account Bayable Inventory Control Owedwms Close Month Rights tie
Vietnam ThJa Thên: Huế HBChiMch Hồ Phòng Hane bg Nai being Cin Ths Hình 4-4: Cập nhột mẩu tin 1.2 Khai báo liệt kê mẩu tin
1.2.1 Liệt bê dữ liệu phía bên trái
Dé liệt kê danh sách country và province trên điều khiển TreeView,
Trang 4Chương 4: Phần kế tốn cơng nợ phải thu 189 new ASDataProvider (); L1 Khai báo thuộc tinh cho déi tugng ASDataProvider dataProvider.CommandText = CreateCommandText ForTreeView() ; 11 Khai báo gọi phương thức GetDataSet
DataSet dataSet = dataProvider.GetDataSet (); ASUIHelper FillDataToTreeView("Country", đataSet.Tables[0], dataSet.Tables[1l], this.tvwProvinces) ; } catch (Exception ex) { ASUIHelper ShowMessageBox ( "SalesInvoice-FillDataToTreeView", ex); }
Do cùng một lúc lấy lên danh sách country va province ban nén si dụng đối tượng DataSet thay vì đối tượng DataTable, rôi gọi phương thức dùng chung FillDataToTreeView khai báo trong lớp ASUIHelper để điển
danh sách mẩu tin vao diéu khién TreeView
Sau đó, ban khai báo gọi phương thức FillDataToTreeView trong biến
cố Load của form như ví dụ 4-2 Pprivate void frmCustomers_ Load (object sender, EventArgs e) { 11 Kiểm tra quyền truy cập CheckPermission () ; 11 Khôi tạo giá trị cho điều khiển DateTimePicher InitiateDate();
Trang 5140 Chương 4: Phản kế tốn cơng nợ phải thu
Chú ý: Phương thức CheckPermission, InitiateDate, illDataToComboBox đã trình bày trong các chương trước
Khi thực thi chương trình, bạn có thể tìm thấy danh sách country trình bày như hình 4-5 3 County: >- Phna United States
Hinh 4-5: Danh sdch country
Nếu người sử dụng chọn vào tên country thì danh sách province truc thuộc sẽ trình bày tương tự như hình 4-6 County China » United States fl Vietnam ThÙa Thiên - Huế Hồ Chí Minh Hài Phòng Hà Nội Đồng Nai Đà nẵng © Can Tha ` Bình DUdng Hình 4-6: Danh sách tỉnh thành,
Mỗi khi người sử dựng chọn vào tên country hay province thi ban liét
kê danh sách khách hàng phía bên phải bằng cách khai báo trong biến cố
Trang 6Chương 4: Phần kế tốn cơng nợ phải thu
}
1b1Warning Text = e.Node.Text;'
Trong đó, phương thức FillCustomersToGridView nhận hai tham số là itermld và level Tham số itemld ứng với mã country hay provinee; còn tham số level ứng với trường hợp chọn vào tên country hay provinee rồi
truyền vào thủ tục nội tại udsCustomers;3
Bằng cách nhận và phân biệt hai tham số này, thủ tục nội tại có tên udsCustomers;3 sẽ liệt kê hay tìm kiếm dựa trên mã country hay tỉnh thành như ví dụ 4-4
CREATE PROC udsCustomers; 3 1] Khai bdo tham sé @ItemId char (3), CustomerStatus tinyint, @Level int, @UserName varchar (50) AS 11 Litt kê mẩu tin theo country if (@Levei=i) select Discontinued, Discontinued AS Status, CustomerId, CompanyNameInVietnamese, Telephone, Address, EmailAddress, FaxNumber, MaxDebitAmount, DueDate
from Provinces P, Customers C
WHERE P Provinceld@=C Provincelda
and CountryId = @ItemId
and Discontinued = case @CustomerStatus
when 2 then Discontinued else @CustomerStatus end
and C.CreatedBy = case @UserName when '' then
C.CreatedBy else @UserName end
Trang 7
142 Chương 4: Phần kế tốn cơng nợ phải thu and C.Provinceld = @ItemId
and Discontinued = case @CustomerStatus
when 2 then Discontinued else @CustomerStatus e
and C.CreatedBy = case @UserName when '' then
c.CreatedBy else @UserName end
order by CustomerId ASC
Wo
GO
Chú ý: Ban có thể tìm thấy phương thức cài đặt overload có tên FillCustomersToGridView trình bày trong chương kế tiếp
1.2.2 Liệt bê dữ liệu phía bên phải
Khác với loại trình bày (View) đã trình bày trong phần trước là Approved va Dnapproval bạn có thể khai báo phương thức
FillEnumToComboBox dé doc giá trị tir enum cé tén Activate bao gim 3
thành vién 14 All, Continue va Discontinued nhv vi du 4-5 Phương private void Fi11EnumToComboBox () { try { cbhoStatus Ttems Add (new ASListItem( ASEnum.Activate.All.ToString(), (short) ASEnum.Activate.All)); cboStatus.Items.Add (new ASListItem( ASEnum.Activate.Continue.ToString(), (short }ASEnum.Activate.Continue)); eboStatus.Items.Add (new ASListItem( ASEnum.Activate.Discontinued.ToString(), (short) ASEnum Activate Discontinued) ); cboStatus.DisplayMember = "TextField"; cboStatus.ValueMember = "ValueField"; cboStatus SelectedIndex = 0; } catch (Exception ex) { ASUTHelper ShowMessageBox ( "§alesInvoice-Fi11EnumToComboBox", ex); } +
Trang 82 ’ L Ằ@ Chương 4: Phần kế tốn cơng nợ phải thu 143 Discontinued từ View và liệt kê đữ liệu theo hình thức trình bày này bằng phương thức FillCustomersToGridView `
Chú ý: Trong phương thức FiHCustomersToGridView bạn gọi thủ tục nội tại có tên udsCustomers;4 có cấu trúc như ví dụ 4-6
dụ 4-6: Thủ tue nội tại udsCustome CREATE PROC udsCustomers;4
TỊ Khai báo tham số @Provinceid char (3), @Typeld char (3), @CustomerStatus tinyint, @Keyword nvarchar (50), @StartDate smalldatetime, @EndDate smalldatetime, @UserName varchar (50) AS ?1 Liệt kê mều tin không theo từ khóa if @Keyword='' select Discontinued , Discontinued AS Status, CustomerId, CompanyNameInVietnamese, Telephone, Address, EmailAddress, FaxNumber, MaxDebitAmount, DueDate from Provinces P, Customers C WHERE P Provinceld=C.Provinceld
and C Provinceld = case @Provinceld
when '' then C.Provinceld elise @Provinceld end
and CustomerTypeld = case @Typeld
when '' then CustomerTypeld else @TypeId end
and Discontinued = case @CustomerStatus
when 2 then Discontinued else @CustomerStatus end
and C.CreatedDate>= @StartDate and C.CreatedDate<-@EndDate
and C.CreatedBy = case @UserName when '' then
c.CreatedBy else @UserName end order by CustomerId ASC else // Liét kê mẩu tin theo từ khóa select Discontinued , Discontinued AS Status, CustomerId, CompanyNameInVietnamese, Telephone, Address, EmailAddress, FaxNumber, MaxDebitAmount, DueDate from Provinces P, Customers C WHERE P.ProvinceId=C.Provinceld
and C.Provinceld = case @Provinceld
Trang 9
144 Chương 4: Phần kế tốn cơng nợ phải thu
and CustomerTypeld = case @Typeld
when '' then CustomerTypeld else @Typeld end
and Discontinued = case @CustomerStatus
when 2 then Discontinued else @CustomerStatus end
and C.CreatedDate>= @StartDate and
C.CreatedDate<=@EndDate
and C.CreatedBy = case @UserName when '' then C.CreatedBy else @UserName end
and CONTAINS (C.*, @Keyword)
order by Customerid ASC
GO
Phuong thức EnableApprovalButton được khai báo như ví dụ 4-7 và gọi trong phương thức FillCustomersToGridView, bạn chỉ cho phép sử dụng hay vô hiệu hóa nút btnApprove khi người sử dụng chọn Continue hay Discontinued Ví dụ 4 : Phương thức EnableApprovalButtoni void EnableApprovalButton({) { string status = Convert.Tostring(((ASListTtem) cboStatus.SelectedTtem) ValueField); if (status != "2" && status !="") {
if (rightOnForm IndexOf ("A") f= -1)
btnDiscont inued Enabled = true; else btnDiscontinued.Enabled = false; if (status ` btnDiscontinued.Text = "Activate"; else btnDiscontinued.Text = "Disconitnued'; } else
btnDiscont inued.Enabled = false;
Chẳng hạn, khi người sử dụng chọn vào tùy chọn Discontinued thì danh sách khách hàng được liệt kê là đã đóng cần kích hoạt trở lại như hình 4-7
Lưu ÿ: Khác với trạng thái mẩu tin đã trình bày trong phần trước,
đối với trường hợp danh sách khách hàng bạn có thể đóng hay kích hoạt trở
Trang 10Chương 4: Phần kế tốn cơng nợ phải thu List of Customers = Couy Ohne Unted Sites Tha Thidn Huế Hồ nh: Hà Pho Hane Bing Nat Dang CảnThe Brh Dung Ready Logged os [ldnekerat] Customers Logged n [43:68 Ae) Hình 4-7: Danh sách khách hàng đã đóng
1.3 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 SaveCustomer để gọi thủ tục nội tại udsCustomers;7 với cấu trúc như ví dụ 4-8
Trang 11
146 Chương 4: Phần kế tốn cơng nợ phải thu ff Trường hợp thêm mới mẩu tin
IF @Flag=1 2 cay
INSERT INTO Customers (CustomerId,
CompanyNameInVietnamese,
CompanyNameInSecondLanguage,
CustomerTypeld, Provinceld, ContactName,
ContactTitle, EmailAddress, Address, Telephone,
Faxnumber, MaxDebitAmount, DueDate,
Discontinued, CreatedBy, CreatedDate)
VALUES (@CustomerId,
@CompanyNameInVietnamese,
@CompanyNameInSecondLanguage,
@CustomerTypeld, @Provinceld, @ContactName,
@ContactTitle, @EmailAddress, @Address, @Telephone, @Faxnumber, @MaxDebitAmount, @DueDate,
@Discontinued, CURRENT_USER, GETDATE(}) ELSE // Truéng hop cap nhat mdu tin UPDATE Customers SET CompanyNameInVietnamese = @CompanyNameInVietnamese, CompanyNameInSecondLanguage = @CompanyNameInSecondLanguage, CustomerTypeld = @CustomerTypeld, Provinceld = @Provinceld, ContactName = @ContactName, ContactTitle = @ContactTitle, EmailAddress = @EmailAddress, Address = @Address, Telephone=@Telephone, Faxnumber = @Faxnumber, MaxDebitAmount =@MaxDebitAmount, DueDate = @DueDate, Discontinued = @Discontinued, ModifiedBy = CURRENT_USER, ModifiedDate = getdate() WHERE CustomerId=@CustomerId GO
Trong 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 EditCustomer để gọi thủ tục nội tại có tên udsCustomers;ð
với cấu trúc như ví dụ 4-9
CREATE PROC udsCustomers;5
@CustomerId CHAR (5) AS
SELECT Convert (char (11), DueDate, 106) AS JoinDate, * FROM Customers
WHERE CustomerId = @CustomerId
Trang 12
Chương 4: Phần kế toán công nợ phải thu 147
Chú ý: Phương thức EditCustomer tương tự như phương thức EditReeeipt, EditReceiptBatch đã trình bày trong các phần trước nên không cần trình bày lại trong phần này
Tuy nhiên, trong phương thức EditCustomer, bạn cẩn gọi phương
thức để Hệt kê danh sách hóa đơn mua hàng của khách hàng đang xem
Trang 13148 Chương 4: Phần kế tốn cơng nợ phải thu catch (Exception ex) { ASUIHelper ShowMessageBox ( "Invoice-FillInvoiceToGridView", ex); }
Chú §: Trong chức năng này, bạn có thể tìm thấy hai phương thức
dùng để định dạng dữ liệu và điều chỉnh kích thước của hai điều khiển DataGridView tương ứng là ApplyStyleForCustomers,
ApplyStyleForSalesInvoices va ResizeGridViewForCustomers,
ResizeGridViewForSalesInvoices
Khi thuc thi chuong trinh, néu bạn chỉnh sửa một khách hang thi
danh sách hóa đơn mua hàng của khách hàng đó được trình bày tương tự như hình 4-8 ceca ee le Gerwlloder Aeenrt feceveleAceartByele Inert Conds Ofeioes ChseHirth Rafts te Edit Customer tS Coury China Custonerid [SiS Province: [Tile Thdn - Hu tf a Unted Stater
© Vielnsm DueDae [32/Sep/207 =] Tyee: [Corporation Bị Company Name [Céng ty Da qubc ga UFCA |
EngishName _[UFCA Cop tt) = Theo
_ Pao COU, issue |
Contact Name [Mi Handar Ms Mo EmalAdd [admn@UFCA com
Contact Tle [County Manage: Telephone [78576578 tec [705780766
MaxDebiAmt 2.000.000.00 Sales Amount [7 38415080 — Dincontiwed SR MRE BE 1 2) | stooooo0ee (27/0e/207| 28000) VND “| Stomnooces | 27/0cv2007 | 250000) USD Ready §92 Logged as [Administrator] [=] Customers: Logged Updwe | Back Bete | n (10:54:41 AM]
Hình 4-8: Danh sách hóa đơn mua hàng của khách hàng có mã số là A0007
Ngoài ra, bạn cũng cần tính tổng giá trị mua hàng của khách hàng đang chọn và điển vào điểu khiển txtTotalAmount (ứng với nhãn Sales Amount như hình 4-8) bằng phương thức CaleulateSalesAmount có cấu trúc
Trang 14Chương 4: Phần kế tốn cơng nợ phải thu 149 du 4-11; Phuong t CalculateSalesAmountl void CalculateSalesAmount () { đouble amount = 0;
11 Duyệt qua từng mẩu tin
foreach (DataGridViewRow row in dataGridViewl.Rows) { 1£ (row.Cel1s[ "TnvoiceTd"}.Value.ToString(} 1= ""} 17 Cộng dẫn số tiền mua hàng của từng hóa đơn amount += Convert.ToDouble( row.Cells["Amount"].Value); } } /1 Gán tổng sổ tiền mua hàng uào điều khiển txtTotalAmount ExtCToEalAmourt,TexE = amount.ToString ( ASParameters.doubleNumberFormat) ; t
1.4 Khai báo xóa mẩu tin
Trong trường hợp xóa mẩu tìn, bạn cũng khai báo xác nhận hành
động xóa và gọi phương thức ÐeleteCustomer thông qua thủ tục nội tại có
tên udsCustomers;6 với cấu trúc như ví dụ 4-12
CREATE PROC udsCustomers; 6
@CustomerId CHAR (5)
AS
DELETE FROM Customers
WHERE Customerid = @CustomerId
Go
Chú ý: Bạn có thể tìm thấy thủ tục nội tại Hên quan đến loại khách hàng trong chương cuối của cuốn sách
2 LÔ HÓA ĐƠN BÁN HÀNG
Trang 15
150 Chương 4: Phần kế tốn cơng nợ phải thu
Chú ý: Để tìm hiểu chức năng này, bạn bắt đâu trình đơn Aceount Receivable | Sales Invoices | Sales Invoice Batchs dé kich hoat form có tên frmSalesInvoiceBatchs va cdc thi tục lưu trong tập tin
SalesInvoiceBatchProcedures.sql
9.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 mẩu tin, bạn gọi thủ tục nội tại có tên udsSalesInvoiceBatchs bằng phương thức
FillSalesInvoiceBatchsToGridView,
H149)
CREATE PROC udsSalesInvoiceBatchs // Khai bdo tham số @BatchStatus tinyint, @Keyword nvarchar (50), @StartDate smalldatetime, @EndDate smalldatetime, @UserName varchar (50) AS 1} Liét ké méu tin khéng dita véo td khéa if (@Keyword='')
select BatchStatus AS Approval,
BatchStatus AS Status, InvoiceBatchId, InvoiceBatchDate,
DescriptionInVietnamese,
CreatedBy, CreatedDate, ModifiedBy, ModifiedDate
from SalesInvoiceBatchs
where BatchStatus = case @BatchStatus
when 2 then BatchStatus else @BatchStatus end
and InvoiceBatchDate>= @StartDate and InvoiceBatchDate<=@EndDate
and CreatedBy = case @UserName when '’ then CreatedBy
else @UserName end
order by InvoiceBatchDate DESC
else
1 Tìm hiếm mu tin dựa sào từ khóa
select BatchStatus AS Approval,
BatchStatus AS Status, InvoiceBatchId, InvoiceBatchDate,
DescriptionInVietnamese,
CreatedBy, CreatedDate, ModifiedBy, ModifiedDate
from SalesinvoiceBatchs
where BatchStatus = case @BatchStatus
when 2 then BatchStatus else @BatchStatus end
and InvoiceBatchDate>= @StartDate and
Trang 16
Chương 4: Phản kế tốn cơng nợ phải thu 151
and CreatedBy = case @UserName when '' then CreatedBy
else @UserName end
and CONTAINS (*, @Keyword)
order by InvoiceBatchDate DESC GO
2.2 Thêm mới va cập nhật mẩu tin
Để thêm mới và cập nhật mẩu tin, bạn khai báo gọi thủ tục nội tại có tên udsBalesInvoiceBatchs;4 trong phương thức SaveSalesInvoiceBatch
nvoiceBat
CREATE PROC udsSalesInvoiceBatchs;4
+1 Khai báo tham số @Flag BIT, @InvoiceBatchId VARCHAR (10), @InvoiceBatchDate SMALLDATETIME, @bescriptioniInVietnamese NVARCHAR (150), @BatchStatus BIT As /{ Trường hợp thêm mới mẩu tin IF @Flag =1 INSERT 1NTO SalesInvoiceBatchs ( InvoiceBatchId, InvoiceBatchDate, DescriptionInVietnamese, BatchStatus, CreatedBy, CreatedDate) VALUES (@InvoiceBatchId, @InvoiceBatchDate, @DescriptionInVietnamese, @BatchStatus, CURRENT_USER, GETDATE(} ) ELSE ff Trường hợp cập nhật mẩu tin UPDATE SalesTnvoiceBatchs SET InvoiceBatchDate = @InvoiceBatchDate, DescriptionInVietnamese = @DescriptionInVietnamese, BatchStatus = @BatchStatus, ModifiedBy = CURRENT_USER, ModifiedDate = getdate() WHERE InvoiceBatchId=@InvoiceBatchId GO
Trong 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 udsSalesInvoiceBatchs;2 trong phương thức EditSalesInvoieeBatch
như ví dụ 4-15
Trang 17
®
159 Chương 4: Phần kế tốn cơng nợ phải thụ
@InvoiceBatchId varchar (10)
AS
select Convert (char(11), InvoiceBatchDate, 106) AS DateOfInvoiceBatch, * from SalesInvoiceBatchs Where InvoiceBatchId = @InvoiceBatchId
GO
9.8 Xóa mẩu tin
Tương tự như vay, dé x6a mau tin trong bang SalesInvoiceBatchs, bạn có thể gọi thủ tục nội tại có tên udsSalesInvoiceBatchs;3 trong phương
thức DeleteSalesInvoiceBatch như ví dụ 4-16
í dụ 4-16: Thủ tục nội tại udsSalesInvoiceBatchs;3|
CREATE PROC udsSalesInvoiceBatchs;3
@InvoiceBatchId varchar (10)
AS
delete from SalesInvoiceBatchs
Where InvoiceBatchId = @InvoiceBatchId
GO
Ngoài ra, bạn cần khai báo Trigger trong bảng SalesInvoiceBatchs 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 bán hàng khi người sử dụng duyệt lô hóa đơn bán hàng
í dụ 4-17: Cấu trúc Trigger cé tén trgSalesInvoiceBatch|
CREATE TRIGGER trgSalesInvoiceBatch
ON SalesInvoiceBatchs
FOR UPDATE AS
DECLARE @BatchStatus bit
DECLARE @InvoiceBatchId VARCHAR (10) SELECT @BatchStatus = BatchStatus, @InvoiceBatchId = InvoiceBatchId FROM INSERTED IF @BatchStatus =1 UPDATE SalesInvoices SET InvoiceStatus = 1 WHERE InvoiceBatchId = @InvoiceBatchTd GO
Cha 9: Mat sd phuong thtrc nhu DeleteSalesInvoiceBatch, SaveSalesInvoice,
Trang 18
Chương 4: Phần kế tốn cơng nợ phải thu 153
tự các phương thức cùng mục đích đã được trình bày trong chương trước do đó chúng tôi không trình bày lại trong chương này
3 HÓA ĐƠN BÁN HÀNG
Hóa đơn bán hàng là chức năng quan trọng trong phần quản lý công nợ khách hàng, bởi vì đây là nơi phát sinh số tiền mà khách hàng mua hàng có thể chưa thanh toán
Chức năng này sẽ kết hợp với phần phân bổ tài khoản dùng cho mục đích báo cáo tài chính sẽ được giới thiệu trong phiên bản kế tiếp
Chú ý: Để tìm hiểu chức năng này, bạn bắt đầu trình đơn Account
Receivable | Sales Invoices | Sales Invoiees để kích hoạt form có tên
frmSalesInvoices, cdc thi tuc luu trong tap tin SalesInvoiceProcedures.sql, SalesPriceProcedures.sql va CustomerProcedures.sql
3.1 Giao dién chinh
Trang 19
154 Chương 4: Phần kế tốn cơng nợ phải thu
Phía bên trái là danh sách country, province và tên khách hàng; trong khi đó phần bên phải là danh sách hóa đơn bán hàng
Trong trường hợp tìm kiếm, bạn thiết kế khung cung cấp tùy chọn tìm kiếm nâng cao như hình 4-10
Hình 4-10: Giao diện tìm hiếm
Chứ ý: Phần này cho phép tìm kiếm hóa đơn theo lô hóa đơn, mã
khách hàng cùng với trạng thái và từ khóa
Tương tự như các loại form khác, bạn thiết kế giao diện thêm mới hay
Trang 20
Chương 4: Phân kế tốn cơng nợ phải thu
3.9 Khai báo liệt kê mẩu tin
Với giao diện được chia thành hai phản, bên trái là danh sách country, province và tên khách hàng; bên phải là danh sách hóa đơn bán hàng, bạn có thể khai báo một số phương thức như sau
3.3.1, Liệt bê mẩu tin phía bên trái
Đằng cách áp đụng quy tắc nạp dữ liệu theo yêu cầu (load on demand), bạn khai báo phương thức FillĐataTơTreeView với cấu trúc như ví dụ 4-1 đã trình bày ở trên,
Rhi người sử dụng chọn vào tỉnh thành, lập tức danh sách khách hàng sẽ được thêm vào node của điều khiển TreeView Node này cũng xuất
hiện dấu I4; chẳng hạn, bạn chọn tên tỉnh thành là Hồ Chí Minh thì node
này xuất hiện dấu E4 như hình 4-12
Trong trường hợp danh sách khách hàng đã liệt kê trên node ứng với United States &: Vietnam, s- Thừa Thiên - Huế Hề Chí Minh Hải Phòng Hà Nội ‡« Đồng Nai Đà nẵng Cần Thủ ¬¿ Bình Dướng
Hinh 4-12: Nạp đã liệu theo yêu cầu
Để làm điều này, bạn khai báo overload phương thức cùng tên
FillDataToTreeView với cấu trúc như ví dụ 4-18
Ví dụ 4-18: Phương thức FillDataToTrec
iewl
void FillDataToTreeView(string provinceld, TreeNode treeNode, bool reload)
{
if (reload)
Trang 21
Chương 4: Phần kế tốn cơng nợ phải thu
T1 Khai báo uà khối tao déi tugng ASDataProvider ASDataProvider dataProvider = new ASDataProvider (); £J Khai báo thuộc tính cho đối tượng ASDataProoider dataProvider.CommandText = “udsCustomers;2"; dataProvider.CommandType = CommandType StoredProcedure; 11 Khai báo gọi phương thức GetDataToble DataTable dataTable = dataProvider GetDataTable("@Provinceld", provinceld) ; £1 Khai báo gọi phương thite FillDataToTreeView ASUIHelper.Fi11DataToTreeView ( dataTable, treeNode) ; } Ñ catch (Exception ex) { ASUIHelper ShowMessageBox ( “SalesInvoice-FillDataToTreeView", ex);
Chú ý: Phương thức PillDataToTreeView dùng để liệt kê danh sách country va province trén diéu khién TreeView
Trong đó, thủ tục nội tại có tên udsCustomers;2 khai báo có cấu trúc
như ví dụ 4-19
ù tục nội tai udsCustomers;2
CREATE PROC udsCustomers; 2
@Provinceld char (3}
AS
SELECT CustomerId, CompanyNameInVietnamese
FROM Customers
WHERE Provinceld = case @Provinceld
when '' then Provinceld else @Provinceld end
GO
Trang 22Chương 4: Phần kế tốn cơng nợ phải thu 157 thức EillDataToTreeView| private void tvwProvinces_AfterSelect (object sender, TreeViewEventArgs e)} { 1 Nếu người sử dụng chọn uào tỉnh thành if le.Node.Level == 2) FillDataToTreeview( Convert.ToString{e.Node.Tag}, e.Node, (e.Node.Nodes.Count == 0}); if (e.Node Level >= 2) { FillSalesInvoicesToGridview( Convert.ToString(e.Node.Tag), e.Node.hevel); ResizeGridViewrorSalesInvoices ( rightOnForm IndexG£("A"} !=-1); } lblWarning Text = @.Node.Text; }
Phuong thie FillSalesInvoicesToGridView ding để liệt kê đanh sách méu tin trình bày trên điều khiển DataGridView phía bên phải
3.9.2 Liệt bê mẩu tín phía bên phải
Tương tự như form đã trình bày, liệt kê mẩu tin phía bên phải phụ thuộc vào mã tỉnh thành hay mã khách hàng Nếu người sử dụng chọn mã
tỉnh thành thì chương trình sẽ liệt kê danh sách hóa đơn của các khách
hàng thuộc tỉnh thành đang chọn
Nếu người sử dụng chọn vào mã khách hàng, danh sách hóa đơn của
khách hàng đó sẽ được trình bày phía bên phải
Do phần trình bày mầu tin phía bên phải còn phụ thuộc vào tùy chon
trên màn hình, nên phương thức EillSalesInvoicesToGridView chia thành
hai phần ứng với trường hợp chọn mã tỉnh thành hay mã khách hàng bên trái và trường hợp tìm kiếm
Đối với trường hợp chọn mã tỉnh thành hay mã khách hàng thì bạn
khai báo thủ tục nội tại có tên udsSalesInvoices với cấu trúc như ví dụ 4-21 và gọi trong phương thức FillSalesInvoicesToGridView có hai tham số là
itemld và level
: Thủ tục nội tai udsSalesInvoicesl
Trang 23
158 Chương 4: Phần kế toán công nợ phải thu
if Khai báo tham số @ItemId varchar (5), @Level tinyint, @InvoiceStatus tinyint, @UserName varchar (50) AS // Truéng hop chon mé tinh thanh if @Level=2
select Approval, Status, Invoiceld,
InvoiceBatchId, InvoiceDate, CustomerId,
CompanyNameInVietnamese, Currencyld,
ExchangeRate, Amount, DescriptionInVietnamese
from vwSalesInvoices
where Provinceld = @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
// Truong hep chon ma Rhdch hang if @Level=3
select * from vwSalesInvoices
WHERE CustomerId = @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 GỌ
Trong đó, đối tượng View có tên vwSalesInvoices dùng để kết nối ba
bảng Customers, SalesInvoices và SalesInvoiceDetails được khai báo tương
tự như ví dụ 4-22
CREATE VIEW vwSalesInvoices
AS
SELECT InvoiceStatus AS Approval,
InvoiceStatus AS Status, S.Invoiceld,
Provinceld, InvoiceBatchId, InvoiceDate,
S.CustomerTd, CompanyNameTnVietnamese,
Currencyld, S.CreatedBy, ExchangeRate,
Trang 24Chương 4: Phần kế tốn cơng nợ phải thu
ON D.TnvoiceTd =§.InvoiceTd
GROUP BY TnvoiceStatus, 8.Invoice1đ, Provinece1d,
InvoiceBatchid, InvoiceDate, §.Customer1d,
CompanyNameInVietnamese, CurrencylId,
ExchangeRate, DescriptionInVietnamese, S.CreatedBy
Trong trường hợp tìm kiếm, bạn khai báo thủ tục nội tại có tên
udsSalesInvoices;2 với cấu trúc như vi du 4-23 va gọi trong phương thức
PillSalesInvoicesToGridView có một tham số là search
CREATE PROC udsSalesTnvoices;2
11 Khai báo tham số @CustomerTd char (5), 9BatchTd VARCHAR (10), @InvoiceStatus tinyint, @Keyword nvarchar (50), @StartDate smalldatetime, @EndDate smalidatetime, @UserName varchar (50) AS 1] Ligt ké m@u tin if (@Keyword='')
select Approval, Status, Invoiceld,
InvoiceBatchId, InvoiceDate, Customerld,
CompanyNameInVietnamese, Currencyld,
ExchangeRate, Amount, DescriptioninVietnamese from
vwSalesInvoices
where CustomerId = case @Customerid when '' then
CustomerId else @CustomerId end
and InvoiceBatchId = case @BatchId when '' then
InvoiceBatchId else @BatchId end
and Status = case @InvoiceStatus when 2 then Status else @InvoiceStatus end
and InvoiceDate>= @StartDate and InvoiceDate<=@EndDate
and CreatedBy = case @UserName when '' then CreatedBy
else @UserName end
order by InvoiceDate DESC
else
+Í Tìm kiếm mẩu tin dựa uào từ khóa
SELECT InvoiceStatus AS Approval,
InvoiceStatus AS Status, S.Invoiceld,
InvoiceBatchId, InvoiceDate, S.CustomerlId,
CompanyNameInVietnamese, Currencyld,
Trang 25° 160 Chương 4: Phản kế tốn cơng nợ phải thu co SUM (Quantity*Price* (1+VATRate/100) -Biscount} AS Amount, DescriptionInVietnamese FROM SalesInvoices S, Customers C, SalesInvoiceDetails D NHERE §.CustomerTd = C.CusEomerTđ and D Invoiceid = S.Invoiceld
AND $.Customerltd = CASE @CustomerId WHEN '' THEN
§.Customerld ELSE @CustomerId END
AND InvoiceBatchId = case @BatchId
WHEN '' then InvoiceBat.chid else @BatchId end
AND InvoiceStatus = CASE @InvoiceStatus WHEN 2 THEN
InvoiceStatus ELSE @InvoiceStatus END
AND S.CreatedBy = CASE @UserName WHEN '' THEN S.CreatedBy ELSE @UserName END
AND InvoiceDate>= @StartDate AND
InvoiceDate<=@EndDate
AND CONTAINS (S.*, @Keyword)
GROUP BY InvoiceStatus, S.Invoiceld,
InvoiceBatchId, InvoiceDate, $.CustomerId,
CompanyNameInVietnamese, Currencyld, ExchangeRate, DescriptioninVietnamese
ORDER BY InvoiceDate DESC
Chú 9: Tha tuc néi tai vừa trình bày ở trên cho phép bạn tìm kiếm mẩu tin theo từ khóa hoặc liệt kê mẩu tin theo trạng thái
3.3 Khai báo thêm mới và cập nhật mẩu tin
Để 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 udsSalesInvoiees;7 và gọi trong phương thức SaveSalesInvoice ứng với
hai trường hợp dựa theo tham số Flag
í dụ 4-24: Thủ t
nội tại adsSalesinvoices;7
CREATE PROC udsSalesInvoices;7
Trang 26Chương 4: Phần kế tốn cơng nợ phải thu 161
+1 Trường hợp thêm mới mu tín
if @Flag =1
INSERT INTO SalesInvoices
(InvoiceBatchId, InvoicelId, InvoiceTypeld,
InvoiceDate, CustomerId, Currencyld,
ExchangeRate, InvoiceStatus,
DescriptionInVietnamese)}
VALUES (@BatchId, @Invoiceld, @InvoiceTypeld, @InvoiceDate, @Customerid, @Currency!d, @ExchangeRate, @InvoiceStatus, @DescriptionInVietnamese) 71 Trường hợp cập nhật mẩu tin else update SalesInvoices set InvoiceBatchId=@BatchIid, InvoiceTypeld=@InvoiceTypeld, InvoiceDate=@InvoiceDate, CustomerId=@Customerld, Currencyld = @CurrencylId, ExchangeRate = @ExchangeRate, InvoiceStatus = @InvoiceStatus, DescriptionInVietnamese = @DescriptionInVietnamese Where InvoicelId = @Invoiceld GO
Khi chỉnh sửa hóa đơn bán hàng để xem hay cập nhật, bạn khai báo thủ tục nội tại có tên udsSalesInvoices;4 với cấu trúc như ví dụ 4-25 và gọi trong phương thức EditSalesInvoice PROC udsSalesInvoices;3 @Invoiceld varchar (10) AS select S.*, CompanyNameInVietnamese,
Convert (char(11), InvoiceDate,106) AS DateOfInvoice from SalesInvoices S, Customers C
Where 5.CustomerTđ=C.CustomerTd
and Invoiceld = @Invoiceld
GO
Do mỗi khi chỉnh sửa hóa đơn bán hàng, chúng ta cần liệt kê danh sách hóa đơn bán hàng chỉ tiết, nên bạn khai báo phương thức cá tên
Trang 27162 Chương 4: Phần kế toán công nợ phải thu thức EillSalesInvoiceDetailsfoGridViewl private void FillSalesInvoiceDetailsToGridview( string invoiceld) { try { 11 Khai bdo vd khởi tạo đối tượng ASDataProuider ASDataProvider đataProvider = new ASDataProvider () ; ?1 Khai báo thuộc tính cho đối tượng ASDataProuider dataProvider CommandText = "udsSalesInvoices;4"; dataProvider.CommandType = CommandType StoredProcedure; // Khai bdo goi phuong thite GetDataTable dataTableForDetails = dataProvider GetDataTable("@InvoicelId", invoiceld); 71 Khai bdo goi phuong thitc FillDataToGridView ASUIHelper FillDataToGridview( dataTableForDetails, this.dataGridViewl) ; 11 Khai báo gọi hai phương thúc định dạng dữ liệu /{ ResizeGridViewForSalesInvoiceDetails va điều chỉnh kích ?1 thước là ResizeGridVieuForSalesinuoiceDetails 1£ (đataTableForDetails.Rows.Count > 0) { ResizeGridviewForSalesInvoiceDetails(); ApplyStyleForSalesInvoiceDetails(); } if (dataProvider.ErrorMessage != "") { ASUTHelper ShowMessaqeBox ( "Sales Invoices-FillInvoiceToGridview", dataProvider.ErrorMessage) ; 3 } catch (Exception ex) { ASUTHelper ShowMessageBox ( "§ales Tnvoice-Fi11InvoicesTcGridView", ex); } }
Chẳng hạn, mỗi khi người sử dụng chỉnh sửa hóa đơn bán hàng, danh sách hóa đơn bán hàng chỉ tiết trình bày trên điêu khiển DataGridView
Trang 28Chương 4: Phần kế toán công nợ phải thu 168 lw«eeeDde [20/00 72007 =) Cummey rane Dore =]
Hinh 4-13: Hóa đơn bán hang chi tiét
Để làm điều này, bạn cần khai báo thủ tục nội tại có tên
udsSalesInvoiees;4 với cấu trúc như ví dụ 4-27
i du 4-27: Thủ tục nội tại ud'
CREATE PROC udsSalesInvoices;4 @InvoiceId 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 SalesInvoiceDetails D, Products P
WHERE P.ProductId = D ProductId
AND InvoiceId= @InvoicelId
GO
Ngoài ra, để tính tổng giá trị của hóa đơn bán hàng, bạn cần khai báo
phương thức CalculateAmount và gọi trong phương thức EditSalesInvoice
(eAmountl
void CaculateAmount ()
{
double amount = 0;
// Duyét qua titng mdu tin
Trang 29164 Chương 4: Phần kế toán công nợ phải thu dataGridView1 Rows) š { L1 Cộng dôn số tiền amount += Convert ToInt32 ( ‘row.Cells["Amount"].Value) ; } 11 Định dạng số tiền txtAmount Text = amount ToString ( ASParameters đoub1eNumberFormat ) ; 11 Tính tổng uà định dạng số tiền txtTotalAmount Text =
(amount * Convert ToDouble(
txtExchange Text) ) ToString (
ASParameters.doubleNumberFormat) ;
}
Chú ý: Tương tự như trong phần trình bày phiếu thu và chỉ, bạn cần khai báo phương thức CalculateTotalAmount và gọi trong biến cố 'TextChanged của điều khiển txtExchange và SelectionChangeCommitted
của điều khiển cboCurreney để quy đổi tỷ giá ngoại tệ
“Trong trường hợp chỉnh sửa chỉ tiết hóa đơn bán hàng, người sử dụng Double Click trên mẩu tin của GridView thì cửa sổ cho phép thêm mới hay
cập nhật xuất hiện như hình 4-14
a
Trang 30
Chương 4: Phần kế tốn cơng nợ phải thu
Chú ý: Nếu trạng thái của hóa đơn đã được duyệt thì bạn không thể
sử dụng các nút Add Details và Delete Details
Để mở form chỉ tiết, bạn khai báo trong biến cố DoubleClick của điều khiến dataGridView1 để chỉnh sửa chỉ tiết hóa đơn bán hàng như ví dụ 4-29
ong biển cố DoubleCl
private void dataGridViewl_DoubleClick (object sender, EventArgs e) { DataGridViewRow dataGridViewRow = dataGridViewl CurrentRow; if (dataGridViewRow != null) { } } EGitDetails (dataGridViewRow) ;
Trang 31
166 Chương 4: Phân kế tốn cơng nợ phải thu
+1 Khai báo số thứ tự mẩu tin kế tiến
fxm.NextOrdinalNumber =
this.dataGridView1.Rows.Count +1;
1} Khai bdo mo form 6 ché dé modal
frm.ShowDialog (this) ;
1] Khai bdo goi phuong thie FillSalesInvoiceDetailsToGridView
71 sau khi form mỡ ở chế độ modal đóng lại
FillSalesiInvoiceDetailsToGridview(
txtId Text);
}
Gọi phương thức EditDetails bằng cách khởi tạo form có tên frmlInvoiceDetails và gán các thuộc tính tương ứng rồi gọi phương thức
ShowDialog dé mé form ở chế độ modal
Sau khi người sử dụng đóng form này thì bạn gợi phương thức
fiHSalesInvoiceDetailsToGridView để làm tươi dữ liệu trong điều khiển dataGridView1 ứng với phần chỉ tiết hóa đơn,
Tương tự như vậy, để thêm mới chỉ tiết hóa đơn bán hàng, bạn khai báo trong biến cố Click của nút btnNewDetail như ví dụ 4-31 binNewDet: private void btnNewDetail_Click(object sender, EventArgs e) { 7Ị Khai báo uà khởi tạo déi tugng frmInvoiceDetails frmInvoiceDetails frm= new frmInvoiceDetails(); († Khai báo thuộc tính cho đối tuong frmInvoiceDetails frm.HeaderText = "Sales Invoice Details - Add New Item"; frm,NextOrđinalNumber = this đataGridView1.Rows.Count + 1; frm.TnvoiceTđ = this.txtId.Text; frm,Currency = cbhoCurrency.SelectedValue.ToString(); 1] Khai bdo mé frminvoiceDetails 6 dang medal frm ShowDialog (this) ;
+1 Khai báo gọi phương thức FilSolesInuoiceDetailsToGridVietu
// sau khi dong frmInvoiceDetails
FillSalesInvoiceDetailsToGridview(
Trang 32Chương 4: Phản kế tốn cơng nợ phải thu 167
Do frmlnvoiceDetails dùng chung cho phần chí tiết hóa đơn bán hàng và mua hàng, nên chỉ tiết của form này sẽ không trình bày trong chương kế tiếp - Phần kế tốn cơng nợ phải trả
Lớp frmlnvoiceDetails bao gồm các thuộc tính khai báo như
SalesInvoice, Status, HeaderText, ProductId, Invoiceld, OrdinalNumber,
NextOrdinalNumber, Quantity, Price, Currency, ~ VATRate, ImportTaxRate
Trong đó, thuộc tính SalesInvoice có giá trị là true vì form này sử
dụng cho trường hợp chỉ tiết hóa đơn bán hàng
private bool salesInvoice = true;
public bool SalesTnvoice {
set { salesInvoice = value; }
}
Nếu muốn biết được trạng thái hóa đơn duyệt hay không duyệt để vô
hiệu hóa nút Add New, Delete và Save; bạn khai báo thuộc tính Status như
Sau:
private bool status = false; public bool Status
{
Set { status = value; } }
Do form này được dùng cho hai trường hợp chỉ tiết hóa đơn bán hàng
và mua hàng, nên bạn khai báo thuộc tính HeaderText để truyền chuỗi và trình bày trên điều khiển lblHeaderText
private string headerText = "";
public string HeaderText
{
} set (headerText = value; }
Khi chinh sia chi tiét héa don, ban can truyén sé thé ty cha mẩu tin dang chọn thông qua thuộc tính OrdinalNumber khai báo như sau:
private int ordinalNumber = 0; public int OrdinalNumber
{
Trang 33
168 Chương 4: Phần kế toán công nợ phải thu
Khi thêm mới mẩu tin, bạn cần truyền sang cho form này số thứ tự chỉ
tiết hóa đơn kế tiếp bằng cách khai báo thuộc tính NextOrdinalNumber
private int nextOrdinalNumber = 0; public int NextOrdinalNumber
{
set { nextOrdinalNumber = value; }
}
Tuong tu nhu vay, ban can truyén cdc thudc tinh Productld, Invoiceld,
Quantity, Price, Currency, VATRate, ImportTaxRate cho phép chỉnh sửa
thông tin chỉ tiết hóa đơn bằng cách khai báo như sau:
private string productId=""; public string ProductId
{
set { productid = value; }
}
private string invoiceTd = ""; public string InvoicelId
{
set { invoiceld = value; } }
private string quantity = "";
public string Quantity
{
set { quantity = value; }
}
private string price =""; public string Price
{
set { price = value; }
}
private string currency =""; public string Currency
{
set { currency = value; }
}
private string vatRate = °";
public string VATRate
{
set { vatRate = value; } }
private string importTaxRate = ""; public string ImportTaxRate
{
set { importTaxRate = value; }
Trang 34Chương 4: Phần kế tốn cơng nợ phải thu 169
Đối với trường hợp chỉnh sửa, bạn khai báo gán gìá trị của các thuộc
tính trên cho các điều khiển trên form trong biến cố Load của form như ví dụ 4-39, private void frmInvoiceDetails_Load (object sender, EventArgs e} {
lblHeaderText Text = headerText ;
1ƒ Nếu người sử dụng đang làm uiệc oới hóa đơn mua hàng
if (!salesInvoice)
messageToShow = "PurchaseinvoiceDetail";
// Ligt ké danh sdch sén phẩm vao diéu khién ComboBox
FillDataToComboBox (
"SELECT ProductId, ProductNameInVietnamese " + "FROM Products order by "
+ "ProductNameInVietnamese ASC", cbhoProduct,
“ProductNameInVietnamese", “ProductId") ;
?† Nếu trường hợp chỉnh sửa thì gán giá trị của thuộc tính ào
+ diều khiển tương ủng if (productId !="")} { choProduct SelectedValue = productId; txtIimportTax.Text = importTaxRate; txtPrice.Text = price; txtQuantity.Text = quantity; CXtVAT.Text = vatRate; txtImportTax.Text = importTaxRate; btnDelete.Enabled = !status; btnSave.Enabled = !status; btnAddNew Enabled = !status; btnSave.Text = "Update"; } else {
£J Trường hợp thêm mới thì uô hiệu hóa nút btnDelete
btnDelete Enabled = false; btnSave.Text = "&Save";
btnSave, Enabled = true; btnAddNew Enabled = true;
Trang 35
170 Chương 4: Phần kế tốn cơng nợ phải thu Chú §: Lớp frmlnvoiceDetails mặc định dùng cho trường hợp quản lý thông tin chỉ tiết hóa đơn bán hàng dựa vào thuộc tính SalesInvoiee có giá trị là true
Hóa đơn bán hàng chi tiết có khóa chính bao gồm ba cột OrdinalNumber (số thứ tự), Productld và Invoiceld Mỗi khi mở frmInvoiceDetails ban cần gán thuộc tính NextOrdinalNumber là số thứ tự kế tiếp Mục đích này là để, nếu người sử dụng thêm mới chỉ tiết mẩu tin thì số thứ tự kế tiếp là số lấy từ thuộc tính này
Chú ý: Dù người sử dụng chọn nút Add Details hay Double Click vào chỉ tiết hóa đơn bán hàng, bạn cần gán giá trị cho thuộc tính OrdinalNumber ứng với số mẩu tin đang có cộng thêm 1
Chẳng hạn, hóa đơn số SI00000088 bao gồm các thông tin chi tiét và
có một mẩu tin ứng với thông tin chỉ tiết hóa đơn như hình 4-15 County China Unted States © Vietnam
Thừa Thiên - Hud
(HB Chi Minh HãiPhòng HàNội Đồng Nai Đà nẵng Cin Tho Binh Dudng
Hinh 4-15: Chi tiét hóa đơn số SI00000088
Trang 36Chương 4: Phần kế toán công nợ phải thu 1z¡ [M?
Hình 4-16: Thêm mới mẩu tin
Sau đó, bạn nhập thông tin chỉ tiết hóa đơn bán hàng như hình 4-17
Hình 4-17: Nhập mới chỉ tiết hóa đơn bán hang
Sau khi người sử dụng chọn tên sản phẩm, bạn khai báo đoạn chương
trình trong biến cố SelectionChangeCommitted của điều khiển cboProduct
để lấy VATRate, ImportTaxRate trong bảng Products và đơn giá trong
Trang 37Chương 4: Phần kế tốn cơng nợ phải thu Khai báo VATItate, Impo private void choProduct_SelectionChangeCommitted( object sender, EventArgs e) { try { £† Trường hợp hóa đơn bán hàng if (salesInvoice) { // Khai bdo va khdi tao déi tugng ASDataProvider ASDataProvider dataProvider = new ASDataProviđer (} ; 1} Khai báo thuộc tính cho đối tượng ASDetaProoider đataProviđder.CommandText = "udsSalesPrices;2"; dataProvider.CommandType = CommandType StoredProcedure;
£† Khai báo mảng tham số
string{] parameterName = new string[2] {
"@ProductId", "@CurrencyId" };
+! Khai bảo mảng giá trị cho tham số
object[] parameterValue z new object[2] { cboProduct SelectedValue.ToString({),
currency };
1 Khai bdo goi phuong thite GetDataRow
DataRow dataRow = dataProvider.GetDataRow(
parameterName, parameterValue) ; if (dataRow != null)
{
+1 Khai báo lấy giá trị từ các cột Price,
// VATRate va ImportTaxRate
Trang 38Chương 4: Phản kế tốn cơng nợ phải thu 173 } catch (Exception ex) { ASUTHelper ShowMessageBox ( “cbhoProduct_SelectionChangeCommitted" , ex); } }
Luu ý: Đoạn chương trình trong biến cố trên chỉ thực thi khi người sử
dụng làm việc với hóa đơn bán hàng, tức là thuộc tính SalesInvoice có giá trị là true
Trong đó, thủ tục nội tại udsSalesPrices;2 khai báo trong tập tin SalesPriceProcedures.sql cho phép lấy giá bán của sản phẩm được khai báo như ví dụ 4-34 CREATE PROC udsSalesPrices ;2 @ProductId varchar (50), @CurrencyId char (3) AS
SELECT VATRate, ImportTaxRate, Price
PROM Products P LEFT JOIN PricesForSalesInvoice $
ON P ProductId=S.ProductId
AND S PriceDiscontinued = 0
AND CurrencylId = @CurrencyId WHERE P.ProductIid = @Productid
ORDER BY DateOfPrice desc
GO
Nếu người sử dụng nhấn nút Add New, thông tin hiện hành trên các
điều khiển sẽ bị xóa để nhập thông tin mới Để làm điều này, bạn khai báo
gọi phương thức AddNewRecord trong biến cố Click của nút btnAddNew
Trong trường hợp người sử dụng nhấn nút Save, bạn khai báo gọi phương thức SavelnvoiceDetail và truyền giá trị cho các tham số khai báo trong thủ tục nội tại uds8alesinvoices;8 có cấu trúc như ví dụ 4-35
tai ưds5ale
CREATE PROC udsSalesInvoices;8
Trang 39174 Chương 4: Phần kế tốn cơng nợ phải thu @VATRate DECIMAL (18,2), @ImportTaxRate DECIMAL (18,2) AS L1 Trường hợp thêm mới mẩu tin if @Flag =1
INSERT INTO SalesInvoiceDetails
(OrdinalNumber, InvoiceId, ProductId, Quantity, Price, VATRate, ImportTaxRate)
VALUES (@OrdinalNumber, @InvoiceId, @ProductId,
@Quantity, @Price, @VATRate, @ImportTaxRate)
(1 Trường hợp cập nhật mẩu tin else
update SalesInvoiceDetails
set Quantity=@Quantity, Price=@Price,
VATRate=@VATRate, ImportTaxRate=@ImportTaxRate
Where InvoiceId= @InvoiceId and ProductId = @ProductIid
and OrdinalNumber = @OrdinalNumber
GO
Chẳng hạn, sau khi nhập thông tin như hình 4-17, bạn nhấn nút
Save thì frmInvoiceDetails sẽ đóng lại, danh sách mẩu tin chỉ tiết hóa đơn bán hàng trình bày như hình 4-18
Trang 40
Chương 4: Phần kế toán công nợ phải thu 175
3.4 Khai báo xóa mẩu tin
Tương tự như chức năng xóa của các form khác đã trình bày trong phần trước Tuy nhiên, khi làm việc với hóa đơn bán hàng, nếu người sử
dụng nhấn nút Delete thì bạn gọi phương thức Deletelnvoice có 1 tham số
Trong phương thức này bạn gọi thủ tục nội tại có tên udsSalesInvoices;5 làm việc với bảng SalesInvoices có cấu trúc như ví dụ 4-36
CREATE PROC udsSalesInvoices;5
@Invoiceld varchar (10)
AS
delete from SalesInvoices
Where InvoiceTd = @Invoiceld
GO
Đối với trường hợp xóa chi tiết hóa đơn bán hang, ban khai báo gọi
phương thức DeletelnvoiceDetails với 3 tham số Bằng cách tương tự như
trên, bạn gọi thủ tục nội tại có tên udsSalesInvoices;6 làm việc với bảng
8alesInvoiceDetails có cấu trúc như ví dụ 4-37
Ví dụ 4-3 ul ội tại sSalesInvoices;6|
CREATE PROC udsSalesInvoices;6
@OrdinalNumber int,
@InvoiceTd varchar (10), @ProductTđ varchar (50)
AS
delete from SalesInvoiceDetails
Where Invoiceld= @Invoiceld
and ProductId = @Productid
and OrdinalNumber = @OrdinalNumber
Go
Chú ý: Nếu người sử dung nhaén nit Delete trén frmInvoiceDetails, bạn cũng khai báo phương thức DeletelnvoiceDetails để gọi thủ tục nội tại
có tên udsSalesInvoices;6
3.5 In báo cáo