



















Preview text:
TRƯỜNG CAO ĐẲNG NGHỀ BÁCH KHOA HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN -------------------
THỰC TẬP TỐT NGHIỆP Đề tài:
Phần mềm quản lí siêu thị
Chức năng quản lí hàng hóa Lớp: LTMT2 Khóa: 13 GVHD:
HÀ NỘI, THÁNG......NĂM 20.....
HÀ NỘI, THÁNG......NĂM 20..... LỜI NÓI ĐẦU
Trong nền kinh tế thị trường hiện nay, việc quản lý hàng hóa và công
nợ là một vấn đề quan trọng đối với các doanh nghiệp. Một hệ thống quản
lý hàng hóa và công nợ hiệu quả sẽ giúp doanh nghiệp kiểm soát tốt hàng
hóa, công nợ, từ đó nâng cao hiệu quả kinh doanh. Bài tập báo cáo này
được thực hiện với mục tiêu thiết kế và xây dựng một hệ thống quản lý
hàng hóa và công nợ cho Công ty thương mại ABC. Hệ thống được thiết kế
trên nền tảng Windows Form và sử dụng ngôn ngữ lập trình C#. Để thực
hiện bài tập này, nhóm đã tiến hành khảo sát bài toán, thu thập các chứng
từ đầu vào, thu thập các báo biểu đầu ra, tìm hiểu môi trường, cài đặt và
giao diện. Trên cơ sở đó, nhóm đã mô tả các yêu cầu chức năng, yêu cầu
bảo mật và yêu cầu khác của hệ thống.
Dưới sự giúp đỡ tận tình của giảng viên hướng dẫn, chúng em đã hoàn
thành báo cáo đúng hạn. Do năng lực còn hạn chế nên bài báo cáo còn
nhiều thiếu sót, mong nhận được ý kiến đóng góp của thầy để bài báo cáo hoàn thiện hơn nữa Nguyễn Duy Đức
CHƯƠNG 1: KHẢO SÁT BÀI TOÁN
1. Tìm hiểu bài toán
- Nghiệp vụ: Quản lí nhập và bán hàng cho công ty thương mại ABC.
Đa dạng hóa sản phẩm với giá cả khác nhau. Xác định giá chuẩn nhưng có
thể có chênh lệch trong quá trình bán hàng
- Yêu cầu người dùng: Quản lí nhập và bán hàng cho công ty thương
mại ABC. Đa dạng hóa sản phẩm với giá cả khác nhau. Quản lí thông tin
khách hàng, thông tin mua bán hàng
2. Thu thập các chứng từ đầu vào:
- Xác định thông tin cần thiết từ hóa đơn nhập/xuất kho để cập nhật số
lượng sản phẩm trong kho. Hóa đơn bán hàng: Thu thập thông tin về các
giao dịch bán hàng để cập nhật công nợ từ khách hàng.
3. Thu thập các báo biểu đầu ra:
- Bảng tồn kho: Hiển thị số lượng tồn kho của từng sản phẩm.
- Bảng công nợ khách hàng: Thể hiện các công nợ đang có và đã
thanh toán từ phía khách hàng và đối tác.
- Bảng hóa đơn: In hiển thị hóa đơn và chi tiết hóa đơn của khách hàng.
4. Tìm hiểu môi trường, cài đặt, giao diện:
- Môi trường: Đảm bảo tích hợp với các yêu cầu kỹ thuật.
- Cài đặt: Kết nối với cơ sở dữ liệu SQL Server để lưu trữ thông tin.
- Giao diện: Window Form sử dụng C# để tạo giao diện người dùng dễ
sử dụng. Hiển thị thông tin một cách rõ ràng và có thể tùy chỉnh. 5. Mô tả yêu cầu:
- Quản lý Hóa đơn Nhập và Bán: Thêm, sửa, xóa thông tin chi tiết của hóa đơn
nhập và hóa đơn bán. In chi tiết hóa đơn .
- Quản lý Phiếu Thu và Phiếu Chi: Ghi chú về các giao dịch thanh toán và nhận thanh toán.
- Báo cáo: Xuất báo cáo tồn kho, công nợ khách hàng, công nợ nhà cung cấp, doanh thu và lợi nhuận.
- Giao diện người dùng: Thiết kế cửa sổ dễ sử dụng với các chức năng tương
ứng. Hiển thị thông tin một cách trực quan và có khả năng tìm kiếm và lọc. *Nguyễn Thị Hoa
CHƯƠNG 2: PHÂN TÍCH HỆ THỐNG
1. Phân tích chức năng
-Sơ đồ phân cấp chức năng:
-Biểu đồ luồng dữ liệu: + Biểu đồ mưc *Đoàn Hoàng Quân
2. Thiết kế cơ sở dữ liệu
* Phân tích các bảng,trường các ràng buộc:
- Bảng ‘KhachHang’: + Trường :
maKH: Mã khách hàng (Primary Key). tenKH: Tên khách hàng.
diaChi: Địa chỉ khách hàng.
soDT: Số điện thoại khách hàng. + Ràng buộc :
maKH : là khóa chính, duy nhất định danh khách hàng - Bảng ‘HoaDon’: + Trường :
soHD: Số hóa đơn (Primary Key). ngay: Ngày tạo hóa đơn. maKH: Mã khách hàng.
soTienTT: Tổng số tiền thanh toán. loaiHD: Loại hóa đơn. + Ràng buộc :
soHD : là khóa chính, duy nhất định danh hóa đơn
maKH : là ngoại khóa liên kết với ‘maKH’ trong bảng KhachHang
- Bảng ‘ChiTietHoaDon: + Trường :
id: Mã chi tiết hóa đơn (Primary Key).
soHD: Số hóa đơn (Foreign Key liên kết với soHD trong HoaDon).
maHang: Địa chỉ khách hàng (Foreign Key liên kết với maHang trong MatHang)
soLuong: Số điện thoại khách hàng.
thanhTien: Số điện thoại khách hàng. + Ràng buộc :
id : là khóa chính, duy nhất định danh mối chi tiết hóa đơn
soHD : là khóa ngoại liên kết với ‘soHD’ trong ‘HoaDon’
maHang : là khóa ngoại liên kết với ‘maHang’ trong ‘MatHang’
- Bảng ‘MatHang’: + Trường :
maHang : Mã hàng (Primary Key). tenHang : Tên hàng. dvTinh : Đơn vị tính. donGia: Đơn giá. + Ràng buộc :
maHang: là khóa chính, duy nhất định danh mỗi hàng hóa.
- Bảng ‘PhieuThuChi’: + Trường :
soPhieu : Số phiếu (Primary Key).
maKH : Mã khách hàng (Foreign Key liên kết với maKH trong KhachHang)
soTien : Số tiền thu hoặc chi.
loaiPhieu: Loại phiếu thu hoặc chi. + Ràng buộc :
so phieu: là khóa chính, duy nhất định danh mỗi phiếu.
maKH: là khóa ngoại liên kết với ‘maKH’ trong ‘KhachHang’.
* Mô hình thực thể liên kết :
* Mô hình dữ liệu quan hệ:
- KhachHang( maKH,tenKH,diaChi,soDT) - HoaDon(soHD, ngay, maKH, soTienTT, loaiHD )
- ChiTietHoaDon(id ,soHD, maHang, soLuong, thanhTien)
- MatHang(maHang, tenHang, dvTinh, donGia)
- Kho(id, maHang, soLuong)
Vẽ cái này ra Đoàn Hoàng quân Nguyễn Duy Đức
CHƯƠNG 3: VIẾT CHƯƠNG TRÌNH 1.Các query sql chính Khách hàng :
- Lấy danh sách khách hàng :
“select * from KhachHang"; - Tạo mới khách hàng :
“insert into KhachHang values(MaKH,TenKH,DiaChi,SDT)"
- Cập nhật khách hàng :
"update KhachHang set tenKH = @tenKH ,diaChi = @diaChi ,soDT = @soDT where maKH =@maKH - Xóa khách hàng :
delete from KhachHang where maKH = @maKH Mặt hàng :
- Lấy danh sách các mặt hàng : "select
MatHang.maHang,MatHang.tenHang,MatHang.dvTinh,MatHang.donGia,Kho.soLuong
from MatHang inner join Kho on MatHang.maHang = Kho.maHang" - Tạo mới mặt hàng:
"insert into MatHang values(@MaHang,@TenHang,@DVTinh,@DonGia)"
" insert into KhoHang values(null,@MaHang,@SoLuong) "
- Cập nhật mặt hàng:
update MatHang set tenHang =@TenhHang,dvTinh = @DVTinh ,donGia =@DonGia where maHang =@MaHang - Xóa mặt hàng:
"delete from MatHang where maHang = @MaHang";
"delete from Kho where maHang = @MaHang” Phiếu thu chi :
- Lấy danh sách các phiếu thu chi :
"select * from PhieuThuChi "
- Tạo mới Phiếu thu chi:
"insert into PhieuThuChi(maKH,soTien,ngay,loaiPhieu)
values(@MaKH,@SoTien,@Ngay,@LoaiPhieu)"
- Cập nhật Phiếu thu chi:
“update PhieuThuChi set maKH =@MaKH + ,soTien = @SoTien,ngay
=@Ngay',loaiPhieu =@loaiPhieu where soPhieu = @SoPHieu” - Xóa Phiếu thu chi
"delete from PhieuThuChi where soPhieu = @SoPhieu"; Hóa đơn :
- Tìm kiếm 1 hóa đơn :
"select * from HoaDon where soHD = @SoHD "
- Tạo mới một hóa đơn:
insert into HoaDon values(@MaHD,@NgayBan,@MaKH,@SoTienTT,@LoaiHD )
- Cập nhật Hóa đơn:
update HoaDon set ngay = @NgayBan, soTienTT =@SoTienTT,loaiHD = @LoaiHD where soHD = @SoHD' - Xóa Hóa đơn
"delete from HoaDon where soHD = @SoHD";
Chi tiết hóa đơn :
- Tìm kiếm chi tiết mặt hàng của 1 hóa đơn : select
MatHang.maHang,MatHang.tenHang,MatHang.donGia,ChiTietHoaDon.soLuong,ChiTiet
HoaDon.thanhTien from ChiTietHoaDon inner join HoaDon on ChiTietHoaDon.soHD =
HoaDon.SoHD inner join MatHang on MatHang.maHang = ChiTietHoaDon.maHang where HoaDon.soHD = @SoHD
- Tạo mới một mặt hàng chi tiết hóa đơn:
insert into ChiTietHoaDon(soHD,maHang,soLuong,thanhTien)
values(@SoHD,@MaHang,@SoLuong,@ThanhTien)"
- Cập nhật mặt hàng chi tiết hóa đơn:
“delete from ChiTietHoaDon where soHD = @SoHD"
"insert into ChiTietHoaDon(soHD,maHang,soLuong,thanhTien)
values(@SoHD,@MaHang,@SoLuong,@ThanhTien)" - Xóa Hóa đơn
“delete from ChiTietHoaDon where soHD = @SoHD" In hóa đơn :
Lấy dữ liệu 1 hóa đơn để in :
SELECT KhachHang.tenKH, KhachHang.diaChi, KhachHang.soDT, HoaDon.soHD,
MatHang.tenHang, MatHang.dvTinh, ChiTietHoaDon.soLuong, MatHang.donGia,
ChiTietHoaDon.thanhTien, HoaDon.soTienTT FROM ChiTietHoaDon INNER JOIN
HoaDon ON ChiTietHoaDon.soHD = HoaDon.soHD INNER JOIN
KhachHang ON HoaDon.maKH = KhachHang.maKH INNER JOIN
MatHang ON ChiTietHoaDon.maHang = MatHang.maHang WHERE (HoaDon.soHD = @SoHD')" * * Phan Văn Tuâns 2.Các chương trình * Code form trang chủ : namespace QLBH_BC {
public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void bảngKháchHàngToolStripMenuItem_Click(object sender, EventArgs e) {
FormKhachHang f = new FormKhachHang(); f.Show(); }
private void bảngMặtHàngToolStripMenuItem_Click(object sender, EventArgs e) {
FormMatHang f = new FormMatHang(); f.Show(); }
private void bảngHóaĐơnToolStripMenuItem_Click(object sender, EventArgs e) {
Form2HoaDoncs f = new Form2HoaDoncs(); f.Show(); }
private void bảngPhiếuThuChiToolStripMenuItem_Click(object sender, EventArgs e) {
FormPhieuThuChi f = new FormPhieuThuChi(); f.Show(); } }} * Code form Khach hàng: namespace QLBH_BC {
public partial class FormKhachHang : Form { public FormKhachHang() { InitializeComponent(); }
private void textBox4_TextChanged(object sender, EventArgs e) { } KetNoi kn = new KetNoi();
private void FormKhachHang_Load(object sender, EventArgs e) {
String sql = "select * from KhachHang";
dataGridView1.DataSource = null;
dataGridView1.DataSource = kn.Load(sql); } private void clearInput() { ipDiaChi.Text = ""; ipMaKH.Text = ""; ipSoDT.Text = ""; ipTenKH.Text = ""; ipMaKH.Enabled = true; }
private void btnThem_Click(object sender, EventArgs e) { KhachHang kh = new
KhachHang(ipMaKH.Text,ipTenKH.Text,ipDiaChi.Text,ipSoDT.Text); kh.Insert(kh); clearInput();
FormKhachHang_Load(sender, e); }
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
ipMaKH.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
ipTenKH.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
ipDiaChi.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
ipSoDT.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString(); ipMaKH.Enabled = false; }
private void btnSua_Click(object sender, EventArgs e) { if(ipMaKH.Text.Length == 0) {
MessageBox.Show("Yêu cầu nhập đủ thông tin"); } else {
KhachHang kh = new KhachHang(ipMaKH.Text, ipTenKH.Text, ipDiaChi.Text, ipSoDT.Text); kh.Update(kh); clearInput();
FormKhachHang_Load(sender, e); } }
private void btnXoa_Click(object sender, EventArgs e) { if (ipMaKH.Text.Length == 0) {
MessageBox.Show("Yêu cầu nhập đủ thông tin"); } else {
KhachHang kh = new KhachHang(ipMaKH.Text, ipTenKH.Text, ipDiaChi.Text, ipSoDT.Text); kh.Delete(kh); clearInput();
FormKhachHang_Load(sender, e); } }
private void btnThoat_Click(object sender, EventArgs e) { this.Close(); } } } *Form mặt hàng: namespace QLBH_BC {
public partial class FormMatHang : Form { public FormMatHang() { InitializeComponent(); }
private void FormMatHang_Load(object sender, EventArgs e) { KetNoi kn = new KetNoi();
dataGridView1.DataSource = kn.Load(@"select
MatHang.maHang,MatHang.tenHang,MatHang.dvTinh,MatHang.donGia,Kho.soLuong
from MatHang inner join Kho on MatHang.maHang = Kho.maHang"); } private void clearInput() { ipMaHang.Text = ""; ipTenHang.Text = ""; ipDVTinh.Text = ""; ipDonGia.Text = ""; ipSoLuong.Text = ""; ipMaHang.Enabled = true; }
private void btnThem_Click(object sender, EventArgs e) {
MatHang mh = new MatHang(ipMaHang.Text, ipTenHang.Text, ipDVTinh.Text,
ipDonGia.Text, Convert.ToInt32(ipSoLuong.Text)); mh.Insert(mh); clearInput(); FormMatHang_Load(sender, e); }
private void ipDonGia_TextChanged(object sender, EventArgs e) { string input = ipDonGia.Text;
if (!double.TryParse(input, out double result) && input.Length > 0) {
MessageBox.Show("Giá phải là số"); ipDonGia.Clear(); } }
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
ipMaHang.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
ipTenHang.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
ipDVTinh.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
ipDonGia.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
ipSoLuong.Text = dataGridView1.CurrentRow.Cells[4].Value.ToString(); ipMaHang.Enabled = false; }
private void btnSua_Click(object sender, EventArgs e) {
if (ipMaHang.Text.Length == 0 || ipTenHang.Text.Length == 0 ||
ipDVTinh.Text.Length == 0 || ipDonGia.Text.Length == 0) {
MessageBox.Show("Yêu cầu nhập đầy đủ thông tin"); } else {
MatHang mh = new MatHang(ipMaHang.Text, ipTenHang.Text, ipDVTinh.Text,
ipDonGia.Text, Convert.ToInt32(ipSoLuong.Text)); mh.Update(mh); clearInput(); FormMatHang_Load(sender, e); } }
private void btnXoa_Click(object sender, EventArgs e) {
if (ipMaHang.Text.Length == 0 ) {
MessageBox.Show("Yêu cầu nhập mã hàng cần xóa"); } else {
MatHang mh = new MatHang(ipMaHang.Text, ipTenHang.Text, ipDVTinh.Text,
ipDonGia.Text,Convert.ToInt32(ipSoLuong.Text)); mh.Delete(mh); clearInput(); FormMatHang_Load(sender, e); } }
private void btnThoat_Click(object sender, EventArgs e) { this.Close(); } } } *Form phiếu thu chi namespace QLBH_BC {
public partial class FormMatHang : Form { public FormMatHang() { InitializeComponent(); }
private void FormMatHang_Load(object sender, EventArgs e) { KetNoi kn = new KetNoi();
dataGridView1.DataSource = kn.Load(@"select
MatHang.maHang,MatHang.tenHang,MatHang.dvTinh,MatHang.donGia,Kho.soLuong
from MatHang inner join Kho on MatHang.maHang = Kho.maHang"); } private void clearInput() { ipMaHang.Text = ""; ipTenHang.Text = ""; ipDVTinh.Text = ""; ipDonGia.Text = ""; ipSoLuong.Text = ""; ipMaHang.Enabled = true; }
private void btnThem_Click(object sender, EventArgs e) {
MatHang mh = new MatHang(ipMaHang.Text, ipTenHang.Text, ipDVTinh.Text,
ipDonGia.Text, Convert.ToInt32(ipSoLuong.Text)); mh.Insert(mh); clearInput(); FormMatHang_Load(sender, e); }
private void ipDonGia_TextChanged(object sender, EventArgs e) { string input = ipDonGia.Text;
if (!double.TryParse(input, out double result) && input.Length > 0) {
MessageBox.Show("Giá phải là số"); ipDonGia.Clear(); } }
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
ipMaHang.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
ipTenHang.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
ipDVTinh.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
ipDonGia.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
ipSoLuong.Text = dataGridView1.CurrentRow.Cells[4].Value.ToString(); ipMaHang.Enabled = false; }
private void btnSua_Click(object sender, EventArgs e) {
if (ipMaHang.Text.Length == 0 || ipTenHang.Text.Length == 0 ||
ipDVTinh.Text.Length == 0 || ipDonGia.Text.Length == 0) {
MessageBox.Show("Yêu cầu nhập đầy đủ thông tin"); } else {
MatHang mh = new MatHang(ipMaHang.Text, ipTenHang.Text, ipDVTinh.Text,
ipDonGia.Text, Convert.ToInt32(ipSoLuong.Text)); mh.Update(mh); clearInput(); FormMatHang_Load(sender, e); } }
private void btnXoa_Click(object sender, EventArgs e) {
if (ipMaHang.Text.Length == 0 ) {
MessageBox.Show("Yêu cầu nhập mã hàng cần xóa"); } else {
MatHang mh = new MatHang(ipMaHang.Text, ipTenHang.Text, ipDVTinh.Text,
ipDonGia.Text,Convert.ToInt32(ipSoLuong.Text)); mh.Delete(mh); clearInput(); FormMatHang_Load(sender, e); } }
private void btnThoat_Click(object sender, EventArgs e) { this.Close(); } } } * Hoàng Xuân Việt * Form hóa đơn namespace QLBH_BC {
public partial class Form2HoaDoncs : Form { public Form2HoaDoncs() { InitializeComponent(); }
private void Form2HoaDoncs_Load(object sender, EventArgs e) { cbbMaHD.Items.Clear(); cbbMaHang.Items.Clear(); cbbMaKH.Items.Clear(); btnInHD.Enabled = false; btnXoaHD.Enabled = false; btnSuaHD.Enabled = false; KetNoi kn = new KetNoi(); kn.con.Open();
SqlDataReader doc = kn.Select("select * from KhachHang"); while (doc.Read()) { cbbMaKH.Items.Add(doc[0]); } kn.con.Close(); kn.con.Open();
SqlDataReader docMH = kn.Select("Select * from MatHang"); while (docMH.Read()) {
cbbMaHang.Items.Add(docMH[0]); } kn.con.Close(); kn.con.Open();
SqlDataReader docMHD = kn.Select("Select * from HoaDon"); while (docMHD.Read()) { ; cbbMaHD.Items.Add(docMHD[0]); } kn.con.Close();
cbTaoPhieuThuChi.Checked = true;
cbbLoaiHoaDon.Items.Add("Xuat");
cbbLoaiHoaDon.Items.Add("Nhap"); } public void clearMatHang() { cbbMaHang.Text = ""; ipSoLuong.Text = ""; ipTenHang.Text = ""; ipDonGia.Text = ""; ipThanhTien.Text = ""; }
private void cbbMaKH_SelectedIndexChanged(object sender, EventArgs e) { KetNoi kn = new KetNoi(); kn.con.Open();
SqlDataReader doc = kn.Select("select tenKH from KhachHang where maKH='" +
cbbMaKH.Text.ToString() + "'"); while (doc.Read()) {
ipTenKH.Text = doc[0].ToString(); } kn.con.Close(); }
private void cbbMaHang_SelectedIndexChanged(object sender, EventArgs e) { KetNoi kn = new KetNoi(); kn.con.Open();
SqlDataReader doc = kn.Select("select * from MatHang where maHang='" +
cbbMaHang.Text.ToString() + "'"); while (doc.Read()) {
ipTenHang.Text = doc[1].ToString();
ipDonGia.Text = doc[3].ToString(); } kn.con.Close(); }
private void ipSoLuong_TextChanged(object sender, EventArgs e) {
if(ipDonGia.Text.Length > 0 && ipSoLuong.Text.Length > 0) {
ipThanhTien.Text = (Int64.Parse(ipDonGia.Text) *
Int64.Parse(ipSoLuong.Text)).ToString();
}else if(ipSoLuong.Text.Length == 0) { ipThanhTien.Text = ""; } }
private void btnThemMH_Click(object sender, EventArgs e) { string mh = cbbMaHang.Text; string sl = ipSoLuong.Text; KetNoi kn = new KetNoi(); kn.con.Open();
SqlDataReader doc = kn.Select("select soLuong from MatHang inner join Kho on
Kho.maHang = MatHang.maHang where MatHang.maHang = '" + mh +"'"); while (doc.Read()) {
if ((Convert.ToInt32(doc[0].ToString()) - Convert.ToInt32(sl)) < 0) {
MessageBox.Show("Số lượng yêu cầu không có sẵn"); return; } } kn.con.Close();
DataGridViewRow existingRow = dataGridView1.Rows .Cast()
.FirstOrDefault(row => row.Cells[0].Value != null &&
row.Cells[0].Value.ToString() == mh); ; if (existingRow != null) {
int slMoi = Convert.ToInt32(existingRow.Cells[2].Value) + Convert.ToInt32(sl);
int thanhTienMoi = Convert.ToInt32(ipDonGia.Text) * Convert.ToInt32(slMoi);
existingRow.Cells[2].Value = slMoi.ToString();
existingRow.Cells[4].Value = thanhTienMoi.ToString(); } else {
dataGridView1.Rows.Add(cbbMaHang.Text,ipTenHang.Text,ipSoLuong.Text,ipDonGia.Tex t,ipThanhTien.Text); } clearMatHang(); }