Vb.net 如何从access数据库中获取数量最多的畅销产品并显示在标签上

Vb.net 如何从access数据库中获取数量最多的畅销产品并显示在标签上,vb.net,ms-access,Vb.net,Ms Access,我在做POS系统。在这一点上,我必须在仪表板上列出数量最多的前三大畅销产品,我不知道如何做到这一点。请帮助我做编码和数据应检索形式的access数据库 这就是我获得最畅销商品的原因。我需要得到顶部第二项和第三项也。 有什么帮助吗 结果预期的形象 假设您有3个面板来显示前3名的畅销产品,每个面板的级别如下所示: 面板1-标签产品名称-LBLPProduct1名称,标签数量名称-lblQTYProduct1 面板2-标签产品名称-LBLPProduct2名称,标签数量名称-lblQTYProduc

我在做POS系统。在这一点上,我必须在仪表板上列出数量最多的前三大畅销产品,我不知道如何做到这一点。请帮助我做编码和数据应检索形式的access数据库

这就是我获得最畅销商品的原因。我需要得到顶部第二项和第三项也。 有什么帮助吗

结果预期的形象


假设您有3个面板来显示前3名的畅销产品,每个面板的级别如下所示: 面板1-标签产品名称-LBLPProduct1名称,标签数量名称-lblQTYProduct1

面板2-标签产品名称-LBLPProduct2名称,标签数量名称-lblQTYProduct2

面板3-标签产品名称-LBLPProduct3名称,标签数量名称-lblQTYProduct3

我们将在每次迭代中获得lblProductName和lblQTYProduct,并为其设置值 他们

最终代码如下:

    con = New OleDbConnection(cs)
    con.Open()
    Dim ct As String = "SELECT TOP 3 ProductName, Sum(Quantity) as Quantity FROM ProductSoldDB group by ProductName order by SUM(Quantity) Desc"
    cmd = New OleDbCommand(ct, con)

    rdr = cmd.ExecuteReader()
    Dim index As Integer = 1
    While rdr.Read

        Dim ctrlProduct As Control = Me.Controls.Find("lblProduct" + index.ToString() + "Name", True).FirstOrDefault()

        ctrlProduct.Text = rdr("ProductName")

        Dim ctrlQuantity As Control = Me.Controls.Find("lblQTYProduct" + index.ToString(), True).FirstOrDefault()

        ctrlQuantity.Text = rdr("Quantity").ToString()
        index = index + 1

    End While
    If Not rdr Is Nothing Then
        rdr.Close()
    End If

    con.Close()
此处输出-根据您的要求更改外观:

@一直以来,学习者都在努力获得一份工作选择职位

我不喜欢在更新用户界面时保持连接打开。因此,我填写了一个
数据表
,并将其传递给
按钮。单击
,从而将数据访问代码与用户界面分离

除了关闭外,还需要释放连接和命令,因此请使用
Using…End-Using

Private Function RetrieveData() As DataTable
    Dim sql = "SELECT TOP 10 ProductName, Sum(Quantity) as Quantity FROM ProductSoldDB Group By ProductName Order By SUM(Quantity)"
    Dim dt As New DataTable
    Using cn As New OleDbConnection("Your connection string"),
            cmd As New OleDbCommand(sql, cn)
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    Return dt
End Function
我创建了一个标签数组,这样我们就可以从
数据表中循环填充
i
是行的索引,在每次迭代中递增一

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt = RetrieveData()
    Dim LabelsToFill = {Label1, Label2, Label3, Label4, Label5, Label6, Label7, Label8, Label9, Label10}
    Dim i As Integer
    For Each l As Label In LabelsToFill
        l.Text = $"{dt.Rows(i)("ProductName")} - {dt.Rows(i)("Quantity")}"
        i += 1
    Next
End Sub
要填充两个不同的标签,一个用于数量,一个用于名称

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim dt = RetrieveData()
    Dim QuanityLabels = {QLabel1, QLabel2, QLabel3, QLabel4, QLabel5, QLabel6, QLabel7, QLabel8, QLabel9, QLabel10}
    Dim NameLabels = {NLabel1, NLabel2, NLabel3, NLabel4, NLabel5, NLabel6, NLabel7, NLabel8, NLabel9, NLabel10}
    Dim i As Integer
    For i = 0 To 9
        NameLabels(i).Text = dt.Rows(i)("ProductName").ToString
        QuanityLabels(i).Text = dt.Rows(i)("Quantity").ToString
    Next
End Sub
编辑

回复:美元。$表示插值字符串的开头,如果被大括号{}包围,则允许直接嵌入变量。这在Visual Studio 2015的vb.net中可用。在以前的版本中,可以使用String.Format获得相同的结果

l.Text = String.Format("{0} - {1})", dt.Rows(i)("ProductName"), dt.Rows(i)("Quantity"))

下面是最后一段代码,它在@mary的帮助下解决了我的问题

Private Function RetrieveData() As DataTable
        Dim sql = "SELECT TOP 3 ProductName, Sum(Quantity) as Quantity FROM ProductSoldDB group by ProductName order by Sum(Quantity) DESC"
        Dim dt As New DataTable
        Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\User\Desktop\EME.accdb;Persist Security Info=False;"),
                cmd As New OleDbCommand(sql, cn)
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
        Return dt
    End Function
最后,我得到了我预期的结果


您好,如果您尝试了某项操作,但出现了错误或输出与预期不同,请添加更多详细信息。如果你希望有人给你一个完整的解决方案,我想你不会得到它。这就是我为获得最畅销商品所做的。但现在我也想获得第二名和第三名。我该怎么做。@judesuren你选择了前10名,为什么你只得到一个呢?是的,我已经纠正了这个错误。即使我选择了前三名,我应该如何在单独的标签上显示它。like==畅销商品1=lbl1==畅销商品数量=lbl2我应该怎么做?编码有什么帮助吗?很好的建议,但用户并没有陷入连接中。他有表单接口相关的问题。@mary这对我来说有点复杂。原因是根据您的编码“Button2”,从数据库中正确检索最畅销的产品名称。但产品名称的数量不正确。例如,根据我的数据库,iPhone11Pro是最畅销的产品,其销量为9。您的编码正确地将iPhone 11 Pro的结果显示为最大销售商品,但数量不正确。此外,您的按钮1编码错误,表示字符无效。突出显示
l.Text=$“{dt.Rows(i)(“产品名称”)}-{dt.Rows(i)(“数量”)}”
此行“$”符号。请帮助这是我为按钮2
Dim dt=RetrieveData()Dim QuanityLabels={lblQTYProduct1,lblQTYProduct1,lblQTYProduct1}Dim NameLabels={lblProduct1Name,lblProduct2Name,lblProduct3Name}Dim I更新的内容,作为I=0到2个名称标签(I)的整数。Text=dt.Rows(I)(“ProductName”).ToString QuanityLabels(i).Text=dt.Rows(i)(“数量”).ToString Next End Sub
原因我不想要前十名销售产品。前三名对我来说已经足够了。请回复。thanks@judesuren请参阅对我的答案的编辑,解释
$
。注释不用于扩展讨论;这段对话已经结束。
Private Function RetrieveData() As DataTable
        Dim sql = "SELECT TOP 3 ProductName, Sum(Quantity) as Quantity FROM ProductSoldDB group by ProductName order by Sum(Quantity) DESC"
        Dim dt As New DataTable
        Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\User\Desktop\EME.accdb;Persist Security Info=False;"),
                cmd As New OleDbCommand(sql, cn)
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
        Return dt
    End Function
Private Sub Load_TopSellingProducts()

        Dim dt = RetrieveData()
        Dim QuanityLabels = {lblQTYProduct1, lblQTYProduct2, lblQTYProduct3}
        Dim NameLabels = {lblProductName1, lblProductName2, lblProductName3}
        Dim i As Integer
        For i = 0 To 2
            NameLabels(i).Text = dt.Rows(i)("ProductName").ToString
            QuanityLabels(i).Text = dt.Rows(i)("Quantity").ToString
        Next
    End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Load_TopSellingProducts()
    End Sub