В свое время работники отдела кадров хотели иметь возможность видеть всех именинников в определенном интервале, мы решали проблему с ДР так (может пригодиться идея).
Была создана табличка RO_DateTable с такими полями:
TransDate, Day, Month, Years, Decade, Quartal
на ней:
X++:
public void insert()
{
;
if (this.TransDate)
{
this.Day = dayofmth(this.TransDate);
this.Month = mthofyr(this.TransDate);
this.Years = year(this.TransDate);
this.Quartal = (this.Month + 2) div 3;
this.Decade = (this.Day + 9) div 10;
this.Decade = (this.Decade == 4) ? 3 : this.Decade;
}
super();
}
и
X++:
static void FillData()
{
RO_DateTable _RO_DateTable;
TransDate _TransDate;
TransDate _MinDate = systemdateget() - 365*100;
TransDate _MaxDate = systemdateget() + 365*100;
;
select firstonly _RO_DateTable order by TransDate desc;
_MinDate = max(_MinDate,_RO_DateTable.TransDate + 1);
for (_TransDate = _MinDate; _TransDate <= _MaxDate; _TransDate++)
{
_RO_DateTable.TransDate = _TransDate;
_RO_DateTable.insert();
}
}
и на россиской форме сотрудников был метод:
X++:
void BirthDayFilter()
{
Query query = new Query(originalQuery);
QueryBuildDataSource qBDS;
QueryBuildRange qBDR1;
QueryBuildRange qBDR2;
TransDate d1 = StartDate.dateValue();
TransDate d2 = EndDate.dateValue();
TransDate d_1;
TransDate d_2;
str range;
;
if (StartDate.dateValue() && EndDate.dateValue())
{
qBDS = query.dataSourceTable(tablenum(RO_DateTable));
if (!qBDS)
{
qBDS = query.dataSourceTable(tablenum(EmplTable),2).addDataSource(tablenum(RO_DateTable),"DT");
qBDS.joinMode(joinMode::InnerJoin);
qBDS.relations(false);
qBDS.addLink(fieldnum(EmplTable, BirthDate),fieldnum(RO_DateTable, TransDate));
}
qBDR1 = qBDS.findRange(fieldnum(RO_DateTable, Day));
if (!qBDR1)
{
qBDR1 = qBDS.addRange(fieldnum(RO_DateTable, Day));
}
range = strfmt("(DT.Day == 99)");
d_1 = d1;
while (d_1 <= d2)
{
d_2 = dateEndMth(d_1);
range += strfmt(" || ((DT.Day >= %1) && (DT.Day <= %2) && "+
"(DT.Month == %3))",dayofmth(d_1),dayofmth(min(d_2,d2)),mthofyr(d_1));
d_1 = d_2 + 1;
}
qBDR1.value(strfmt("(%1)",range));
EmplTable_ds.query(query);
}
else
{
EmplTable_ds.query(originalQuery);
}
EmplTable_ds.executeQuery();
}