16.05.2008, 09:39 | #1 |
Участник
|
Как узнать: является ли сотрудник именинником за указанный период?
ax 3.0 sp3
Товарищи! Подскажите, есть ли в Аксапте функция, которая может сказать, является ли сотрудник именинником за выбранный интервал времени?
__________________
И почему никто меня не любит? Да, я надоедливый |
|
16.05.2008, 09:57 | #2 |
MCITP
|
Гм. Думаю нет такой.
А что тяжело написать самому разве такую?
__________________
Zhirenkov Vitaly |
|
16.05.2008, 10:23 | #3 |
Участник
|
Все бы вам писать. Спокойно встаём на поле с днем рождения, нажимаем Ctrl+K и вводим диапазон дат.
|
|
16.05.2008, 10:27 | #4 |
MCITP
|
Подозреваю, что исходный вопрос был всё-таки про функцию в коде (Х++)!
__________________
Zhirenkov Vitaly |
|
16.05.2008, 10:33 | #5 |
Участник
|
вместо года в запросе используйте '*'
|
|
16.05.2008, 11:35 | #6 |
Участник
|
так не выходит
X++: static void Job219(Args _args) { BonusCustTable tBonusCustTable; Query cQuery; QueryRun cQueryRun; QueryBuildDataSource qbdsBonusCustTable; ; cQuery = new Query(); qbdsBonusCustTable = cQuery.addDataSource(tableNum(BonusCustTable)); qbdsBonusCustTable.fetchMode(0); qbdsBonusCustTable.addRange(fieldNum(BonusCustTable, BirthDate)).value(StrFMT('%1.%2.*', dayOfMth(SystemDateGet()), mthOfYr(SystemDateGet()))); cQueryRun = new QueryRun (cQuery); while (cQueryRun.next()) { tBonusCustTable = cQueryRun.get(tableNum(BonusCustTable)); info (tBonusCustTable.Id); } }
__________________
И почему никто меня не любит? Да, я надоедливый Последний раз редактировалось Antant; 16.05.2008 в 11:45. |
|
|
За это сообщение автора поблагодарили: jeky (1). |
16.05.2008, 11:36 | #7 |
Участник
|
Какой, например?
__________________
И почему никто меня не любит? Да, я надоедливый |
|
16.05.2008, 13:35 | #8 |
Moderator
|
К сожалению, решение данной задачки в Аксапте возможно только нетривиальным путем, или, проще говоря, с изрядными извратами.
Тема уже неоднократно обсуждалась на Форуме: фильтрация записей по месяцу в поле дата День рождения в апреле... Запрос по дате |
|
|
За это сообщение автора поблагодарили: Antant (1). |
16.05.2008, 15:08 | #9 |
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). |
16.05.2008, 15:47 | #10 |
Member
|
А интервал дат в каких единицах измерения задается? Интервал может превышать календарный год?
Думаю, что стоит отталкиваться от отчета УП\Отчеты\Торжества\Дни рождения.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: Antant (1). |
16.05.2008, 15:55 | #11 |
Участник
|
Цитата:
X++: void clicked() { EmplTable locEmplTable; QueryBuildRange qbr; int bday, cday, bdofM, cdofM, bmofY, cmofY; ; EmplTable_ds.query().dataSourceNo(1).clearRanges(); while select BirthDate from locEmplTable { bday = dayofyr(locEmplTable.BirthDate); cday = dayofyr(systemDateGet()); bdofM = DayOfMth(locEmplTable.BirthDate); cdofM = DayOfMth(systemDateGet()); bmofY = MthOfYr(locEmplTable.BirthDate); cmofY = MthOfYr(systemDateGet()); if ( (bday >= cday)&&(bday < (cday + 8)) || ((bdofM == cdofM)&&(bmofY == cmofY)) ) { qbr = EmplTable_ds.query().dataSourceNo(1).addRange(fieldnum(EmplTable, BirthDate)); qbr.value(date2str(locEmplTable.BirthDate,10,2,2,2,2,4)); qbr.status(RangeStatus::Hidden); } } EmplTable_ds.executeQuery(); super(); }
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
|
За это сообщение автора поблагодарили: Antant (1). |
Теги |
законченный пример, программно, расчеты с персоналом, ax3.0 |
|
|