BERDAFLEX Software Systems
Главная > Delphi > Печать информации о периоде отбора данных

Печать информации о периоде отбора данных

История переиздания
Издание 1.0 2003.10.28 Сергей Бердачук

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

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

//Возвращаем первое число месяца
//соответствующего дате aDate
function BS_FirstDay(const aDate:TDateTime):TDateTime;
var
  fYear, fMonth, fDay: Word;
begin
  // Используем функции модуля SysUtils
  DecodeDate(aDate, fYear, fMonth, fDay);
  Result := EncodeDate(fYear, fMonth, 1);
end;

//Возвращаем последнее число месяца
//соответствующего дате aDate
function BS_LastDay(const aDate:TDateTime):TDateTime;
var
  fYear, fMonth, fDay: Word;
begin
  DecodeDate(aDate, fYear, fMonth, fDay);
  fDay := DaysPerMonth(fYear, fMonth);
  Result := EncodeDate(fYear, fMonth, fDay);
end;

// Возвращаем первое число текущего месяца
function BS_FirstDayCurMonth:TDateTime;
begin
  Result:= BS_FirstDay(Now);
end;

// Возвращаем последний день текущего месяца
function BS_LastDayCurMonth:TDateTime;
begin
  Result := BS_LastDay(Now);
end;

//Функция формирования строки заголовка за период
//от aDateFrom до aDateTo. Предполагается, что
//aDateFrom, aDateTo типа TdateTime, Но, так как
//при работе с полями TField возможны null значения,
//то производится приведение типов
function BS_GetBetweenDateCaptionStr(aDateFrom,aDateTo:Variant):string;
begin
  Result:='';
  if (not VarIsNull(aDateFrom)) and (not VarIsNull(aDateTo))
   and (aDateFrom = aDateTo) and (aDateTo<>0) then
      Result:='(на '+DateToStr(aDateTo)+')'
  else
    if (not VarIsNull(aDateTo))and(aDateTo<>0) then
      begin
        if (not VarIsNull(aDateFrom))and(aDateFrom<>0) then
          begin
            if (BS_FirstDay(TDateTime(aDateFrom))=TDateTime(aDateFrom))
            and (BS_LastDay(TDateTime(aDateFrom))=TDateTime(aDateTo)) then
              Result:='(за '+GetMonthYearLine(TDateTime(aDateFrom))+')'
            else
              Result:='(с: '+DateToStr(aDateFrom)
                     +' по: '+DateToStr(aDateTo)+')'
          end
        else
          Result:='(по '+DateToStr(aDateTo)+')';
      end;
end;

Пример использования данной функции на выборке данных по документам прихода за период с gPeriodFrom по gPeriodTo (глобальные переменные выбора периода):

procedure TfrmStoreOrder.ReopenStoreOrder;
begin
  DM.cdsStoreOrder.Close;
  DM.cdsStoreOrder.Params[0].Value:=gPeriodFrom;
  DM.cdsStoreOrder.Params[1].Value:=gPeriodTo;
  DM.cdsStoreOrder.Open;
  Self.Caption:=’Приходные ордера ’
  + BS_GetBetweenDateCaptionStr(gPeriodFrom, gPeriodTo);
end;

Рисунок 1. Печать интервала в заголовке формы

Печать интервала в заголовке формы (Увеличить)

Не менее актуально применение данной функции при формировании отчетов. Например, если Вы используете библиотеку компонент fastReport, то код программы может быть примерно таким:

procedure TdmReports.frDisactByPeriodCustomersBeforePrint(
  Memo: TStringList; View: TfrView);
begin
  if (View is TfrMemoView)and(TfrMemoView(View).Name='frmemoPeriod') then
    begin
      TfrMemoView(View).Memo.Text:=
        BS_GetBetweenDateCaptionStr(BS_FirstDay(gPeriodFrom),BS_LastDay(gPeriodTo));
    end;
end;

И соответственно получим примерно такую форму отчета:

Рисунок 2. Печать интервала в отчете

Печать интервала в отчете (Увеличить)

Хочется обратить ваше внимание, для функции BS_GetBetweenDateCaptionStr подразумевается использование входных параметров типа TDateTime. Но, так как, данная функция наиболее часто вызывается с данными, которые извлекаются из TDataSet’ов, то введено преобразование типов. Что позволяет возвращать корректный результат, при отсутствии значения одного из параметров.

Скачать модуль bs_lib

Rambler's Top100 Рейтинг@Mail.ru