打印带有报告查看器问题的收据

Printing receipt with report viewer problem

我正在尝试使用报表查看器通过 pos 系统打印收据,但我总是得到第一个订单打印详细信息,而不是当前订单详细信息 我认为 PrintPreview 代码部分的问题我可以准确地放置代码

   Sub Savepayment()
        Try
            Dim sdate As String = Now.ToString("yyyy-MM-dd")
            Dim stime As String = Now.ToString("hh:mm:ss")
            cn.Open()
            cm = New SqlCommand("Insert into TblSales(transno,total,sdate,stime,cashier,discount,totalbill) values (@transno,@total,@sdate,@stime,@cashier,@discount,@totalbill) ", cn)
            With cm
                .Parameters.AddWithValue("@transno", FrmPos.LblTransNo.Text)
                .Parameters.AddWithValue("@total", CDbl(TxtBill.Text))
                .Parameters.AddWithValue("@sdate", sdate)
                .Parameters.AddWithValue("@stime", stime)
                .Parameters.AddWithValue("@cashier", str_user)
                .Parameters.AddWithValue("@Discount", CDbl(TxtDiscount.Text))
                .Parameters.AddWithValue("@totalbill", CDbl(TxtTotal.Text))
                '.Parameters.AddWithValue("@Cash", CDbl(TxtCash.Text))
                '.Parameters.AddWithValue("@Change", CDbl(TxtChange.Text))

                .ExecuteNonQuery()
            End With

            cn.Close()

            cn.Open()
            cm = New SqlCommand("Update tblcart set status='Completed' Where transno like '" & FrmPos.LblTransNo.Text & "'", cn)
            cm.ExecuteNonQuery()
            cn.Close()

            MsgBox("Payment successfully Saved!", vbInformation)

            With FrmReceipt
                .PrintPreview("Select c.id, p.Description, c.price, c.qty, c.total From tblcart as c inner join tblproduct as p on c.pid=p.id where c.status like 'Completed' and TransNo like '" & FrmPos.LblTransNo.Text & "'")

                .ShowDialog()
            End With


            With FrmPos
                .LblTransNo.Text = .GetTransNo()
                .loadcart()
            End With


            Me.Dispose()
        Catch ex As Exception

            cn.Close()
            MsgBox(ex.Message, vbCritical)
        End Try

    End Sub

您的连接应始终在与 Using...End Using 块一起使用的方法中声明。需要处理连接和命令(调用它们的 Dispose 方法)以释放非托管资源。 Using 块为我们处理这个,即使有错误。它还会关闭连接。

Execute... 之前不要 Open 连接。

不要将 AddWithValue 与 Sql 服务器一起使用。参见 http://www.dbdelta.com/addwithvalue-is-evil/https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ 还有一个: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications 这是另一个 https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html

您需要断开数据库代码与用户界面代码的连接。在 UI 代码中显示消息框并与控件交互。

我猜TransNo是数值类型,主键和外键。如果它是身份字段,则不应为其发送值。从字段列表、参数列表和插入命令的添加方法中删除它。

日期应保存为日期。如果它们不是日期,您稍后将在排序和搜索时遇到问题。我没有更改这是代码。

Private cnStr As String = "Your connection String"

Sub Savepayment(TransNo As Integer, TotalBill As Decimal, str_user As String, Discount As Decimal, Total As Decimal)
    Dim sdate As String = Now.ToString("yyyy-MM-dd")
    Dim stime As String = Now.ToString("hh:mm:ss")
    Using cn As New SqlConnection(cnStr)
        Using cm As New SqlCommand("Insert into TblSales(transno,total,sdate,stime,cashier,discount,totalbill) values (@transno,@total,@sdate,@stime,@cashier,@discount,@totalbill);", cn)
            With cm.Parameters
                .Add("@transno", SqlDbType.NVarChar).Value = TransNo
                .Add("@total", SqlDbType.Decimal).Value = TotalBill
                .Add("@sdate", SqlDbType.NVarChar).Value = sdate
                .Add("@stime", SqlDbType.NVarChar).Value = stime
                .Add("@cashier", SqlDbType.NVarChar).Value = str_user
                .Add("@Discount", SqlDbType.Decimal).Value = Discount
                .Add("@totalbill", SqlDbType.Decimal).Value = Total
            End With
            cn.Open()
            cm.ExecuteNonQuery()
        End Using
        Using cm As New SqlCommand("Update tblcart set status='Completed' Where transno = @TransNo", cn)
            cm.Parameters.Add("@TransNo", SqlDbType.Int).Value = TransNo
            cm.ExecuteNonQuery()
        End Using
    End Using
End Sub


Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim TransNo = CInt(FrmPos.LblTransNo.Text)
    Dim User As String = "I don't know where this comes from"
    Dim BillTotal As Decimal
    If Not Decimal.TryParse(TxtBill.Text, BillTotal) Then
        MessageBox.Show("Please enter a valid number in Total Bill.")
        Exit Sub
    End If
    Dim Discount As Decimal
    If Not Decimal.TryParse(TxtDiscount.Text, Discount) Then
        MessageBox.Show("Please enter a valid number in Discount")
        Exit Sub
    End If
    Dim TotalAfterDiscount As Decimal
    If Not Decimal.TryParse(TxtTotal.Text, TotalAfterDiscount) Then
        MessageBox.Show("Please enter a valid number in Total")
        Exit Sub
    End If
    Try
        Savepayment(TransNo, BillTotal, User, Discount, TotalAfterDiscount)
        MsgBox("Payment successfully Saved!", vbInformation)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    'I have no idea what this code is doing.
    With FrmReceipt
        .PrintPreview("Select c.id, p.Description, c.price, c.qty, c.total From tblcart as c inner join tblproduct as p on c.pid=p.id where c.status like 'Completed' and TransNo like '" & FrmPos.LblTransNo.Text & "'")
        .ShowDialog()
    End With
    With FrmPos
        .LblTransNo.Text = .GetTransNo()
        .loadcart()
    End With
End Sub

我得到了解决方案我在报表的加载表单事件中添加了刷新报表的代码

 ReportViewer1.RefreshReport()