05.07.2018, 15:34 | #1 |
Участник
|
Date.SETRANGE не работает
Коллеги, я вообще по AX, а тут попался проект на NAV, сижу ковыряюсь.
Не могу понять, что происходит с Date.SETRANGE, если указаны и второй, и третий параметры. К примеру, вот это: Date.RESET; Date.SETRANGE("Period Type",Date."Period Type"ate); Date.SETRANGE("Period Start",DMY2DATE(5,7,2018)); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); ... как и положено возвращает сообщение "05-07-18". А вот это: Date.RESET; Date.SETRANGE("Period Type",Date."Period Type"ate); Date.SETRANGE("Period Start",DMY2DATE(5,7,2018),CALCDATE('<CM>',DMY2DATE(5,7,2018))); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); ... возвращает 01-01-1999, т.е. не просто дата не та, но и год стал четырехзначный. Подозреваю, что проблема в collations. Подскажите, куда копать? --- NAV 2018 Server collation: Danish_Norwegian_CI_AS Database collation: Latin1_General_100_CS_AS И на клиенте, и на SQL сервере в Виндах выбран датский регион, т.е. с форматом даты dd-mm-yyyy Последний раз редактировалось Stitch_MS; 05.07.2018 в 15:48. |
|
05.07.2018, 17:12 | #2 |
Administrator
|
доброго дня
не совсем понятно зачем Вы ищете в служебной таблице дату, когда ее уже сами знаете. можно задачку словами описать? чего хотим достичь? |
|
05.07.2018, 17:37 | #3 |
Administrator
|
попробуйте MESSAGE('%1', FORMAT(Date."Period Start"));
оно должно перевести в виндовый dd-MM--yyyy mm и MM есть разница MM - месяц mm - минуты |
|
|
За это сообщение автора поблагодарили: Stitch_MS (1). |
05.07.2018, 17:46 | #4 |
Участник
|
Подставил FORMAT, но печатает то же самое.
Код вообще не мой, чужой продукт, в этом месте ошибка, и непонятно почему. До меня обращались к вендору, чей код, те ответили типа "у нас всё нормально ищите у себя". И таки да, на другом компе и другой базе тот же самый код работает. Что-то с системными настройками. Последний раз редактировалось Stitch_MS; 05.07.2018 в 17:48. |
|
05.07.2018, 20:14 | #5 |
Участник
|
Не знаю подробностей, но в меню - администрирование - настройка пользователй, каждому назначается кодовая страница.
XXX/Подразделения/Администрирование/Настройка приложения/Ролевая настройка клиента/Персонализация пользователя Для России 1049 Web services по умолчанию (до изменения ключей в конфиг файле) в 1033. Каким клиентом пользуетесь? WEB?
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
06.07.2018, 10:22 | #6 |
Участник
|
Клиент обычный, попробовал поменять код 1033 (Английский) на 1030 (Датский), не помогло.
Создал новую таблицу HelloWorld, с двумя полями "Period Start" и "Period End", вручную забил несколько значений и попробовал аналогичный код на этой таблице, всё работает. Написал новый код, копирующий значения из этой магической таблицы Date в HelloWorld, падает на пятом по счету вызову HelloWorld.INSERT, с ошибкой типа "Значение 03-01-0001 не может быть записано в поле Period Start таблицы HelloWorld, т.к. значение или слишком длинное, или недействительное". Что это вообще за виртуальная таблица Date (не могу найти ее в базе)? Когда она заполняется этими недействительными значениями? OnRun() HelloWorld.RESET; HelloWorld.DELETEALL; Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); IF Date.FINDSET THEN BEGIN REPEAT HelloWorld."Period Start" := Date."Period Start"; HelloWorld."Period End" := Date."Period End"; HelloWorld.INSERT; UNTIL (Date.NEXT = 0) END; |
|
06.07.2018, 11:21 | #7 |
Участник
|
Похоже, у вас действительно проблема с региональными настройками. Я сейчас проверил ваш код на своей системе - все норма. 31 июля. Какой результат у вас выдает функция CALCDATE ? Попробуйте вместо setrange использовать setfilter.
Таблица Date - это вечный календарь. Его не надо заполнять. Он сам по себе существует. Создайте форму для этой таблицы со всеми колонками и посмотрите на нее, поиграйте с фильтрами, чтобы увидеть результат их работы. Там все просто. PS. И проверьте региональные настройки на сервере, на котором стоит NAV. Я ранее уже описывал странность работы функции DT2DATE с датой. Там независимо от настроек нав использовались настройки винды. Последний раз редактировалось BuzCom; 06.07.2018 в 11:28. |
|
06.07.2018, 11:24 | #8 |
Участник
|
Что это вообще за виртуальная таблица Date (не могу найти ее в базе)? Когда она заполняется этими недействительными значениями?
Она Виртуальная и храниться в памяти. Как её посмотреть - создайте Page и выберите её как источник данных (2000000007). Далее используя мастер выведите все поля в список. Откроете страницу и увидите формат даты в явном виде.
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
|
За это сообщение автора поблагодарили: Stitch_MS (1). |
06.07.2018, 11:34 | #9 |
Участник
|
В файле конфигурации NAV службы (CustomSettings.config) есть узел.
Цитата:
Specifies which of the installed Dynamics NAV languages on the server instance will be used as the default language in the clients. Set the value to a valid language culture name, such en-US or da-DK.
In the Dynamics NAV Web and Tablet clients, the Default Language setting determines the language that is used if the web browser's language setting does not match any installed language or a language in the Supported Languages setting, if used. In the Dynamics NAV Windows client, this is the language that is used if the language setting of the computer does not have a match. If there are application-specific configuration settings, this setting will be overridden by the default language setting that is specified in application-specific configuration file. --> <add key="DefaultLanguage" value="" />
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
06.07.2018, 11:59 | #10 |
Участник
|
Спасибо за подсказки. Пока сделал еще несколько тестов.
Вот эти три сообщения выдают правильное значение "05-07-18": Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETRANGE("Period Start",DMY2DATE(5,7,2018)); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETFILTER("Period Start",'=%1', DMY2DATE(5,7,2018)); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETFILTER("Period Start",'>=%1&<=%2', DMY2DATE(5,7,2018),DMY2DATE(5,7,2018)); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); А вот эти три выдают "01-01-9999", т.е. последнее значение в виртуальной таблице: Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETRANGE("Period Start",DMY2DATE(5,7,2018), DMY2DATE(5,7,2018)); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETFILTER("Period Start",'>%1&<%2', DMY2DATE(4,7,2018),DMY2DATE(6,7,2018)); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETFILTER("Period Start",'%1..%2', DMY2DATE(5,7,2018),DMY2DATE(5,7,2018)); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); Т.е. даже если диапазон или фильтр используют два одинаковых значения, т.е. сортировка не должна влиять, запрос всё равно не работает. Похоже, придется в майкрософтовскую поддержку обращаться. |
|
06.07.2018, 12:18 | #11 |
Administrator
|
попробуйте
MESSAGE(FORMAT(DMY2DATE(5,7,2018))); что выдаст? |
|
06.07.2018, 12:32 | #12 |
Участник
|
|
|
06.07.2018, 12:48 | #13 |
Участник
|
Уберите вообще функцию DMY2DATE. Соберите дату текстом и после этого по ней фильтруйте.
|
|
|
За это сообщение автора поблагодарили: Stitch_MS (1). |
06.07.2018, 13:34 | #14 |
Участник
|
Цитата:
Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETFILTER("Period Start", '=05-07-2018'); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); Вот это глючит: Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETFILTER("Period Start", '<=05-07-2018'); IF Date.FINDLAST THEN MESSAGE('%1', Date."Period Start"); |
|
06.07.2018, 13:56 | #15 |
Administrator
|
а вот так глючит?
Date.SETFILTER("Period Start", '..%1', 050718D); |
|
06.07.2018, 14:32 | #16 |
Участник
|
|
|
06.07.2018, 17:31 | #17 |
Участник
|
Вы таки будете смеяться, но проблема решилась перезапуском сервера. Все куски кода, которые не работали, теперь работают.
Единственное, что не заработало сразу, это код, копирующий данные в новую таблицу. После добавления диапазона по полю Period Start, заработало и это. HelloWorld.RESET; HelloWorld.DELETEALL; Date.RESET; Date.SETRANGE("Period Type",Date."Period Type":ate); Date.SETRANGE("Period Start", DMY2DATE(5,7,1999), DMY2DATE(5,7,2019)); <-- новая строка IF Date.FINDSET THEN BEGIN REPEAT CLEAR(HelloWorld); HelloWorld."Period Start" := Date."Period Start"; HelloWorld."Period End" := Date."Period End"; HelloWorld.INSERT; UNTIL (Date.NEXT = 0) END; MESSAGE('DONE'); Всем спасибо |
|
12.07.2018, 17:02 | #18 |
Участник
|
Помнится сам сидел с таким же косяком полдня и в полном недоумении, пока не додумался перезапустить апликуху. Теперь перезапуск - это первое средство в случае не поддающихся объяснению багов.
__________________
Want to believe... |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Не только у нас "веселье" с переводом или Due date = Shipment Date? | 0 | |||
Код из Отчета в кодеюнит | 8 |
|