Member 13174737 Ответов: 3

Как мы можем сделать сумму данных из таблицы данных SQL и отобразить значение суммы человеку в datagridview


вот моя таблица данных SQL и таблица Datagridview, я хочу получить итоговое значение человека, указанного в таблице базы данных, и отобразить его в datagridview.

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

SQL DATA TABLE			
StaffId	StaffName	INRDrAmt	INRCrAmt
STF-01	Deepak Sasmal	5,000.00	0.00
STF-02	Abdul Vakil	3,000.00	0.00
STF-03	Arvind Soorma	7,000.00	0.00
STF-04	Anwar Khan	4,000.00	0.00
STF-05	Arvind Mohanty	1,000.00	0.00
STF-06	Raman Kumar	7,000.00	0.00
STF-01	Deepak Sasmal	9,000.00	0.00
STF-01	Deepak Sasmal	1,000.00	0.00
STF-01	Deepak Sasmal	0.00	11,000.00
STF-06	Raman Kumar	0.00	200.00
STF-02	Abdul Vakil	0.00	500.00
STF-03	Arvind Soorma	4,000.00	
STF-03	Arvind Soorma	0.00	6,000.00
STF-04	Anwar Khan	1,000.00	0.00
STF-04	Anwar Khan	0.00	4,000.00
STF-04	Anwar Khan	0.00	1,500.00


DATA GRID VIEW				
StaffId	StaffName	Total DrAmt	Total CrAmt	Balance
STF-01	Deepak Sasmal	15,000.00	11,000.00	4,000.00
STF-02	Abdul Vakil	0.00	0.00	0.00
STF-03	Arvind Soorma	0.00	0.00	0.00
STF-04	Anwar Khan	0.00	0.00	0.00
STF-05	Arvind Mohanty	0.00	0.00	0.00
STF-06	Raman Kumar	0.00	0.00	0.00


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

Dim Cmd As New SqlClient.SqlCommand
        Dim Con As New SqlClient.SqlConnection
        Dim Rd As SqlDataReader
        Con.ConnectionString = "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=dbase;Integrated Security=True;Pooling=False"
        Cmd.Connection = Con
        Con.Open()
        Dim Row As DataGridViewRow
        Dim Int As Integer
        Row = Clientconsole.Dgvcltconsole.Rows(Int)
        Cmd.CommandText = "Select [ClientName], ISNULL(Sum(INRCrAmt),0) as Credit, ISNULL(Sum(INRDrAmt),0) as Debit From ClientLdgr Where [ClientName]='" & Row.Cells(1).Value & "' GROUP BY [ClientName]"
        Rd = Cmd.ExecuteReader
        Rd.Read()
        If Rd.Read Then
            Row.Cells(2).Value = Rd.Item("Debit")
            Row.Cells(3).Value = Rd.Item("Credit")
            Row.Cells(4).Value = Rd.Item("Debit") - Rd.Item("Credit")
            Rd.Close()
        End If

3 Ответов

Рейтинг:
8

Member 13174737

Dim Cmd As New SqlCommand
        Dim Con As New SqlConnection
        Con.ConnectionString = "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=dbase;Integrated Security=True;Pooling=False"
        Cmd.Connection = Con
        Con.Open()
        For Each Row As DataGridViewRow In Clientconsole.Dgvcltconsole.Rows
            Cmd.CommandText = "Select ClientName, ISNULL(Sum(INRCrAmt),0) as Credit, ISNULL(Sum(INRDrAmt),0) as Debit From ClientLdgr Where ClientName ='" & Row.Cells(1).Value & "' GROUP BY [ClientName]"
            Using Rd As SqlDataReader = Cmd.ExecuteReader
                Rd.Read()
                If Rd.HasRows Then
                    Row.Cells(2).Value = Rd.Item("Debit")
                    Row.Cells(3).Value = Rd.Item("Credit")
                    Row.Cells(4).Value = Rd.Item("Debit") - Rd.Item("Credit")
                End If
            End Using
        Next


Рейтинг:
2

Patrice T

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


Рейтинг:
1

RickZeeland

Быстрый и грязный способ, поместите это в метод нажатия кнопки:

Dim totalValue As Integer = 0
For Each dr As DataGridViewRow In DataGridView1.Rows
    totalValue = totalValue + CInt(dr.("ColumnName").value.tostring)
Next
TextBox1.Text = totalValue.ToString

Ой, вышеприведенный ответ был немного поспешным, вам, вероятно, нужен запрос, который выглядит так:
SELECT  StaffId, ClientName, SUM(INRDrAmt)
FROM    ClientLdgr
WHERE   INRDrAmt IS NOT NULL
GROUP BY  StaffId, ClientName


Для тестирования:
USE [CodeProject2017]
GO
CREATE TABLE [dbo].[ClientLdgr](
	[StaffId] [nvarchar](10) NULL,
	[ClientName] [nvarchar](50) NULL,
	[INRDrAmt] [decimal](10, 2) NULL
) ON [PRIMARY]
GO

INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-01', 'Deepak Sasmal', '5000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-02', 'Abdul Vakil', '3000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-03', 'Arvind Soorma', '7000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-04', 'Anwar Khan', '4000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-05', 'Arvind Mohanty', '1000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-06', 'Raman Kumar', '7000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-01', 'Deepak Sasmal', '9000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-01', 'Deepak Sasmal', '1000')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-01', 'Deepak Sasmal', '0')
INSERT INTO [dbo].[ClientLdgr] ([StaffId],[ClientName],[INRDrAmt]) VALUES ('STF-06', 'Raman Kumar', NULL)

SELECT  StaffId, ClientName, SUM(INRDrAmt)
FROM    ClientLdgr
WHERE   INRDrAmt IS NOT NULL
GROUP BY  StaffId, ClientName


0x01AA

Быстрый и грязный 5 ;)

Maciej Los

Согласитесь, 5 от меня.

Member 13174737

Дорогие все, спасибо за ваши усилия, я уже сделал это