История переиздания | ||
---|---|---|
Издание 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;
Не менее актуально применение данной функции при формировании отчетов. Например, если Вы используете библиотеку компонент 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;
И соответственно получим примерно такую форму отчета:
Хочется обратить ваше внимание, для функции BS_GetBetweenDateCaptionStr подразумевается использование входных параметров типа TDateTime. Но, так как, данная функция наиболее часто вызывается с данными, которые извлекаются из TDataSet’ов, то введено преобразование типов. Что позволяет возвращать корректный результат, при отсутствии значения одного из параметров.
Скачать модуль bs_lib