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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2005, 11:53   #1  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Дешифровка формата даты EDT
Следующий код преобразует свойства расширенного типа данных даты в целочисленные параметры, пригодные для date2str().

Первая рекурсивная процедура загружает свойства расширенного типа:

PHP код:
private void loadDateFormatProperties(ExtendedTypeId _typeId)
{
    
#Properties
    
str             propertyproperties;
    
SysDictType     sysDictType;
    
#define.Auto("Auto")
    
;

    
sysDictType = new SysDictType(_typeId);

    if (! 
sysDictType || isSysId(sysDictType.id()))
        return;

    
properties sysDictType.treeNode().AOTgetProperties();

    
property findProperty(properties#PropertyDateformat);
    
propertyDateFormat property != #Auto ? property : "";

    
property findProperty(properties#PropertyDateSeparator);
    
propertyDateSeparator property != #Auto ? property : "";

    
property findProperty(properties#PropertyDateYear);
    
propertyDateYear property != #Auto ? property : "";

    
property findProperty(properties#PropertyDateMonth);
    
propertyDateMonth property != #Auto ? property : "";

    
property findProperty(properties#PropertyDateDay);
    
propertyDateDay property != #Auto ? property : "";

    
if ((! propertyDateFormat ||
         ! 
propertyDateSeparator ||
         ! 
propertyDateYear ||
         ! 
propertyDateMonth ||
         ! 
propertyDateDay) &&
        
sysDictType.extend())
    {
        
this.loadDateFormatProperties(sysDictType.extend());
    }

Вторая - анализирует их и сохраняет собственно указанные выше параметры:
PHP код:
protected void loadDateFormat()
{
    
int         idigit;
    
str         defSeparators;

    if (
loaded)
        return;

    
propertyDateFormat      "";
    
propertyDateSeparator   "";
    
propertyDateYear        "";
    
propertyDateMonth       "";
    
propertyDateDay         "";

    
this.loadDateFormatProperties(this.extTypeId());

    
// DATE FORMAT
    
intDateSequence 0;
    if (
propertyDateFormat)
    {
        
// for example "YMD" -> 321
        
for (1<= 3i++)
        {
            switch (
substr(propertyDateFormat4-i1))
            {
                case 
'D' digit 1; break;
                case 
'M' digit 2; break;
                case 
'Y' digit 3; break;
            }
            
intDateSequence += exp10(i-1) * digit;
        }
    }
    else 
// 'Auto' -> Usually "DMY" -> 123
    
{
        
intDateSequence SF_PropType_AtomDate::defSequence();
    }

    
// DAY DIGITS
    
switch (propertyDateDay)
    {
        case 
"Always two digits":
            
intDateDay 2;
            break;
        case 
"One or two digits":
            
intDateDay 1;
            break;
        default:
            
intDateDay SF_PropType_AtomDate::defDayDigits();
    }

    
// SEPARATORS
    
intDate1Separator 0;
    
intDate2Separator 0;
    
defSeparators SF_PropType_AtomDate::defSeparators();
    if (! 
propertyDateSeparator)
    {
        
propertyDateSeparator defSeparators;
    }
    
propertyDateSeparator strReplace(propertyDateSeparator"(none)",  'N');
    
propertyDateSeparator strReplace(propertyDateSeparator"(space)"'S');
    for (
1<= 2i++)
    {
        switch (
substr(propertyDateSeparatori1))
        {
            case 
'S' digit 1; break;
            case 
'.' digit 2; break;
            case 
'-' digit 3; break;
            case 
'/' digit 4; break;
            default  :
                
propertyDateSeparator strPoke(propertyDateSeparatorsubstr(defSeparatorsi1), i);
                
i--;
                continue;
        }
        if (
== 1)
        {
            
intDate1Separator digit;
        }
        if (
== 2)
        {
            
intDate2Separator digit;
        }
    }

    
// MONTH DIGITS
    
switch (propertyDateMonth)
    {
        case 
"Always two digits":
            
intDateMonth 2;
            break;
        case 
"One or two digits":
            
intDateMonth 1;
            break;
        default:
            
intDateMonth SF_PropType_AtomDate::defMonthDigits();
    }

    
// YEAR DIGITS
    
switch (propertyDateYear)
    {
        case 
"Two digits":
            
intDateYear 2;
            break;
        case 
"Four digits":
            
intDateYear 4;
            break;
        default:
            
intDateYear SF_PropType_AtomDate::defYearDigits();
    }

    
loaded true;

За это сообщение автора поблагодарили: mazzy (17).
Старый 30.09.2005, 11:56   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
А это - параметры, которая система берет из настроек Windows, если в последнем родительском EDT стоит "Auto":

PHP код:
private static int defDayDigits()
{
    
int     ret;
    
str     testDate;

    
testDate date2str(2\11\1911123, -12222);
    
ret strFind(testDate'.'18) - 1;

    return 
ret;
}
private static 
int defMonthDigits()
{
    
int     ret;
    
str     testDate;

    
testDate date2str(11\2\191121322, -122);
    
ret strFind(testDate'.'18) - 1;

    return 
ret;
}
private static 
str defSeparators()
{
    
int     separator1separator2;
    
str     testDate;

    
testDate date2str(11\11\1911SF_PropType_AtomDate::defSequence(), 2, -12, -12);
    
testDate strRem(testDate'1');

    return 
testDate;
}
private static 
int defSequence()
{
    
int     sequence;
    
str     testDate;

    
int sequencePosNum(str _testStr)
    {
        
int ret;

        
ret strScan(testDate_testStr18);
        switch (
ret)
        {
            case 
1:
                
ret 1;
                break;
            case 
4:
                
ret 2;
                break;
            case 
7:
                
ret 3;
                break;
            default:
                throw 
error(Error::wrongUseOfFunction(funcName()));
        }
        return 
ret;
    }

    ;

    
testDate date2str(22\11\1933, -122222);
    
sequence += sequencePosNum("22") * 100;
    
sequence += sequencePosNum("11") * 10;
    
sequence += sequencePosNum("33") * 1;

    return 
sequence;
}
private static 
int defYearDigits()
{
    
int     ret;
    
str     testDate;

    
testDate date2str(11\11\19113122222, -1);
    
ret strFind(testDate'.'18) - 1;

    return 
ret;

Теги
date, edt, полезное, формат дат

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание наследника EDT через Х++ vesna DAX: Программирование 12 02.05.2012 08:13
Lookup даты для выбора месяца Antidot DAX: Программирование 0 21.01.2005 21:24
Синхронизация таблиц при изменении EDT z_av DAX: Программирование 1 16.12.2004 11:55
Список полей таблиц на базе конкретного EDT Владимир Максимов DAX: Программирование 10 06.10.2004 14:45
Очень не хочеться вручную устанавливать даты для всех строк журнала .... ATimTim DAX: Функционал 1 14.09.2004 19:33

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

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

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