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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.07.2018, 15:34   #1  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
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  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
доброго дня
не совсем понятно зачем Вы ищете в служебной таблице дату, когда ее уже сами знаете.
можно задачку словами описать? чего хотим достичь?
Старый 05.07.2018, 17:37   #3  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
попробуйте MESSAGE('%1', FORMAT(Date."Period Start"));
оно должно перевести в виндовый dd-MM--yyyy
mm и MM есть разница
MM - месяц
mm - минуты
За это сообщение автора поблагодарили: Stitch_MS (1).
Старый 05.07.2018, 17:46   #4  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Подставил FORMAT, но печатает то же самое.

Код вообще не мой, чужой продукт, в этом месте ошибка, и непонятно почему. До меня обращались к вендору, чей код, те ответили типа "у нас всё нормально ищите у себя". И таки да, на другом компе и другой базе тот же самый код работает. Что-то с системными настройками.

Последний раз редактировалось Stitch_MS; 05.07.2018 в 17:48.
Старый 05.07.2018, 20:14   #5  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Не знаю подробностей, но в меню - администрирование - настройка пользователй, каждому назначается кодовая страница.
XXX/Подразделения/Администрирование/Настройка приложения/Ролевая настройка клиента/Персонализация пользователя
Для России 1049
Web services по умолчанию (до изменения ключей в конфиг файле) в 1033. Каким клиентом пользуетесь? WEB?
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 06.07.2018, 10:22   #6  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Клиент обычный, попробовал поменять код 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  
BuzCom is offline
BuzCom
Участник
 
59 / 17 (1) ++
Регистрация: 10.08.2017
Похоже, у вас действительно проблема с региональными настройками. Я сейчас проверил ваш код на своей системе - все норма. 31 июля. Какой результат у вас выдает функция CALCDATE ? Попробуйте вместо setrange использовать setfilter.

Таблица Date - это вечный календарь. Его не надо заполнять. Он сам по себе существует. Создайте форму для этой таблицы со всеми колонками и посмотрите на нее, поиграйте с фильтрами, чтобы увидеть результат их работы. Там все просто.

PS. И проверьте региональные настройки на сервере, на котором стоит NAV. Я ранее уже описывал странность работы функции DT2DATE с датой. Там независимо от настроек нав использовались настройки винды.

Последний раз редактировалось BuzCom; 06.07.2018 в 11:28.
Старый 06.07.2018, 11:24   #8  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Что это вообще за виртуальная таблица Date (не могу найти ее в базе)? Когда она заполняется этими недействительными значениями?
Она Виртуальная и храниться в памяти.
Как её посмотреть - создайте Page и выберите её как источник данных (2000000007). Далее используя мастер выведите все поля в список. Откроете страницу и увидите формат даты в явном виде.
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
За это сообщение автора поблагодарили: Stitch_MS (1).
Старый 06.07.2018, 11:34   #9  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
В файле конфигурации 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  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Спасибо за подсказки. Пока сделал еще несколько тестов.

Вот эти три сообщения выдают правильное значение "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  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
попробуйте
MESSAGE(FORMAT(DMY2DATE(5,7,2018)));

что выдаст?
Старый 06.07.2018, 12:32   #12  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от Sancho Посмотреть сообщение
попробуйте
MESSAGE(FORMAT(DMY2DATE(5,7,2018)));
что выдаст?
05-07-18, и на первом компе где ошибка, и на втором, где всё нормально
Старый 06.07.2018, 12:48   #13  
BuzCom is offline
BuzCom
Участник
 
59 / 17 (1) ++
Регистрация: 10.08.2017
Уберите вообще функцию DMY2DATE. Соберите дату текстом и после этого по ней фильтруйте.
За это сообщение автора поблагодарили: Stitch_MS (1).
Старый 06.07.2018, 13:34   #14  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от BuzCom Посмотреть сообщение
Уберите вообще функцию DMY2DATE. Соберите дату текстом и после этого по ней фильтруйте.
Вот это работает:

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  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
а вот так глючит?
Date.SETFILTER("Period Start", '..%1', 050718D);
Старый 06.07.2018, 14:32   #16  
BuzCom is offline
BuzCom
Участник
 
59 / 17 (1) ++
Регистрация: 10.08.2017
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Date.SETFILTER("Period Start", '<=05-07-2018');
Оно и не будет так работать. На вход вы подаете текст, а пытаетесь использовать сравнение "больше-меньше". С чего бы ему сортировать значения как числа.
Старый 06.07.2018, 17:31   #17  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Вы таки будете смеяться, но проблема решилась перезапуском сервера. Все куски кода, которые не работали, теперь работают.

Единственное, что не заработало сразу, это код, копирующий данные в новую таблицу. После добавления диапазона по полю 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  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
Помнится сам сидел с таким же косяком полдня и в полном недоумении, пока не додумался перезапустить апликуху. Теперь перезапуск - это первое средство в случае не поддающихся объяснению багов.
__________________
Want to believe...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не только у нас "веселье" с переводом или Due date = Shipment Date? RedFox NAV: Прочие вопросы 0 04.12.2008 15:58
Код из Отчета в кодеюнит by_HT NAV: Программирование 8 01.10.2008 15:10

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

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

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