User 13831921 Ответов: 4

Как получить "количество" и "сумма" в таблицу с#


В моем приложении у меня есть datatable с именем TB, который содержит следующие столбцы: BL, PREP, NBLIG, QTY и ERRTYPE. вот пример данных из таблицы

BL		PREP	NBLIG	QTY		ERRTYPE
125485	P1		5		125		RNF
189654	P2		12		762		RNF
156985	P2		3		36		FNR
219874	P1		36		5423	OTH
123698	P3		6		112		OTH
719736	P1		25		998		RNF


Я хочу, для каждого нужно подготовить, чтобы вычислить количество бл сумме NBLIG и кол-во и кол-во каждого ERRTYPE. Затем поместите эти данные в datagridview следующим образом:

PREP	NB_BL	TOTLIG	TOTQTY	TOTRNF	TOTFNR	TOTOTH      
P1		3		66		6546	2		0		1
P2		2		15		798		1		1		0
P3		1		6		112		0		0		1


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

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

я новичок в использовании datatable

спасибо

4 Ответов

Рейтинг:
34

Maciej Los

Все очень просто. Все, что вам нужно сделать, это сгруппировать данные по PREP поле. Пожалуйста, ознакомьтесь с приведенным ниже решением:

DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
	{
		new DataColumn("BL", typeof(int)),
		new DataColumn("PREP", typeof(string)),
		new DataColumn("NBLIG", typeof(int)),
		new DataColumn("QTY", typeof(int)),
		new DataColumn("ERRTYPE", typeof(string))
	});
dt.Rows.Add(new object[]{125485, "P1", 5, 125, "RNF"});
dt.Rows.Add(new object[]{189654, "P2", 12, 762, "RNF"});
dt.Rows.Add(new object[]{156985, "P2", 3, 36, "FNR"});
dt.Rows.Add(new object[]{219874, "P1", 36, 5423, "OTH"});
dt.Rows.Add(new object[]{123698, "P3", 6, 112, "OTH"});
dt.Rows.Add(new object[]{719736, "P1", 25, 998, "RNF"});

var result = dt.AsEnumerable()
	.GroupBy(x=>x.Field<string>("PREP"))
	.Select(grp=>new
	{
		PREP = grp.Key,
		NB_BL = grp.Count(),
		TOTLIG = grp.Where(x=>x.Field<string>("PREP")==grp.Key).Sum(x=>x.Field<int>("NBLIG")),
		TOTQTY = grp.Where(x=>x.Field<string>("PREP")==grp.Key).Sum(x=>x.Field<int>("QTY")),
		TOTRNF = grp.Where(x=>x.Field<string>("ERRTYPE")=="RNF").Count(),
		TOTFNR = grp.Where(x=>x.Field<string>("ERRTYPE")=="FNR").Count(),
		TOTOTH = grp.Where(x=>x.Field<string>("ERRTYPE")=="OTH").Count()
	})
	.ToList();


[no name]

Большое спасибо

BillWoodruff

+5 наткнулся на это сегодня, проводя некоторые исследования по DataTable.Вычислять. Большой ответ.

Maciej Los

Большое спасибо, Билл.

Рейтинг:
2

Richard MacCutchan

Если это находится в базе данных, то вы должны быть в состоянии использовать Функции SQL COUNT(), AVG() и SUM() [^]

Видеть Класс DataTable (System.Data)[^].


[no name]

Нет его нет в базе данных

Richard MacCutchan

Затем вам нужно будет написать код, чтобы найти все связанные элементы в вашей таблице, подсчитать их и вычислить итоговые значения.

Рейтинг:
1

Rocky Villalobos Bitos Jr.

Вы можете использовать DataTable.Вычислительный метод.

Проверьте эту ссылку для получения дополнительной информации. объект DataTable.Вычислить Методом (Строка, Строка) (Система.Сведения)[^]


Рейтинг:
1

Nachiket G

Это может быть достигнуто несколькими способами. Однако, если вы хотите сэкономить свое время, Я бы рекомендовал использовать экономящие время запросы LINQ.

Вот функция, которую я создал для вас :


public static DataTable BuildPrepData(DataTable sourceData)
        {
            try
            {
                DataTable outTable = new DataTable("PrepData");
                DataColumn[] dataColumn = {
                    new DataColumn("PREP", typeof(string)),
                    new DataColumn("NB_BL", typeof(int)),
                    new DataColumn("TOTLIG", typeof(int)),
                    new DataColumn("TOTQTY", typeof(int)),
                    new DataColumn("TOTRNF", typeof(int)),
                    new DataColumn("TOTFNR", typeof(int)),
                    new DataColumn("TOTOTH", typeof(int))
                };
                outTable.Columns.AddRange(dataColumn);

                var output = sourceData.AsEnumerable()
                    .GroupBy(Prep => Prep.Field<string>("PREP"))
                    .Select(PrepGroup => new
                    {
                        PREP = PrepGroup.Key,
                        NB_BL = PrepGroup.Count(),
                        TOTLIG = PrepGroup.Where(x => x.Field<string>("PREP") == PrepGroup.Key).Sum(x => x.Field<int>("NBLIG")),
                        TOTQTY = PrepGroup.Where(x => x.Field<string>("PREP") == PrepGroup.Key).Sum(x => x.Field<int>("QTY")),
                        TOTRNF = PrepGroup.Where(x => x.Field<string>("ERRTYPE") == "RNF").Count(),
                        TOTFNR = PrepGroup.Where(x => x.Field<string>("ERRTYPE") == "FNR").Count(),
                        TOTOTH = PrepGroup.Where(x => x.Field<string>("ERRTYPE") == "OTH").Count()
                    }).ToList();

                foreach (var dRow in output)
                {
                    DataRow row = outTable.NewRow();
                    row["PREP"] = dRow.PREP;
                    row["NB_BL"] = dRow.NB_BL;
                    row["TOTLIG"] = dRow.TOTLIG;
                    row["TOTQTY"] = dRow.TOTQTY;
                    row["TOTRNF"] = dRow.TOTRNF;
                    row["TOTFNR"] = dRow.TOTFNR;
                    row["TOTOTH"] = dRow.TOTOTH;
                    outTable.Rows.Add(row);
                }

                return outTable;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }


Все, что вам нужно сделать здесь, это использовать эту функцию и предоставить ей объект datatable в формате, который вы объяснили в своем вопросе.

BL		PREP	NBLIG	QTY		ERRTYPE
125485	P1		5		125		RNF
189654	P2		12		762		RNF
156985	P2		3		36		FNR
219874	P1		36		5423	OTH
123698	P3		6		112		OTH
719736	P1		25		998		RNF


Пожалуйста, не обращайте внимания static и console.writeline() как я только что пытался сделать это с помощью стандартного консольного приложения.

Надеюсь, это поможет!


Maciej Los

Чем ваш ответ отличается от моего?
Я бы сказал, что ваш запрос linq точно такой же, как и мой! Вот почему я проголосовал за 1.

Nachiket G

Да, когда я начал писать свой aswer, я обнаружил, что в конечном итоге получаю почти такое же решение. Я подумал, почему бы не использовать хорошую работу, уже сделанную вами. Так помогли в создании отдельной функции. Я и сейчас голосую за вас так же. :)

Maciej Los

Без комментариев...

Richard Deeming

Брать чужую работу и представлять ее как свою-Это называется плагиатом.

У нас здесь очень смутное представление об этом.

Nachiket G

Ну же, ребята! Не могли бы вы прочитать ту часть вышеприведенного комментария, где я упомянул о том, что "в конечном итоге получаю почти то же самое решение"! Да, я согласен, что предлагаю аломост такое же решение, но если бы мне пришлось копировать, я бы использовал его как есть. Если вы опытный профессионал, то в мире программирования два или более человека могут иметь одинаковый образ мышления и/или написания кода. Я бы ничего не сделал, кроме как проигнорировал дальнейшие комментарии по этому вопросу.

[no name]

Спасибо!