Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
1

Посчитать время из двух столбцов DBGrid

08.04.2013, 17:41. Просмотров 1476. Ответов 25
Метки нет (Все метки)

Подскажите, как подсчитать время из двух столбцов DBGrid
Например первый столбец n_smena имеет значение 5:15, а второй k_smena 13:25. Все отображается в формате HH.mm, даты нет.
в edit нужно вывести разницу. k_smena - n_smena.
В БД эти столбцы имеют формат дата/время. БД через ADOQuery ADOconnection DataSource.

Есть наметки, но он естественно не правильный. Подскажите путь истинный

Delphi
1
2
3
4
5
6
7
8
var j:TDataTime;
begin
ADOQuery1.First;
j:=ADOQuery1.FieldbyName('k_smena').AsDateTime-ADOQuery1.FieldbyName('n_smena').AsDateTime;
ADOQuery1.Next;
edit5.text:=DateToStr(j);
ADOQuery1.First;
end;
Как правильно объявить переменную для начала?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 17:41
Ответы с готовыми решениями:

Посчитать разницу столбцов DBGrid
Ребят, помогите! как реализовать такую штуку? Я привязал бд к делфи, добавил...

Посчитать суммы элементов двух столбцов матрицы, вывести большую сумму
Дан двумерный массив. Посчитать сумму его двух столбцов, вывести большую сумму....

Выравнивание столбцов в Dbgrid
Нужно было при выводе в грид выравнивать столбцы по длине максимальной строки в...

Печать определённых столбцов DBGrid
Доброго времени суток всем. Возможно ли сделать как нибудь, чтобы пользователь...

Delphi!? DbGrid, не совпадают названия столбцов?
вот до компиляции, то, что находится на форме, обратите внимание как называются...

25
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
08.04.2013, 17:54 2
Цитата Сообщение от ul_mralex Посмотреть сообщение
Подскажите путь истинный
Путь истинный лежит через вычисляемое поле и событие OnCalcFields DataSet-объекта, поставляющего данные для отображения в DBGrid.
0
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
08.04.2013, 17:58  [ТС] 3
А поподробнее можно?
0
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
08.04.2013, 18:04 4
Подробности есть во встроенной справке.
0
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
08.04.2013, 22:53  [ТС] 5
Я не догнал, может кто еще подскажет?
0
ILNAR_93
Android
237 / 237 / 49
Регистрация: 19.01.2013
Сообщений: 1,881
Записей в блоге: 3
09.04.2013, 01:13 6
Это чуть не то что тебе нужно, но всеже может пригодится!
Delphi
1
2
3
4
5
6
7
8
9
var 
d2:integer;
begin
ADOQuery1.First;
 d2:=(trunc(ADOQuery1.FieldbyName('k_smena').AsDateTime) - trunc(ADOQuery1.FieldbyName('n_smena').AsDateTime));
ADOQuery1.Next;
edit5.text:=DateToStr(d2);
ADOQuery1.First;
end;
а на счет твоего вопроса-можно реализовать таким методом чтоб:


Delphi
1
2
3
hh-hh1;
mm-mm1;
ss-ss1;
-Смысл понял ??
1
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
09.04.2013, 09:03 7
Цитата Сообщение от ul_mralex Посмотреть сообщение
Я не догнал
Кого ты не догнал ?)
0
ILNAR_93
Android
237 / 237 / 49
Регистрация: 19.01.2013
Сообщений: 1,881
Записей в блоге: 3
09.04.2013, 11:24 8
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.btn1Click(Sender: TObject);
    var a,b,c: TDateTime;
begin
ADOQuery1.First;
a:=(ADOQuery1.FieldbyName('k_smena').AsDateTime);
b:=(ADOQuery1.FieldbyName('n_smena').AsDateTime);
c:=a-b;
label1.Caption:=Timetostr(c);
end;
1
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
09.04.2013, 13:20  [ТС] 9
Да, разобрался. ТО, что нужно было. Почти делал такой вариант, но что то было не так.
kaspersky, Большое человеческое спасибо.

Добавлено через 1 час 10 минут
Стоп, а вот результат минусовой должен получится, а он выводит все по нулям, это как исправить?
А еще в edit выводит полный формат времени, как оставить HH:mm
Если вывести формат HH.mm я думаю вопрос сам собой отпадет или все же нет?
1
ILNAR_93
Android
237 / 237 / 49
Регистрация: 19.01.2013
Сообщений: 1,881
Записей в блоге: 3
09.04.2013, 13:35 10
Ну чтобы вывести в формате hh:mm думаю как то так надо:

Delphi
1
edit1.text:=FormatDateTime('hh:mm', c);
1
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26151 / 17527 / 6951
Регистрация: 22.10.2011
Сообщений: 30,867
Записей в блоге: 6
09.04.2013, 13:58 11
Цитата Сообщение от kaspersky Посмотреть сообщение
думаю как то так надо:
Проверять никогда не пробовал то, что советуешь? Попробуй, полюбопытствуй:

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b : TTime;
begin
  a := StrToTime('12:00');
  b := StrToTime('11:22');
  Caption := FormatDateTime('HH:mm', b - a); // Упс, почему показывает 00:38, должно же быть -00:38 !!!
end;
Не всё так просто с отрицательными значениями...
1
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
09.04.2013, 14:03  [ТС] 12
Цитата Сообщение от kaspersky Посмотреть сообщение
Ну чтобы вывести в формате hh:mm думаю как то так надо:

Delphi
1
edit1.text:=FormatDateTime('hh:mm', c);
Да, так сработало. Теперь надо разобраться с отрицательным значением времени..
0
ILNAR_93
Android
237 / 237 / 49
Регистрация: 19.01.2013
Сообщений: 1,881
Записей в блоге: 3
09.04.2013, 14:05 13
Цитата Сообщение от UI Посмотреть сообщение
Проверять никогда не пробовал то, что советуешь? Попробуй, полюбопытствуй:
UI мой ответ был на вопрос
Цитата Сообщение от ul_mralex Посмотреть сообщение
А еще в edit выводит полный формат времени, как оставить HH:mm
и я знаю что вариант:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button2Click(Sender: TObject);
var a,b,c: TDateTime;
begin
a:=ADOQuery1.FieldbyName('k_smena').AsDateTime;
b:=ADOQuery1.FieldbyName('n_smena').AsDateTime;
c:=a-b;
edit1.text:=FormatDateTime('hh:mm', c);
end;
все решает и оставляет время в формате hh:mm
1
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26151 / 17527 / 6951
Регистрация: 22.10.2011
Сообщений: 30,867
Записей в блоге: 6
09.04.2013, 14:24 14
Я бы сделал вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
// uses DateUtils;
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b : TTime;
const
  sign : array[{TValueRelationship}-1 .. 1] of char = ('-', ' ', ' ');
begin
  // a := StrToTime('12:00');;
  // b := StrToTime('11:22');
  a := StrToTime('12:00');;
  b := StrToTime('12:22');
  Caption := sign[CompareTime(b, a)] + FormatDateTime('hh:mm', a - b);
end;
все решает и оставляет время в формате hh:mm
Ни черта он не решает, потому как отрицательные промежутки, которые нужны TC-у, не обрабатываются корректно. Так что... Делай выводы.
1
ILNAR_93
Android
237 / 237 / 49
Регистрация: 19.01.2013
Сообщений: 1,881
Записей в блоге: 3
09.04.2013, 15:04 15
Цитата Сообщение от UI Посмотреть сообщение
Ни черта он не решает, потому как отрицательные промежутки, которые нужны TC-у, не обрабатываются корректно. Так что... Делай выводы.
ОЙ блин я теебе а ты мне б, я говорю про отображение формата а не минус плюс . когда до тебе дойдет ?
1
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
09.04.2013, 17:22  [ТС] 16
Скажите, а как сделать, что бы подсчитывало время в столбце правильно?
Такая процедура на кнопку, она работает:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm13.Button6Click(Sender: TObject);
var s:TDateTime;
i:integer;
begin
S:=0;
i:=ADOQuery1.RecNo;
ADOQuery1.DisableControls;
ADOQuery1.First;
while not(ADOQuery1.Eof) do
  begin
    S:=S+ADOQuery1.FieldByName('it_vrema').AsDateTime;
    ADOQuery1.Next;
  end;
ADOQuery1.RecNo:=i;
ADOQuery1.EnableControls;
edit6.Text:=FormatDateTime('HH:mm', s);
       end;
Но!:
Даны числа: 07:14 + 05:49 + 07:05 + 10:45. Результат должен по идее получится: 30:53
Но выводит как 6:53.
Т.е. получается до 23:59 он считает нормально, а потом?!
Как сделать и где выставить правильный формат вывода времени?
0
ILNAR_93
Android
237 / 237 / 49
Регистрация: 19.01.2013
Сообщений: 1,881
Записей в блоге: 3
09.04.2013, 18:18 17
По идее есть 12-часовой формат времени, и 24. вот он у тебя после 24:59 начинает с 01:00
0
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
09.04.2013, 18:55  [ТС] 18
Ну да, это я понял
А как дальше то считать?

Добавлено через 35 минут
Где то видел, но это было вроде на С# , так там часы, минуты отдельно отделялись. Пример у кого нибудь есть?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26151 / 17527 / 6951
Регистрация: 22.10.2011
Сообщений: 30,867
Записей в блоге: 6
09.04.2013, 19:05 19
Цитата Сообщение от ul_mralex Посмотреть сообщение
А как дальше то считать?
Переходить на даты, больше 24 часов - это уже в сутках, тут просто форматом hh:mm не обойтись...
Delphi
1
edit6.Text:=FormatDateTime('dd:HH:mm', s + EncodeDate(1899, 12, 31));
0
ul_mralex
2 / 2 / 1
Регистрация: 02.04.2013
Сообщений: 103
09.04.2013, 19:42  [ТС] 20
Не, понимаете в чем дело...
Есть такое понятие, как отработка месячного балла сотрудником. Вот и считается его ненормированное время, к примеру: 07:14 + 05:49 + 07:05 + 10:45
т.е. 1.04.13 сотрудник отработал 07:14 часов, а 2.04.13 отработал 05:49, вот и надо посчитать за определенный период месяца его отработанные часы...
0
09.04.2013, 19:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 19:42

Как сделать фиксацию столбцов в DBGrid
как сделать фиксацию столбцов таблицы в DBGrid1 ????

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

Изменение размеров столбцов в DBGrid в зависимости от монитора
есть DBGrid у него в свойствах Align стоит alClient сама область таблицы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru