Как отформатировать значение сравнения DateTime в службе запросов AX

Я работаю со службой запросов Dynamics AX 2012 R2, и мне нужно отфильтровать (установить диапазон) в поле ModifiedDateTime таблицы CustTable. Я создаю объект QueryDataRangeMetadata и устанавливаю его свойства. Я могу правильно фильтровать целочисленные значения, но не DateTimes.

Мне удалось выяснить, что оператор сравнения на самом деле встроен в значение. Я проверил это с целочисленными полями, и это работает, но я не смог понять, как отформатировать значение DateTime, чтобы оно правильно оценивалось. Код ниже не работает. Диапазон просто игнорируется и возвращаются все записи из таблицы CustTable.

    public static void RangeTest()
    {
        var client = new QueryServiceClient();

        var dataSource = new QueryDataSourceMetadata
        {
            Table = "CustTable",
            Name = "CustTable",
            HasRelations = false,
            Enabled = true,
            DynamicFieldList = true // get all fields
        };

        var range = new QueryDataRangeMetadata
        {
            TableName = "CustTable",
            FieldName = "modifiedDateTime",
            Value = ">2013-02-05T21:17:33Z", // <-- ISSUE: notice the operator with the value!
            Enabled = true
        };

        dataSource.Ranges = new QueryRangeMetadata[] { range };

        var sort = new QueryDataOrderByMetadata
                       {
                           DataSource = "CustTable",
                           FieldName = "modifiedDateTime",
                           SortOrder = SortOrder.Ascending
                       };

        var query = new QueryMetadata
        {
            QueryType = QueryType.Join,
            DataSources = new[] { dataSource },
            OrderByFields = new QueryOrderByMetadata[] { sort }
        };

        Paging paging = null;
        var dataSet = client.ExecuteQuery(query, ref paging);

        Console.WriteLine(dataSet.Tables[0].Rows.Count);
    }

Я также безуспешно пробовал эти варианты форматирования:

Value = ">2013-02-05 21:17:33"

Value = ">2013-02-05T9:17:33"

Value = ">'2013-02-05T9:17:33'"

Value = ">2013-02-05T21:17:33Z"

Кто-нибудь знает, какой формат DateTime должен быть в этом случае?


person Paul Sasik    schedule 01.03.2013    source источник


Ответы (1)


После повторения множества вариантов форматирования DateTime я просто скопировал и вставил значение из пользовательского интерфейса, и знаете что? Это сработало. Это фрагмент:

        var range = new QueryDataRangeMetadata
        {
            TableName = "CustTable",
            FieldName = "modifiedDateTime",
            Value = ">2/5/2013 9:17:33 PM",
            Enabled = true
        };

Таким образом, формат выглядит следующим образом: comparison_operatorMM/DD/YYYY hh:mm:ss AM

Я в США и формат первый месяц. Я предполагаю, что другие локали должны были бы форматироваться по-другому, например. день первый.

person Paul Sasik    schedule 01.03.2013
comment
что, если пользователь изменит формат даты в настройках. ваш код перестанет работать... вы нашли какое-нибудь другое решение? - person Saboor Awan; 10.02.2014
comment
@SaboorAwan: фрагменты кода в ОП и ответ жестко закодированы, но для простоты. Для производства вы должны использовать культуру пользователя для форматирования. Еще лучше использовать дату и время в формате UTC и литерал: msdn.microsoft. com/en-us/library/cc597805.aspx - person Paul Sasik; 11.02.2014