Goran Bibic Ответов: 2

Столбец сумма где условие дата


Sum column where condition Date and 


Мой код работает нормально, мне нужно добавить условие, где дата-время сегодня...или что-то еще...

Какая-то помощь?

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

double[] columnData = new double[mp_kasa_listaDataGridView.Rows.Count];
columnData = (from DataGridViewRow row in mp_kasa_listaDataGridView.Rows
              where row.Cells["dataGridViewTextBoxColumn16"].FormattedValue.ToString() != string.Empty
              select Convert.ToDouble(row.Cells["dataGridViewTextBoxColumn16"].FormattedValue)).ToArray();
textBox1.Text = columnData.Sum().ToString("#,0.00");

Wendelius

каково имя и тип столбца, содержащего дату?

Goran Bibic

датум dataGridViewTextBoxColumn4, дата

2 Ответов

Рейтинг:
1

Wendelius

Если вам нужно добавить дополнительные условия , которые применяются к данным, просто используйте && (и) оператор

Так что что-то вроде:

columnData = (from DataGridViewRow row in mp_kasa_listaDataGridView.Rows
              where row.Cells["dataGridViewTextBoxColumn16"].FormattedValue.ToString() != string.Empty
              && row.Cells["dataGridViewTextBoxColumn4"] == System.DateTime.Now.Date
              select Convert.ToDouble(row.Cells["dataGridViewTextBoxColumn16"].FormattedValue)).ToArray();
textBox1.Text = columnData.Sum().ToString("#,0.00");

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


Goran Bibic

Оператор '==' не может быть применен к операндам типа 'DataGridViewCell' и 'DateTime'

Wendelius

Как я уже писал, вам может потребоваться привести (или разобрать) данные столбца. Это зависит от того, какие значения может иметь столбец.

Если все они являются датами, вы можете попробовать с
&& система.значение datetime.Parse(row.Cells["dataGridViewTextBoxColumn4"].ToString()) == Система.Датавремя.Сейчас.Дата

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

Goran Bibic

{"Строка не была распознана как допустимая Дата-Время. Существует неизвестное слово, начинающееся с индекса 0."}

Goran Bibic

Значение из sql 2018-04-26

Goran Bibic

Значение автоматически берется из sql (insert into GETDATE())

Wendelius

Попробуйте с помощью

Система.значение datetime.ParseExact ("гггг-ММ-ДД",строка.Ячейки["dataGridViewTextBoxColumn4"].ToString(), System.Глобализация.CultureInfo.Языка и региона существует)

Goran Bibic

{"Строка не была распознана как допустимая Дата-Время."}

Как найти формат? или я могу поместить значение в insert в формат даты sql?

Вставить в mp_kasa_lista (redni_broj,датум,tip_placanja, iznos_sa_pdv, сайт kupac) значения(@maxNo,функции getdate(),'Готовина',@iznos_sa_pdv,'Fizičko вшивость')", кон))

Goran Bibic

Внутри GETDATE(поставить какой-то формат) вроде гггг-ММ-ДД?

Wendelius

Я не уверен, как SQL связан с вашим вопросом. В своем первоначальном вопросе вы использовали LINQ для запроса строк из DataGridView, а теперь пытаетесь отформатировать дату в операторе SQL.

Не могли бы вы подробно объяснить, что вы пытаетесь сделать?

Goran Bibic

Конечно. В моей таблице sql у меня есть значение 26.4.2018 (datagridcolumn type d()

В sql это значение 2018-04-26

Код работает нормально

Проблема заключается в формате даты "ДД.ММ.гггг"


double[] columnData2 = новый double[mp_kasa_listaDataGridView.Rows.Рассчитывать];
columnData2 = (из строки DataGridViewRow в mp_kasa_listaDataGridView.Rows
где грести.Ячейки["dataGridViewTextBoxColumn16"].FormattedValue.ToString() != строка.Пустая & amp; система.значение datetime.ParseExact("dd.mm.yyyy", строка.Ячейки["dataGridViewTextBoxColumn4"].ToString(), System.Глобализация.CultureInfo.Инвариантная Культура) == Система.Датавремя.Сейчас.Дата
выберите пункт конвертировать.Метод todouble(строки.Ячейки["dataGridViewTextBoxColumn16"].FormattedValue)).Метод toArray();
textbox3 и.Текст = columnData2.Функция sum().Метод toString("#,0.00");

Goran Bibic

Сумма столбца dataGridViewTextBoxColumn16 на сегодня в textbox3

Wendelius

Итак, есть ли дата в формате dd.mm.yyyy в DataGridView?

Goran Bibic

Да. Я настраиваю это

Wendelius

В этом случае вы должны использовать этот формат при разборе строки из datagridview. Иначе говоря

Система.значение datetime.ParseExact ("dd.MM.yyyy",строка.Ячейки["dataGridViewTextBoxColumn4"].ToString(), System.Глобализация.CultureInfo.Языка и региона существует)

Goran Bibic

О, боже мой...{"Строка не была распознана как допустимая Дата-Время."}

Я устал...Я могу поверить

Wendelius

Используя отладчик, когда возникает исключение, посмотрите на значение в столбце в этой конкретной строке. Что в нем содержится?

Goran Bibic

Это полная ошибка

Система.FormatException был необработан
Значение HRESULT=-2146233033
Сообщение=строка не распознана как действительное значение datetime.
Источник=mscorlib
Трассировка стека:
в системе.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, стиль DateTimeStyles)
в системе.значение datetime.Метод parseexact(строка s, формат строки, поставщик объекта iformatprovider )
в BSS_pos.lista_racuna.&ЛТ;&ГТ;гр.&ЛТ;lista_racuna_load&ГТ;Б__2_2(ячейки datagridviewrow подряд) в C:\Users\Bibic документы Горан\\визуальной студии 2015\проекты\БСС пос\БСС пос\lista_racuna.CS:линия 47
в System.Linq.Перечислимый.WhereSelectEnumerableIterator`2.Метод MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
в System.Linq.Перечислимый.ToArray[TSource](IEnumerable`1 source)
в BSS_pos.lista_racuna.lista_racuna_Load(отправитель объекта, EventArgs e) в C:\Users\Bibic Goran\documents\visual studio 2015\Projects\BSS pos\BSS pos\lista_racuna.cs:строка 46
в системе.Окна.Форм.Форма.События onload(EventArgs в электронной)
в системе.Окна.Форм.Форма.OnCreateControl()
в системе.Окна.Формы.Контроль.CreateControl(Boolean fIgnoreVisible)
в системе.Окна.Формы.Контроль.CreateControl()
в системе.Окна.Формы.Контроль.WmShowWindow(сообщение& m)
в системе.Окна.Формы.Контроль.WndProc(сообщение& m)
в системе.Окна.Формы.ScrollableControl.WndProc(сообщение& m)
в системе.Окна.Forms.Form.WmShowWindow(Message& m)
в системе.Окна.Forms.Form.WndProc(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.OnMessage(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.WndProc(сообщение& m)
в системе.Окна.Формы.Родное окно.DebuggableCallback(hwnd элемента указателя IntPtr, int32 и глутамат натрия, указателя IntPtr параметр wparam, указателя IntPtr lparam должен)
Свойство innerexception:

Goran Bibic

//line46//columnData2 = (из строки DataGridViewRow в mp_kasa_listaDataGridView.Rows
//строка 47// где строка.Ячейки["dataGridViewTextBoxColumn16"].FormattedValue.ToString() != строка.Пустая & amp; система.значение datetime.ParseExact("dd.MM.yyyy", строка.Ячейки["dataGridViewTextBoxColumn4"].ToString(), System.Глобализация.CultureInfo.Инвариантная Культура) == Система.Датавремя.Сейчас.Дата

Wendelius

Это стек ошибок.

Используя отладчик, когда возникает исключение, посмотрите на значение в столбце в этой конкретной строке. Что в нем содержится? Является ли это значение датой в формате ДД.ММ.гггг или чем-то еще?

Goran Bibic

Нет определенного значения, только значение по умолчанию из datagrid type date и sql value date...формат данных в SQL являются 2018-04-26

Wendelius

Как я уже объяснял, вы можете использовать метод ParseExact для анализа строки на сегодняшний день.

Однако формат должен быть точно таким же, как у вас в сетке. В противном случае преобразование не удастся, как вы уже видели. Кроме того, если у вас нет значения, которое потерпит неудачу.

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

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

Goran Bibic

где грести.Ячейки["dataGridViewTextBoxColumn16"].FormattedValue.ToString() != строка.Empty && (row.Cells["dataGridViewTextBoxColumn14"].ToString()) == ("Готовина").Метод toString()

какая-нибудь помощь в этом деле? найти слово "Готовина" в колонке и суммировать

Рейтинг:
1

Maciej Los

Я уже ответил на ваш аналогичный вопрос.[^]
Основываясь на приведенной там идее, проверьте это:

DataTable dt = (DataTable)mp_kasa_listaDataGridView.DataSource;
textBox1.Text = dt.AsEnumerable()
    .Where(x=>x.Field<DateTime>("date").Date==DateTime.Today)
    .Sum(x=>x.Field<double>("price"))
    .ToString("#,0.00");


Goran Bibic

'string' не содержит определения для 'Date', и никакой метод расширения 'Date', принимающий первый аргумент типа 'string', не может быть найден (вы пропускаете директиву using или ссылку на сборку?)

Maciej Los

Простите, я ошибся. Проверьте обновленный ответ.

Goran Bibic

Строка ошибки 2 textBox1.Text = dt.Методом asenumerable()

Goran Bibic

Невозможно неявно преобразовать тип 'double' в 'string'

Maciej Los

Добавьте в конце .Метод toString("#,0.00");

Goran Bibic

отладка без ошибок...в приложении...когда клик на кнопку...

{"Невозможно привести объект типа 'System.Окна.Формы.BindingSource" для ввода "System.Data.DataTable"."}

Maciej Los

Это означает, что ваш DataGridView привязан к BindingSource, а не к DataTable...
Вы должны предоставить дополнительную информацию о том, как вы связываете свои данные с DataGridView. Есть ли какой-нибудь класс?

Goran Bibic

Просто строка соединения (имя od conn-CS) привязывается к sql. Нет объекта DataTable

Maciej Los

Попробуйте воспользоваться этим:

DataTable dt = (DataTable)mp_kasa_listaDataGridView.DataSource.List;

Если connector привязан к DataTable, вы сможете использовать код.

Goran Bibic

нет это не сработает

Goran Bibic

Что такое функция textBox1.Text в этом коде?