Member 13600825 Ответов: 4

Как вычесть из системы и отказаться от продажи, если товар закончился


Приветствую всех,

я пытаюсь создать систему точек продаж с помощью vb.net и база данных sql. до сих пор я могу добавлять товары в систему и даже продавать. Проблема, с которой я сталкиваюсь, заключается в том, что даже если товары заканчиваются из базы данных, она все равно позволяет продавать. Я хотел бы остановить продажу товаров, как только они закончатся из базы данных.

Что я уже пробовал:

Imports MySql.Data.MySqlClient
Public Class frmPos
    Dim totalprice As Double
    Dim totalCost As Double
    Dim getProdtoDelete As Integer
    Dim Firstnum As Decimal
    Dim secondnum As Decimal
    Dim Operations As Integer
    Dim Operator_Selector As Boolean = False
    Dim result As Integer
    Dim totStockOut As Double
    Dim totSales As Double
    Dim strMonthNo As String
    Dim y As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        PictureBox1.ImageLocation = My.Settings.Logo
        PicBarCode.BackgroundImage = Code128(txtSearch.Text, "A")

        Panel1.Height = GVReceipt.Height + 471

        GridSettings()

        GVReceipt.Columns(0).Name = "Item Description"
        GVReceipt.Columns(1).Name = "Qty"
        GVReceipt.Columns(2).Name = "@"
        GVReceipt.Columns(3).Name = "Amount"
        GVReceipt.Columns(0).Width = 120
        GVReceipt.Columns(1).Width = 50
        GVReceipt.Columns(2).Width = 50
        GVReceipt.Columns(3).Width = 100
    End Sub



    Private Sub resizeDGV()
        GVReceipt.Height = GVReceipt.ColumnHeadersHeight + GVReceipt.Rows.Cast(Of DataGridViewRow).Sum(Function(r) r.Height)

        Panel1.Height = GVReceipt.Height + 471
        GVReceipt.ClearSelection()

    End Sub

    Private Sub Calc()
        Dim total As Integer = 0
        For index As Integer = 0 To GVReceipt.RowCount - 1
            total += Convert.ToDouble(GVReceipt.Rows(index).Cells(3).Value.ToString)
        Next
        Label12.Text = total.ToString()
        Label34.Text = total.ToString()
    End Sub



    Private Sub GVReceipt_RowsAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles GVReceipt.RowsAdded
        resizeDGV()
    End Sub

    Private Sub GVReceipt_RowsRemoved(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsRemovedEventArgs) Handles GVReceipt.RowsRemoved
        resizeDGV()
    End Sub

    Private Sub PrintDoc_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage
        Dim bm As New Bitmap(Me.Panel1.Width, Me.Panel1.Height)

        Panel1.DrawToBitmap(bm, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height))

        e.Graphics.DrawImage(bm, 0, 0)

        Dim aPS As New PageSetupDialog
        aPS.Document = PrintDoc
    End Sub

    '   Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    '       PrintDoc.PrinterSettings.PrinterName = My.Settings.Printer
    '       PrintDoc.Print()

    '       GVReceipt.Rows.Clear()
    '       GVProduct.Rows.Clear()

    '       Calc()
    '   End Sub

    Private Sub PrinterSetupToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrinterSetupToolStripMenuItem.Click
        frmPrinter.ShowDialog()
    End Sub

    Private Sub LogoSetupToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LogoSetupToolStripMenuItem.Click
        frmLogo.ShowDialog()
    End Sub
    '''start here
    <CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
    Private Sub GetItemInfo()
        Try
            sqL = "SELECT Barcode, Description, UnitPrice, ProductNo FROM product Where Description = '" & Val(txtSearch.Text) & "'"
            ConnDB()
            cmd = New MySqlCommand(sqL, conn)
            dr = cmd.ExecuteReader()

            If dr.Read = True Then
                productCode = dr("Barcode")
                itemDesc = dr("Description")
                itemPrice = dr("UnitPrice")
                itemNum = dr("ProductNo")
                itemDesc2 = dr("Description")
            End If
            txtSearch.Text = ""
        Catch ex As Exception
            '         MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub
    <CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")>
    <CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
    Public Sub addtolist()
        Dim sql As String
        Dim cmd As New MySqlCommand
        Dim dr As MySqlDataReader

        '''''''''''''''''''''

        Try
            sql = "SELECT * FROM product where Barcode = '" & txtSearch.Text & "'"

            ConnDB()
            With cmd
                .CommandText = sql
                .Connection = conn
            End With
            dr = cmd.ExecuteReader
            While dr.Read()
                If txtSearch.Text = "" Then

                Else
                    ' Create the new row.
                    Dim price As Decimal = dr("UnitPrice")
                    Dim stockonhand As Decimal = dr("StocksOnHand")
                    Dim itemcode As String = dr("Barcode")
                    Dim itemdesc As String = dr("Description")
                    Dim itemDesc2 As String = dr("Description")

                    'add transactiondetail
                    itemNum = dr("ProductNo")
                    itemPrice = dr("UnitPrice")

                    Try
                        sql = "INSERT INTO transactiondetails(InvoiceNo, ProductNo, ItemPrice, Quantity, Discount, user) Values('" & lblInvoiceNo.Text & "', '" & itemNum & "', '" & itemPrice & "', '" & txtQuantity.Text & "', '" & txtdiscount.Text & "', '" & tsslUser.Text & "')"
                        ConnDB()
                        cmd = New MySqlCommand(sql, conn)
                        cmd.ExecuteNonQuery()
                    Catch ex As Exception
                        '                      MsgBox(ex.Message)
                    Finally
                        cmd.Dispose()
                        conn.Close()
                    End Try

                    totalprice = Val(txtQuantity.Text) * price

                    dgvItems.Rows.Add(txtQuantity.Text, itemcode, itemdesc, price, totalprice)
                    GVReceipt.Rows.Add(itemDesc2, txtQuantity.Text, price, totalprice)
                    GridSettings()
                    Calc()
                    'update stockonhand per item
                    'receipt datagrid'' '''''''''''''''''''

                    'end'''''''''''''''''''''''
                    UpdateDecreaseQuantity()
                    txtSearch.Clear()
                End If
            End While
        Catch ex As Exception
            '           MsgBox(ex.Message)
        Finally
            conn.Close()
        End Try

    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        '      lbltime1.Text = Date.Now.ToString("hh:mm:ss")

        Label38.Text = Date.Now.ToString("hh:mm:ss")
        Label36.Text = Date.Now.ToString("dd/MM/yyyy")
    End Sub


    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
        frmProduct.Show()
    End Sub

    Private Sub txtSearch_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtSearch.KeyDown
        If txtSearch.Text = Nothing Then

            '''''''''''''''''''''''
        Else
            If e.KeyCode = Keys.Enter Then

                e.SuppressKeyPress = True
                '       txtdescription.Text = itemDesc
                txtQuantity.Enabled = True

                txtQuantity.Focus()

            End If
        End If
    End Sub

    Private Sub autocomplete()
        Try
            ConnDB()
            Dim dt As New DataTable
            Dim ds As New DataSet
            ds.Tables.Add(dt)

            Dim da As New MySqlDataAdapter("Select Barcode from product", conn)

            da.Fill(dt)
            Dim r As DataRow
            txtSearch.AutoCompleteCustomSource.Clear()
            For Each r In dt.Rows

                txtSearch.AutoCompleteCustomSource.Add(r.Item(0).ToString)
            Next
            conn.Close()

        Catch ex As Exception
            '            MessageBox.Show(ex.ToString)
        End Try
    End Sub

    Private Sub frmPos_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If (e.Control AndAlso (e.KeyCode = Keys.P)) Then
            ' When Control + P is pressed
            'button perfom click
            btnPayment.PerformClick()
        ElseIf (e.Control AndAlso (e.KeyCode = Keys.N)) Then
            btnNewTransacation.PerformClick()
        ElseIf (e.Control AndAlso (e.KeyCode = Keys.R)) Then
            btnRemove.PerformClick()
            '


            '
        ElseIf (e.Control AndAlso (e.KeyCode = Keys.Escape)) Then
            frmMain.ClosePosToolStripMenuItem.PerformClick()
        End If

    End Sub

    <CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
    Private Sub frmPos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '   Me.WindowState = FormStartPosition.CenterScreen
        Me.WindowState = FormWindowState.Maximized

        Me.KeyPreview = True
        btnNewTransacation.PerformClick()
        getinvoiceNo()
        Timer1.Start()
        autocomplete()
        txttotalcost.Text = txtsubtotal.Text
        txtQuantity.Enabled = False
        txtrecieved.Enabled = False
        'txttotalcost.Text = FormatCurrency(Val(txttotalcost.Text))
        txtSearch.Select()
        change.txtChange.Text = "0.00"
        '      lblDate1.Text = Date.Now.ToString("MM/dd/yyyy")

        'Receipt Generation On Payment

        PictureBox1.ImageLocation = My.Settings.Logo
        PicBarCode.BackgroundImage = Code128(txtSearch.Text, "A")

        Panel1.Height = GVReceipt.Height + 471



        GVReceipt.Columns(0).Name = "Item Description"
        GVReceipt.Columns(1).Name = "Qty"
        GVReceipt.Columns(2).Name = "@"
        GVReceipt.Columns(3).Name = "Amount"
        GVReceipt.Columns(0).Width = 120
        GVReceipt.Columns(1).Width = 50
        GVReceipt.Columns(2).Width = 50
        GVReceipt.Columns(3).Width = 100
        'End of Line

        Try

            sqL = "SELECT ProductCode, P.Description, TDate, SUM(TD.Quantity) as totalQuantity, TD.ItemPrice FROM Product as P, Transactions as T, TransactionDetails as TD WHERE P.ProductNo = TD.ProductNo AND TD.InvoiceNo = T.InvoiceNo AND  TDate LIKE '" & frmFilterDailySales.DateTimePicker1.Value.ToString("MM/dd/yyyy") & "' GROUP BY P.ProductNo, TDate ORDER By TDate"


            ConnDB()
            cmd = New MySqlCommand(sqL, conn)
            dr = cmd.ExecuteReader

            frmReportDailySales.dgw.Rows.Clear()
            totStockOut = 0.0
            totSales = 0.0
            y = 0
            Do While dr.Read = True
                frmReportDailySales.dgw.Rows.Add(dr("ProductCode"), dr("Description"), dr("TDate"), dr("totalQuantity"), Format(dr("ItemPrice"), "#,##0.00"), Format((dr("ItemPrice") * dr("TotalQuantity")), "#,##0.00"))
                y += 17
                totStockOut += dr("totalQuantity")
                totSales += (dr("ItemPrice") * dr("TotalQuantity"))
            Loop
            frmReportDailySales.dgw.Height += y
            frmReportDailySales.lblTotalStocksIn.Text = totStockOut
            frmMain.lblSales.Text = Format(totSales, "0.00")
            change.txtChange.Text = Format("0.00")
            'lblInvoiceNo.Text = Label41.Text
            Label41.Text = lblInvoiceNo.Text
            Panel3.Location = New Point(Me.Panel3.Location.X, Me.Panel3.Location.Y + y)
            ' InitializeComponent()
            ' frmMain.txtWordNumber.Text = UCase(SpellNumber(Val(lblSales.Text.Replace(",", ""))))
        Catch ex As Exception
            MsgBox(ex.ToString)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub
    'receipt code
    Private Sub GridSettings()
        GVReceipt.ScrollBars = ScrollBars.None
        GVReceipt.ClearSelection()

        GVReceipt.RowHeadersVisible = False
        GVReceipt.ColumnCount = 4

        GVReceipt.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        'DataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal
        GVReceipt.CellBorderStyle = DataGridViewCellBorderStyle.None

    End Sub

    'end here
    Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        Me.Close()
        frmMain.ToolStrip1.Enabled = True
        frmMain.MenuStrip1.Enabled = True

    End Sub

    Private Sub txtQuantity_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtQuantity.KeyDown
        If txtQuantity.Text = Nothing Then
            ''''''''''''''''''''''''''''''''
        Else
            If e.KeyCode = Keys.Enter Then
                e.SuppressKeyPress = True

                addtolist()
                totalCost += totalprice

                txtsubtotal.Text = Format(totalCost, "0.00")
                txtrecieved.Enabled = True
                '  lblGrandTotal.Text = Format(totalCost, "#,##0.00")
                GetItemInfo()



                'end
                txtQuantity.Clear()
                txtSearch.Focus()
            End If
        End If
    End Sub

    <CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
    Private Sub UpdateDecreaseQuantity()
        Try
            sqL = "Update product SET StocksOnHand = stocksOnHand - " & Val(txtQuantity.Text) & " WHERE Barcode = '" & txtSearch.Text & "'"
            ConnDB()
            cmd = New MySqlCommand(sqL, conn)
            cmd.ExecuteNonQuery()

        Catch ex As Exception
            '            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub

    Private Sub btnNewTransacation_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNewTransacation.Click
        dgvItems.Rows.Clear()
        txtsubtotal.Text = "0.00"
        '   lblGrandTotal.Text = "0.00"
        totalCost = 0
        txtrecieved.Enabled = False
        txtQuantity.Enabled = False
        txtSearch.Focus()
    End Sub

    Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click
        If dgvItems.Rows.Count = 0 Then
            MsgBox("No Transaction", MsgBoxStyle.Exclamation, "Remove Item")
            txtSearch.Focus()
            Exit Sub
        Else
            If MsgBox("Are you sure you want to Delete?", MsgBoxStyle.YesNo, "Delete Item") = MsgBoxResult.Yes Then
                RemoveItem()

                txtSearch.Focus()
            Else
                Exit Sub
            End If

        End If
    End Sub


    <CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
    Private Sub UpdateIncreaseQuantity()
        Try
            sqL = "Update product SET StocksOnHand = stocksOnHand + '" & dgvItems.CurrentRow.Cells(0).Value & "' WHERE ProductNo = " & getProdtoDelete & ""
            ConnDB()
            cmd = New MySqlCommand(sqL, conn)
            cmd.ExecuteNonQuery()

        Catch ex As Exception
            '            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub
    Private Sub RemoveItem()
        txtsubtotal.Text = Format(txtsubtotal.Text - dgvItems.CurrentRow.Cells(4).Value, "0.00")
        GetProductIDToDelete()
        UpdateIncreaseQuantity()
        dgvItems.Rows.Remove(dgvItems.SelectedRows.Item(0))
        totalCost = txtsubtotal.Text
    End Sub
    <CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
    Private Sub GetProductIDToDelete()
        Try
            sqL = "SELECT ProductNo FROM product Where Barcode = '" & dgvItems.CurrentRow.Cells(1).Value & "'"
            ConnDB()
            cmd = New MySqlCommand(sqL, conn)
            dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            If dr.Read = True Then
                getProdtoDelete = dr("ProductNo")


                'delete transactiondetail
                Try
                    sqL = "DELETE FROM transactiondetails WHERE ProductNo = " & getProdtoDelete & " AND InvoiceNo = '" & lblInvoiceNo.Text & "'"
                    ConnDB()
                    cmd = New MySqlCommand(sqL, conn)
                    Dim i As Integer
                    i = cmd.ExecuteNonQuery
                    If i > 0 Then
                        'MsgBox("Item Deleted", MsgBoxStyle.Information, "Delete Item")
                    Else
                        ' MsgBox("Failed to Delete item", MsgBoxStyle.Critical, "Delete Item")
                    End If
                Catch ex As Exception
                    '                   MsgBox(ex.Message)
                End Try
            End If
        Catch ex As Exception
            '            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub btnPayment_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPayment.Click
        '       frmpayment.ShowDialog()
        'frmPrintReceipt.ShowDialog()
        txtrecieved.Focus()

    End Sub

    Private Sub bn1_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "1"
        Else
            txtSearch.Text += "1"
        End If
    End Sub

    Private Sub bn2_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "2"
        Else
            txtSearch.Text += "2"
        End If
    End Sub

    Private Sub bn3_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "3"
        Else
            txtSearch.Text += "3"
        End If
    End Sub

    Private Sub bn4_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "4"
        Else
            txtSearch.Text += "4"
        End If
    End Sub

    Private Sub bn5_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "5"
        Else
            txtSearch.Text += "5"
        End If
    End Sub

    Private Sub bn6_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "6"
        Else
            txtSearch.Text += "6"
        End If
    End Sub

    Private Sub bn7_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "7"
        Else
            txtSearch.Text += "7"
        End If
    End Sub

    Private Sub bn8_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "8"
        Else
            txtSearch.Text += "8"
        End If
    End Sub

    Private Sub bn9_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "9"
        Else
            txtSearch.Text += "9"
        End If
    End Sub

    Private Sub bn0_Click(sender As Object, e As EventArgs)
        If txtSearch.Text <> "0" Then
            txtSearch.Text += "0"
        Else
            txtSearch.Text += "0"
        End If
    End Sub


    Private Sub lblTotalCost_TextChanged(sender As Object, e As EventArgs) Handles txtsubtotal.TextChanged
        Try
            txtSubtotal1.Text = txtsubtotal.Text
            txttotalcost.Text = Val(txtsubtotal.Text) - Val(txtdiscount.Text)
            'retotal.Text = "0.00"
            ' retotal.Text = txttotalcost.Text
            totaldue = txttotalcost.Text.Replace(",", "")
            Format(totaldue, "0.00")
            'txtsubtotal.Text = Label12.Text

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked = True Then
            txtdiscount.Text = Val(txtSubtotal1.Text) * 0.1
            txttotalcost.Text = Val(txtsubtotal.Text) - Val(txtdiscount.Text) - Val(txtTax.Text)

            txtsubtotal.Text = Val((txtSubtotal1.Text) + Val(txtTax.Text)) - Val(txtdiscount)
            discount = txtdiscount.Text.Replace(",", "")
            Format(discount, "0.00")
        Else
            txtdiscount.Text = "0.00"
            txttotalcost.Text = Val(txtsubtotal.Text)
            totaldue = txttotalcost.Text.Replace(",", "")
            Format(totaldue, "0.00")
            discount = txtdiscount.Text.Replace(",", "")
            Format(discount, "0.00")
        End If
    End Sub

    Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
        Try
            If CheckBox2.Checked = True Then
                txtTax.Text = Val(txtSubtotal1.Text) * 0.16
                txttotalcost.Text = Val(txtsubtotal.Text) - Val(txtdiscount.Text) - Val(txtTax.Text)
                'calculating value payable
                txtsubtotal.Text = Val((txtSubtotal1.Text) + Val(txtTax.Text)) - Val(txtdiscount.Text)
                vat = txtTax.Text.Replace(",", "")
                ' vat = Label35.Text.Replace(",", "")
                Format(vat, "0.00")
            Else
                txtTax.Text = "0.00"
                txttotalcost.Text = Val(txtsubtotal.Text)
                totaldue = txttotalcost.Text.Replace(",", "")
                Format(totaldue, "0.00")
                vat = txtTax.Text.Replace(",", "")
                ' vat = Label35.Text.Replace(",", "")
                Format(vat, "0.00")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

    <CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
    Private Sub txtrecieved_KeyDown(sender As Object, e As KeyEventArgs) Handles txtrecieved.KeyDown

        If e.KeyCode = Keys.Enter Then
            e.SuppressKeyPress = True
            change.ShowDialog()

            Try
                ConnDB()

                Dim cmd As New MySqlCommand
                If e.KeyCode = Keys.Enter Then
                    e.SuppressKeyPress = True
                    sqL = "INSERT INTO transactions (InvoiceNo, TDate, TTime, NonVatTotal, VatAmount, TotalAmount, StaffID) VALUES ('" & lblInvoiceNo.Text & "' , '" & Date.Now.ToString("MM/dd/yyyy") & "' , '" & frmMain.lblTimer.Text & "' , '" & txtSubtotal1.Text & "' , '" & txtTax.Text & "' ,'" & txttotalcost.Text & "' , '" & frmMain.tsslUser.Text & "')"
                    ' sqL = "INSERT INTO payment (InvoiceNo, CashTendered, PChange, Username, Totalamount, trdate) VALUES ('" & lblInvoiceNo.Text & "' , '" & txtrecieved.Text & "' , '" & change.txtChange.Text & "', '" & frmMain.tsslUser.Text & "', '" & txtsubtotal.Text & "', '" & frmMain.lblDate.Text & "')"

                Else

                    sqL = "INSERT INTO payment (InvoiceNo, CashTendered, PChange) VALUES ('" & lblInvoiceNo.Text & "' , '" & txtrecieved.Text & "' , '" & change.txtChange.Text & "')"
                End If
                With cmd
                    .CommandText = sqL
                    .Connection = conn
                End With
                result = cmd.ExecuteNonQuery
                If result > 0 Then
                    '''''printing receipt

                    PrintDoc.PrinterSettings.PrinterName = My.Settings.Printer
                    PrintDoc.Print()

                    GVReceipt.Rows.Clear()
                    GVProduct.Rows.Clear()

                    Calc()



                    '''''''''''''''''''
                    MsgBox("Thank you for transacting!")
                    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''         frmPrintReceipt.ShowDialog()
                    ' frmPrintReceipt.ShowDialog()
                    'change.txtChange = ""
                    txtrecieved.Clear()
                    txttotalcost.Clear()
                    GVReceipt.Rows.Clear()
                    ' Label41.Text = ""
                    '   lblInvoiceNo.Text = ""
                    getinvoiceNo()
                    btnNewTransacation.PerformClick()
                    conn.Close()
                    '  '''''''''''''''' refresh form so all the textboxes are upto date ''''''''''''
                    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                    frmPos_Load(Me, New System.EventArgs)
                    txtSearch.Focus()
                Else
                    MsgBox("Transaction not Saved!")
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End Sub

    Private Sub txtrecieved_TextChanged(sender As Object, e As EventArgs) Handles txtrecieved.TextChanged

        '  change.txtChange.Text = Val(Label23.Text)

        ' txtrecieved.Text = Label15.Text
        Label15.Text = txtrecieved.Text
        change.txtChange.Text = Val(txtrecieved.Text) - Val(txttotalcost.Text)
        ' Label23.Text = Val(Label12.Text) - Val(Label15.Text)
        Label23.Text = Val(Label15.Text) - Val(Label12.Text)
        ' Label1.Text = Label34.Text
        If Val(txtrecieved.Text) < Val(txttotalcost.Text) Then



        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        BackupModule.ShowDialog()
    End Sub


End Class

CHill60

Никто не собирается читать весь этот код. Отредактируйте свой вопрос (используя ссылку улучшить вопрос, когда вы наводите на него курсор мыши) и удалите все, что не имеет отношения к тому, сколько акций осталось в базе данных или как вы их продаете.
Еще пара моментов, прежде чем кто-то опубликует не ответ, сообщающий вам об этом - ваш код уязвим для SQL-инъекции. Никогда не объединяйте строки для создания SQL - запросов- используйте параметризованные запросы
EDIT: вот некоторые ресурсы о SQL-инъекции SQL-инъекция - Википедия[^]
SQL-инъекции | фонд[^]

Правка 2 - я только что заметил

<CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2100:Review SQL queries for security vulnerabilities")>
Не говори глупостей - исправь проблему. Игнорирование предупреждений приведет только к сердечной боли позже

Member 13600825

спасибо расслабься, я буду лучше на моих ошибках, просьба помочь.

Maciej Los

Я бы с удовольствием прекратил продажу товаров, как только они закончатся из базы данных
Поэтому, прежде чем начать продавать конкретный товар, проверьте, доступен ли он.

0x01AA

Опционально: увеличьте срок поставки :-)

Maciej Los

:смеяться:

F-ES Sitecore

Проверьте, если количество больше нуля, прежде чем обрабатывать продажу, или не давайте возможность купить, если оно равно нулю. Как уже отмечали другие, там слишком много кода, чтобы кто-то мог понять, как он работает, сократив его только до соответствующих битов.

4 Ответов

Рейтинг:
2

Patrice T

Цитата:
Проблема, с которой я сталкиваюсь, заключается в том, что даже если товары заканчиваются из базы данных, она все равно позволяет продавать. Я хотел бы остановить продажу товаров, как только они закончатся из базы данных.

Из этого предложения, и даже не читая ваш код, у вас есть около 3 решений:
- Вы можете добавить поле (таблицу товаров), указывающее, продается товар или нет, и проверять его каждый раз, когда вы делаете продажу. проблема, много ручного ведения домашнего хозяйства.

- Следите за запасом каждого товара. В таблице товаров у вас есть поле, показывающее номер на складе, и каждая операция (вход или выход) будет обновлять запас.
Товар закончен, когда его нет на складе, вы должны проверить, достаточно ли его перед продажей.
Каждый раз, когда вы получаете новые товары, акции растут, каждая продажа уменьшает запас.

- Другой подход заключается в том, что большинство магазинов являются самообслуживанием, и когда клиент показывает на стойку с товарами, есть вероятность, что они на складе и, следовательно, не закончены, даже база данных говорит об обратном.

sql = "INSERT INTO transactiondetails(InvoiceNo, ProductNo, ItemPrice, Quantity, Discount, user) Values('" & lblInvoiceNo.Text & "', '" & itemNum & "', '" & itemPrice & "', '" & txtQuantity.Text & "', '" & txtdiscount.Text & "', '" & tsslUser.Text & "')"

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
1

OriginalGriff

Не решение, а проблема, которая у вас есть.
Вместо того чтобы подавлять серьезные предупреждения об уязвимостях безопасности, не пишите код, в котором они есть. Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Member 13600825

вау, хорошо позаботились, спасибо за вышеприведенные предложения. наверное, я просто был ленив в этом.

OriginalGriff

Гораздо ленивее не разбираться в том беспорядке, который может вызвать SQL-инъекция! :смеяться:

Вы говорите с ленивым человеком мирового класса ... :Д

Рейтинг:
0

MadMyche

Вот исправление для первого экземпляра Уязвимость SQL-инъекции

sqL = "SELECT Barcode, Description, UnitPrice, ProductNo FROM product Where Description = @Description"
ConnDB()
cmd = New MySqlCommand(sqL, conn)
cmd.Parameters.AddWithValue("@Description", Val(txtSearch.Text))

Что касается вопроса продажи больше, чем то, что есть на руках... что бы я сделал, так это схватил бы StocksOnHand с вашим ВЫБИРАТЬ операторы, которые используются для заполнения ваших дисплеев товаров и не позволяют совершать покупки в большем количестве, чем то, что у вас есть под рукой.
"SELECT Barcode, Description, UnitPrice, ProductNo, StocksOnHand FROM product..."


Member 13600825

привет, как бы ты посоветовал мне это заархивировать?

Рейтинг:
0

CHill60

Еще одна проблема, с которой вы столкнетесь, заключается в том ,что набор субподрядчиков обрабатывает события щелчка для bn1, bn2,..., bn9, bn0

Private Sub bn1_Click(sender As Object, e As EventArgs)
    If txtSearch.Text <> "0" Then
        txtSearch.Text += "1"
    Else
        txtSearch.Text += "1"
    End If
End Sub
Вы делаете точно то же самое, независимо от того, содержит ли текстовое поле "0" или нет. Этот код идентичен по своему поведению
Private Sub bn1_Click(sender As Object, e As EventArgs)
    txtSearch.Text += "1"
End Sub
Чтобы усугубить ситуацию, вам придется сделать это исправление 10 раз - один раз за нажатие кнопки.

Когда вы видите, что повторяете код таким образом, где, возможно, только 1 или 2 вещи меняются между каждым повторением, спросите себя, могли бы вы поместить этот код в другую подпрограмму или функцию.

Например, 70 строк кода, которые обрабатывают нажатия кнопок, могут быть уменьшены до 37 - то есть почти вдвое - сделав что-то вроде этого
Private Sub DealWithButtonClick(buttonNumber As String)
    If txtSearch.Text <> "0" Then
        txtSearch.Text += buttonNumber
    Else
        txtSearch.Text += buttonNumber
    End If
End Sub
		
Private Sub bn1_Click(sender As Object, e As EventArgs)
    DealWithButtonClick "1"
End Sub

. . .

Private Sub bn9_Click(sender As Object, e As EventArgs)
    DealWithButtonClick "9"
End Sub

Private Sub bn0_Click(sender As Object, e As EventArgs)
    DealWithButtonClick "0"
End Sub
Речь идет не только о том, чтобы уменьшить "раздувание" в вашем коде, хотя это сделает его немного легче читать, это означает, что вам нужно только исправить это, но однажды - и это должно быть хорошо, верно?
Теперь я смотрю на свой код и думаю, что там все еще есть повторяющийся шаблон, есть ли что-то еще, что я могу сделать?
Ну, я мог бы воспользоваться этим свойство TAG [^] каждой из кнопок - я могу либо ввести это во время разработки, либо добавить позже в коде
bn1.Tag = "1"
bn2.Tag = "2" 
etc etc 
и сделайте так, чтобы все кнопки использовали точно такое же событие щелчка, как это
Private Sub AButton_Click(sender As Object, e As EventArgs) _
        Handles bn1.Click, bn2.Click, bn3.Click, bn4.Click, bn5.Click, bn6.Click, bn7.Click, bn8.Click, bn9.Click, bn0.Click

    Dim TheButton = DirectCast(sender, Button)

	If txtSearch.Text <> "0" Then
		txtSearch.Text += TheButton.Tag.ToString
	Else
		txtSearch.Text += TheButton.Tag.ToString
	End If    
End Sub
Я даже могу сделать еще один шаг вперед и использовать название кнопки, чтобы определить, что делать ...
Private Sub AButton_Click(sender As Object, e As EventArgs) _
        Handles bn1.Click, bn2.Click, bn3.Click, bn4.Click, bn5.Click, bn6.Click, bn7.Click, bn8.Click, bn9.Click, bn0.Click

    Dim TheButton = DirectCast(sender, Button)

	If txtSearch.Text <> "0" Then
		txtSearch.Text += TheButton.Name.Substring(TheButton.Name.Length - 1) 
	Else
		txtSearch.Text += TheButton.Name.Substring(TheButton.Name.Length - 1)
	End If    
End Sub
Предупреждение - это последнее будет работать только для однозначных имен, таких как bn1, bn2 ... bn9,bn0. Это не сработает как оно есть для bn10, bn11, прием
Но ты только посмотри на это. Я перешел от 70 строк кода к 8, код все еще легко читается, и я могу исправить эту ошибку в одном месте и только в одном месте.

То, что я сделал, называется "рефакторинг", и это хороший инструмент, чтобы иметь его в своем арсенале.

Вот несколько статей на эту тему (некоторые из них написаны на C#, но принципы те же самые)
C# Bad Practices: узнайте, как сделать хороший код, используя примеры плохого кода[^]
Метрики кода, запахи кода и рефакторинг на практике[^]
Рефакторинг исходного кода в Visual Studio Code[^]
Есть также несколько книг на эту тему - некоторые из них доступны через Google Books https://www.amazon.co.uk/s?k=refactoring&справ=nb_sb_noss_1[^]