Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » DataGridView

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сем привет. Бьюсь с DataGridView уже сутки перечитал msdn. Так и не могу решить задачу с подсчетом количества строк в DataGridView с определенным значением, например:
 
Имеется DataGridView в который из базы MySQL выбираются строки определенной таблицы, в DataGridView есть столбец в котором и присутствуют те самые, мне так нужные уникальные записи которые необходимо подсчитать, что делаю:

Код:
 
Dim CountR As Integer
        For CountR = 0 To DataGridView1.Rows.Count - 1
            Select Case DataGridView1.Rows(CountR).Cells(7).Value.ToString
                Case "1" : Label_cancel.Text = CountR.ToString()
                Case "2" : Label_ok.Text = CountR.ToString()
            End Select
        Next
 

Исключения не использую, так как исключено отсутствие значения в Cells(7) на стадии записи в БД.
Предположим в DataGridView есть 3 строки 2 содержат "1" и одна "2"
в Label_cancel.Text вижу 3, а в Label_ok.Text вижу 1 - это меня приводит в замешательство...
 
Как можно подсчитать количество строк с определенным значением в DataGridView?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 16:01 13-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
Ну, например, завести переменную типа Amount (раз Count у тебя уже занят ) и делать ей +1 когда текущая строка соответствует чему надо. Если я правильно угадал синтаксис VBA, то что-то типа такого:
 

Код:
 
        Dim CountR As Integer
        Dim Amount as Integer
        Amount = 0
        For CountR = 0 To DataGridView1.Rows.Count - 1  
            Select Case DataGridView1.Rows(CountR).Cells(7).Value.ToString  
                Case "нужное значение" : Amount = Amount + 1
            End Select  
        Next  
        Label_ok.Text = Amount.ToString()  
 

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 19:19 13-05-2013 | Исправлено: miwa, 19:20 13-05-2013
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
miwa
Вот ты молодец, готов тебя расцеловать, вот сделал о чем мечтал:

Код:
 
 Dim CountR As Integer
        Dim sok As Integer = 0
        Dim s1 As Integer = 0
        Dim s2 As Integer = 0
        Dim s3 As Integer = 0
        Dim sstop As Integer = 0
        Dim scancel As String
        For CountR = 0 To DataGridView1.Rows.Count - 1
            Select Case DataGridView1.Rows(CountR).Cells(7).Value.ToString
                Case "1" : s1 = s1 + 1
                Case "2" : s2 = s2 + 1
                Case "3" : s2 = s2 + 1
                Case "ok" : sok = sok + 1
                Case "stop" : sok = sok + 1
            End Select
        Next
        scancel = s1 + s2 + s3 + sstop
        Label_ok.Text = sok.ToString()
        Label_cancel.Text = scancel
 

Все работает...  
А можно еще вопрос по поводу MySQL?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 19:35 13-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вот ты молодец, готов тебя расцеловать

Не надо, я сегодня небритый
 
А что там с мускулем?

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 20:53 13-05-2013
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А с мускулем, то все в порядке... Я голову ломаю вот над чем:
С сайта в базу заношу текущее время в формате UTC + 10 минут выглядит вот так (05.13.2013 20:10:19)
затем в программе его получаю следующим способом:

Код:
 
       Try
            conn.Open()
            cmd.Connection = conn
            cmd.CommandText = "SELECT * FROM `taxi69_users`"
            Dim Date1 As New Date
            Date1 = Date.UtcNow
            Dim current_Date As String = Date1.ToString("MM.dd.yyyy HH.mm.ss")
            Dim reader As MySqlDataReader
            reader = cmd.ExecuteReader()
            While reader.Read()
                db_Date = reader.GetValue(5) 'переменная db_Date объявлена глобальной где то в начале огорода.
            End While
            conn.Close()
        Catch ex As Exception
            MsgBox("Ошибка: " & ex.Message, MsgBoxStyle.Critical)
        End Try
 

Вот теперь сижу, смотрю на весь этот огород и думаю что мне делать с переменной db_Date и current_Date.
Задача у меня такая, выбрать все записи из базы время которых больше текущего, затем все эти записи посчитать и вывести ну скажем в label. Ну с подсчетом и выводом, то проблем не будет.
Как составить запрос к базе что бы та вернула N количество записей где время больше чем в запросе, или написать еще 10 гектар кода, который будет пахать весь этот огород и выводить в label число.
 
Я больше склонен к запросу, ты как считаешь в какую сторону копать?
 
Добавлено:
Копнул в сторону запроса, получил:

Код:
 
           Try
            Dim Date1 As New Date
            Date1 = Date.UtcNow
            Dim current_Date As String = Date1.ToString("yyyy-MM-dd HH:mm:ss")
            conn.Open()
            cmd.Connection = conn
            cmd.CommandText = "SELECT * FROM `taxi69_users` WHERE `online`>'" & current_Date & "'"
            Dim reader As MySqlDataReader
            reader = cmd.ExecuteReader()
            While reader.Read()
                db_Date = reader.GetValue(5)
            End While
            conn.Close()
            Dim i As Integer = 0
            Select Case db_Date
                Case db_Date : i = i + i
            End Select
            ListBox1.Items.Add(i)
        Catch ex As Exception
 
        End Try
 

 
Почему то переменная i в ListBox1 = 0

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 21:42 13-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
Копнул, ИМХО, правильно. Но запрос я бы делал таким

Код:
 
select count(*) from taxi69_users where online > addtime(current_time + '00:10:00')
 

Тогда не надо ни циклов, ни кучи переменных и конструкция в целом должна работать намного быстрее. Правда, в хитросплетения мускульных функций даты-времени я не вникал (никогда с мусклей не работал) так что возможно надо подправить выражение addtime(current_time + '00:10:00')

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 23:30 13-05-2013 | Исправлено: miwa, 23:30 13-05-2013
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
miwa
Выродил вот такой рабочий код (или быдлокод):

Код:
 
 Try
            Dim Date1 As New Date
            Date1 = Date.UtcNow
            Dim current_Date As String = Date1.ToString("yyyy-MM-dd HH:mm:ss")
            cmd.CommandText = "SELECT * FROM `taxi69_users` WHERE `online`>'" & current_Date & "'"
            Dim s1 As Integer = 0
            Dim reader As MySqlDataReader
            reader = cmd.ExecuteReader()
            While reader.Read()
                Values = reader.GetValue(5)
                Select Values
                    Case Values : s1 = s1 + 1
                End Select
            End While
            Label_online.Text = s1
        Catch ex As Exception
 
        End Try
 

Работает.

Цитата:
Правда, в хитросплетения мускульных функций даты-времени я не вникал...

А я почитал доки, сделал для даты тип varchar и забыл как страшный сон, если еще и MySQL начать изучать, так лучше сразу на машинном коде писать, ИМХО.

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 23:48 13-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
Я имел в виду немного другое - вместо выборки select * from ... и последующего while ... s1 = s1 + 1 ... сделать select count(*) from ... - тогда сервер сразу вернет именно количество записей и тебе не надо буде делать этот цикл вообще.
 
Плюс опять же прирост скорости выполнения кода, что само по себе не самоцель, конечно, но мелочь приятная
 

Цитата:
если еще и MySQL начать изучать, так лучше сразу на машинном коде писать

Ну, зависит от того, как ты будешь этот самый mysql использовать. Если чаще чем раз в полгода, то базовые вещи (типа того же select count() или select sum() ) я бы таки подтянул - потратишь максимум пару дней, а сэкономишь кучу времени и нервов. Ну и если не углубляться в хитросплетения мускля, а просмотреть хотя бы стандартный SQL-92 - это пригодится тем более; СУБД в мире много и где с ними встретишся - не угадаешь.
Но, тебе решать, само собой

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 07:58 14-05-2013
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется в виду запрос типа

Код:
 
cmd.CommandText = "SELECT count(*) FROM `taxi69_users` WHERE `online`>'" & current_Date & "'"  
 

Я правильно понял?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 14:07 14-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
Да.  
Но ты писал, что тебе надо не текущее время, а +10 минут, вроде. Если так - тогда надо как раз с помощью функций даты-времени добавлять необходимый интервал. Если же просто нужно количество записей, у которых время больше текущего, тогда можно даже еще проще:
 

Код:
 
cmd.CommandText = "SELECT count(*) FROM `taxi69_users` WHERE `online`> current_timestamp"  
 

Функция сервера mysql current_timestamp возвращает текущее время сервера и так делать идеологически правильнее, чем склеивать запрос с датой из клиентского компьютера. Конечно, если тебе надо именно дату с клиента, тогда можно делать так, как ты написал.

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 17:30 14-05-2013
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
miwa
Да, это будет правильнее.

Код:
 
cmd.CommandText = "SELECT count(*) FROM `taxi69_users` WHERE `online`> current_timestamp"  
 

А время с сайта пишется так:

Код:
 
if (is_user($user)) {
$con=mysqli_connect($dbhost,$dbuname,$dbpass,$dbname);
mysqli_query($con, "set CHARACTER SET cp1251");
date_default_timezone_set('UTC');
$date_today = date("Y-m-d"); //Дата
$Hour[1] = date("H"); //часы
$minute[1] = date("i") + 1; //минуты
$seconds[1] = date("i"); //секунды
$datetime = $date_today." ".$Hour[1].":".$minute[1].":".$seconds[1];
$result = mysqli_query($con,"UPDATE `taxi69_users` SET `online` = '$datetime' WHERE `username` = '$username'");
mysqli_close();
}  
 

Затем сравниваем

Код:
 
         Try
            conn.Open()
            cmd.Connection = conn
            Dim Date1 As New Date
            Date1 = Date.UtcNow
            Dim current_Date As String = Date1.ToString("yyyy-MM-dd HH:mm:ss")
            cmd.CommandText = "SELECT * FROM `taxi69_users` WHERE `online`>'" & current_Date & "'"
            Dim s1 As Integer = 0
            Dim reader As MySqlDataReader
            reader = cmd.ExecuteReader()
            While reader.Read()
                Values_online = reader.GetValue(5)
                Select Case Values_online
                    Case Values_online : s1 = s1 + 1
                End Select
            End While
            Label_online.Text = s1
            conn.Close()
        Catch ex As Exception
            Label_online.Text = "0"
            conn.Close()
        End Try
 

Попробую, использовать твою строку запроса.  
 
 
Добавлено:
Не получается чего то у меня.
Ставлю в `online` тип данных TIMESTAMP, атрибуты on update CURRENT_TIMESTAMP
Захожу на сайт логинюсь и бывает такое, что в `online` появляется 0000-00-00 00:00:00.
Но даже когда там скажем 2013-05-14 19:17:16 отправляю запрос

Код:
 
cmd.CommandText = "SELECT count(*) FROM `taxi69_users` WHERE `online`> current_timestamp"  
 

Пусто... Может я не догоняю чуть

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 22:46 14-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
 
При формировании даты у тебя и минуты и секунды считаются как date("i") - это так и должно быть?
 

Код:
 
$minute[1] = date("i") + 1; //минуты  
$seconds[1] = date("i"); //секунды  
 

 
А вообще тут я бы тоже делал по-другому: вместо вычисления даты на клиенте и отправки ее в базу данных, делал бы все средствами СУБД:
 

Код:
 
if (is_user($user)) {  
$con=mysqli_connect($dbhost,$dbuname,$dbpass,$dbname);  
mysqli_query($con, "set CHARACTER SET cp1251");  
$result = mysqli_query($con,"UPDATE `taxi69_users` SET `online` =  TIMESTAMPADD(MINUTE,1, CURRENT_TIMESTAMP) WHERE `username` = '$username'");  
mysqli_close();  
}  
 

 
Касаемо нулевого значения в поле online, возможно, что у тебя ошибка при работе с датой-временем (возможно как раз в месте, где ты минуты и секунды как date(i) вычисляешь). А насчет того, что даже при "нормальных" значениях ничего не получается на выходе - я бы проверял таймзоны и на клиенте и на сервере и всюду по дороге (php/vb/mysql/etc).

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 15:08 15-05-2013
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
При формировании даты у тебя и минуты и секунды считаются как date("i") - это так и должно быть?  

Конечно нет, это ошибка которую я допустил.
Должно быть date("s") секунды.
По поводу временных зон в коде php

Код:
 
date_default_timezone_set('UTC');
 

В коде windows приложения  

Код:
 
Date1 = Date.UtcNow
 

Я проверял, в базу пишется точно время в UTC + 1 минута.
 
miwa огромное спасибо за помощь, вечером сяду писать код по твоему сценарию.
 
 
Добавлено:
Не удержался до вечера  

Код:
 
if (is_user($user)) {  
$con=mysqli_connect($dbhost,$dbuname,$dbpass,$dbname);  
mysqli_query($con, "set CHARACTER SET cp1251");  
$result = mysqli_query($con,"UPDATE `taxi69_users` SET `online` =  TIMESTAMPADD(MINUTE,1, CURRENT_TIMESTAMP) WHERE `username` = '$username'");  
mysqli_close();  
}    
 

Вносит в базу время по Москве, нужно в UTC что добавить в запрос?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 13:25 16-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
А вот тут я уже некомпетентен. Возможно, если использовать функцию UTC_TIMESTAMP вместо CURRENT_TIMESTAMP все будет так, как тебе надо. А возможно что надо будет ковырять параметры подключения, или еще что-то. Я не работал с мускулем и не в курсе, как там у него настраиваются временные зоны.

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 13:55 16-05-2013
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
if (is_user($user)) {    
$con=mysqli_connect($dbhost,$dbuname,$dbpass,$dbname);    
mysqli_query($con, "set CHARACTER SET cp1251");    
$result = mysqli_query($con,"UPDATE `taxi69_users` SET `online` =  TIMESTAMPADD(MINUTE,1, UTC_TIMESTAMP) WHERE `username` = '$username'");    
mysqli_close();    
}    
 

Ты Гений с большой буквы!!!

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 15:37 16-05-2013
miwa

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
Не заставляй меня краснеть.
Рад, что смог помочь

Всего записей: 455 | Зарегистр. 10-10-2004 | Отправлено: 19:40 16-05-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » DataGridView


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru