|
![]() |
#1 |
NavAx
|
В свое время работники отдела кадров хотели иметь возможность видеть всех именинников в определенном интервале, мы решали проблему с ДР так (может пригодиться идея).
Была создана табличка 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). |
Теги |
законченный пример, программно, расчеты с персоналом, ax3.0 |
|
|