Proper schema is the backbone. Here’s a minimal but production-ready design:
Public Class frmProducts Private Sub frmProducts_Load(sender As Object, e As EventArgs) Handles MyBase.Load LoadProducts() End Sub Private Sub LoadProducts() Try Dim dt As DataTable = Product.GetAllProducts() dgvProducts.DataSource = dt dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill Catch ex As Exception MessageBox.Show("Error loading products: " & ex.Message) End Try End Sub
Try ' Create a StreamWriter to write text to the file Using writer As New StreamWriter(filePath, False) ' False to overwrite existing file writer.WriteLine("================================") writer.WriteLine(" OFFICIAL INVOICE ") writer.WriteLine("================================") writer.WriteLine("Date: " & invoiceDate) writer.WriteLine("Customer: " & customerName) writer.WriteLine("--------------------------------") ' If using a DataGridView for items, loop through rows here writer.WriteLine("Total Amount Due: $" & totalAmount) writer.WriteLine("--------------------------------") writer.WriteLine(" Thank you for your business! ") writer.WriteLine("================================") End Using
Inside your frmBillEntry.vb :
Private Sub SaveInvoice() OpenDB() Dim transaction As SqlTransaction = conn.BeginTransaction() Try ' 1. Insert into Invoice Master Dim invoiceNo As Integer = GetNextInvoiceNumber() ' custom function Dim masterQuery As String = "INSERT INTO tbl_Invoice_Master VALUES(@invNo, @date, @custID, @sub, @discPct, @tax, @grand)" cmd = New SqlCommand(masterQuery, conn, transaction) cmd.Parameters.AddWithValue("@invNo", invoiceNo) cmd.Parameters.AddWithValue("@date", DateTime.Now) cmd.Parameters.AddWithValue("@custID", cmbCustomer.SelectedValue) cmd.Parameters.AddWithValue("@sub", lblSubtotal.Text) cmd.Parameters.AddWithValue("@discPct", txtDiscountPercent.Text) cmd.Parameters.AddWithValue("@tax", lblTax.Text) cmd.Parameters.AddWithValue("@grand", lblGrandTotal.Text) cmd.ExecuteNonQuery() ' 2. Insert details For Each row As DataGridViewRow In dgvBill.Rows If row.IsNewRow Then Continue For Dim detailQuery As String = "INSERT INTO tbl_Invoice_Details (InvoiceNo, ProductID, Quantity, Rate, Amount) VALUES(@invNo, @pid, @qty, @rate, @amt)" cmd = New SqlCommand(detailQuery, conn, transaction) cmd.Parameters.AddWithValue("@invNo", invoiceNo) cmd.Parameters.AddWithValue("@pid", row.Cells("ProductID").Value) cmd.Parameters.AddWithValue("@qty", row.Cells("Quantity").Value) cmd.Parameters.AddWithValue("@rate", row.Cells("Rate").Value) cmd.Parameters.AddWithValue("@amt", row.Cells("Amount").Value) cmd.ExecuteNonQuery()
Proper schema is the backbone. Here’s a minimal but production-ready design:
Public Class frmProducts Private Sub frmProducts_Load(sender As Object, e As EventArgs) Handles MyBase.Load LoadProducts() End Sub Private Sub LoadProducts() Try Dim dt As DataTable = Product.GetAllProducts() dgvProducts.DataSource = dt dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill Catch ex As Exception MessageBox.Show("Error loading products: " & ex.Message) End Try End Sub vb.net billing software source code
Try ' Create a StreamWriter to write text to the file Using writer As New StreamWriter(filePath, False) ' False to overwrite existing file writer.WriteLine("================================") writer.WriteLine(" OFFICIAL INVOICE ") writer.WriteLine("================================") writer.WriteLine("Date: " & invoiceDate) writer.WriteLine("Customer: " & customerName) writer.WriteLine("--------------------------------") ' If using a DataGridView for items, loop through rows here writer.WriteLine("Total Amount Due: $" & totalAmount) writer.WriteLine("--------------------------------") writer.WriteLine(" Thank you for your business! ") writer.WriteLine("================================") End Using Proper schema is the backbone
Inside your frmBillEntry.vb :
Private Sub SaveInvoice() OpenDB() Dim transaction As SqlTransaction = conn.BeginTransaction() Try ' 1. Insert into Invoice Master Dim invoiceNo As Integer = GetNextInvoiceNumber() ' custom function Dim masterQuery As String = "INSERT INTO tbl_Invoice_Master VALUES(@invNo, @date, @custID, @sub, @discPct, @tax, @grand)" cmd = New SqlCommand(masterQuery, conn, transaction) cmd.Parameters.AddWithValue("@invNo", invoiceNo) cmd.Parameters.AddWithValue("@date", DateTime.Now) cmd.Parameters.AddWithValue("@custID", cmbCustomer.SelectedValue) cmd.Parameters.AddWithValue("@sub", lblSubtotal.Text) cmd.Parameters.AddWithValue("@discPct", txtDiscountPercent.Text) cmd.Parameters.AddWithValue("@tax", lblTax.Text) cmd.Parameters.AddWithValue("@grand", lblGrandTotal.Text) cmd.ExecuteNonQuery() ' 2. Insert details For Each row As DataGridViewRow In dgvBill.Rows If row.IsNewRow Then Continue For Dim detailQuery As String = "INSERT INTO tbl_Invoice_Details (InvoiceNo, ProductID, Quantity, Rate, Amount) VALUES(@invNo, @pid, @qty, @rate, @amt)" cmd = New SqlCommand(detailQuery, conn, transaction) cmd.Parameters.AddWithValue("@invNo", invoiceNo) cmd.Parameters.AddWithValue("@pid", row.Cells("ProductID").Value) cmd.Parameters.AddWithValue("@qty", row.Cells("Quantity").Value) cmd.Parameters.AddWithValue("@rate", row.Cells("Rate").Value) cmd.Parameters.AddWithValue("@amt", row.Cells("Amount").Value) cmd.ExecuteNonQuery() Insert into Invoice Master Dim invoiceNo As Integer
