AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.05.2008, 09:39   #1  
Antant is offline
Antant
Участник
 
82 / 17 (1) ++
Регистрация: 03.12.2005
? Как узнать: является ли сотрудник именинником за указанный период?
ax 3.0 sp3

Товарищи! Подскажите, есть ли в Аксапте функция, которая может сказать, является ли сотрудник именинником за выбранный интервал времени?
__________________
И почему никто меня не любит?
Да, я надоедливый
Старый 16.05.2008, 09:57   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Гм. Думаю нет такой.
А что тяжело написать самому разве такую?
__________________
Zhirenkov Vitaly
Старый 16.05.2008, 10:23   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Все бы вам писать. Спокойно встаём на поле с днем рождения, нажимаем Ctrl+K и вводим диапазон дат.
Старый 16.05.2008, 10:27   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Все бы вам писать. Спокойно встаём на поле с днем рождения, нажимаем Ctrl+K и вводим диапазон дат.
Подозреваю, что исходный вопрос был всё-таки про функцию в коде (Х++)!
__________________
Zhirenkov Vitaly
Старый 16.05.2008, 10:33   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
вместо года в запросе используйте '*'
Старый 16.05.2008, 11:35   #6  
Antant is offline
Antant
Участник
 
82 / 17 (1) ++
Регистрация: 03.12.2005
Цитата:
Сообщение от ice Посмотреть сообщение
вместо года в запросе используйте '*'
так не выходит

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  
Antant is offline
Antant
Участник
 
82 / 17 (1) ++
Регистрация: 03.12.2005
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Все бы вам писать. Спокойно встаём на поле с днем рождения, нажимаем Ctrl+K и вводим диапазон дат.
Какой, например?
__________________
И почему никто меня не любит?
Да, я надоедливый
Старый 16.05.2008, 13:35   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
К сожалению, решение данной задачки в Аксапте возможно только нетривиальным путем, или, проще говоря, с изрядными извратами.
Тема уже неоднократно обсуждалась на Форуме:

фильтрация записей по месяцу в поле дата

День рождения в апреле...

Запрос по дате
За это сообщение автора поблагодарили: Antant (1).
Старый 16.05.2008, 15:08   #9  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (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).
Старый 16.05.2008, 15:47   #10  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
А интервал дат в каких единицах измерения задается? Интервал может превышать календарный год?

Думаю, что стоит отталкиваться от отчета УП\Отчеты\Торжества\Дни рождения.
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: Antant (1).
Старый 16.05.2008, 15:55   #11  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Сообщение от Antant Посмотреть сообщение
ax 3.0 sp3

Товарищи! Подскажите, есть ли в Аксапте функция, которая может сказать, является ли сотрудник именинником за выбранный интервал времени?
кнопка на форме RHRMEmplTable она показывает "Дни рождения на этой неделе"


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

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
MDX запрос, выборка за период. Вата DAX: Программирование 2 17.10.2008 14:34
Как узнать по объекту RecordSortedList, из какой таблицы в нем записи? gl00mie DAX: Программирование 4 20.02.2008 15:39
Как узнать UserName от кого выполняется метод ? egorych DAX: Программирование 7 18.09.2007 18:46
Через map узнать fieldId Dron AKA andy DAX: Программирование 6 20.02.2004 18:18
Можно ли узнать ширину колонки в Grid? Maxim Gorbunov DAX: Программирование 1 05.07.2002 18:52

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:21.