Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2015, 13:11   #1
WhiteSadKat
 
Регистрация: 13.04.2015
Сообщений: 3
По умолчанию Формирование отчета за месяц

Добрый день, уважаемые знатоки!

Возникла передо мной нетипичная задача - переделать код формирования отчета.

Условия:

Каждое утро происходит формирование отчета о потреблении электроэнергии в период с 00:00 01 числа текущего месяца по 00:00 сегодняшнего дня. 30 апреля произойдет формирование отчета в период 00:00 01.04.2015г по 00:00 30.04.2015. А 1 мая отчет не сформируется, т.к. "dtStart = dtEnd then Exit; end;". А есть желание, чтобы 1 мая отчет сформировался за 00:00 01.04.2015 - 00:00 01.05.2015г.

Даю вводные:

Код:
var dtStart, dtEnd, dtTemp, dtStamp: DateTime;
var dtDay, dtMonth, dtYear:integer;

 begin
  iParam := GetParameter(2);             -  параметр по данным, которые характеризуют потребление электроэнергии (устанавливаются программно) 
  dtEnd := GetParameter(11);            -   дата назначаемая программно (текущая дата)
  DecodeDate (dtEnd, dtYear, dtMonth, dtDay);
  dtStart := EnCodeDate(dtYear, dtMonth, 1)+0;
  if dtStart = dtEnd then Exit;
Мое (ошибочное) видение решения проблемы:

Код:
 DecodeDate (dtEnd, dtYear, dtMonth, dtDay);
  if dtDay = 1 then
  inDay (-1)
  dtStart := EnCodeDate(dtYear, dtMonth, 1)+0;
  if dtStart = dtEnd then Exit;
Подскажите, подправьте порядок слов, букв, цифр.

Заранее, спасибо!

Последний раз редактировалось WhiteSadKat; 14.04.2015 в 08:29.
WhiteSadKat вне форума Ответить с цитированием
Старый 12.05.2015, 09:25   #2
WhiteSadKat
 
Регистрация: 13.04.2015
Сообщений: 3
По умолчанию

Разве никто не может подсказать?
WhiteSadKat вне форума Ответить с цитированием
Старый 12.05.2015, 09:32   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Разве никто не может подсказать?
Скорее никто не может понять )
Я вот не смог понять что за отчет, и чего ты хочешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2015, 09:39   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Нельзя жестко забить константы на месяца?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 12.05.2015, 09:44   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
  DecodeDate (dtEnd, dtYear, dtMonth, dtDay);
  if dtDay=1 then DecodeDate (dtEnd-1, dtYear, dtMonth, dtDay);
  dtStart := EnCodeDate(dtYear, dtMonth, 1);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.05.2015, 22:05   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Так понимаю, что надо формировать отчет с первого числа предыдущего месяца по первое число текущего месяца.
В этом случае при формировании (кодировании) даты старта надо отнимать 1 из месяца.
Вместе с тем, если это только в середине года, то и все, а если, например, надо будет посчитать и за период с первого декабря предыдущего года по 1-е января текущего, то следует вычитать и из года.

Аватар
Цитата:
DecodeDate (dtEnd, dtYear, dtMonth, dtDay);
if dtDay=1 then DecodeDate (dtEnd-1, dtYear, dtMonth, dtDay);
...
Если я правильно понял, то
dtEnd - это кодированная дата, которая декодируется и значения сохраняются в переменных dtYear, dtMonth, dtDay.
И какой у нее формат?
Можно ли в этом случае писать dtEnd-1. А если формат DDMMYYYY ?

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.05.2015, 22:07   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

dtEnd обыкновенный TDateTime, из которого DecodeDate выдергивает год и прочее. А формат у TDateTime - вещественное, точнее Double, целая часть - порядковый номер дня от 30 декабря 1899г., дробное - время, 0.5 - 12 часов. Так что отнимая единицу от 01/01/2015 неизбежно получим 31/12/2014
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.05.2015 в 22:13.
Аватар вне форума Ответить с цитированием
Старый 12.05.2015, 22:23   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Спасибо за пояснение. Так понял, что дата - это Юлианские дни.
Самому не приходилось использовать такие процедуры.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 13.05.2015, 10:15   #9
WhiteSadKat
 
Регистрация: 13.04.2015
Сообщений: 3
По умолчанию

Ребята, спасибо, буду пробовать. В начале следующего месяца отпишусь))
WhiteSadKat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формирование отчета Simply-Art SQL, базы данных 3 30.07.2014 04:39
Формирование отчета в Rave. lovetolaugh БД в Delphi 2 11.06.2011 20:43
Формирование отчета Jenikj Microsoft Office Access 2 15.04.2011 13:15
Формирование отчета по условию timesoon Microsoft Office Access 0 28.05.2010 21:44