1. Trang chủ
  2. » Công Nghệ Thông Tin

xây dựng ứng dụng quản lí kế toán bằng c 2005 part2

131 231 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 131
Dung lượng 41,9 MB

Nội dung

Trang 1

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 2

Chươ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 4

Chươ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 5

140 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 6

Chươ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 8

2 ’ 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 10

Chươ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 13

148 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 14

Chươ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 22

Chươ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 24

Chươ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 26

Chươ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 27

162 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 28

Chươ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 29

164 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 32

Chươ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 34

Chươ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 36

Chươ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 37

Chươ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 38

Chươ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 39

174 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

Ngày đăng: 28/02/2014, 23:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN