268 Chương 6: Phần kế toán xuất - nhập - tén
WHERE I.ImportId = D.ImportId
AND ImportDate between @StartDate and @EndDate
GROUP BY StockId, ProductId UNION ALL
/{T6ng hop méu tin tt bang Exports va ExportDetails SELECT StockId, ProductId, 0, 0,
isnull(SUM(Quantity),0) As ExportQuantity
FROM Exports E , ExportDetails D
WHERE E ExportId = D.Exportid
AND ExportDate between @StartDate and @EndDate
GROUP BY StockId, ProductId
}
!1Tổng hợp mẩu tin vao bang MonthlyInventoryControl
INSERT INTO MonthlyInventoryControl
(StockId, ProductId, BeginQuantity, ImportQuantity,
ExportQuantity, EndQuantity) SELECT StockId, ProductId,
SUM (BeginQuantity) AS BeginQuantity, SUM(ImportQuantity) AS ImportQuantity, SUM(ExportQuantity) AS ExportQuantity, SUM(BeginQuantity) + SUM(ImportQuantity) - SUM(ExportQuantity) AS EndQuantity FROM ExportAndImportQuantity GROUP BY StockId, Productld; GO
Trong trường hợp bạn cho phép người sử đụng tổng hợp xuất nhập và tên kho của một sản phẩm, bạn khai báo thủ tục nội tại có tên
udsInventoryControl;ä như ví dụ 6-40 và cũng gọi trong biến cố Click của
nút btnCalculate
í dụ 6-40: Thu tue 1
CREATE PROC udsInventoryControl;3
+¡ Khai báo tham số @Product1đ varchar (10), @PreviousMonth CHAR (8), @StartDate smalldatetime, @EndDate smalldatetime AS
// Xa mau tin dang tôn tai trong bang MonthlyInventoryControl
DELETE FROM MonthlyInventoryControl
WHERE Product Id=@ProductId;
(1 Khai báo biểu thức bằng ExportAndimporiQuantiy WITH ExportAndImportQuantity
Trang 2
Chương 6: Phân kế toán xuất - nhập - tổn 269
(
//Téng hop méu tin tit bang CloseMonthInventoryControlDetails
SELECT StockId, ProductiId, EndQuantity As BeginQuantity,
0 As ImportQuantity, 0 As ExportQuantity FROM CloseMonthInventoryControlDetails
WHERE CloseMonth = @PreviousMonth AND Product Id=@ProductId
UNION ALL
/{Téng hop méu tin tit bdng Imports va ImportDetails SELECT StockId, ProductId, 0,
isnull(SUM(Quantity),0) As ImportQuantity, 0 FROM Imports I, ImportDetails D
WHERE I ImportId = D.ImportId
AND ProductId=@ProductId
AND ImportDate between @StartDate and @EndDate
GROUP BY StockId, ProductId
UNION ALL
/1Téng hop méu tin tit bang Exports va ExportDetails
SELECT StockId, ProductId, 0, 0,
isnull (SUM(Quantity),0) As ExportQuantity FROM Exports E ; ExportDetallsD
WHERE E.Exbort1d = D.ExportTd AND Product Id=@ProductId
AND ExportDate between @StartDate and @EndDate GROUP BY StockId, ProductId
)
£ITổng hợp mẩu tin vao bang MonthlyInventoryControl INSERT INTO MonthlyInventoryControl
(StockId, ProductId, BeginQuantity, ImportQuantity,
ExportQuantity, EndQuantity)
SELECT StockId, ProductId,
SUM (BeginQuantity) AS BeginQuantity,
SUM (ImportQuantity) AS ImportQuantity, SUM(ExportQuantity) AS ExportQuantity, SUM(BeginQuantity) + SUM(ImportQuantity) - SUM(ExportQuantity) AS EndQuantity
FROM ExportAndimportQuantity WHERE Product Id=@ProductId
GROUP BY StockId, ProductId; GO
Chú ý: Khi thực hiện chức năng này, chương trình sẽ tự tổng hợp xuất nhập và tính tôn kho cho tất cả sản phẩm trong nhiều kho
Chẳng hạn, bạn chọn vào tùy chọn Selected Product réi tiép tue chon
Trang 3
Chương 6: Phần kế toán xuất - nhập - tồn
TẾT me lel
Fe GeneralLedger Account Receivable Account Payable Inventory Controls Directories Close Month Rights Heb
Inventory Controls 7 Month 012007 Specie Marth @ Calcuste AP
Stat Date: [01/0cr 72007 =] End Date [3170c1/2007 = erence ok a
CaedalelClo CC AIPodeh (S SastedPodel Calculate | SlockName | Pioductid | PodietNanerVeinsnese Beginduently ImporQuaniiy Exportuanity Eneuentiy 00001 h 100 s 15 #5 ODOT 'Túsách 180 600 40 50 P0002 | Tuixdch ding cho hoe sinh nf 180 0U — 885 55 P0002 xách đìng cho học sphrủ 7 250 180 Tixéch ding cha hoe sin nam |Stock8 | P3 /Túxáchdmgckohoesihnam | so To ma ‘Ti domoa [Tú sách đng co Máy tính 315
:hđng cho điện hoạ đ động 2h ding cho Gién thos! di dong Tả xách dừng cho PC Ready $82 Logged as [Administrator] Inventory Controls Loggedin [4:54:21 PM)”
Hình 6-24: Tổng hợp dữ liệu xuất nhập uà tính tồn kho của một sản phẩm Chú $: Đề tạo danh sách tháng và năm trên điều khiển ComboBox
dùng cho lựa chọn tháng và năm trong quá khứ, bạn khai báo phương thức InitiateMonth như ví dụ 6-41 và gọi trong biến cố Load của form Vi du 6-41: Phu rin pint teMonth| void InitiateMonth() Ệ for (int year = 2007; year < 2010; year++) { }
ASCommon asCommon = new ASCommon () ;
Trang 4Chương 6: Phần kế toán xuất - nhập - tồn 271
4 CẬP NHẬT SỐ LƯỢNG THỰC
Số lượng sản phẩm trong kho có thể khác với số lượng trong sổ sách
kế toán”, nguyên nhân của sự khác biệt này là đo con số nhập và xuất thực
tế khơng đúng
Ngồi ra, chức năng này còn cho phép người sử dụng nhập số lượng sản phẩm bị hư hỏng vào cột BadProductInStock thuộc bảng ProductInStocks phục vụ cho mục đích quản lý
Chú ý: Đề tìm hiểu chức năng này, bạn bắt đầu trình đơn Inventory
Controls | Update Product In Stock để kích hoạt form có tên frmUpdateStock.cs, các thủ tục lưu trong tap tin
ProductStatusProcedures.sql
4.1 Giao dién
Để điều chỉnh số lượng của sản phẩm trong kho theo sổ sách kế toán hay ngược lại, bạn cần thiết kế form với giao tiếp như hình 6-25
Hinh 6-25: Giao dién frmUpdateStock.cs
Dữ liệu dùng để điều chỉnh số lượng hiện tại trong kho phải được tổng
hợp trong chức năng trên
4.2 Khai báo
Tương tự như chức năng trên, bạn có thể trình bày tình hình xuất
nhập và tôn kho của tháng hiện hành bằng cách gọi thủ tục nội tại có tên
udsProductStatus với cấu trúc như ví dụ 6-42 trong phương thức FillDataToGridView
CREATE PROC udsProductStatus
Trang 5fA? 272 Chương 6: Phan ké todn xudt - nhap - tén AS SELECT S.StockId, StockName, I-ProductId, ProductNameInVietnamese, BeginQuantity AS BeginQtty, ImportQuantity AS ImportQtty, ExportQuantity AS ExportQtty, EndQuantity AS EndQtty, GoodProduct InStock AS QttyInStock, BadProductInStock AS BadQtty FROM Products P INNER JOIN MonthlyInventoryControl I ON P ProductId = I ProductId
INNER JOIN Stocks S ON S.StockId = I.StockId INNER JOIN Product InStocks PIS
ON I.StockId = PIS.StockId
AND PIS ProductId = I ProductId
WHERE S.StockId = case @StockId when ''
then S.StockId else @StockId end Go
'Rhi gọi frmUpdateStock, tình hình xuất nhập va tồn kho trong tháng
Trang 6R o * k
Chương 6: Phần kế toán xuất - nhập - tổn ams
Bằng cách thêm hai cột, cột thứ nhất ứng với trường hợp người sử
dụng nhập số lượng sản phẩm bị hư hồng (BadQtty), cột thứ hai là cột UpdateQtty, bạn khai báo đoạn chương trình sau trong phương thức ApplyStyleForColumn
if (!dataGridView.Columns.Contains("Updategtty"))
dataGridView.Columns.Add("UpdateQtty", "Update"); Để điền số lượng từ cột EndQtty hay QttyInStock vào cột Update tùy
thuộc vào tùy chọn EndQtty To QttyInStock hay QttyInStock To EndQtty,
ban khai báo đoạn chương trình trong biến cố Click của nút btnFillUpdate@tty như ví dụ 6-43 private void btnFillUpdateQtty_Click (object sender, EventArgs e} { try {
f1 Duyệt qua từng mẩu tin
foreach (DataGridViewRow row in dataGridView Rows) { 1} EndQtty To QttyInStock if (rdoEndQttyToUpdateQtty.Checked) row.Cells["UpdateQtty"].Value = row.Cells["EndQtty"].Value; else 1} QttyInStock To EndQtty row.Cells["UpdateQtty"].Value = row.Cells["QttyInStock"] Value; } } catch (Exception ex) { ASUTHelper ShowMessageBox ( "btnFillUpdateQtty_Click", ex); } }
Chang han, khi bạn nhấn nút Fill Update Qity với tùy chọn là ndQtty To UpdateQtty thì kết quả trình bầy như hình 6-27
Trang 7Chương 6: Phan kế toán xuất - nhập - tồn Tibdch dig cht sh [Ti ch ding cho hoe sinh nam {dh fom ing he rn Tonia [Taek oie TH xách đồng cho học enh nam Tú áo ma Tứ áo mùa Tech ng cho My tinh Tú xách đừng cho My th
Tiindch ding cho din thoi dé |
Trang 8
Chương 6: Phần kế toán xuất - nhập - tổn 275
Sau khi điều chỉnh số lượng trong cột Update, nếu bạn quyết định cập
nhật số lượng theo thực tế hay sổ sách trong kho thì nhấn nút Update Tùy
vào thy chon EndQtty To QttyInStock hay QttyInStock To EndQtty, ban gọi thủ tục nội tại udsProductStatus;2 nhữ ví dụ 6-44
CREATE PROC udsProductStatus;2
#1 Khai báo tham số @UpdateMode bit, @StockId CHAR (5), @ProductId varchar (10), @Quantity DECIMAL (18, 2) AS 11 Trường hợp cập nhật số lượng từ sổ sách sang kho IF @UpdateMođe = 1
UPDATE Product InStocks
SET GoodProduct InStock = @Quantity,
ModifiedBy = CURRENT_USER, ModifiedDate = GETDATE() WHERE StockId = @StockId AND Productid = @ProductId ELSE +] Trường hợp cập nhật số lượng từ sách sang sổ sách UPDATE MonthlyInventoryControl SET EndQuantity = @Quantity, ModifiedBy = CURRENT_USER, ModifiedDate = GETDATE() WHERE StockId = @Stockid AND ProductId = @ProductId GO Sau đó, khai báo gọi thủ tục nội tại này trong biến cố CHek của nút btnCalculate như ví dụ 6-45 private void btnCalculate_Click (object sender, EventArgs e} { try {
41 Khai báo mdng string va object
string{] parameterName = null;
object {] parameterValue = null; parameterName = new string[4]
Trang 9
276 Chương 6: Phần kế toán xuất - nhập - tồn
"aQuantity" };
parameterValue = new object [4];
11 Duyệt qua từng mẩu tin
foreach (DataGridViewRow row in dataGridView Rows) { object obj = row.Cells["UpdateQtty"].Value; if (obj t=null && ASFormatter.IsNumeric (obj) ) {
// Khai báo biến
string productId = Convert.ToString( row.Cells["ProductId"] Value) ; string stockId = Convert ToString(
row.Cells["StockId"].Value);
double qtty = Convert ToDouble(obj};
/{ Khai bdo va khdi tao déi tugng ASDataProvider ASDataProvider dataProvider = new ASDaraProvider () ; + Khai báo thuộc tính cho đối tượng ASDataProuider đataProvider.CommandText = "udsProductStatus;2"; dataProvider.CommandType = CommandType StoredProcedure; 1 { Khai bdo gid tri cho tham sé parameterValue[0] = rdoEndQttyToQttyInStock.Checked; parameterValue[1]= stockId; parameterValue[2]= productId; parameterValue[3]=qtty;
TỊ Khai báo gọt phương thúc ExecuteNonQuery đataProvi đer ExecuteNonQuery ( parameterName, parameterValue); } } } catch (Exception ex} ae ASUTHelper ShowMessageBox (
"btnCalculate_ Click", ex);
Chú ý: Bạn cần cẩn thận khi thực hiện chức năng này, do nó làm ảnh
Trang 10
Chương 6: Phần kế toán xuất - nhập - tồn
5 KẾT LUẬN
“Trong phần này, bạn tập trung tìm hiểu chức năng tổng hợp số lượng nhập và xuất rồi tính tôn kho cuối kỳ của từng thủ tục nội tại trong từng
kho
Ngoài ra, bạn cũng tìm hiểu chỉ tiết các cập nhật số lượng của sản phẩm từ con sổ trong sổ sách so với số lượng thực tế hay ngược lại
Chú ý: Đây là chức năng dùng để làm tham khảo, bạn có thể loại bỏ
hay thay đổi theo quy định nào đó nhằm bảo đảm thống nhất số lượng tồn của sản phẩm trên sổ sách so với số lượng tổn thực tế trong kho
Ban có thể tham khảo diễn giải chỉ tiết của các ghỉ chú được đánh dấu
theo thứ tự như sau:
{1): Xuất nhập tổn (nventory Controls) là chức năng quản lý số lượng nhập sản phẩm từ nhà cung cấp và xuất sản phẩm cho
khách hàng
(2): Trên sổ sách kế toán, số lượng được tính toán đựa trên dữ liệu
nhập và xuất cùng với số lượng cuối kỳ Tuy nhiên, trong thực tế
số lượng tổn thực tế tổn trong kho có thể khác với số lượng tồn
Trang 11Chương 7: Phần đóng sổ kế toán 279 Chương 7: PHAN DONG SO KE TOAN Tém chương 7:
Vào thời gian cuối tháng, nhân viên kế toán cần tính toán
và làm báo cáo cuối kỳ về tổn quỹ, công nợ thu của khách hàng và
chỉ cho nhà cung cấp, tình hình xuất nhập tồn,
Để kết thúc kỳ (tháng hiện hành) thì kế toán, nhân viên kế
toán phải chuyển các số đư cuối kỳ của tháng hiện hành thành số
dư đầu kỳ của tháng kế tiếp
Chúng ta đã tìm hiểu chỉ tiết 3 chức năng tương ứng với 3
phần của ứng dụng đã trình bày trong những phần trước, để cho
phép người sử dụng thực hiện chức năng chuyển số dư cuối kỳ của tháng hiện thành số dư đầu kỳ của tháng kế tiếp, bạn cung cấp
giao điện và khai báo cùng với thủ tục nội tại tương ứng
Các vấn dé chính sẽ được đề cập:
v Chuyển số dư cuối kỳ thành số dư đầu kỳ Thay đổi giá trị dùng chung
*ˆ Cấu hình ứng dụng
1 CHUYỂN SỐ DƯ CUỐI KỲ THÀNH SỐ DƯ
ĐẦU KỲ
Trước khi cho phép người sử dụng thực thi chức năng chuyển số dư
cuối kỳ thành số dư đầu kỳ sang tháng kế tiếp, bạn cần trình bày tình hình tôn quỹ, xuất nhập tổn và công nợ đã tính trong các chức năng trước
Chú $: Để tìm hiểu chức năng này, bạn bắt đầu từ trình đơn Close Month
Trang 12
280 Chương 7: Phần đóng sổ kế tốn
Ngồi ra, thủ tục nội tại sử dụng để tổng hợp dữ liệu cuối kỳ trong
chức năng đều đã trình bày trong phần trước 1.1 Giao diện
Để cho phép người sử dụng thực hiện chức năng này, trước tiên bạn thiết kế form có tên frmCloseMonth với giao diện như hình 7-1
Kế đến, bạn khai báo phương thức FiICBToGridView để gọi thủ tục nội tại có tên udsCashBalance đã trình bày trong phần kế toán thu và chỉ
Hình 7-1: Giao diện frmCloseMonth 1.2 Khai báo liệt kê dữ liệu
Bạn cần khai báo hai phương thức ApplyStyleForCB và
ResizeGridViewForCB để định dạng dữ liệu và điều chỉnh kích thước các
cột dữ liệu
Chẳng hạn, nếu chọn vào tùy chọn Cash Balance rồi nhấn nút
Refresh thì kết quả trình bày như hình 7-2
Tương tự như trên, bạn khai báo phương thức FillARToGridView để
gọi thủ tục nội tại có tên udsAecountReceivable;4 đã trình bày trong phần
kế tốn cơng nợ phải thu
Bạn cần khai báo hai phương thức ApplyStyleForAR và
ResizeGridViewForAR để định dạng dữ liệu và điều chỉnh kích thước các
cột dữ liệu
Như đã giới thiệu trong phần kế tốn cơng nợ phải thu, bạn cần khai
báo phương thức AddSumAmountForAR để tính công nợ phải thu của tất cả
Trang 13Chương 7: Phần đóng sổ kế toán TH Ý Paotuana | œ/0aaur LÍ PAD0000104 | 07/02/2007 | Ì?apœonœ '0/na/amr |“ ®amomG |0a/2mz | Panaaont; | 06/0a/2m07 PAD0fA0108 0902/2007 ~ Paoooomt08 | osroe/2007 ˆ_ 'PAp®0ni0 09/0a/207 n2 LỄ Pepmemlitwoa.mr Trà pin mua ng Suan Vit a Tekan mus ig
[Teh tan rushing
[Tedtén muahing Ainomar VietNam | [TRhênmabin [hananmahing [Teter mu hig Titan mus hig Trà ăn mua hàng Tà tên ma hồng Train mua hàng ‘APTOOOOTOT ` 10/00/2007 | ThuIên bán hàg của khiến hàngM ¡ 888750000) 8283 5m 90857-50000) 73687 500.00, | 71.857 mm, 62.057 500.00 (68.257 500.00 885780000 65387 500.00) ‘6 05750000) 8837200 Hình 7-3: Tình hình tồn quỹ
Ví dụ, bạn chọn vào tùy chọn Account Receivable thì tình hình công nợ phải thu của khách hàng trình bày như hình 7-3
Bacco System Mananeest Conse [Gos er
Cray Trdch Nig HO Hon 8 Vi (Công Trách Nise Hu Han Kodak | Céngiy Tdch Nin Duan ES "Công Cổ phn Suzan Vietnam
TieđenUCAUSA — | Genaiy 8a aute ga UFCA [Clog chin Reoutinn
| Trang tm gio du Vein
Trang 14
282 Chương 7: Phần đóng sổ kế toán
Đối với trường hợp tình hình công nợ phải trả cho nhà cung cấp, bạn
khai báo phương thức FiIAPToGridView để gọi thủ tục nội tại có tên udsAccountPayable;4
Ngoài ra, bạn cũng khai báo hai phương thức ApplyStyleForAP và
ResizeGridViewForAP để định dạng dữ liệu và điều chỉnh kích thước các
cột dữ liệu
Tương tự như trong phần kế tốn cơng nợ phải trả, bạn cần khai báo
phương thức AddSumAmountForAP để tính công nợ trả cho nhà cung cấp
trên form thay vì trong thủ tục nội tại
Chẳng hạn, bạn chọn vào tùy chọn Account Payable thi tinh hinh công nợ phải trả cho nhà cung cấp trình bày như hình 7-4 ies I 8745000 912250 CăglyCổ gảnYendaVệtNen | 12677500 17177800 Côngty Trách Nhận HẦu Hạn Macr 346700 68000 ng Tieh Nhén MôMaaVeh 2 TedAveut | 2000000
Hình 7-4: Tình hình công nợ phải trả cho nhà cung cấp
Bằng cách tương tự như trên, bạn khai báo phương thức PIICToGridView để gọi thủ tục nội tại có tên udsInventoryControl;4 để trình bày tình hình xuất nhập và tồn kho
Chú ý: Bạn cũng khai báo hai phương thức ApplyStyleForIC và
ResizeGridViewForIC để định dạng dữ liệu và điều chỉnh kích thước các cột
Trang 15Chương 7: Phần đóng sổ kế toán
Ví dụ, bạn chọn vào tùy chọn Inventory Controls thì tình hình xuất
nhập và tôn kho trình bày như hình 7-5
VỂ Account System 4anagemsentt Console - [Close Mohth] tú ho Tổ xách đìng cho học sh ngm “Teixéch ding cho hoe sinh nam “Ti do mua Tứ xách đồng cho Máy tinh Tú xách đìng choMáytih
Tú xách dùng cho điện hoạ đ động Tí xách dùng cho điện thoa đ động Í Tá xách dừng cho PC
ÍTú sách đờng choPC,
Rosy Logged ot (nto lets eth coped 9.2235 44)
Hình 7-5: Tinh hinh xuất nhập tơn
Để hồn thiện chức năng vừa trình bày ở trên, bạn khai báo phương thức Preview để gọi phương thức FillCBToGridView, FIIARToGridView,
Trang 16Chương 7: Phần đóng số kế toán break; : case “InventoryControl": FillicToGridview(); break;
Sau đó, gọi phương thức Preview trong biến cố Click của nút
btnRefresh hay biến cố CheckedChanged của các diéu khién RadioButton
1.3 Tính số dư cuối kỳ
Nếu người sử dụng có nhu cầu tính lại số dư tồn quỹ, công nợ phải thu, công nợ phải trả và tôn kho cuối kỳ, bạn khai báo phương thức Caleulate
như ví dụ 7-2 rồi gọi trong biến cố Click của nút btnCalculate
Ví dụ 7 Phương thức Calculate|
void Calculate()
{
+1 Khai báo uà khỏi tao déi tuang Common
ASCommon asCommon = new A3Common () ; 1] Khai báo tính tháng trước đó string previousMonth = asCommon Get PreviousMonth ( ASParameters.currentMonth) ; String startDate = "01/"+ ASParameters.currentMonth; +] Khai báo tính số ngày trong tháng
int days = DateTime DaysInMonth ( DateTime Parse (startDate) Year, DateTime Parse (startDate) Month) ; string endDate = đays.ToString(} + "/
+ ASParameters.currentMonth;
/1 Khai báo mảng tham số 0à giá trị của tham số
Trang 17Chương 7: Phần đóng số kế toán 285 case "CashBalance": dataProvider.CommandText = "udsCashBalance;2"; parameterName = new string(4) { "@CurrentMonth", "@PreviousMonth", “@StartDate", "@EndDate" }; parameterValue = new object [4] { ASParameters.currentMonth, previousMonth, startDate, endDate }; break; ff Tinh hinh céng ng phdi thu cia khach hang case "AccountReceivable”: dataProvider.CommandText = "udsAccountReceivable; 2"; parameterName = new string[3] { "@PreviousMonth", "@StartDate", "@EndDate” };
parameterValue = new object (3) {
previousMonth, startDate, endDate }; break;
#1 Tình hình công nợ phải trả cho nhà cung cấp
case “Account Payable":
dataProvider CommandText =
“udsAccount Payable;2";
parameterName = new string[3] {
"@PreviousMonth", "@StartDate", "@EndDate" };
parameterValue = new object [3] {
previousMonth, startDate, endDate }; break; /{ Tinh hinh xudt nhap tén case "InventoryControls": dataProvider.CommandText = “udsInventoryControl;2";
parameterName = new string(3) {
"@PreviousMonth", "@StartDate”, "@EndDate" };
parameterValue = new object [3] {
previousMonth, startDate, endDate };
break;
}
dataProvider.CommandType =
Trang 18286 Chuong 7: Phan déng sé ké todn catch (Exception ex) { ASUIHelper ShowMessageBox( "Calculate", ex); } J
Chú ý: Phương thức trên gọi thủ tục nội tại tương ứng với chức năng
đã trình bày trong các phần trước để tổng hợp đữ liệu và tính số dư cuối kỳ
1.4 Đóng sổ
Khi thực hiện chức năng đóng sổ kế toán, số dư cuối kỳ của tháng hiện hành sẽ chuyển sang số dư đầu kỳ của tháng kế tiếp
Đối với trường hợp tồn quỹ, bạn lưu trong bang CloseMonthCashBalances
và CloseMonthCashBalanceDetails; công nợ phải thu của khách hàng thì
lưu vào bảng CloseAccountReceivable va CloseAccountReceivableDetails; công nợ phải trả cho nhà cung cấp thì lưu vào bảng CloseAccountPayable và
CloseAccountPayableDetails, xuất nhập tổn thì lưu trong bảng
CloseInventoryControl va CloseInventoryControlDetails
Để làm điều này, trước tiên bạn khai báo phương thức có tên
CloseMonth với cấu trúc như ví dụ 7-3 du hươi seMonth g thức string CloseMonth(}) { string closeMonth = "";
TỊ Khai báo uà khởi tạo đổi tượng ASConumon ASCommon asCommon = new ASCommon () ;
TJ Khai bảo tháng trước đó string previousMonth = asCommon Get PreviousMonth ( ASParameters.currentMonth) ; string startDate = "01/°+ ASParameters.currentMonth; £] Khai báo số ngày trong tháng
inE đays = DateTime DaysTnMonEh (
DateTime Parse (startDate) Year,
DateTime Parse(startDate) Month);
string endDate = days.ToString() +"/"+ ASParameters.currentMonth;
11 Khai báo mắng tham số uữ giá trị
Trang 19Chương 7: Phần đóng số kế toán 287 object [] parameterValue = null; try ` { +1 Khai báo uà khởi tạo đối tượng ASDataProuider ˆ ASDataProvider dataProvider = new ASDataProviđer () ; 11 Khai bdo thuée tính cho đối tượng ASDataProuider dataProvider.CommandText = "udsCloseMonth"; parameterName = new string[4] { “@CurrentMonth", "@PreviousMonth", “@StartDate", "@EndDate" }; parameterValue = new object [4] { ASParameters.currentMonth, previousMonth, startDate, endDate }; dataProvider.CommandType = CommandType StoredProcedure; /} Khai báo gọi phương thúc ExecuteNonQuery dataProvider ExecuteNonQuery ( parameterName, parameterValue) ; if (dataProvider.ErrorMessage != "") { closeMonth = dataProvider.ErrorMessage; } } catch (Exception ex) { ASUTHelper ShowMessageBox ( "Close Month", ex); } return closeMonth; } Trong đó, thủ tục nội tại có tên udsCloseMonth khai báo với cấu trúc như ví dụ 7-4 Thủ tục nội tại ud
CREATE PROC udsCloseMonth
/J Khai báo tham số
9CurrentMonEh CHAR (8),
@PreviousMonth CHAR(8) , @DeleteData BIT
AS
£1 Thực thủ thủ tục nội tại udsCloseMonthForGL exec udsCloseMonthForGL @CurrentMonth,
@PreviousMonth, @DeleteData
Trang 20288 Chuong 7: Phan đóng số kế toán exec udsCloseMonthForAR @CurrentMonCch, @PreviousMonth, @DeleteData
£† Thực thi thi tục nội tai udsCloseMonthForAP exec udsCloseMonthForAP @CurrentMonth,
@PreviousMonth, @DeleteData
// Thue thi thủ tục nột tai udsCloseMonthForIC exec udsCloseMonthForIc @CurrentMonth,
@PreviousMonth, @DeleteData
GO
Trong đó, thủ tục nội tại dùng để chuyển số dư tổn quỹ cuối kỳ là
udsCloseMonthForGL, có cấu trúc như ví dụ 7-5
CREATE PROC udsCloseMonthForGL
17 Khai báo tham số
@CurrentMonth CHAR (8),
@PreviousMonth CHAR (8),
@DeleteData BIT
AS
//Xéa méu tin dang ton tại
DELETE FROM CloseMonthCashBalances
WHERE CloseMonth = @CurrentMonth;
DELETE FROM CloseMonthCashBalanceDetails WHERE CloseMonth = @CurrentMonth;
1/Tén quy déu ky
DECLARE @BeginAmount DECIMAL
SELECT @BeginAmount = EndingAmount
FROM CloseMonthCashBalances
WHERE CloseMonth = @PreviousMonth;
//Thém mau tin vao béng CloseMonthCashBalances INSERT INTO CloseMonthCashBalances
{CloseMonth, BeginingAmount , ReceiptAmount,
PaymentAmount, EndingAmount)
SELECT TOP 1 @CurrentMonth, @BeginAmount,
ReceiptAmount, PaymentAmount, BalanceAmount
FROM MonthlyCashBalances
ORDER BY BalancelId DESC;
/{Thém mGu tin véo béng CloseMonthCash BalanceDetails INSERT INTO CloseMonthCashBalanceDetails
(Balanceld, CloseMonth, Issueld,
IssueDate, PartnerId, ReceiptAmount, PaymentAmount, BalanceAmount,
ĐescriptionTnVietnamese}
Trang 21Chương 7: Phần đóng số kế toán 289 TssuelId, IssueDate, PartnerId, ReceiptAmount, PaymentAmount, BalanceAmount, DescriptionInVietnamese FROM MonthlyCashBalances 11Xóa mẫu tin đang tôn tại IF @DeleteData=1 BEGIN
DELETE FROM Receipts;
DELETE FROM ReceiptBatchs;
DELETE FROM Payments;
DELETE FROM Payment Batchs; END
Go
Ngoài ra, bạn khai báo thủ tục nội tại có tên udsCloseMonthForAR,
dùng để chuyển số dư công nợ cuối kỳ phải thu của khách hàng với cấu trúc
như ví dụ 7-6
CREATE PROC udsCloseMonthForAR
11 Khai bdo tham số
@CurrentMonth CHAR (8), @PreviousMonth CHAR (8),
@DeleteData BIT AS
/1/X6éa mau tin đang tôn tại
DELETE FROM CloseMonthAccountReceivable WHERE CloseMonth = @CurrentMonth;
DELETE FROM CloseMonthAccountReceivableDetails
WHERE CloseMonth = @CurrentMonth;
/{Thém mau tin vao bang CloseMonthAccountReceivable
INSERT INTO CloseMonthAccount Receivable (CloseMonth,
BeginAmount, SalesAmount, ReceivedAmount, EndAmount )
SELECT @CurrentMonth, SUM(BeginAmount),
SUM(SalesAmount),
SUM(ReceivedAmount) , SUM(EndAmount ) FROM MonthlyAccountReceivable
/{Thém mau tin vao bang CloseMonthAccountReceivableDetails INSERT INTO CloseMonthAccountReceivableDetails
(CustomerTđ, CloseMonth, BeginAmount, SalesAmount,
ReceivedAmount ) EndAmount }
SELECT CustomerId, @CurrentMonth, BeginAmount, SalesAmount, ReceivedAmount , EndAmount
FROM MonthlyAccountReceivable {/Xéa mdu tin dang tén tai
Trang 22
290 Chương 7: Phần đóng sổ kế toán
BEGIN
DELETE FROM Receipts;
DELETE FROM SalesInvoiceBatchs;
DELETE FROM Salesinvoices;
DELETE FROM SalesinvoiceDetails;
END GO
Tương tự như vậy, bạn khai báo thủ tục nội tại có tên
udsCloseMonthForAP dùng để chuyển số dư công nợ cuối kỳ phải trả cho
nhà cung cấp với cấu trúc như ví dụ 7-7 Ví dụ
CREATE PROC udsCloseMonthForAP
J1 Khai báo tham số
@CurrentMonth CHAR (8),
@PreviousMonth CHAR(8) ,
@DeleteData BIT
AS
/ {Xba mau tin dang tén tai
DELETE FROM CloseMonthAccount Payable
WHERE CloseMonth = @CurrentMonth;
DELETE FROM CloseMonthAccount PayakleDetails
WHERE CloseMonth = @CurrentMonth;
t1 Thêm nấu tin vao bdng CloseMonthAccountPayable
INSERT INTO CloseMonthAccount Payable (CloseMonth, BeginAmount, PurchaseAmount, PaidAmount, EndAmount)
SELECT @CurrentMonth, SUM(BeginAmount), SUM(PurchaseAmount),
SUM(PaidAmount), SUM(EndAmount ) FROM MonthlyAccount Payable
//Thém mu tin vao bang CloseMonthAccountPayableDetails INSERT INTO CloseMonthAccount PayableDetails
(SupplierId, CloseMonth, BeginAmount, PurchaseAmount, PaidAmount , EndAmount }
SELECT Supplierld, @CurrentMonth, BeginAmount, PurchaseAmount, PaidAmount, EndAmount
FROM MonthlyAccount Payable
41 Xóa mầu tin đang tôn tại
TF @DeleteData = 1 BEGIN
DELETE FROM Payments;
DELETE FROM PurchaseInvoiceBatchs; DELETE FROM PurchaseTnvoices;
DELETE FROM PurchaseInvoiceDetails;
Trang 23
Chương 7: Phần đóng số kế toán 291
Sau cùng, bạn khai báo thủ tục nội tại có tên udsCloseMonthForIC
dùng để chuyển số dư cuối kỳ tổn kho với cấu trúc như ví dụ 7-8
CREATE PROC udsCloseMonthForic
4 Khai báo tham số
@CurrentMonth CHAR (8),
@PreviousMonth CHAR(8) , @DeleteData BIT
AS
(1! Xóa mẩu tin đang tôn tại
DELETE FROM CloseMonthTnvenEoryControl WHERE CloseMonth = @CurrentMonth;
DELETE FROM CloseMonthInventoryControlDetails
WHERE CloseMonth = @CurrentMonth;
1{Thém mau tin vao bang CloseMonthInventoryControl
INSERT INTO CloseMonthInventoryControl (CloseMonth)
VALUES (@CurrentMonth) ;
{1Thêm mấu tin vao bang CloseMonthInventoryControlDetails
INSERT INTO CloseMonthInventoryControlDetails
(Productid, StockId, CloseMonth, BeginQuantity, ImportQuantity, ExportQuantity, EndQuantity}
SELECT Productid, Stockid, @CurrentMonth, BeginQuantity, ImportQuantity, ExportQuantity, EndQuantity FROM MonthlyInventoryControl; /1Xéa mdu tin đang tôn tại IF @DeleteData = 1 BEGIN
DELETE FROM ImportBatchs; DELETE FROM Imports;
DELETE FROM ImportDetails; DELETE FROM Export Batchs; DELETE FROM Exports;
DELETE FROM ExportDetails; END
Go
Sau đó, khai bdo goi phuong thie CloseMonth trong bién cé Click cha
nut btnCloseMonth nhy vi du 7-9
private void btnCloseMonth_Click (object sender,
Trang 24° 292 Chương 7: Phan déng sé ké toan
if (MessageBox Show("You are closing month, once you
click OK, all data will be transferred to history
database.", ASParameters.welcomeMessage,
MessageBoxButtons OKCancel, MessageBoxIcon.Warning,
MessageBoxDefaultButton Button2) == DialogResult.OK)
{
(1 Khai báo gọi phương thức CloseMonth
string resulE z CloseMonEh(); if(result == "") MessageBox Show ( "Close Month has completed."); else MessageBox Show ( "Close Month has not completed \n" + result);
Chú ý: Trong mỗi thủ tục nội tại thành viên, bạn khai báo để xóa dữ
liệu của các bảng tương ứng từng trường hợp tham số @DeleteData có giá trị lal
Néu dang chay chuong trinh dé kiém tra, ban truyén gid tri cho tham số này là 0 Tuy nhiên, khi chạy chương trình vào mục đích ứng dụng, bạn truyển giá trị cho tham số này là 1, sau khi đóng sổ thành công, đữ liệu dùng để lưu trữ nghiệp vụ phát sinh hằng ngày sẽ bị xóa
Để lưu trữ dữ liệu này sang cơ sở dữ liệu khác dùng cho mục đích tham
khảo, bạn có thể tạo cơ sở đữ liệu có tên ABC chẳng hạn, rồi khai báo phát
biéu INSERT thay vi DELETE
Tuy nhiên, để bảo đảm dữ liệu không bị mất khi thực hiện chức năng
đóng số, bạn cần khai báo transaction trong các thủ tục thành viên
udsCloseMonthForGL, udsCloseMonthForAR, udsCloseMonthForAP va
udsCloseMonthForlIC
Chẳng hạn, bạn có thể cài đặt transaction trong thủ tục nội tại
udsCloseMonthEorIC như ví dụ 7-10
i dat transaction trong udsCloseMouthF CREATE PROC udsCloseMonthForIc
+Ị Khai báo tham số
@CurrentMonth CHAR (8) ,
Trang 25Chương 7: Phần đóng sổ kế toán 293 AS 7¡Bắt đầu transaction BEGIN TRAN 1C
tJ Xóa mẩu tin đang tôn tại
DELETE FROM CloseMonthInventoryControl
WHERE CloseMonth = @CurrentMonth;
DELETE FROM CloseMonthIinventoryControlDetails WHERE CloseMonth = @CurrentMonth;
//Thém mau tin vdo béng CloseMonthinventoryControl
INSERT INTO CloseMonthInventoryControl (CloseMonth}
VALUES (@CurrentMonth) ;
-11Thém mẩu tin vao bang CloseMonthInventoryControlDetails INSERT INTO CloseMonthInventoryControlDetails
(Productid, StockId, CloseMonth, BeginQuantity, ImportQuantity, ExportQuantity, EndQuantity)
SELECT Productid, StockId, @CurrentMonth, BeginQuantity, ImportQuantity, ExportQuantity, EndQuantity FROM MonthlyInventoryControl; //Xéa méu tin đang tôn tại IF 8DeleteData = 1 BEGIN
DELETE FROM ImportBatchs; DELETE FROM Imports;
DELETE FROM ImportDetails; DELETE FROM Export Batchs; DELETE FROM Exports;
DELETE FROM Export Details; END TF ERROR_ NUMBER () >0 //Hily transaction ROLLBACK TRAN IC / [Két thúc transaction COMMIT TRAN 1C GO
Ngoài ra, bạn cũng có thể cài đặt try catch cùng với transaction dé kiểm soát lỗi trong thủ tục nội tại thành viên Chẳng hạn, bạn khai báo
try catch trong thủ tục nội t:
tch va transaction;
CREATE PROC udsCloseMonthForIC // Khai bdo tham sé
Trang 26BR? 204 Chương 77: Phần đóng sổ kế toán @breviousMonth CHAR(8) , apeleteData BIT AS (GIN TRAN IC 7/Bát đầu khối TRY BESIN TRY
+JXóa mẩu tín đang tân tại
DELETE FROM CloseMonthInventoryControl
WHERE CloseMonth = @CurrentMonth;
DELETE FROM CloseMonthInventoryControlDetails WHEKE CloseMonth = @CurrentMonth;
//Théem mdu tin vao bang CloseMonthInventoryControl
INSERT INTO CloseMonthinventoryControl (CloseMonth)
VALUES (@CurrentMonth) ;
!ƒThêm mẫu tin uào bảng CloseMonthinuentoryControlDetails
INSERT INTO CloseMonthInventoryControlDetails
(ProductId, StockId, CloseMonth, BeginQuantity, ImportQuantity, ExportQuantity, EndQuantity)
SELECT ProductId, StockId, @CurrentMonth, BeginQuantity, ImportQuantity, ExportQuantity, EndQuantity FROM MonthiyInventoryControl; / {Xéa méu tin dang tén tại IF @DeleteData = 1 BEGIN
DELETE FROM Import Batchs; DELETE FROM Imports;
DELETE FROM TmportDetails; DELETE FROM Export Ratchs; DELETE FROM Exports;
Trang 27
Chương 7: Phần đóng sổ kế toán 295
2 THAY ĐỔI GIÁ TRỊ DÙNG CHUNG
Bạn có thể cho phép người sử dụng thay đổi giá trị cho các biến công
khai tĩnh được khai báo trong lớp ASParameters bằng cách lưu chúng trong bảng Parameters
Tương tự như các chức năng đã trình bày trong phần trước, để tìm
hiểu chức năng này, bạn có thể thiết kế form và khai báo thủ tục nội tại liên
quan
Chú ý: Để tìm hiểu chức năng này, bạn bắt đầu trình đơn Close
Month | Parameters để kích hoạt form có tên frmParameters, thủ tục lưu trong tập tin Paremeters.sql
2.1 Giao diện
Bạn có thể thiết kế frmParameters bao gồm các điều khiển với giao
diện tương tự như hình 7-6 Parameters 'WelcomeMessage CưnentMonth DateFormat DoubleNumberFormat ‘IntegerNumberFormat AutoCreateld }- $howToolTipOnDataAyd Ï” Hình 7-6: Giao diện frmParameters 2.2 Khai báo
Khi frmParameters nap lén man hình, bạn điển giá trị trong các biến công khai tĩnh trong lớp ASParameters vào điều khiển bằng cách khai báo
trong biến cố Load như ví dụ 7-12
Trang 28
BA? 296 Chương 7: Phần đóng sổ kế toán
object sender, EventArgs e) { txtCurrentMonth Text = ASParameters.currentMonth; txtWelcomeMessage.Text = ASParameters welcomeMessage; txtDateFormat Text = ASParameters.dateFormat; txtDoubleNumberFormat Text = ASParameters.doubleNumberFormat ; - txtIntegerNumberFormat Text = ASParameters integerNumberFormat; chkAutoCreateId.Checked = ASParameters.autoCreateld; chkShowToolTipOnDataGrid.Checked = ASParameters.showToolTipOnDataGrid;
Chẳng hạn, khi thực thi chương trình, nếu người sử dụng chọn vào
trình đơn Close Month | Parameters thì frmParameters trình bày như hình 7-7
Hình 7-7: Cập nhật giá trị cho biến công khai tĩnh
Khi người sử dụng thay đổi và cập nhật, bạn khai báo đoạn chương
Trang 29Chương 7: Phần đóng số kế toán 397
private void btnUpdate_Click( object sender, EventArgs e)
{
try {
#1 Khai báo mảng tham số
string[] parameterName = new string[ 71 { "@CurrentMonth", "@WelcomeMessage", AutoCreateId", "@ShowToolTipOnDataGrid", "@DateFormat", “@DoubleNumberFormat", "@IntegerNumberFormat" };
i} Khai báo mảng giỏ trị của tham số
object [] parameterValue = new object [7] { txtCurrentMonth.Text, txtWelcomeMessage.Text, chkAutoCreateld.Checked, chkShowToolTipOnDataGrid.Checked, txtDateFormat Text, txtDoubleNumberFormat.Text, txtIntegerNumberFormat.Text }; 1} Khai bdo vd khdi tao déi tuong ASDataProvider ASDataProvider asDataProvider = new ASDataProvider(); 17 Khai báo thuộc tính cho đối tượng ASDataProuider asDataProvider.CommandText = "udsParameters;2"; asDataProvider CommandType = CommandType StoredProcedure; £1 Khai báo gọi phương thúc ExecuteNonQuery asDataProvider ExecuteNonQuery ( parameterName, parameterValue) ; ?¡ Khai báo gọi phương thức PutParameters PutParameters (} ; Joven (Exception ex) ‘ ASUIHelper ShowMessageBox ( "btnUpdate_Click" , ex.Message}; ) }
Trong đó, phương thức PutParameters dùng để cập nhật giá trị vừa
thay đổi trên các điểu khiển vào biến công khai tĩnh trong lớp
Trang 30Chương 7: Phần đóng sổ kế toán Phương thức PutParamete void Put Parameters () { ASParameters.currentMonth = txtCurrentMonth, Text; ASParameters.welcomeMessage = txtWelcomeMessage.Text; ASParameters.dateFormat = txtDateFormat Text; ASParameters.doubleNumberFormat = txtDoubleNumberFormat Text; ASParameters integerNumberFormat = txtIntegerNumberFormat Text; ASParameters.autoCreateld = chkAutoCreateId Checked; ASParameters showToolTipOnDataGrid = chkShowToolTipOnDataGrid.Checked;
Ngoài ra, để cập nhật giá trị thay déi vao bang Parameters, ban khai
báo thủ tục nội tại có tên udsParameters;2 như ví dụ 7-15
tai udsParameters
CREATE PROC udsParameters;2 !J Khai báo tham số @CurrentMonth char(8}, @WelcomeMessage nvarchar (50), 6AutoCreate1d bit, @ShowToolTipOnDataGrid bit, @DateFormat varchar (15), @DoubleNumberFormat varchar (15 @IntegerNumberFormat varchar (1 AS
/1 Méu tin dé tén tai thi thue thị phát biéu UPDATE
IF EXISTS (SELECT * FROM Parameters) UPDATE Parameters SET CurrentMonth = @CurrentMonth, WelcomeMessage = @WelcomeMessage, AutoCreateld = @AutoCreateld, ShowToolTipOnDataGrid = @ShowToolTipOnDataGrid, DateFormat = @DateFormat, DoubleNumberFormat = @DoubleNumberFormat, IntegerNumberFormat = @IntegerNumberFormat ELSE }„ 5)
f1 Thêm mới mẩu tin
INSERT INTO Parameters (CurrentMonth,
Trang 31Chương 7: Phần đóng số kế toán 299 ShowTool'iponDataörid, DatreFormat, DoubleNumberFormaE, TnregerNumberFormat) VALUES (@CurrentMonth, @WelcomeMessage, @AutoCreateld, @ShowToolTipOnDataGrid, @DateFormat, @DoubleNumberFormat, @IntegerNumber Format)
Luu %: Dé doc gid tri ty bang Parameters va điển vào biến công khai
tĩnh trong lớp ASParameters, bạn khai báo phương thức GetParameters
với cấu trúc như ví dụ 7-16
í dụ Phương (hức Get
internal static void Get Parameters ()
{
11 Khai báo uà khởi tạo đối tuong ASDataProvider
ASDataProvider asDataProvider = new ASDataProvider(); 11 Khai báo thuộc tính cho đối tượng ASDataProuider asDataProvider.CommandText = "udsParameters"; asDataProvider CommandType = CommandType StoredProcedure;
11 Khai bảo gọi phương thúc GetDotafiou
DataRow dataRow = asDataProvider.GetDataRow(); if (dataRow != null} { 11 Khai bảo gắn giá trị uào biến công khai tĩnh ASParameters.currentMonth = Convert ToString (dataRow(["CurrentMonth"]); ASParameters.welcomeMessage = Convert ToString(dataRow["WelcomeMessage"])}; ASParameters.dateFormat = Convert ToString(dataRow["DateFormat"]}; ASParameters.doubleNumberFormat = Convert.ToString (dataRow[ *“DoubleNumberFormat"]); ASParameters integerNumberFormat = Convert.ToString (dataRow[ "tntegerNumberFormat"]); ASParameters.autoCreateld = Convert ToBoolean (dataRow["AutoCreateId"]); ASParameters showPoolTipOnDataGrid = Convert ToBoolean (dataRow[ "ShowToolTipOnDataGrid"}); iF
Sau đó khai báo gọi phương thức GetParameters trong biến cố CHck
Trang 32Chương 7: Phản đóng sổ kế toán 3 CẤU HÌNH ỨNG DỤN!
Phần tham số cấu hình ứng đụng như tên máy, tên cơ sở dữ liệu, thời
gian kết nối, cổng kết nối cơ sở dữ liệu và vị trí tập tin Report được khai báo
trong tap tin App.config
Trong ứng dụng, chúng ta khai báo hai phương thức Overload có tên GetConnectionString trong lớp ASConfig dé doc giá trị từ tập tin
App.config
Ngoài ra, ban cũng khai báo phương thức GetReportPath để đọc giá trị ứng với đường dẫn tập tin Report (.rdÌc trình bày trong phần kế tiếp)
Bạn có thể thiết kế form và sử dụng đối tugng DOM (Document
Object Model) để cập nhật giá trị như cách làm viée véi tap tin Xml
Tuy nhiên, người sử dụng cũng có thể thay đổi các giá trị này bằng
cách sử dụng tiện ích Notepad thay vì sử dụng form trong ứng dụng
4 KẾT LUẬN
Thông qua phần này, bạn đã tìm hiểu cách đóng sổ để chuyển các số dư cuối kỳ của tháng hiện hành thành số dư đâu kỳ cho tháng kế tiếp
Bất kỳ ứng dựng nào cũng sử dụng các giá trị mặc định tương tự như
biến công khai tĩnh trong lớp ASParameters, bạn nên thiết kế form cho phép người sử dụng có thể thay đổi các giá trị này và lưu chúng trong cơ sở
Trang 33Chương 8: Phan bdo cdo (Report) 301 Chuong 8: PHAN BAO CAO (REPORT) Tóm tắt chương 8:
Báo cáo là thông tin đâu ra của ứng dụng, nó cho phép người
sử dụng kết xuất dữ liệu theo yêu câu quản lý Do cùng sử dụng
chung chức năng Print trong mỗi form của từng chức năng trong
ứng dụng, bạn có thể kích hoạt form có tên rmReports cùng với
việc truyền một số tham số như đã trình bày trong các phần trước Bằng cách sử dụng trình điểu khiển ReportViewer va
Microsoft Report thay vì Crystal Report, bạn có thể trình bày báo
cáo với nhiều dạng khác nhau Các vấn đề chính sẽ được đề cập: Thiết kế Report w Giao diện v Khai báo 1 THIẾT KẾ REPORT
Mỗi bảng dữ liệu đều cho phép người sử dụng in báo theo ba loại, loại
thứ nhất là mỗi trang ứng với một mẩu tin (Single Form), loại thứ hai là mỗi trang trình bày nhiễu mẩu tin (Sheet), loại thứ ba là báo cáo bao gồm
loại một và hai (Master/Details)
Chẳng hạn, khi bạn im báo cáo cho trường hợp hóa đơn bán hàng, mua hàng, nhập kho và xuất kho thì báo cáo dạng Single form sẽ bao gồm danh sách mẩu tin có quan hệ N
Ví dụ, khi người sử dụng in báo cáo hóa đơn bán hàng, đanh sách hóa
Trang 34302 Chương 8: Phan bdo cdo (Report)
Với ba loại như trên, chúng ta sẽ thiết kế Report đại diện cho mỗi loại,
các Report còn lại bạn có thể tham khảo chúng trong ứng dụng đính kèm
Chu §: Do hau hết dữ liệu đều được xuất ra bằng việc thực thi thủ tục
nội tại, khi thiết kế Report chúng ta cũng dựa trên các cột đữ liệu mà thủ tục
nội tại kết xuất
1.1 Tạo kết nối cơ sở dữ liệu
Dé tao Report, ban chon trinh don Project | Add New Item | Report
rồi đặt tên như hình 8-1 Templates: Visual Studio installed templates : Class 244 Interface
[2] Windows Form #5082 Procedure Class For Version 8
{9 User Control ACustom Control
‘@iinherited User Control BA Web Custom Control
| J SQL Database (šj)DataSet RJ XML Schema „2l! XSLT Fie Aj Style Sheet 3) Text File
B cursor File Aga
gi Icon File i] Windows Service
8) JScript File SB] VBScript File
«Assembly Information File |) Application Configuration File
1} Settings File [SIMO Parent
“GB Debugger Visualizer 2 Class Diagram i
[fan empty Report file For creating a report using Microsoft reporting technology [Report dle ee a eee | Hinh 8-1: Tao Report Sau khi đặt tên Report, nhấn nút Add thì Report được thêm vào dự án,
cửa sổ tạo Data Sources xuất hiện như hình 8-2
Bằng cách chọn vào lién két Add New Data Source, bạn có thể tìm
Trang 35® Chương 8: Phần báo cáo (Report) 303 [Ml Data Sources ‹ Add New Data Source 3 Choose a Data Source Type ‘Where will the application get data from? = Web Service Object ee dataset,
Hinh 8-3: Logi kết nối cơ sở dữ liệu
Chú ý: Bạn có thể chọn loại kết nối cơ sở dữ liệu là Database hay
Web Service Tuy nhiên, trong trường hợp này chúng ta chỉ sử dụng loại kết
nối cơ sở dữ liệu là Database
Sau khi nhấn nút Next, nếu trước đó đã tạo chuỗi kết nối cơ sở dữ liệu và lưu trong tập tin App.confñig thì chuỗi kết nối đó sẽ hiện ra như hình 8-4
Trong trường hợp bạn muốn tạo mới chuỗi kết nối thì chọn vào nút
New Connection, khi đó cửa sổ khai báo các thuộc tính kết nối cơ sở dữ liệu
Trang 36PA? 304 Chương 8: Phần báo cáo (Report)
Hình 8-4: Sử dụng chuỗi kết nối cơ sở dữ liệu đã có
Trang 37
Chương 8: Phần báo cáo (Report) 305
Chú ý: Để kết nối cơ sở dữ liệu SQL Server 2005, bạn có thể sử dụng
một trong hai đặc quyền ứng với hai tùy chọn Use Windows Authentication hay SQL Server Authentication
Chọn Next, bạn có thể tìm thấy danh sách một số loại đối tượng cơ sở
dữ liệu?) Tables, View, Stored Procedures hay Functions xuất hiện như hình 8-6 (Ậ , =eseeensseenee a “itch databace bjt do you want your cate? ae) 7 Oy Views © Oy Stored mocedres © Pe rretons
Hình 8-6: Chọn loại đối tượng cơ sở đữ liệu
Bằng cách chọn 3 loại đối tượng cơ sở dữ liệu và đặt tên Data Source
Trang 38BX” 306 Chương 8: Phần báo cáo (Report)
ĐM 306 Chương 8: Phần báo cáo (Report)
Ngoài ra, bạn có thể tìm danh sách đối tượng cơ sở dữ liệu xuất hiện
trong cửa sổ Data a Sources n nhu “hình 8-8 th HEE eee ee eel ‘ Ễ CloseMorthAccountPayableDetals hAccountReceivable | FADES OOOO Ow | 4 & LE Cosehorthcataorcebetats tPA Clann ManthCach® alanene Hinh 8-8: Danh sdch déi tượng cơ sở dữ liệu 1.9 Thiết kế Report Để thiết kế Report, bạn sử dụng các điểu khiển trên cửa sổ ToolBox như hình 8-9 Toolbow
Hinh 8-9: Cia sé ToolBox
Để trình bày dữ liệu trên Report, bạn có thể chọn các cột từ cửa sổ Data
Trang 39Chương 8: Phần báo cáo (Report) 307
1.2.1 Report dang Single Form-
Chẳng hạn, bạn thiết kế Report có tên Customer theo loai Single Form,
bằng cách chọn các cột dữ liệu từ bảng có tên Customers như hình 8-10 Geter } 2) Currencies err ‘CustomerId CompanyNameinvietnamese ‘CompanyNamelnSecondlanguage ContactName ContactTitle Address
Hinh 8-10: Cét di liéu trong thủ tục nội tại udsCustomers
Chọn từng cột rồi kéo và thả vào vùng Report với giao diện như hình 8-11
Customer
Customer Id =First(Fields!Customerld Value)
Customer Name =First(FieldsICompanyNameinVietnamese Value)
Contact Name =First(Fieids!ContactName Value)
Contact Title =First(Fields!ContactTitle Value) Address =First(Fields!Address Value) Tel =First(Fields!Telephone Value)
Fax =First(Fields!F axNumber Value) Email Address =First(Fields!EmailAddress Value)
Max Debit Amt =Sum(FieldsIMaxDebitAmount Value)
Hình 8-11: Thiết kế Report trình bày mẩu tin của từng khách hàng Chú ý: Bạn có thể kiểm tra danh sách, thêm hay loại bỏ đối tượng cơ
sở dữ liệu trong Report bằng cách chọn vào trình đơn Report | Data
Trang 40308 Chương 8: Phan bdo cdo (Report) 2Ø Report Data Sources
Choose data sources to use in the report,
Broject data sources: ˆ i
fAccountSystemDataSet_AccountNumbers >] _
Report deta sources: zi
AccountSystemDataSet_Customers
Hình 8-12: Đối tượng cơ sở đữ liệu trong Report
Khi thực thi chương trình, nếu người sử dụng đang xem thông tin chỉ
tiết của khách hàng và nhấn nút Print thì kết quả trình bày như hình 8-13
5H + Customer Customer Id
Cuetomer Name _ Công ty Trách Nhiệm Hữu Han IBN Vietnam
Contact Name Mr Hall Contact Title Director