...
...

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

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

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

А если быть более точным, функция 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;

//Возвращаем последнее число месяца, cоответствующего дате 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(aDate From,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(aDate To<> 0) then
begin
if (not VarIsNull(aDateFrom))and (aDateFrom<> 0) then
begin
if (BS_FirstDay(TDateTime(aDate From))=TDateTime(aDateFrom))
and (BS_LastDay(TDateTime(aDate From))=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'ов, введено преобразование типов. Это позволяет возвращать корректный результат при отсутствии значения одного из параметров.

Сергей Бердачук, Berdachuk@tochka.by


© Компьютерная газета

полезные ссылки
Аренда ноутбуков