Показать сообщение отдельно
Старый 16.05.2008, 15:08   #9  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
В свое время работники отдела кадров хотели иметь возможность видеть всех именинников в определенном интервале, мы решали проблему с ДР так (может пригодиться идея).

Была создана табличка 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();
}
За это сообщение автора поблагодарили: Antant (1), farlander (1).