|
Вопрос # 2 435/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Нужно найти количество недель в промежутке времени. Допустим на форме 2 DataTimePicker'a и edit, нужно в edit'e показать количество недель в промежутке указанном в DataTimePicker'ах
п.с. это я гдето нашел правда так и не смог додуматься:
"WeekSpan функция DateUtils Возвращает количество недель, включая дробную часть, между двумя значениями TDateTime."
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: necboss (статус: Посетитель)
Вопрос отправлен: 19 февраля 2009, 18:25
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Dron
Здравствуйте, necboss!
Ничего сложного в этом нет. Тем более, вы даже нашли функцию, которая определяет число недель. Текущая дата у TDateTimePicker хранится в свойстве DateTime. Поэтому:
var W: Extended;
...
W:=WeekSpan(DateTimePicker1.DateTime,DateTimePicker2.DateTime);
ShowMessage('Полных недель: '+IntToStr(Trunc(W)));
Удачи!
 |
Ответ отправил: Dron (статус: Студент)
Время отправки: 19 февраля 2009, 18:34
Оценка за ответ: 5
Комментарий к оценке: не ожидал такой реакции, спасибо
|
Мини-форум вопроса
Всего сообщений: 17; последнее сообщение — 21 февраля 2009, 19:18; участников в обсуждении: 3.
|
necboss (статус: Посетитель), 19 февраля 2009, 19:24 [#1]:
а как сделать чтоб не только полных недель показывало, а с дробной величиной?
|
|
Dron (статус: Студент), 19 февраля 2009, 19:26 [#2]:
Использовать полученное значение (W) по своему усмотрению. С дробной частью - вместо IntToStr(Trunc(W)) - FloatToStr(W).
С уважением.
|
|
necboss (статус: Посетитель), 19 февраля 2009, 19:41 [#3]:
после запятой выходят 14 символов, как сделать 2
(3,34527934687234=3,35)
|
|
Dron (статус: Студент), 19 февраля 2009, 19:43 [#4]:
Приблизительно (по памяти) так:
FloatToStrF(W,ffFixed,4,2);
Если будет немного не то - попробовать поменять циферки.
С уважением.
|
|
necboss (статус: Посетитель), 19 февраля 2009, 19:47 [#5]:
спасибо, кажись все
|
|
necboss (статус: Посетитель), 19 февраля 2009, 21:07 [#6]:
терь мне нужно это значение присвоить ячейке таблицы
это работает:
DataModule2.ADOTable6.FieldByName('kol_vyhodov').Asinteger :=(Trunc(W));
но мне нужно с дробью, но это дает ошибку:
DataModule2.ADOTable6.FieldByName('kol_vyhodov').AsFloat :=(W,ffFixed,4,2);
|
|
Dron (статус: Студент), 19 февраля 2009, 21:09 [#7]:
(W,ffFixed,4,2) - это что такое? А где же название функции - FloatToStrF?
С уважением.
|
|
necboss (статус: Посетитель), 20 февраля 2009, 06:20 [#8]:
так тоже неработает:
DataModule2.ADOTable6.FieldByName('kol_vyhodov').AsFloat :=FloatToStrF(W,ffFixed,4,2);
|
|
Вадим К (статус: Академик), 20 февраля 2009, 10:01 [#9]:
Уважаемые вопрошающие. Когда пишете "не работает", всегда пишите как именно - не компилируется, возвращая ошибку (её можно внизу скопировать, если выделить и нажать Ctrl+C) или программа запускается, но уже в процессе работы выдает ошибку (многие MessageBox'ы тоже можнно скопировать через Ctrl+C!).
Теперь об ошибке.
AsFloat на то и AsFloat, что есть типа Float (вещественного, под делфийскому Extended). И присвоить ему строку (которую возвращает FloatToStrF) ну никак не получиться. Компилятор не знает, как привести эти типы.
В связи с этим, надо разобраться, какого типа поле kol_vyhodov в базе данных. Если оно там вещественное, тогда всякое понятие о "3 цифрах после запятой" - не более, чем разглагольствование. Если надо показывать 3 цифры после запятой, то и показываем - то есть при отображении обрезаем вывод, а не при добавлении в базу.
Если же поле kol_vyhodov есть строковое, что есть идеологически не верным, то в этом случае можно обрезать
DataModule2.ADOTable6.FieldByName('kol_vyhodov').AsString :=FloatToStrF(W,ffFixed,4,2);
но это черевато многими проблемами. Во первых, как только значение понадобиться для рассчетов, надо будет переводить в число. Во вторых, его будет сложно и неэффективно использовать в SQL.
Но смотря на названия поля, кажется, что оно целого типа (количество выходов - ну как может быть 3.2 выхода? хотя может у бухгалтеров другие мысли по этому поводу).
В целом, весело
Галочка "подтверждения прочтения" - вселенское зло.
|
|
necboss (статус: Посетитель), 20 февраля 2009, 12:00 [#10]:
када так:
DataModule2.ADOTable6.FieldByName('kol_vyhodov').AsFloat :=FloatToStrF(W,ffFixed,4,2);
ошибки такие:
[Error] Unit11.pas(49): Incompatible types: 'Double' and 'String'
[Fatal Error] MDIAPP.DPR(18): Could not compile used unit 'Unit11.pas'
мне нужно чтобы значение было численным, а не строковым, т.к. дальше c ним будут происходить матем-е операции.
|
|
Вадим К (статус: Академик), 20 февраля 2009, 12:45 [#11]:
DataModule2.ADOTable6.FieldByName('kol_vyhodov').AsFloat :=W;
и всё.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
necboss (статус: Посетитель), 20 февраля 2009, 18:10 [#12]:
да, но мне нужно дробное число
|
|
Вадим К (статус: Академик), 20 февраля 2009, 18:58 [#13]:
а там что, строка что ли будет? там как раз и будет дробное число.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
necboss (статус: Посетитель), 20 февраля 2009, 19:35 [#14]:
в смысле чтоб показывало значения после запятой (например: 3,25)
|
|
Вадим К (статус: Академик), 20 февраля 2009, 23:31 [#15]:
Ну так кто мешает? что не так?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
necboss (статус: Посетитель), 21 февраля 2009, 18:05 [#16]:
так показывает тока целые числа
|
|
Вадим К (статус: Академик), 21 февраля 2009, 19:18 [#17]:
значит что то делаете не так, но в другом месте. В базу обязано попасть вещественное число. Может просто туда не пишете его.
Может просто округляете перед записью?
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|